From 9500ff05df1c06b95085e7fcb52106ef8c018fc0 Mon Sep 17 00:00:00 2001 From: DarthArgus Date: Sun, 12 Jun 2016 04:21:02 -0700 Subject: [PATCH] cleanup some junk we don't need here --- src/engine/build/linux/platformDefs.mak | 3 - .../application/Miff/src/linux/BISON.HAI | 334 ---- .../Miff/src/linux/InputFileHandler.cpp | 136 -- .../Miff/src/linux/InputFileHandler.h | 71 - .../Miff/src/linux/OutputFileHandler.cpp | 164 -- .../Miff/src/linux/OutputFileHandler.h | 80 - .../application/Miff/src/linux/bison.simple | 698 -------- .../application/Miff/src/linux/mIFF.dox | 62 - .../application/Miff/src/linux/miff.cpp | 958 ----------- .../application/Miff/src/linux/parser.lex | 517 ------ .../application/Miff/src/linux/parser.yac | 1003 ----------- .../ArmorExporterTool/src/linux/dummy.cpp | 0 .../src/linux/dummy.cpp | 0 .../DataTableTool/src/linux/dummy.cpp | 0 .../src/linux/FirstTemplateCompiler.cpp | 1 - .../src/linux/FirstTemplateCompiler.h | 9 - .../linux/FirstTemplateDefinitionCompiler.cpp | 2 - .../linux/FirstTemplateDefinitionCompiler.h | 9 - .../application/Turf/src/linux/FirstTurf.h | 17 - .../WeaponExporterTool/src/linux/dummy.cpp | 0 .../src/linux/SQLC_Defs.h | 18 - .../src/linux/ConfigSharedDebugLinux.cpp | 70 - .../src/linux/ConfigSharedDebugLinux.h | 29 - .../sharedDebug/src/linux/DebugHelp.cpp | 677 -------- .../library/sharedDebug/src/linux/DebugHelp.h | 33 - .../sharedDebug/src/linux/DebugMonitor.cpp | 445 ----- .../sharedDebug/src/linux/DebugMonitor.h | 67 - .../src/linux/PerformanceTimer.cpp | 125 -- .../sharedDebug/src/linux/PerformanceTimer.h | 51 - .../sharedDebug/src/linux/ProfilerTimer.cpp | 39 - .../sharedDebug/src/linux/ProfilerTimer.h | 29 - .../library/sharedFile/src/linux/OsFile.cpp | 123 -- .../library/sharedFile/src/linux/OsFile.h | 51 - .../sharedFoundation/src/linux/ByteOrder.h | 20 - .../src/linux/ConfigSharedFoundation.cpp | 289 ---- .../src/linux/ConfigSharedFoundation.h | 64 - .../src/linux/FirstPlatform.h | 54 - .../src/linux/FloatingPointUnit.cpp | 266 --- .../src/linux/FloatingPointUnit.h | 102 -- .../library/sharedFoundation/src/linux/Os.cpp | 468 ----- .../library/sharedFoundation/src/linux/Os.h | 264 --- .../src/linux/PerThreadData.cpp | 161 -- .../src/linux/PerThreadData.h | 232 --- .../src/linux/PlatformGlue.cpp | 273 --- .../sharedFoundation/src/linux/PlatformGlue.h | 125 -- .../src/linux/SetupSharedFoundation.cpp | 185 -- .../src/linux/SetupSharedFoundation.h | 58 - .../sharedFoundation/src/linux/vsnprintf.cpp | 35 - .../sharedFoundation/src/linux/vsnprintf.h | 24 - .../library/sharedFoundation/src/win32/Os.cpp | 131 +- .../library/sharedFoundation/src/win32/Os.h | 3 - .../src/linux/FoundationTypesLinux.h | 30 - .../sharedLog/src/linux/StderrLogger.cpp | 74 - .../src/linux/OsMemory.cpp | 40 - .../sharedMemoryManager/src/linux/OsMemory.h | 29 - .../src/linux/OsNewDel.cpp | 134 -- .../sharedMemoryManager/src/linux/OsNewDel.h | 33 - .../sharedNetwork/src/linux/Address.cpp | 372 ---- .../src/linux/NetworkGetHostName.cpp | 141 -- .../library/sharedNetwork/src/linux/Sock.cpp | 236 --- .../library/sharedNetwork/src/linux/Sock.h | 128 -- .../sharedNetwork/src/linux/TcpClient.cpp | 610 ------- .../sharedNetwork/src/linux/TcpClient.h | 89 - .../sharedNetwork/src/linux/TcpServer.cpp | 238 --- .../sharedNetwork/src/linux/TcpServer.h | 52 - .../sharedNetwork/src/linux/UdpSock.cpp | 63 - .../sharedRegex/src/linux/RegexServices.cpp | 26 - .../sharedRegex/src/linux/RegexServices.h | 25 - .../src/linux/ConditionVariable.cpp | 38 - .../src/linux/ConditionVariable.h | 34 - .../sharedSynchronization/src/linux/Gate.cpp | 45 - .../sharedSynchronization/src/linux/Gate.h | 35 - .../src/linux/InterlockedInteger.h | 63 - .../src/linux/InterlockedVoidPointer.h | 53 - .../sharedSynchronization/src/linux/Mutex.cpp | 32 - .../sharedSynchronization/src/linux/Mutex.h | 31 - .../src/linux/RecursiveMutex.cpp | 37 - .../src/linux/RecursiveMutex.h | 31 - .../src/linux/Semaphore.cpp | 40 - .../src/linux/Semaphore.h | 30 - .../linux/FirstSharedTemplateDefinition.cpp | 1 - .../library/sharedThread/src/linux/Thread.cpp | 159 -- .../library/sharedThread/src/linux/Thread.h | 100 -- .../3rd/library/java/include/linux/jawt_md.h | 39 - .../3rd/library/java/include/linux/jni_md.h | 26 - .../pcre/4.1/linux/include/pcre/pcre.h | 184 -- .../pcre/4.1/linux/include/pcre/pcreposix.h | 88 - .../3rd/library/pcre/4.1/linux/lib/libpcre.a | Bin 171760 -> 0 bytes .../3rd/library/pcre/4.1/linux/lib/libpcre.la | 32 - .../pcre/4.1/linux/lib/libpcre.so.0.0.1 | Bin 113284 -> 0 bytes .../library/pcre/4.1/linux/lib/libpcreposix.a | Bin 26534 -> 0 bytes .../pcre/4.1/linux/lib/libpcreposix.la | 32 - .../pcre/4.1/linux/lib/libpcreposix.so.0.0.0 | Bin 30771 -> 0 bytes .../library/perforce/lib/linux/libclient.a | Bin 169230 -> 0 bytes .../3rd/library/perforce/lib/linux/librpc.a | Bin 80338 -> 0 bytes .../3rd/library/perforce/lib/linux/libsupp.a | Bin 924320 -> 0 bytes .../platform/utils/Base/linux/Archive.h | 44 - .../utils/Base/linux/BlockAllocator.cpp | 110 -- .../platform/utils/Base/linux/Event.cpp | 103 -- .../library/platform/utils/Base/linux/Event.h | 74 - .../platform/utils/Base/linux/Logger.cpp | 390 ----- .../platform/utils/Base/linux/Mutex.cpp | 40 - .../library/platform/utils/Base/linux/Mutex.h | 79 - .../platform/utils/Base/linux/Platform.cpp | 55 - .../platform/utils/Base/linux/Platform.h | 112 -- .../platform/utils/Base/linux/Thread.cpp | 274 --- .../platform/utils/Base/linux/Thread.h | 146 -- .../library/platform/utils/Base/linux/Types.h | 42 - .../library/soePlatform/Base/linux/Event.cpp | 82 - .../library/soePlatform/Base/linux/Event.h | 67 - .../library/soePlatform/Base/linux/Mutex.cpp | 28 - .../library/soePlatform/Base/linux/Mutex.h | 65 - .../soePlatform/Base/linux/Platform.cpp | 39 - .../library/soePlatform/Base/linux/Platform.h | 77 - .../library/soePlatform/Base/linux/Thread.cpp | 63 - .../library/soePlatform/Base/linux/Thread.h | 76 - .../library/soePlatform/Base/linux/Types.h | 34 - .../CSAssist/utils/Base/linux/Archive.h | 44 - .../utils/Base/linux/BlockAllocator.cpp | 110 -- .../CSAssist/utils/Base/linux/Event.cpp | 103 -- .../CSAssist/utils/Base/linux/Event.h | 74 - .../CSAssist/utils/Base/linux/Mutex.cpp | 40 - .../CSAssist/utils/Base/linux/Mutex.h | 79 - .../CSAssist/utils/Base/linux/Platform.cpp | 55 - .../CSAssist/utils/Base/linux/Platform.h | 112 -- .../CSAssist/utils/Base/linux/Thread.cpp | 274 --- .../CSAssist/utils/Base/linux/Thread.h | 146 -- .../CSAssist/utils/Base/linux/Types.h | 42 - .../CTServiceGameAPI/Base/linux/Archive.h | 44 - .../CTServiceGameAPI/Base/linux/Platform.cpp | 55 - .../CTServiceGameAPI/Base/linux/Platform.h | 112 -- .../CTServiceGameAPI/Base/linux/Types.h | 42 - .../ChatAPI/utils/Base/linux/Archive.h | 44 - .../utils/Base/linux/BlockAllocator.cpp | 110 -- .../ChatAPI/utils/Base/linux/Event.cpp | 103 -- .../ChatAPI2/ChatAPI/utils/Base/linux/Event.h | 74 - .../ChatAPI/utils/Base/linux/Mutex.cpp | 40 - .../ChatAPI2/ChatAPI/utils/Base/linux/Mutex.h | 79 - .../ChatAPI/utils/Base/linux/Platform.cpp | 55 - .../ChatAPI/utils/Base/linux/Platform.h | 112 -- .../ChatAPI/utils/Base/linux/Thread.cpp | 299 ---- .../ChatAPI/utils/Base/linux/Thread.h | 146 -- .../ChatAPI2/ChatAPI/utils/Base/linux/Types.h | 42 - .../3rd/library/zlib/lib/linux/libz.a | Bin 65922 -> 0 bytes .../archive/src/linux/ArchiveMutex.cpp | 34 - .../library/archive/src/linux/ArchiveMutex.h | 30 - .../application/PhonyApp/src/linux/main.cpp | 14 - .../build/win32/SwgGameServer.vcproj | 961 ----------- .../build/win32/SwgGameServer.vcxproj | 281 --- .../build/win32/ignoreLibraries.rsp | 1 - .../build/win32/ignoreLibraries_d.rsp | 1 - .../build/win32/ignoreLibraries_o.rsp | 1 - .../build/win32/ignoreLibraries_r.rsp | 2 - .../build/win32/includePaths.rsp | 56 - .../SwgGameServer/build/win32/libraries.rsp | 5 - .../build/win32/libraryPaths.rsp | 3 - .../SwgGameServer/build/win32/settings.rsp | 4 - .../application/SwgGameServer/codegen/README | 32 - .../SwgGameServer/codegen/bindmap.def | 3 - .../SwgGameServer/codegen/maketable.pl | 372 ---- .../application/SwgGameServer/codegen/putall | 9 - .../SwgGameServer/codegen/putauto.pl | 54 - .../SwgGameServer/codegen/typemap.def | 8 - .../include/public/SwgGameServer/CSHandler.h | 1 - .../public/SwgGameServer/CombatEngine.h | 1 - .../public/SwgGameServer/ConfigCombatEngine.h | 1 - .../ConsoleCommandParserCombatEngine.h | 1 - .../ConsoleCommandParserCombatEngineQueue.h | 1 - .../public/SwgGameServer/FirstSwgGameServer.h | 1 - .../SwgGameServer/JediManagerController.h | 1 - .../public/SwgGameServer/JediManagerObject.h | 1 - .../ServerJediManagerObjectTemplate.h | 1 - .../public/SwgGameServer/SwgCreatureObject.h | 1 - .../public/SwgGameServer/SwgGameServer.h | 1 - .../SwgPlayerCreatureController.h | 1 - .../public/SwgGameServer/SwgPlayerObject.h | 1 - .../SwgServerCreatureObjectTemplate.h | 1 - .../SwgServerPlayerObjectTemplate.h | 1 - .../public/SwgGameServer/SwgServerUniverse.h | 1 - .../SwgGameServer/WorldSnapshotParser.h | 1 - .../application/SwgGameServer/project.lnt | 59 - .../SwgGameServer/src/linux/main.cpp | 141 -- .../src/shared/combat/CombatEngine.cpp | 740 -------- .../src/shared/combat/CombatEngine.h | 74 - .../src/shared/combat/ConfigCombatEngine.cpp | 279 --- .../src/shared/combat/ConfigCombatEngine.h | 229 --- .../src/shared/combat/combat.def | 32 - .../ConsoleCommandParserCombatEngine.cpp | 73 - .../ConsoleCommandParserCombatEngine.h | 48 - .../ConsoleCommandParserCombatEngineQueue.cpp | 198 --- .../ConsoleCommandParserCombatEngineQueue.h | 48 - .../controller/JediManagerController.cpp | 205 --- .../shared/controller/JediManagerController.h | 42 - .../SwgPlayerCreatureController.cpp | 55 - .../controller/SwgPlayerCreatureController.h | 43 - .../src/shared/core/CSHandler.cpp | 1517 ----------------- .../SwgGameServer/src/shared/core/CSHandler.h | 91 - .../src/shared/core/FirstSwgGameServer.h | 25 - .../src/shared/core/SwgGameServer.cpp | 141 -- .../src/shared/core/SwgGameServer.h | 36 - .../src/shared/core/SwgServerUniverse.cpp | 68 - .../src/shared/core/SwgServerUniverse.h | 62 - .../src/shared/lint/ServerObjectLint.cpp | 122 -- .../src/shared/lint/ServerObjectLint.h | 16 - .../src/shared/object/JediManagerObject.cpp | 1489 ---------------- .../src/shared/object/JediManagerObject.h | 111 -- .../src/shared/object/SwgCreatureObject.cpp | 338 ---- .../src/shared/object/SwgCreatureObject.h | 61 - .../src/shared/object/SwgPlayerObject.cpp | 374 ---- .../src/shared/object/SwgPlayerObject.h | 66 - .../ServerJediManagerObjectTemplate.cpp | 186 -- .../ServerJediManagerObjectTemplate.h | 87 - .../SwgServerCreatureObjectTemplate.cpp | 57 - .../SwgServerCreatureObjectTemplate.h | 33 - .../SwgServerPlayerObjectTemplate.cpp | 57 - .../SwgServerPlayerObjectTemplate.h | 33 - .../shared/snapshot/WorldSnapshotParser.cpp | 366 ---- .../src/shared/snapshot/WorldSnapshotParser.h | 25 - .../src/win32/FirstSwgGameServer.cpp | 1 - .../SwgGameServer/src/win32/WinMain.cpp | 555 ------ 220 files changed, 1 insertion(+), 26531 deletions(-) delete mode 100644 src/engine/build/linux/platformDefs.mak delete mode 100644 src/engine/client/application/Miff/src/linux/BISON.HAI delete mode 100644 src/engine/client/application/Miff/src/linux/InputFileHandler.cpp delete mode 100644 src/engine/client/application/Miff/src/linux/InputFileHandler.h delete mode 100644 src/engine/client/application/Miff/src/linux/OutputFileHandler.cpp delete mode 100644 src/engine/client/application/Miff/src/linux/OutputFileHandler.h delete mode 100644 src/engine/client/application/Miff/src/linux/bison.simple delete mode 100644 src/engine/client/application/Miff/src/linux/mIFF.dox delete mode 100644 src/engine/client/application/Miff/src/linux/miff.cpp delete mode 100644 src/engine/client/application/Miff/src/linux/parser.lex delete mode 100644 src/engine/client/application/Miff/src/linux/parser.yac delete mode 100644 src/engine/shared/application/ArmorExporterTool/src/linux/dummy.cpp delete mode 100644 src/engine/shared/application/CoreWeaponExporterTool/src/linux/dummy.cpp delete mode 100644 src/engine/shared/application/DataTableTool/src/linux/dummy.cpp delete mode 100644 src/engine/shared/application/TemplateCompiler/src/linux/FirstTemplateCompiler.cpp delete mode 100644 src/engine/shared/application/TemplateCompiler/src/linux/FirstTemplateCompiler.h delete mode 100644 src/engine/shared/application/TemplateDefinitionCompiler/src/linux/FirstTemplateDefinitionCompiler.cpp delete mode 100644 src/engine/shared/application/TemplateDefinitionCompiler/src/linux/FirstTemplateDefinitionCompiler.h delete mode 100644 src/engine/shared/application/Turf/src/linux/FirstTurf.h delete mode 100644 src/engine/shared/application/WeaponExporterTool/src/linux/dummy.cpp delete mode 100644 src/engine/shared/library/sharedDatabaseInterface/src/linux/SQLC_Defs.h delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/ConfigSharedDebugLinux.cpp delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/ConfigSharedDebugLinux.h delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/DebugHelp.cpp delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/DebugHelp.h delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/DebugMonitor.cpp delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/DebugMonitor.h delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/PerformanceTimer.cpp delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/PerformanceTimer.h delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/ProfilerTimer.cpp delete mode 100644 src/engine/shared/library/sharedDebug/src/linux/ProfilerTimer.h delete mode 100644 src/engine/shared/library/sharedFile/src/linux/OsFile.cpp delete mode 100644 src/engine/shared/library/sharedFile/src/linux/OsFile.h delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/ByteOrder.h delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/ConfigSharedFoundation.cpp delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/ConfigSharedFoundation.h delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/FirstPlatform.h delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/FloatingPointUnit.cpp delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/FloatingPointUnit.h delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/Os.cpp delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/Os.h delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/PerThreadData.cpp delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/PerThreadData.h delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/PlatformGlue.cpp delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/PlatformGlue.h delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/SetupSharedFoundation.cpp delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/SetupSharedFoundation.h delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/vsnprintf.cpp delete mode 100644 src/engine/shared/library/sharedFoundation/src/linux/vsnprintf.h delete mode 100644 src/engine/shared/library/sharedFoundationTypes/src/linux/FoundationTypesLinux.h delete mode 100644 src/engine/shared/library/sharedLog/src/linux/StderrLogger.cpp delete mode 100644 src/engine/shared/library/sharedMemoryManager/src/linux/OsMemory.cpp delete mode 100644 src/engine/shared/library/sharedMemoryManager/src/linux/OsMemory.h delete mode 100644 src/engine/shared/library/sharedMemoryManager/src/linux/OsNewDel.cpp delete mode 100644 src/engine/shared/library/sharedMemoryManager/src/linux/OsNewDel.h delete mode 100644 src/engine/shared/library/sharedNetwork/src/linux/Address.cpp delete mode 100644 src/engine/shared/library/sharedNetwork/src/linux/NetworkGetHostName.cpp delete mode 100644 src/engine/shared/library/sharedNetwork/src/linux/Sock.cpp delete mode 100644 src/engine/shared/library/sharedNetwork/src/linux/Sock.h delete mode 100644 src/engine/shared/library/sharedNetwork/src/linux/TcpClient.cpp delete mode 100644 src/engine/shared/library/sharedNetwork/src/linux/TcpClient.h delete mode 100644 src/engine/shared/library/sharedNetwork/src/linux/TcpServer.cpp delete mode 100644 src/engine/shared/library/sharedNetwork/src/linux/TcpServer.h delete mode 100644 src/engine/shared/library/sharedNetwork/src/linux/UdpSock.cpp delete mode 100644 src/engine/shared/library/sharedRegex/src/linux/RegexServices.cpp delete mode 100644 src/engine/shared/library/sharedRegex/src/linux/RegexServices.h delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/ConditionVariable.cpp delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/ConditionVariable.h delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/Gate.cpp delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/Gate.h delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/InterlockedInteger.h delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/InterlockedVoidPointer.h delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/Mutex.cpp delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/Mutex.h delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/RecursiveMutex.cpp delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/RecursiveMutex.h delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/Semaphore.cpp delete mode 100644 src/engine/shared/library/sharedSynchronization/src/linux/Semaphore.h delete mode 100644 src/engine/shared/library/sharedTemplateDefinition/src/linux/FirstSharedTemplateDefinition.cpp delete mode 100644 src/engine/shared/library/sharedThread/src/linux/Thread.cpp delete mode 100644 src/engine/shared/library/sharedThread/src/linux/Thread.h delete mode 100644 src/external/3rd/library/java/include/linux/jawt_md.h delete mode 100644 src/external/3rd/library/java/include/linux/jni_md.h delete mode 100644 src/external/3rd/library/pcre/4.1/linux/include/pcre/pcre.h delete mode 100644 src/external/3rd/library/pcre/4.1/linux/include/pcre/pcreposix.h delete mode 100644 src/external/3rd/library/pcre/4.1/linux/lib/libpcre.a delete mode 100644 src/external/3rd/library/pcre/4.1/linux/lib/libpcre.la delete mode 100644 src/external/3rd/library/pcre/4.1/linux/lib/libpcre.so.0.0.1 delete mode 100644 src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.a delete mode 100644 src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.la delete mode 100644 src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.so.0.0.0 delete mode 100644 src/external/3rd/library/perforce/lib/linux/libclient.a delete mode 100644 src/external/3rd/library/perforce/lib/linux/librpc.a delete mode 100644 src/external/3rd/library/perforce/lib/linux/libsupp.a delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Archive.h delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/BlockAllocator.cpp delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Event.cpp delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Event.h delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Logger.cpp delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Mutex.cpp delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Mutex.h delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Platform.cpp delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Platform.h delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Thread.cpp delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Thread.h delete mode 100644 src/external/3rd/library/platform/utils/Base/linux/Types.h delete mode 100644 src/external/3rd/library/soePlatform/Base/linux/Event.cpp delete mode 100644 src/external/3rd/library/soePlatform/Base/linux/Event.h delete mode 100644 src/external/3rd/library/soePlatform/Base/linux/Mutex.cpp delete mode 100644 src/external/3rd/library/soePlatform/Base/linux/Mutex.h delete mode 100644 src/external/3rd/library/soePlatform/Base/linux/Platform.cpp delete mode 100644 src/external/3rd/library/soePlatform/Base/linux/Platform.h delete mode 100644 src/external/3rd/library/soePlatform/Base/linux/Thread.cpp delete mode 100644 src/external/3rd/library/soePlatform/Base/linux/Thread.h delete mode 100644 src/external/3rd/library/soePlatform/Base/linux/Types.h delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Archive.h delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/BlockAllocator.cpp delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Event.cpp delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Event.h delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Mutex.cpp delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Mutex.h delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Platform.cpp delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Platform.h delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Thread.cpp delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Thread.h delete mode 100644 src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Types.h delete mode 100644 src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Archive.h delete mode 100644 src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Platform.cpp delete mode 100644 src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Platform.h delete mode 100644 src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Types.h delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Archive.h delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/BlockAllocator.cpp delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Event.cpp delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Event.h delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Mutex.cpp delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Mutex.h delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Platform.cpp delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Platform.h delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Thread.cpp delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Thread.h delete mode 100644 src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Types.h delete mode 100644 src/external/3rd/library/zlib/lib/linux/libz.a delete mode 100644 src/external/ours/library/archive/src/linux/ArchiveMutex.cpp delete mode 100644 src/external/ours/library/archive/src/linux/ArchiveMutex.h delete mode 100644 src/game/server/application/PhonyApp/src/linux/main.cpp delete mode 100644 src/game/server/application/SwgGameServer/build/win32/SwgGameServer.vcproj delete mode 100644 src/game/server/application/SwgGameServer/build/win32/SwgGameServer.vcxproj delete mode 100644 src/game/server/application/SwgGameServer/build/win32/ignoreLibraries.rsp delete mode 100644 src/game/server/application/SwgGameServer/build/win32/ignoreLibraries_d.rsp delete mode 100644 src/game/server/application/SwgGameServer/build/win32/ignoreLibraries_o.rsp delete mode 100644 src/game/server/application/SwgGameServer/build/win32/ignoreLibraries_r.rsp delete mode 100644 src/game/server/application/SwgGameServer/build/win32/includePaths.rsp delete mode 100644 src/game/server/application/SwgGameServer/build/win32/libraries.rsp delete mode 100644 src/game/server/application/SwgGameServer/build/win32/libraryPaths.rsp delete mode 100644 src/game/server/application/SwgGameServer/build/win32/settings.rsp delete mode 100644 src/game/server/application/SwgGameServer/codegen/README delete mode 100644 src/game/server/application/SwgGameServer/codegen/bindmap.def delete mode 100644 src/game/server/application/SwgGameServer/codegen/maketable.pl delete mode 100644 src/game/server/application/SwgGameServer/codegen/putall delete mode 100644 src/game/server/application/SwgGameServer/codegen/putauto.pl delete mode 100644 src/game/server/application/SwgGameServer/codegen/typemap.def delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/CSHandler.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/CombatEngine.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/ConfigCombatEngine.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/ConsoleCommandParserCombatEngine.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/ConsoleCommandParserCombatEngineQueue.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/FirstSwgGameServer.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/JediManagerController.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/JediManagerObject.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/ServerJediManagerObjectTemplate.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/SwgCreatureObject.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/SwgGameServer.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/SwgPlayerCreatureController.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/SwgPlayerObject.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/SwgServerCreatureObjectTemplate.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/SwgServerPlayerObjectTemplate.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/SwgServerUniverse.h delete mode 100644 src/game/server/application/SwgGameServer/include/public/SwgGameServer/WorldSnapshotParser.h delete mode 100644 src/game/server/application/SwgGameServer/project.lnt delete mode 100644 src/game/server/application/SwgGameServer/src/linux/main.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/combat/CombatEngine.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/combat/CombatEngine.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/combat/ConfigCombatEngine.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/combat/ConfigCombatEngine.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/combat/combat.def delete mode 100644 src/game/server/application/SwgGameServer/src/shared/console/ConsoleCommandParserCombatEngine.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/console/ConsoleCommandParserCombatEngine.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/console/ConsoleCommandParserCombatEngineQueue.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/console/ConsoleCommandParserCombatEngineQueue.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/controller/JediManagerController.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/controller/JediManagerController.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/controller/SwgPlayerCreatureController.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/controller/SwgPlayerCreatureController.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/core/CSHandler.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/core/CSHandler.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/core/FirstSwgGameServer.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/core/SwgGameServer.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/core/SwgGameServer.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/core/SwgServerUniverse.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/core/SwgServerUniverse.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/lint/ServerObjectLint.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/lint/ServerObjectLint.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/object/JediManagerObject.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/object/JediManagerObject.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/object/SwgCreatureObject.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/object/SwgCreatureObject.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/object/SwgPlayerObject.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/object/SwgPlayerObject.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/objectTemplate/ServerJediManagerObjectTemplate.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/objectTemplate/ServerJediManagerObjectTemplate.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/objectTemplate/SwgServerCreatureObjectTemplate.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/objectTemplate/SwgServerCreatureObjectTemplate.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/objectTemplate/SwgServerPlayerObjectTemplate.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/objectTemplate/SwgServerPlayerObjectTemplate.h delete mode 100644 src/game/server/application/SwgGameServer/src/shared/snapshot/WorldSnapshotParser.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/shared/snapshot/WorldSnapshotParser.h delete mode 100644 src/game/server/application/SwgGameServer/src/win32/FirstSwgGameServer.cpp delete mode 100644 src/game/server/application/SwgGameServer/src/win32/WinMain.cpp diff --git a/src/engine/build/linux/platformDefs.mak b/src/engine/build/linux/platformDefs.mak deleted file mode 100644 index 059c7642d..000000000 --- a/src/engine/build/linux/platformDefs.mak +++ /dev/null @@ -1,3 +0,0 @@ -PLATFORM =linux -#PLATFORM_DEFINES =-DLINUX -DJNI_IBM_JAVA -PLATFORM_DEFINES =-DLINUX diff --git a/src/engine/client/application/Miff/src/linux/BISON.HAI b/src/engine/client/application/Miff/src/linux/BISON.HAI deleted file mode 100644 index 999b55591..000000000 --- a/src/engine/client/application/Miff/src/linux/BISON.HAI +++ /dev/null @@ -1,334 +0,0 @@ - -extern int timeclock; - - -int yyerror; /* Yyerror and yycost are set by guards. */ -int yycost; /* If yyerror is set to a nonzero value by a */ - /* guard, the reduction with which the guard */ - /* is associated is not performed, and the */ - /* error recovery mechanism is invoked. */ - /* Yycost indicates the cost of performing */ - /* the reduction given the attributes of the */ - /* symbols. */ - - -/* YYMAXDEPTH indicates the size of the parser's state and value */ -/* stacks. */ - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 500 -#endif - -/* YYMAXRULES must be at least as large as the number of rules that */ -/* could be placed in the rule queue. That number could be determined */ -/* from the grammar and the size of the stack, but, as yet, it is not. */ - -#ifndef YYMAXRULES -#define YYMAXRULES 100 -#endif - -#ifndef YYMAXBACKUP -#define YYMAXBACKUP 100 -#endif - - -short yyss[YYMAXDEPTH]; /* the state stack */ -YYSTYPE yyvs[YYMAXDEPTH]; /* the semantic value stack */ -YYLTYPE yyls[YYMAXDEPTH]; /* the location stack */ -short yyrq[YYMAXRULES]; /* the rule queue */ -int yychar; /* the lookahead symbol */ - -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -YYSTYPE yytval; /* the semantic value for the state */ - /* at the top of the state stack. */ - -YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ - -YYLTYPE yytloc; /* location data for the state at the */ - /* top of the state stack */ - - -int yynunlexed; -short yyunchar[YYMAXBACKUP]; -YYSTYPE yyunval[YYMAXBACKUP]; -YYLTYPE yyunloc[YYMAXBACKUP]; - -short *yygssp; /* a pointer to the top of the state */ - /* stack; only set during error */ - /* recovery. */ - -YYSTYPE *yygvsp; /* a pointer to the top of the value */ - /* stack; only set during error */ - /* recovery. */ - -YYLTYPE *yyglsp; /* a pointer to the top of the */ - /* location stack; only set during */ - /* error recovery. */ - - -/* Yyget is an interface between the parser and the lexical analyzer. */ -/* It is costly to provide such an interface, but it avoids requiring */ -/* the lexical analyzer to be able to back up the scan. */ - -yyget() -{ - if (yynunlexed > 0) - { - yynunlexed--; - yychar = yyunchar[yynunlexed]; - yylval = yyunval[yynunlexed]; - yylloc = yyunloc[yynunlexed]; - } - else if (yychar <= 0) - yychar = 0; - else - { - yychar = yylex(); - if (yychar < 0) - yychar = 0; - else yychar = YYTRANSLATE(yychar); - } -} - - - -yyunlex(chr, val, loc) -int chr; -YYSTYPE val; -YYLTYPE loc; -{ - yyunchar[yynunlexed] = chr; - yyunval[yynunlexed] = val; - yyunloc[yynunlexed] = loc; - yynunlexed++; -} - - - -yyrestore(first, last) -register short *first; -register short *last; -{ - register short *ssp; - register short *rp; - register int symbol; - register int state; - register int tvalsaved; - - ssp = yygssp; - yyunlex(yychar, yylval, yylloc); - - tvalsaved = 0; - while (first != last) - { - symbol = yystos[*ssp]; - if (symbol < YYNTBASE) - { - yyunlex(symbol, yytval, yytloc); - tvalsaved = 1; - ssp--; - } - - ssp--; - - if (first == yyrq) - first = yyrq + YYMAXRULES; - - first--; - - for (rp = yyrhs + yyprhs[*first]; symbol = *rp; rp++) - { - if (symbol < YYNTBASE) - state = yytable[yypact[*ssp] + symbol]; - else - { - state = yypgoto[symbol - YYNTBASE] + *ssp; - - if (state >= 0 && state <= YYLAST && yycheck[state] == *ssp) - state = yytable[state]; - else - state = yydefgoto[symbol - YYNTBASE]; - } - - *++ssp = state; - } - } - - if ( ! tvalsaved && ssp > yyss) - { - yyunlex(yystos[*ssp], yytval, yytloc); - ssp--; - } - - yygssp = ssp; -} - - - -int -yyparse() -{ - register int yystate; - register int yyn; - register short *yyssp; - register short *yyrq0; - register short *yyptr; - register YYSTYPE *yyvsp; - - int yylen; - YYLTYPE *yylsp; - short *yyrq1; - short *yyrq2; - - yystate = 0; - yyssp = yyss - 1; - yyvsp = yyvs - 1; - yylsp = yyls - 1; - yyrq0 = yyrq; - yyrq1 = yyrq0; - yyrq2 = yyrq0; - - yychar = yylex(); - if (yychar < 0) - yychar = 0; - else yychar = YYTRANSLATE(yychar); - -yynewstate: - - if (yyssp >= yyss + YYMAXDEPTH - 1) - { - yyabort("Parser Stack Overflow"); - YYABORT; - } - - *++yyssp = yystate; - -yyresume: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - yyn += yychar; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar) - goto yydefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - yystate = yyn; - - yyptr = yyrq2; - while (yyptr != yyrq1) - { - yyn = *yyptr++; - yylen = yyr2[yyn]; - yyvsp -= yylen; - yylsp -= yylen; - - yyguard(yyn, yyvsp, yylsp); - if (yyerror) - goto yysemerr; - - yyaction(yyn, yyvsp, yylsp); - *++yyvsp = yyval; - - yylsp++; - if (yylen == 0) - { - yylsp->timestamp = timeclock; - yylsp->first_line = yytloc.first_line; - yylsp->first_column = yytloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } - - if (yyptr == yyrq + YYMAXRULES) - yyptr = yyrq; - } - - if (yystate == YYFINAL) - YYACCEPT; - - yyrq2 = yyptr; - yyrq1 = yyrq0; - - *++yyvsp = yytval; - *++yylsp = yytloc; - yytval = yylval; - yytloc = yylloc; - yyget(); - - goto yynewstate; - -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -yyreduce: - - *yyrq0++ = yyn; - - if (yyrq0 == yyrq + YYMAXRULES) - yyrq0 = yyrq; - - if (yyrq0 == yyrq2) - { - yyabort("Parser Rule Queue Overflow"); - YYABORT; - } - - yyssp -= yyr2[yyn]; - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yysemerr: - *--yyptr = yyn; - yyrq2 = yyptr; - yyvsp += yyr2[yyn]; - -yyerrlab: - - yygssp = yyssp; - yygvsp = yyvsp; - yyglsp = yylsp; - yyrestore(yyrq0, yyrq2); - yyrecover(); - yystate = *yygssp; - yyssp = yygssp; - yyvsp = yygvsp; - yyrq0 = yyrq; - yyrq1 = yyrq0; - yyrq2 = yyrq0; - goto yyresume; -} - -$ diff --git a/src/engine/client/application/Miff/src/linux/InputFileHandler.cpp b/src/engine/client/application/Miff/src/linux/InputFileHandler.cpp deleted file mode 100644 index ead23d7c9..000000000 --- a/src/engine/client/application/Miff/src/linux/InputFileHandler.cpp +++ /dev/null @@ -1,136 +0,0 @@ -//=========================================================================== -// -// FILENAME: InputFileHandler.cpp [C:\Projects\new\tools\src\miff\src\] -// COPYRIGHT: (C) 1999 BY Bootprint Entertainment -// -// DESCRIPTION: file handler for input files (standard flat text files) -// AUTHOR: Hideki Ikeda -// DATE: 1/13/99 4:53:31 PM -// -// HISTORY: 1/13/99 [HAI] - File created -// : -// -// FUNCTION: InputFileHandler() constructor -// : ~InputFileHandler() destructor -// : -// -//=========================================================================== - -//========================================================== include files == -#include "sharedFoundation/FirstSharedFoundation.h" -#include "InputFileHandler.h" - -#include "sharedFile/TreeFile.h" -//#include "sharedFile/Iff.h" - -//================================================= static vars assignment == - - - -//--------------------------------------------------------------------------- -// Constructor -// -// Remarks: -// -// -// See Also: -// -// -// Revisions and History: -// 1/13/99 [HAI] - created -// -InputFileHandler::InputFileHandler(const char *infilename) -{ - TreeFile::addSearchAbsolute(0); // search current working directory - - file = TreeFile::open(infilename, AbstractFile::PriorityData, true); - -} - - -//--------------------------------------------------------------------------- -// Destructor -// -// Remarks: -// -// -// See Also: -// -// -// Revisions and History: -// 1/13/99 [HAI] - created -// -InputFileHandler::~InputFileHandler(void) -{ - if(file) - delete file; -} - - -//--------------------------------------------------------------------------- -// reads a file stream into specified buffer of the size passed -// -// Return Value: -// actual size read (signed int) -// -// Remarks: -// -// -// See Also: -// Treefile::read() -// -// Revisions and History: -// 1/13/99 [HAI] - created -// -const int InputFileHandler::read( - void *sourceBuffer, // pointer to the buffer - int bufferSize // number of BYTES to be read - ) -{ - int retVal = -1; // assume fileHandle is NOT valid - - if (file) - retVal = file->read(sourceBuffer, bufferSize); - - return(retVal); -} - -//--------------------------------------------------------------------------- -// Deletes a file -// -// Return Value: -// whatever DeleteFile() returns -// if fileHandle != -1, it assumes that the fileHandle passed belonged to -// this filename, and therefore, it will attempt to close the file and -// set it to 0. -// -// Remarks: -// calls DeleteFile() found in windows.h -// InputFileHandler does NOT have any way to validate that the handle -// passed belongs to the filename that it wants to be deleted. So use -// it with caution -// -// See Also: -// windows.h -// -// Revisions and History: -// 1/13/99 [HAI] - created -// -int InputFileHandler::deleteFile( - const char *filename, - bool deleteHandleFlag - ) -{ - if (deleteHandleFlag && file) - { - delete file; - file = NULL; - } - return(unlink(filename)); -} - - -//=========================================================================== -//============================================================ End-of-file == -//=========================================================================== - diff --git a/src/engine/client/application/Miff/src/linux/InputFileHandler.h b/src/engine/client/application/Miff/src/linux/InputFileHandler.h deleted file mode 100644 index 9e4734fe5..000000000 --- a/src/engine/client/application/Miff/src/linux/InputFileHandler.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef __INPUTFILEHANDLER_H__ -#define __INPUTFILEHANDLER_H__ - -//=========================================================================== -// -// FILENAME: InputFileHandler.h [C:\Projects\new\tools\src\miff\src\] -// COPYRIGHT: (C) 1999 BY Bootprint Entertainment -// -// DESCRIPTION: file handler for input files (flat text files) -// AUTHOR: Hideki Ikeda -// DATE: 1/13/99 4:55:15 PM -// -// HISTORY: 1/13/99 [HAI] - File created -// : -// -//=========================================================================== - -//============================================================== #includes == - -//========================================================= class typedefs == - -//====================================================== class definitions == - -class AbstractFile; - -class InputFileHandler -{ -//------------------------------ -//--- public var & functions --- -//------------------------------ -public: // functions - InputFileHandler(const char *infilename); - ~InputFileHandler(void); - - const int read(void *sourceBuffer, int bufferSize); - int deleteFile(const char * filename, bool deleteHandleFlag = false); - -public: // vars - - - //------------------------------- - //--- member vars declaration --- - //------------------------------- -protected: // vars - AbstractFile *file; - -private: // vars - - //----------------------------------- - //--- member function declaration --- - //----------------------------------- -protected: // functions - -private: // functions - void close(void); // close the input file called by destructor - -}; - -//=========================================================================== -//========================================================= inline methods == -//=========================================================================== - - -//=========================================================================== -//============================================================ End-of-file == -//=========================================================================== -#else - #ifdef DEBUG - #pragma message("InputFileHandler.h included more then once!") - #endif -#endif // ifndef __H__ diff --git a/src/engine/client/application/Miff/src/linux/OutputFileHandler.cpp b/src/engine/client/application/Miff/src/linux/OutputFileHandler.cpp deleted file mode 100644 index 1c8ffe96f..000000000 --- a/src/engine/client/application/Miff/src/linux/OutputFileHandler.cpp +++ /dev/null @@ -1,164 +0,0 @@ -//=========================================================================== -// -// FILENAME: OutputFileHandler.cpp -// COPYRIGHT: (C) 1999 BY Bootprint Entertainment -// -// DESCRIPTION: file handler for Output file (IFF file) -// AUTHOR: Hideki Ikeda -// DATE: 1/13/99 4:52:42 PM -// -//=========================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "OutputFileHandler.h" - -#include "sharedFile/Iff.h" - -//=========================================================================== -// Constructor - -OutputFileHandler::OutputFileHandler(const char *filename) -{ - outputIFF = new Iff(MAXIFFDATASIZE); - outFilename = NULL; - - setCurrentFilename(filename); -} - -void OutputFileHandler::setCurrentFilename(const char *filename) -{ - if (outFilename) - delete [] outFilename; - - outFilename = new char[strlen(filename)+1]; - strcpy(outFilename, filename); -} - -//--------------------------------------------------------------------------- -// Destructor - -OutputFileHandler::~OutputFileHandler(void) -{ - if (outputIFF && outFilename) - { - delete outputIFF; - delete [] outFilename; - } - - outputIFF = NULL; -} - - -//--------------------------------------------------------------------------- -// begins a new FORM in the IFF -// -// Return Value: -// bool - true == success -// -// See Also: -// Iff::insertForm() - -void OutputFileHandler::insertForm( - const char *tag - ) -{ - Tag formTag = convertStrToTag(tag); - outputIFF->insertForm(formTag); -} - -//--------------------------------------------------------------------------- -// begins a new CHUNK in the IFF -// -// See Also: -// Iff::insertChunk() - -void OutputFileHandler::insertChunk( - const char *tag - ) -{ - Tag chunkTag = convertStrToTag(tag); - outputIFF->insertChunk(chunkTag); -} - - -//--------------------------------------------------------------------------- -// converts string (4 bytes) form into Tag format -// -// Return Value: -// Tag -// -// Remarks: -// currently, this code is machine dependant code (non portable) and it assumes little endian -// -// See Also: -// Tag - -Tag OutputFileHandler::convertStrToTag( - const char *str - ) -{ - // prepare for hack-o-rama. It is byte order dependant, thus not portable ^_^ - Tag retVal = str[3] + (str[2] * 0x100) + (str[1] * 0x10000) + (str[0] * 0x1000000); - - return(retVal); -} - - -//--------------------------------------------------------------------------- -// adds new chunk data into the current chunk it is in -// -// See Also: -// Iff::insertChunkData() -// - -void OutputFileHandler::insertChunkData( - void *data, - int length - ) -{ - outputIFF->insertChunkData(data, length); -} - -//--------------------------------------------------------------------------- -// exits current FORM section we are in -// -// See Also: -// Iff::exitForm() - -void OutputFileHandler::exitForm(void) -{ - outputIFF->exitForm(); -} - -//--------------------------------------------------------------------------- -// exits current CHUNK we are in -// -// See Also: -// Iff::exitChunk() - -void OutputFileHandler::exitChunk(void) -{ - outputIFF->exitChunk(); -} - - -//--------------------------------------------------------------------------- -// Calls Iff:write() -// -// Return Value: -// -// True if the Iff was successfully written, otherwise false -// -// See Also: -// Iff::write() - -bool OutputFileHandler::writeBuffer(void) -{ - if (outputIFF && outFilename) - return outputIFF->write(outFilename, true); - - return false; -} - -//=========================================================================== - diff --git a/src/engine/client/application/Miff/src/linux/OutputFileHandler.h b/src/engine/client/application/Miff/src/linux/OutputFileHandler.h deleted file mode 100644 index 5f4eaf580..000000000 --- a/src/engine/client/application/Miff/src/linux/OutputFileHandler.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef __OUTPUTFILEHANDLER_H__ -#define __OUTPUTFILEHANDLER_H__ - -//=========================================================================== -// -// FILENAME: OutputFileHandler.h [C:\Projects\new\tools\src\miff\src\] -// COPYRIGHT: (C) 1999 BY Bootprint Entertainment -// -// DESCRIPTION: file handler for output files (IFF file format) -// AUTHOR: Hideki Ikeda -// DATE: 1/13/99 4:55:56 PM -// -// HISTORY: 1/13/99 [HAI] - File created -// : -// -//=========================================================================== - -//============================================================== #includes == - -//========================================================= class typedefs == -#include "sharedFile/Iff.h" - -//====================================================== class definitions == -class OutputFileHandler -{ -//------------------------------ -//--- public var & functions --- -//------------------------------ -public: // functions - OutputFileHandler(const char *filename); - ~OutputFileHandler(void); - bool writeBuffer(void); - - void insertForm(const char *tagName); - void insertChunk(const char *tagName); - void insertChunkData(void *data, int length); - void exitForm(void); - void exitChunk(void); - - void setCurrentFilename(const char *fname); - -public: // vars - - - //------------------------------- - //--- member vars declaration --- - //------------------------------- -protected: // vars - Iff * outputIFF; - char *outFilename; - -enum{ - MAXIFFDATASIZE = 8192 // allocate 8K of memory for a starter - }; - -private: // vars - - //----------------------------------- - //--- member function declaration --- - //----------------------------------- -protected: // functions - -private: // functions - Tag convertStrToTag(const char *str); - -}; - -//=========================================================================== -//========================================================= inline methods == -//=========================================================================== - - -//=========================================================================== -//============================================================ End-of-file == -//=========================================================================== -#else - #ifdef DEBUG - #pragma message("OutputFileHandler.h included more then once!") - #endif -#endif // ifndef __H__ diff --git a/src/engine/client/application/Miff/src/linux/bison.simple b/src/engine/client/application/Miff/src/linux/bison.simple deleted file mode 100644 index 5f8f386e6..000000000 --- a/src/engine/client/application/Miff/src/linux/bison.simple +++ /dev/null @@ -1,698 +0,0 @@ -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "bison.simple" - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#define MSDOS 1 - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include -#else /* not sparc */ -#if defined (MSDOS) && !defined (__TURBOC__) -#include -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -#include - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -#ifdef MSDOS -#define alloca(n) malloc(n) -#endif - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug = 1; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *to, char *from, int count) -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 196 "bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - -$ /* the action file gets copied in in place of this dollarsign */ -#line 498 "bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} diff --git a/src/engine/client/application/Miff/src/linux/mIFF.dox b/src/engine/client/application/Miff/src/linux/mIFF.dox deleted file mode 100644 index 4c46d600b..000000000 --- a/src/engine/client/application/Miff/src/linux/mIFF.dox +++ /dev/null @@ -1,62 +0,0 @@ -// NOTE: this makes it more convinient for me to make the help screen fancier... -// blah... not that anybody cares... - -printf("\ -Usage:\n\ - mIFF {-%c |--%s=}\n\ - [{-%c |--%s=} | {-%c|--%s}]\n\ - [{-%c|--%s}] [{-%c|--%s}] [{-%c|--%s}]\n\n", - SNAME_INPUT_FILE, LNAME_INPUT_FILE, - SNAME_OUTPUT_FILE, LNAME_OUTPUT_FILE, - SNAME_PRAGMA_TARGET, LNAME_PRAGMA_TARGET, - SNAME_CCCP, LNAME_CCCP, - SNAME_VERBOSE, LNAME_VERBOSE, - SNAME_DEBUG, LNAME_DEBUG); -printf("\ - mIFF {-%c|--%s}\n\n", SNAME_HELP, LNAME_HELP); - -printf("\ -Parameters:\n\ - -%c ,--%s=\n\ - [required] specifies the input path for IFF source file.\n", SNAME_INPUT_FILE, LNAME_INPUT_FILE); -printf("\ - -%c ,--%s=\n\ - [optional] specifies the pathname for the generated \n\ - IFF data file. Note that if neither this nor the following \n\ - option are specified, a default output filename of the source\n\ - file's base name with extension \".iff\" will be used.\n", SNAME_OUTPUT_FILE, LNAME_OUTPUT_FILE); -printf("\ - -%c,--%s\n\ - [optional] specifies the generated output filename should be \n\ - taken from the #pragma options within the source file. \n\ - Allowable #pragma options are: \n\ - #pragma drive \":\"\n\ - #pragma directory \"\"\n\ - #pragma filename \"\"\n\ - #pragma extension \"\"\n", SNAME_PRAGMA_TARGET, LNAME_PRAGMA_TARGET); -printf("\ - -%c,--%s\n\ - [optional] use CCCP rather than CPP.\n", SNAME_CCCP, LNAME_CCCP); -printf("\ - -%c,--%s\n\ - [optional] display more information during execution.\n", SNAME_VERBOSE, LNAME_VERBOSE); -printf("\ - -%c,--%s\n\ - [optional] enable debug mode (save intermediate files).\n", SNAME_DEBUG, LNAME_DEBUG); -printf("\ - -%c,--%s\n\ - [very optional] this help screen.\n", SNAME_HELP, LNAME_HELP); -printf("\ -Examples:\n\ - mIFF -%c foo.bar\n\ - this will generate an iff file foo.iff (default if no parm specified)\n\ - in the current working directory. Even if foo.bar contains #pragma, \n\ - it will create foo.iff because -%c was not specified.\n", SNAME_INPUT_FILE, SNAME_PRAGMA_TARGET); -printf("\ - mIFF -%c \"C:\\my project\\myData\\foo.iff\" --%s=foo.bar\n\ - notice that if you have space in your dirname, use \" to encapsulate \n\ - it.\n", SNAME_OUTPUT_FILE, LNAME_INPUT_FILE); -printf("\ - mIFF -%c foo.bar --%s\n\ - will generate output file specified by #pragma statements \n\ - within file foo.bar.\n", SNAME_INPUT_FILE, LNAME_PRAGMA_TARGET); diff --git a/src/engine/client/application/Miff/src/linux/miff.cpp b/src/engine/client/application/Miff/src/linux/miff.cpp deleted file mode 100644 index 032f56407..000000000 --- a/src/engine/client/application/Miff/src/linux/miff.cpp +++ /dev/null @@ -1,958 +0,0 @@ -//=========================================================================== -// -// FILENAME: mIFF.cpp [C:\Projects\new\tools\src\miff\src\] -// COPYRIGHT: (C) 1999 BY Bootprint Entertainment -// -// DESCRIPTION: make IFF (Console version) -// AUTHOR: Hideki Ikeda -// DATE: 1/07/99 12:57:20 PM -// -// HISTORY: 1/07/99 [HAI] - File created -// : 1/07/99 [HAI] - v1.0 introductory version -// : 1/12/99 [HAI] - v1.1 switched from DOS to Engine library -// : - first attempt was to setup the main entry -// : point via ConsoleEntryPoint() via callback -// : 1/29/99 [HAI] - changed the parameter in MIFFMessage to allow -// : output even in non-verbose mode (for error -// : message purpose. -// : 05/07/99 [HAI]- added MIFFallocString() and MIFFfreeString() -// : to work with memory manager. they are allocated -// : in the lexical analyzer for IDENTIFIERS and STR_LIT -// : deleted after parser parses the rule. -// -// FUNCTION: main() -// : evaluateArgs() -// : help() -// : handleError() -// : preprocessSource() -// : MIFFMessage() -// : callbackFunction() -// -//=========================================================================== - -//========================================================== include files == -#include "sharedFoundation/FirstSharedFoundation.h" - -#include "sharedCompression/SetupSharedCompression.h" -#include "sharedDebug/SetupSharedDebug.h" -#include "sharedFile/SetupSharedFile.h" -#include "sharedFile/TreeFile.h" -#include "sharedFoundation/CommandLine.h" -#include "sharedFoundation/Crc.h" -#include "sharedFoundation/Os.h" -#include "sharedFoundation/SetupSharedFoundation.h" -#include "sharedMemoryManager/MemoryManager.h" -#include "sharedThread/SetupSharedThread.h" - -#include "InputFileHandler.h" -#include "OutputFileHandler.h" - -#include // for memset() -#include // FILE stuff -#include // for getcwd() -#include // for tolower() - -//================================================= static vars assignment == -const int entryPointVersion = 1; // constantly check DataEntryPoint.h to see if this value has changed - -OutputFileHandler *outfileHandler = NULL; -const int bufferSize = 16 * 1024 * 1024; -const int maxStringSize = 256; -const char version[] = "1.3 September 18, 2000"; - -// vars set by pragmas or via command line -char drive[8]; // should be no more then 2 char "C:" -char directory[maxStringSize]; -char filename[maxStringSize]; -char extension[8]; // we'll truncate if the extension is more then 8 chars... -char inFileName[512]; - -// switches to be sent to mIFF Compiler -char sourceBuffer[bufferSize]; -char outFileName[512]; // x2 to combine filename, dir, and ext -bool usePragma = false; -bool useCCCP = false; -bool verboseMode = false; // default to non-verbose mode -bool debugMode = false; // set this on and the preprocessed source file (miff.$$$) won't be deleted - -static bool runningUnderNT; - -enum errorType { - ERR_FILENOTFOUND = -1, - ERR_ARGSTOOFEW = -2, - ERR_BUFFERTOOSMALL = -3, - ERR_UNKNOWNDIR = -4, - ERR_PREPROCESS = -5, - ERR_MULTIPLEINFILE = -6, - ERR_PARSER = -7, - ERR_ENGINE = -8, - - ERR_HELPREQUEST = -9, - ERR_OPTIONS = -10, - - ERR_WRITEERROR = -11, - - ERR_NONE = 0 - }; -char err_msg[256]; -errorType errorFlag = ERR_NONE; // assume no error (default) - - -// long and short name definitions for command line options - -static const char * const LNAME_HELP = "help"; -static const char * const LNAME_INPUT_FILE = "inputfile"; -static const char * const LNAME_OUTPUT_FILE = "outputfile"; -static const char * const LNAME_PRAGMA_TARGET = "pragmatarget"; -static const char * const LNAME_CCCP = "cccp"; -static const char * const LNAME_VERBOSE = "verbose"; -static const char * const LNAME_DEBUG = "debug"; - -static const char SNAME_HELP = 'h'; -static const char SNAME_INPUT_FILE = 'i'; -static const char SNAME_OUTPUT_FILE = 'o'; -static const char SNAME_PRAGMA_TARGET = 'p'; -static const char SNAME_CCCP = 'c'; -static const char SNAME_VERBOSE = 'v'; -static const char SNAME_DEBUG = 'd'; - -// following is the command line option spec tree needed for command line processing -static CommandLine::OptionSpec optionSpecArray[] = -{ - OP_BEGIN_SWITCH(OP_NODE_REQUIRED), - - // help - OP_SINGLE_SWITCH_NODE(SNAME_HELP, LNAME_HELP, OP_ARG_NONE, OP_MULTIPLE_DENIED), - - // real options - OP_BEGIN_SWITCH_NODE(OP_MULTIPLE_DENIED), - OP_BEGIN_LIST(), - // input filename required - OP_SINGLE_LIST_NODE(SNAME_INPUT_FILE, LNAME_INPUT_FILE, OP_ARG_REQUIRED, OP_MULTIPLE_DENIED, OP_NODE_REQUIRED), - - // optional, mutually exclusive output file specification options - // if none specified, generate derive output filename from input filename - OP_BEGIN_LIST_NODE(OP_MULTIPLE_DENIED, OP_NODE_OPTIONAL), - OP_BEGIN_SWITCH(OP_NODE_OPTIONAL), - // specify output filename on command line - OP_SINGLE_SWITCH_NODE(SNAME_OUTPUT_FILE, LNAME_OUTPUT_FILE, OP_ARG_REQUIRED, OP_MULTIPLE_DENIED), - - // use pragma target for output filename - OP_SINGLE_SWITCH_NODE(SNAME_PRAGMA_TARGET, LNAME_PRAGMA_TARGET, OP_ARG_NONE, OP_MULTIPLE_DENIED), - OP_END_SWITCH(), - OP_END_LIST_NODE(), - - // if specified, use cccp instead of cpp - OP_SINGLE_LIST_NODE(SNAME_CCCP, LNAME_CCCP, OP_ARG_NONE, OP_MULTIPLE_DENIED, OP_NODE_OPTIONAL), - - // if specified, be verbose - OP_SINGLE_LIST_NODE(SNAME_VERBOSE, LNAME_VERBOSE, OP_ARG_NONE, OP_MULTIPLE_DENIED, OP_NODE_OPTIONAL), - - // if specified, enter debug info - OP_SINGLE_LIST_NODE(SNAME_DEBUG, LNAME_DEBUG, OP_ARG_NONE, OP_MULTIPLE_DENIED, OP_NODE_OPTIONAL), - OP_END_LIST(), - OP_END_SWITCH_NODE(), - - OP_END_SWITCH() -}; -static const int optionSpecCount = sizeof(optionSpecArray) / sizeof(optionSpecArray[0]); - -//================================================= function prototypes == -int main(int argc, char *argv[]); -static errorType evaluateArgs(void); -static void help(void); -static void handleError(errorType error); -static int preprocessSource(char *sourceName); -static void callbackFunction(void); -static errorType loadInputToBuffer(void *destAddr, int maxBufferSize); - -// functions called by parser.yac and parser.lex -extern "C" void MIFFMessage(char *msg, int forceOut); -extern "C" void MIFFSetError(void); -extern "C" void MIFFSetIFFName(const char *newFileName); -extern "C" void MIFFinsertForm(const char *formName); -extern "C" void MIFFinsertChunk(const char *chunkName); -extern "C" void MIFFinsertChunkData(void * buffer, unsigned bufferSize); -extern "C" int MIFFloadRawData(char *fname, void * buffer, unsigned maxBufferSize); -extern "C" void MIFFexitChunk(void); -extern "C" void MIFFexitForm(void); -extern "C" unsigned long MIFFgetLabelHash(char *inputStream); - -// external functions found in parser.lex file -extern "C" void MIFFCompile(char *inputStream, char *inputFname); -extern "C" void MIFFCompileInit(char *inputStream, char *inputFname); - -//--------------------------------------------------------------------------- -// main entry point from console call -// -// Return Value: -// errorType - see enumeration; 0 if no errors -// -// Remarks: -// -// -// See Also: -// -// -// Revisions and History: -// 1/07/99 [HAI] - created -// -int main( int argc, // number of args in commandline - char * argv[] // list of pointers to strings - ) -{ - memset(sourceBuffer, 0, bufferSize); - - SetupSharedThread::install(); - SetupSharedDebug::install(4096); - - SetupSharedFoundation::Data SetupSharedFoundationData (SetupSharedFoundation::Data::D_console); - SetupSharedFoundationData.argc = argc; - SetupSharedFoundationData.argv = argv; - SetupSharedFoundation::install (SetupSharedFoundationData); - - SetupSharedCompression::install(); - - SetupSharedFile::install(false); - - TreeFile::addSearchAbsolute(0); - TreeFile::addSearchPath (".", 0); - - SetupSharedFoundation::callbackWithExceptionHandling(callbackFunction); - SetupSharedFoundation::remove(); - - SetupSharedThread::remove(); - return static_cast (errorFlag); -} - -//--------------------------------------------------------------------------- -// callback function for Engine's console entry point -// -// Return Value: -// none -// -// Remarks: -// this is like a substitute of main() -// -// See Also: -// -// -// Revisions and History: -// 1/12/99 [HAI] - created -// -static void callbackFunction(void) -{ - outfileHandler = NULL; - -#ifdef WIN32 - - // check if we're running under NT - OSVERSIONINFO osInfo; - Zero(osInfo); - - osInfo.dwOSVersionInfoSize = sizeof(osInfo); - const BOOL getVersionResult = GetVersionEx(&osInfo); - if (getVersionResult) - runningUnderNT = (osInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); - if (runningUnderNT) - DEBUG_REPORT_LOG(true, ("MIFF: running under Windows NT platform\n")); - else - DEBUG_REPORT_LOG(true, ("MIFF: running under non-NT Windows platform\n")); - -#endif - - errorFlag = evaluateArgs(); - if (ERR_NONE == errorFlag) - { - outfileHandler = new OutputFileHandler(outFileName); - MIFFCompile(sourceBuffer, inFileName); - } - else - handleError(errorFlag); - - if (outfileHandler) - { - // only write output IF there was no error - if (ERR_NONE == errorFlag) - { - if (!outfileHandler->writeBuffer()) - { - fprintf(stderr, "MIFF: failed to write output file \"%s\"\n", outFileName); - errorFlag = ERR_WRITEERROR; - } - } - delete outfileHandler; - } -} - -//--------------------------------------------------------------------------- -// Evaluates the command line and sets up the environment variables required for mIFF to function -// -// Return Value: -// errorType -// -// Remarks: -// argc's and argv's are substituted with CommandLine::functions() -// -// See Also: -// -// -// Revisions and History: -// 1/07/99 [HAI] - created -// -static errorType evaluateArgs(void) -{ - errorType retVal = ERR_NONE; - - // parse the commandline - const CommandLine::MatchCode mc = CommandLine::parseOptions(optionSpecArray, optionSpecCount); - if (mc != CommandLine::MC_MATCH) - { - // -TF- add call to retrieve command line error buffer for display (as soon as it is written!) - printf("WARNING: usage error detected, printing help.\n"); - help(); - return ERR_OPTIONS; - } - else if (CommandLine::getOccurrenceCount(SNAME_HELP)) - { - // user specified help - help(); - retVal = ERR_HELPREQUEST; - return(retVal); - } - - // at this point, we can assume a valid combination of options has been specified on the commandline - - - // setup input filename - strcpy(inFileName, CommandLine::getOptionString(SNAME_INPUT_FILE)); - - - // handle output filename spec - if (CommandLine::getOccurrenceCount(SNAME_OUTPUT_FILE)) - { - strcpy(outFileName, CommandLine::getOptionString(SNAME_OUTPUT_FILE)); - } - else if (CommandLine::getOccurrenceCount(SNAME_PRAGMA_TARGET)) - { - // use pragma target within iff source for output filename - usePragma = true; - } - else - { - // no output option specified on commandline, derive from input filename - char *terminator; - - // start with input file pathname - strcpy(outFileName, inFileName); - - // try to terminate at rightmost '.' - terminator = strrchr(outFileName, '.'); - if (terminator) - *terminator = 0; - - // append the default iff extension - strcat(outFileName, ".iff"); - } - - - // handle options (get them out of the way, as we use them later) - useCCCP = (CommandLine::getOccurrenceCount(SNAME_CCCP) != 0); - verboseMode = (CommandLine::getOccurrenceCount(SNAME_VERBOSE) != 0); - debugMode = (CommandLine::getOccurrenceCount(SNAME_DEBUG) != 0); - - - // preprocess the input file - if (0 == preprocessSource(inFileName)) - { - if (verboseMode) - { - sprintf(err_msg,"Now compiling %s...\n", inFileName); - MIFFMessage(err_msg, 0); - } - if (ERR_NONE == retVal) - retVal = loadInputToBuffer(sourceBuffer, bufferSize); - } - else - { - // preprocessSource returned an error... - retVal = ERR_PREPROCESS; - } - if (retVal != ERR_NONE) - return retVal; - - return retVal; - -#if 0 - - errorType retVal = ERR_NONE; // assume no error has been found - bool outPathUsed = false; // flag to monitor if -o flag was used, if so, we can ignore -d, -p, -e, -f - bool inFileEntered = false; - int argc = CommandLine::getPlainCount(); - - // get default values from DOS - char currentDir[maxStringSize]; - if (NULL == getcwd(currentDir, maxStringSize)) // get current working directory - { - retVal = ERR_UNKNOWNDIR; - return(retVal); - } - drive[0] = currentDir[0]; // drive letter - drive[1] = 0; // and null terminate it - strcpy(extension, "IFF"); // default to uppercase .IFF - strcpy(directory, ¤tDir[2]); // get everything after the Drive: including the first backslash - filename[0] = 0; - - // see specs.txt for requests - // scan for any argv's that has '-' in the argv[n][0]'s character - for (int index = 0; index < argc; index++) // note: if using argv[] rather then CommandLine::getPlainString() then start with 1 rather then 0 - { - if ('-' == CommandLine::getPlainString(index)[0]) - { - // we've found a parameter switch - switch (tolower(CommandLine::getPlainString(index)[1])) // assume non case sensitive switches - { - case 'i': // install via #pragma - { - usePragma = true; - break; - } - - case 'c': // use CCCP instead of CPP - useCCCP = true; - break; - - case 'v': // don't show any debug message - verboseMode = true; - break; - - case '$': - debugMode = true; - break; - - case 'o': // target output file name and path (complete path) - { - index++; // next param - outPathUsed = true; - strcpy(outFileName, CommandLine::getPlainString(index)); - break; - - } - - case 'd': // target drive letter (-p must be present) - { - if (!outPathUsed) - { - index++; // next param - strcpy(drive, CommandLine::getPlainString(index)); - } - else - index++; // skip the drive letter arg that SHOULD follow the -d option - break; - } - - case 'p': // target pathname - { - if (!outPathUsed) - { - index++; // next param - strcpy(directory, CommandLine::getPlainString(index)); - } - else - index++; // skip the pathname arg that follows the -p option - break; - } - - case 'f': // target filename - { - if (!outPathUsed) - { - index++; // next param - strcpy(filename, CommandLine::getPlainString(index)); - } - else - index++; // skip the filename arg that follows the -f - break; - } - - case 'e': // target extension - { - if (!outPathUsed) - { - index++; // next param - strcpy(extension, CommandLine::getPlainString(index)); - } - else - index++; // skip the extension arg that follows the -e - break; - } - - case 'h': // help! - case '?': - { - help(); - index = argc; // force to exit - retVal = ERR_HELPREQUEST; - return(retVal); // special case, ONLY time I call return() in the middle of the function (because I check for argc < 2 at the end of the code) - break; - } - - default: - { - sprintf(err_msg, "\nUnknown parameter %s, use -h to seek help...\n", CommandLine::getPlainString(index)); - MIFFMessage(err_msg, 1); - index = argc; // force to exit - break; - } - } - } - else - { - // we found an arg that doesn't start with '-' so let's assume it's a filename - if (!inFileEntered) - { - strcpy(inFileName, CommandLine::getPlainString(index)); - inFileEntered = true; - } - else - { - retVal = ERR_MULTIPLEINFILE; - index = argc; - } - - // now construct the DEFAULT filename for this file by scanning backwards to front and only extracting the filename (no extension, no path) - if (ERR_NONE == retVal) - { - char sourceName[maxStringSize]; - strcpy(sourceName, inFileName); // make a duplicate for us to play with - for (int strIndex = strlen(sourceName); strIndex > 0; strIndex--) - { - if ('.' == sourceName[strIndex]) - sourceName[strIndex] = 0; // put a stopper here... we are assuming that '.' indicates extension! I'm going to assume that the person is just testing me if s/he decides to use filename like "foo.bar.psych" which will truncate to "foo" - if ('\\' == sourceName[strIndex]) - break; // get out, for we've reached the path name... - } - - // ok, by here, strIndex should point to either beginning of the string, or where the first '\' was found scanning backwards - strcpy(filename, &sourceName[strIndex]); // ta-da-! - } - } - } - - if (inFileEntered) - { - if (0 == preprocessSource(inFileName)) - { - if (verboseMode) - { - // using err_msg as my temp buffer... - sprintf(err_msg,"Now compiling %s\n", inFileName); - MIFFMessage(err_msg, 0); - } - - if (ERR_NONE == retVal) - retVal = loadInputToBuffer(sourceBuffer, bufferSize); - } - else // preprocessSource returned an error... - { - retVal = ERR_PREPROCESS; - } - } - else // inFileEntered == false - { - MIFFMessage("Missing input filename in command line!", 1); - } - - // construct a outFileName[] based on drive[], directory[], filename[], and extension[] - if (!outPathUsed && (ERR_NONE == retVal)) - { - if (inFileName[0]) // make sure the user has entered a input filename - sprintf(outFileName,"%s:%s\\%s.%s", drive, directory, filename, extension); - } - - if (argc < 1) - retVal = ERR_ARGSTOOFEW; // we can do this because we know -h was not entered... - - return(retVal); - -#endif - -} - - -//--------------------------------------------------------------------------- -// reads the tmeporary files spit out by CCCP and stuffs the plain text into source buffer -// -// Return Value: -// errorType -// -// Remarks: -// -// -// See Also: -// -// -// Revisions and History: -// 1/14/99 [HAI] - created -// -static errorType loadInputToBuffer( - void * dest, // destination address of where you want the date to be read - int maxBufferSize // maximum destination data pool size - ) -{ - errorType retVal = ERR_NONE; - InputFileHandler *inFileHandler = new InputFileHandler("miff.$$$"); - if (inFileHandler) - { - int sizeRead = inFileHandler->read(dest, maxBufferSize); - if (sizeRead >= maxBufferSize) - { - retVal = ERR_BUFFERTOOSMALL; - } - else - { - reinterpret_cast(dest)[sizeRead] = 0; // so stupid... but if you don't zero-terminate at exact spot, YYInput may chokes because of extra grammer that may exist... - } - if (!debugMode) - inFileHandler->deleteFile("miff.$$$", true); // no need for temp file now... - - // we've successfully read the file, now close it... - delete inFileHandler; - } - else // inFileName is NULL - { - retVal = ERR_FILENOTFOUND; - } - - return(retVal); -} - -//--------------------------------------------------------------------------- -// help function called by main upon -h switch -// -// Return Value: -// none -// -// Remarks: -// #include's mIFF.dox -// make sure to update the version when modified. -// Notice that help() does NOT go thru MIFFMessage() because we want it to -// print out whether it's verbose mode or not... -// -// See Also: -// mIFF.dox -// -// Revisions and History: -// 1/07/99 [HAI] - created -// -static void help(void) -{ - printf("\nmIFF v%s (DOS version) - Bootprint Ent. (c) 1999\n", version); - printf("Hideki Ikeda\n"); -#include "mIFF.dox" -} - - -//--------------------------------------------------------------------------- -// upon exit from main(), if error has been found, it calls here to inform the user of the type of errors it has encounted. -// -// Return Value: -// none -// -// Remarks: -// use -q switch to suppress error messages - but in shell, return value can be used to determine the handling -// -// See Also: -// -// -// Revisions and History: -// 1/07/99 [HAI] - created -// -static void handleError(errorType error) -{ - if (ERR_NONE == error) - return; - - switch (error) - { - case ERR_NONE: - break; - - case ERR_FILENOTFOUND: - MIFFMessage("ERROR: INPUT File not found!\n", 1); - break; - - case ERR_ARGSTOOFEW: - MIFFMessage("ERROR: Not enough arguments. Use -h for help.\n", 1); - break; - - case ERR_BUFFERTOOSMALL: - MIFFMessage("ERROR: Internally allocated buffer for reading\nsource code is too small, increase buffer and re-compile\n", 1); - break; - - case ERR_UNKNOWNDIR: - MIFFMessage("ERROR: Directory unknown...\n", 1); - break; - - case ERR_PREPROCESS: - MIFFMessage("ERROR: Possible problems running the GNU C Preprocessor.\n", 1); - break; - - case ERR_MULTIPLEINFILE: - MIFFMessage("ERROR: There can only be ONE inputfile name.\nPerhaps you've forgotten the -o option flag\n", 1); - break; - - case ERR_ENGINE: - MIFFMessage("ERROR: Engine returned a non-zero value...\n", 1); - break; - - case ERR_PARSER: - MIFFMessage("ERROR: Parser error\n", 1); - break; - - case ERR_HELPREQUEST: - break; - - case ERR_OPTIONS: - MIFFMessage("ERROR: Failed to handle command line options\n", 1); - break; - - default: - MIFFMessage("ERROR: Unknown error, you suck!\n", 1); - break; - } -} - - -///////////////////////////////////////////////////////////////////////////// -// gotta write all these externs because you can't call C++ class based non-static -// functions from C... So we will use here as the bridge between the two -// languages - - -//--------------------------------------------------------------------------- -// Message output handler called by ALL external "C" functions -// -// Return Value: -// none -// -// Remarks: -// all the messages that are displayed are channeled thru this function. Note the -q quiet mode suppresses all messages. -// this is an extern "C" function -// -// See Also: -// yyerror() -// -// Revisions and History: -// 1/07/99 [] - created -// -extern "C" void MIFFMessage(char *message, // null terminated string to be displayed - int forceOutput) // if non-zero, it will print out even in quiet mode (for ERRORs) -{ - if (forceOutput) - fprintf(stdout, "%s\n", message); - else if (verboseMode) - fprintf(stdout, "%s\n", message); - OutputDebugString(message); - OutputDebugString("\n"); -} - -// Only call this via parser!!! -extern "C" void MIFFSetError(void) -{ - errorFlag = ERR_PARSER; -} - -//--------------------------------------------------------------------------- -// validation of the filename passed are legal. -// -// Return Value: -// bool usePragma - whether #pragma is ignored or not -// -// Remarks: -// if -i switch is used then #pragma's are expected -// this is an extern "C" function -// -// See Also: -// -// -// Revisions and History: -// 1/07/99 [ ] - created -// -extern "C" int validateTargetFilename( char *targetFileName, // pointer to where we can store the string filename - unsigned maxTargetBufSize // size of the filename string buffer - ) -{ - if (strlen(outFileName) > maxTargetBufSize) - MIFFMessage("Internal error, increase string buffer size in parser.yac and recompile!", 1); - - strcpy(targetFileName, outFileName); - - return(usePragma); -} - - -//--------------------------------------------------------------------------- -// function calls CCCP or CPP via shell to preprocess the source code for #include's and #define's via C-Compatible Compiler Preprocessor -// -// Return Value: -// shell return value (4DOS is very generous on returning different values, while DOS just returns 0 all the time) -// -// Remarks: -// use -c switch to use CCCP rather then CPP in your search path -// -// See Also: -// -// -// Revisions and History: -// 1/07/99 [ ] - created -// -static int preprocessSource(char *sourceName) -{ - char shellCommand[512]; - int retVal = 0; - - memset(shellCommand, 0, sizeof(shellCommand)); - -// if (!runningUnderNT) - { - - if (verboseMode) - MIFFMessage("Preprocessing... via CCCP", 0); - - // CCCP parameters: - // -nostdinc -nostdinc++ - do NOT search for standard include directory; without this, your - // puter would be just twiddling its thumb because CCCP can't find it... - // -pedantic - issue warnings (use pedantic-errors if you want it as errors) - // required by the ANSI C standard in certain cases such as comments that - // follow the #else/#endif - // -dD - output #defines (for the purpose of error msg I parse) - // -H - display the name of the header/included files (verbose mode) - // -P - originally, I had this... so it won't show the # line_num "filename" ??? - if (!useCCCP && verboseMode) - { - sprintf(shellCommand, "cpp -nostdinc -nostdinc++ -x c++ -pedantic -Wall -dD -H %s 'miff.$$$'", sourceName); - } - else if (!useCCCP && !verboseMode) - { - sprintf(shellCommand, "cpp -nostdinc -nostdinc++ -x c++ -pedantic -Wall -dD %s 'miff.$$$'", sourceName); - } - else if (useCCCP && verboseMode) - { - sprintf(shellCommand, "cccp -nostdinc -nostdinc++ -x c++ -pedantic -Wall -dD -H %s 'miff.$$$'", sourceName); - } - else - sprintf(shellCommand, "cccp -nostdinc -nostdinc++ -x c++ -pedantic -Wall -dD %s 'miff.$$$'", sourceName); - } -// else - { - // running under NT. Use the MSVC cl since it deals with long filenames on fat16/fat32 partitions correctly - // and ccp and cccp don't -// sprintf(shellCommand, "cl /nologo /W4 /EP %s > miff.$$$", sourceName); - } - - retVal = system(shellCommand); - if (2 == retVal) // actually, I think 4DOS reports 2 for cannot find file, but DOS returns a 0... - { - REPORT_LOG(true, ("failed to execute following shell command (%d):\n", retVal)); - REPORT_LOG(true, (" %s\n", shellCommand)); - MIFFMessage("\n\nERROR: Cannot find preprocessor (either CCCP.EXE, CPP.EXE or CL.EXE (under NT) in the search path...\n", 1); - MIFFMessage("Please make sure the preprocessor is in your search path!\n", 1); - } - return(retVal); -} - -extern "C" void MIFFSetIFFName(const char *newFileName) -{ - if (ERR_NONE != errorFlag) - return; - - if (outfileHandler) - outfileHandler->setCurrentFilename(newFileName); -} - -extern "C" void MIFFinsertForm(const char *formName) -{ - if (ERR_NONE != errorFlag) - return; - - if (outfileHandler) - outfileHandler->insertForm(formName); -} - -extern "C" void MIFFinsertChunk(const char *chunkName) -{ - if (ERR_NONE != errorFlag) - return; - - if (outfileHandler) - outfileHandler->insertChunk(chunkName); -} - -extern "C" void MIFFinsertChunkData(void * buffer, unsigned bufferSize) -{ - if (ERR_NONE != errorFlag) - return; - - if (outfileHandler) - outfileHandler->insertChunkData(buffer, bufferSize); -} - -extern "C" int MIFFloadRawData(char *fname, void * buffer, unsigned maxBufferSize) -{ - int sizeRead = -1; - - if (ERR_NONE != errorFlag) - return(sizeRead); // should be -1 - - InputFileHandler * inFileName = new InputFileHandler(fname); - if (inFileName) - { - sizeRead = inFileName->read(buffer, maxBufferSize); - if (static_cast(sizeRead) >= maxBufferSize) - { - handleError(ERR_BUFFERTOOSMALL); - sizeRead = -1; - } - delete inFileName; - } - - return(sizeRead); -} - -extern "C" void MIFFexitChunk(void) -{ - if (ERR_NONE != errorFlag) - return; - - if (outfileHandler) - outfileHandler->exitChunk(); -} -extern "C" void MIFFexitForm(void) -{ - if (ERR_NONE != errorFlag) - return; - - if (outfileHandler) - outfileHandler->exitForm(); -} - -extern "C" char * MIFFallocString(int sizeOfString) -{ - return(new char[sizeOfString]); -} - -extern "C" void MIFFfreeString(char * pointer) -{ - delete [] pointer; -} - -extern "C" unsigned long MIFFgetLabelHash(char * inputStream) -{ - return (unsigned long)Crc::calculate(inputStream); -} - -//=========================================================================== -//============================================================ End-of-file == -//=========================================================================== - diff --git a/src/engine/client/application/Miff/src/linux/parser.lex b/src/engine/client/application/Miff/src/linux/parser.lex deleted file mode 100644 index 3989ec880..000000000 --- a/src/engine/client/application/Miff/src/linux/parser.lex +++ /dev/null @@ -1,517 +0,0 @@ -%option full - -%{ -/*-----------------------------------------------------------------------------** -** FILE: parser.lex ** -** (c) 1998 - Bootprint GTInteractive ** -** ** -** DESCRIPTION: lexical analyzer for mIFF ** -** ** -** AUTHOR: Hideki Ikeda ** -** ** -** HISTORY: ** -** ** -** Notes: companion to parser.yac ** -**-----------------------------------------------------------------------------*/ -/* Disable compiler warnings (we want warning level 4) for anything that flex spits out */ -#pragma warning (disable: 4127) /* conditional expression is constant - ie. while(1) */ -#pragma warning (disable: 4131) /* usage of old-style declarator */ -#pragma warning (disable: 4098) /* void function returning a vlue - this is because yyterminate() is defined as return() */ -#pragma warning (disable: 4505) /* unreferenced local function has been removed (to be direct: yyunput()) */ - -/* include files */ -#include "parser.h" /* NOTE: make sure this matches what Bison/yacc spits out */ - -#include -#include - -/*--------------------------------** -** exteranl prototype declaration ** -**--------------------------------*/ -void MIFFMessage(char *message, int forceOutput); -void MIFFSetError(void); -char * MIFFallocString(int sizeOfString); -void MIFFfreeString(char * pointer); - -int yyparse(); - -/* prototype declaration */ -int MIFFYYInput(char *buf,int max_size); -void initParser(void); -void count(void); -void yyerror(char *err); -void open_brace(void); -void close_brace(void); -int count_brace(void); - -void printString(char *str); - -/* global vars that has to be pre-declared because it's referenced by the lexical analyzer */ -int initialCompile = 0; -int globalErrorFlag = 0; -char inFileName[512]; /* keep track of source file name for error message */ - -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) (result = MIFFYYInput(buf,max_size)) - -#define SPACE_COUNT_FOR_TAB (8) - -%} - -DIGIT [0-9] -HEXDIGIT [0-9a-fA-F] -LETTER [A-z_] -FLOATSYM (f|F|l|L) -INTSYM (u|U|l|L)* -EXP (e|E)(\+|-)? - -%% -"//"[^\n]*\n { - /* don't do count(); */ - } - -"#define"[^\n]*\n { - /* don't you love regular expression? [^\n]* everything but \n, and then end with \n */ - /* don't do count(); just like comments */ - /* return(DEFINE); <-- note: #define's are ignored in parser for they are handled via preprocessors CCCP */ - } - -\"([^\"]|(\\\"))*\" { - /* start with " then ( [^\"] | (\\\") )* which means either anything but " OR \" of multiple encounter, and then close with " */ - /* case for "string" literals */ - char *s; // allocate space for string and pass the string pointer rather then yytext - - count(); - s = MIFFallocString(strlen(yytext) + 1); - strcpy(s, yytext+1); /* strip off the double quotes */ - s[strlen(yytext+1)-1] = 0; /* strip off the ending double quotes */ - yylval.stype = s; - return(STR_LIT); - } - -"form" | -"FORM" { - count(); - return(FORM); - } - -"chunk" | -"CHUNK" { - count(); - return(CHUNK); - } - -"int32" { - count(); - return(INT32); - } -"int16" { - count(); - return(INT16); - } -"int8" { - count(); - return(INT8); - } -"uint32" { - count(); - return(UINT32); - } -"uint16" { - count(); - return(UINT16); - } -"uint8" { - count(); - return(UINT8); - } -"float" { - count(); - return(FLOAT); - } -"double" { - count(); - return(DOUBLE); - } -"string" | -"cstring" | -"CString" { - count(); - return(STRING); - } -"wstring" | -"WString" { - count(); - return(WSTRING); - } -"labelhash" { - count(); - return(LABELHASH); - } - -"sin" { - count(); - return(SIN); - } -"cos" { - count(); - return(COS); - } -"tan" { - count(); - return(TAN); - } -"asin" { - count(); - return(ASIN); - } -"acos" { - count(); - return(ACOS); - } -"atan" { - count(); - return(ATAN); - } - -"enum" { - count(); - return(ENUMSTRUCT); - } - -"includeIFF" | -"includeiff" { - count(); - return(INCLUDEIFF); - } -"include" { - count(); - return(INCLUDEBIN); - } -"#include" { - count(); - return(INCLUDESOURCE); - } -"#pragma" { - count(); - return(PRAGMA); - } -"drive" { - count(); - return(PRAGMA_DRIVE); - } -"directory" { - count(); - return(PRAGMA_DIR); - } -"filename" { - count(); - return(PRAGMA_FNAME); - } -"extension" { - count(); - return(PRAGMA_EXT); - } - -{LETTER}({LETTER}|{DIGIT})* { - /* label identifiers */ - char *s; // allocate space for string and pass the string pointer rather then yytext - - count(); - s = MIFFallocString(strlen(yytext) + 1); - strcpy(s, yytext); - yylval.stype = s; - return(IDENTIFIER); - } - -{DIGIT}*"."{DIGIT}+{FLOATSYM}? { - /* handle numericals (floats) */ - /* - * {DIGIT}*"."{DIGIT}+{FLOATSYM}? means zero or more digits . one or more digit and with/without f at the end - */ - count(); - /* make sure to store it to dtype, and use strtod to convert to double */ - yylval.dtype = strtod((char *) yytext, (char **) 0); - return(FLOAT_LIT); - } - -0[xX]{HEXDIGIT}+{INTSYM}? | -0{DIGIT}+{INTSYM}? | -{DIGIT}+{INTSYM}? { - /* handle numericals ( hex, ints) */ - /* - * 0[xX]{HEXDIGIT}+{INTSYM}? means start with 0, then X one or more digit and you can put int symbol if you want - * 0{DIGIT}+{INTSYM}? means start with 0, one ore more digit and w/or w/o int symbol - * {DIGIT}+{INTSYM}? means one or more digit and w/or w/o int symbol - */ - count(); - /* make sure to store it to ltype (long), and use strtod to convert to unsigned long */ - yylval.ltype = strtoul((char *) yytext, (char **) 0, 0); - return(LIT); - } - -'(\\.|[^\\'])+' { - /* handle 'x' - single character */ - count(); - yylval.chtype = yytext[1]; - return(CHAR_LIT); - } - -"#" { - /* #'s are used for informing the parser which file and line number it is processing (debug purpose) */ - count(); - return(POUND); - } - -">>" { - count(); - return(SHIFTRIGHT); - } -"<<" { - count(); - return(SHIFTLEFT); - } -"^^" { - count(); - return(RAISEDPOWER); - } - -"[" | -"]" | -"^" | -";" | -"," | -":" | -"=" | -"(" | -")" | -"." | -"&" | -"!" | -"~" | -"-" | -"+" | -"*" | -"/" | -"%" | -"<" | -">" | -"|" | -"?" { - /* valid operators */ - count(); - yylval.stype = yytext; - return(* yylval.stype); - } - -"{" { - count(); - open_brace(); - yylval.stype = yytext; - return(* yylval.stype); - } -"}" { - count(); - close_brace(); - yylval.stype = yytext; - return(* yylval.stype); - } - -[ \t\n\r]+ { - /* white spaces and newlines are ignored */ - count(); - } - -<> { - /* do a count on bracket matching... */ - if (0 == count_brace()) - { - if (!initialCompile && !globalErrorFlag) - MIFFMessage("mIFF successfully compiled!\n", 0); - } - - yyterminate(); /* tell yyparse() it's time to quit! DO NOT comment or delete this line! */ - } - -. { - /* anything that's not a rule from above goes here */ - count(); - yyerror((char *) yytext); - } -%% - -/*--------------------** -** C supporting codes ** -**--------------------*/ - -/*------------------** -** static variables ** -**------------------*/ -static char *MIFFInputStream; -int column = 0; -int line_num = 1; -int line_num2 = 1; -char error_line_buffer[256]; -long brace_counter = 0; - - -/*---------------------------------------------------------------------** -** Initialize all the static variables before all calls to MIFFCompile ** -**---------------------------------------------------------------------*/ -void initParser(void) -{ - line_num = 1; - column = 0; - - brace_counter = 0; - error_line_buffer[0] = 0; - - globalErrorFlag = 0; - - memset(inFileName, 0, 512); /* make sure to change this size if the char array gets bigger... */ -} - -/*-------------------------------------------------** -** generate a dialog box to MFC to report an error ** -**-------------------------------------------------*/ -void yyerror(char *err) /* called by yyparse() */ -{ - char myString[256]; - - if (!initialCompile) - { - /* spit it out in MSDev error format */ - sprintf(myString, "\n%s(%d) : yyERROR : %s\n>>%s<<", inFileName, line_num, err, error_line_buffer); - MIFFMessage(myString, 1); - globalErrorFlag = 1; - MIFFSetError(); /* set global error flag for shell as well */ - yyterminate(); - } - -} - -/*-------------------------** -** our version of YY_INPUT ** -**-------------------------*/ -int MIFFYYInput(char *buf,int max_size) -{ - int len = strlen(MIFFInputStream); - int n = max_size < len ? max_size : len; - if (n > 0) - { - memcpy(buf,MIFFInputStream,n); - MIFFInputStream += n; - } - return(n); -} - -/*------------------------------------------------------------** -** line and column counter for error searching during compile ** -**------------------------------------------------------------*/ -void count() -{ - int i; - static char *elb = error_line_buffer; - for (i = 0; yytext[i] != '\0'; i++) - { - if (yytext[i] == '\n') - { - column = 0; - line_num++; - elb = error_line_buffer; - } - else - { - *elb++ = yytext[i]; - if (yytext[i] == '\t') - column += SPACE_COUNT_FOR_TAB - (column & (SPACE_COUNT_FOR_TAB - 1)); - else - column++; - } - *elb = 0; - } -} - -/*--------------------------------------------------------------** -** sets up current line number and filename the error came from ** -**--------------------------------------------------------------*/ -void setCurrentLineNumber(int lineNum, char * fileName, int mysteryNum) -{ - line_num = lineNum; - strcpy(inFileName, fileName); - line_num2 = mysteryNum; -} - -/*----------------------------------------------** -** MIFFCompile called by CMIFFView::OnCompile() ** -**----------------------------------------------*/ -void MIFFCompile(char *inputStream, char *inputFileName) -{ - MIFFInputStream = inputStream; - yyrestart(0); - initParser(); - initialCompile = 0; - strcpy(inFileName, inputFileName); - yyparse(); -} - -void MIFFCompileInit(char *inputStream, char *inputFileName) -{ - MIFFInputStream = inputStream; - yyrestart(0); - initParser(); - initialCompile = 1; - strcpy(inFileName, inputFileName); - yyparse(); -} - -/*---------------------------------------** -** matching of open/close brace checking ** -**---------------------------------------*/ -void open_brace(void) -{ - brace_counter++; -} - -void close_brace(void) -{ - brace_counter--; -} - -/* - * what: count_brace(): - * return: 0 == all braces matched - */ -int count_brace(void) -{ - if (0 == brace_counter) /* things are fine... */ - return(0); - - /* if this is called, we should have 0 brace counter if not, we have a mis-match*/ - if (brace_counter > 0) - { - /* a mismatch */ - yyerror("There are more OPEN brackets then closed"); - } - else if (brace_counter < 0) - { - yyerror("There are more CLOSED brackets then open"); - } - - return(-1); -} - -/*-----------------------------------------------------------------------** -** FLEX.SLK requires this prototype function so I'm forced to do this... ** -**-----------------------------------------------------------------------*/ -int yywrap() -{ - return(1); -} - -void printString(char *str) -{ - char ts[256]; - sprintf(ts, "%s - %s", str, yytext); - MIFFMessage(ts, 0); -} diff --git a/src/engine/client/application/Miff/src/linux/parser.yac b/src/engine/client/application/Miff/src/linux/parser.yac deleted file mode 100644 index 8412cbea6..000000000 --- a/src/engine/client/application/Miff/src/linux/parser.yac +++ /dev/null @@ -1,1003 +0,0 @@ -%expect 1 -%{ -/*-----------------------------------------------------------------------------** -** FILE: parser.yac ** -** (c) 1998 - Bootprint GTInteractive ** -** ** -** DESCRIPTION: parser for mIFF ** -** ** -** AUTHOR: Hideki Ikeda ** -** HISTORY: ** -** ** -** Notes: companion to parser.lex ** -**-----------------------------------------------------------------------------*/ - -/*---------------** -** C declaration ** -**---------------*/ -#pragma warning (disable: 4005) /* macro redefinition - bision.simple redefines alloca() */ -#pragma warning (disable: 4127) /* conditional expression is constant - in bison.simple */ -#pragma warning (disable: 4131) /* uses old-style declarator - mostly in bison.simple */ -#pragma warning (disable: 4244) /* possible loss of data due to conversion from one type to another - bision.simple */ -#pragma warning (disable: 4701) /* local variable ('yyval' in first case) may be used without having been initialed */ -// #pragma warning (disable: 6311) /* compiler malloc.h: see previous definition of alloca() */ - -/* include files */ -#include /* for pow() and stuff */ -#include -#include /* for toupper() */ -#include /* for wide character (16bit) strings */ - -#include - -/*----------------------------------------------------------------** -** debug options, turn these on to TEST ONLY! don't leave these ** -** switch on, it's annoying as hell in console mode! ** -** NOTE: if you turn YYERROR_VERBOSE on, you MUST have YYDEBUG! ** -** IMHO, it's better off using primitive printf() method to debug ** -**----------------------------------------------------------------*/ -#define YYERROR_VERBOSE 1 -#define YYDEBUG 1 - -#undef YYERROR_VERBOSE -#undef YYDEBUG - -/* external prototype declaration */ -extern void MIFFMessage(char *message); /* found in mIFF.CPP */ -extern char * MIFFallocString(int sizeOfString); -extern void MIFFfreeString(char * pointer); -extern int validateTargetFilename(char *fname, int fnameSize); /* found mIFF.CPP */ -extern void yyerror(char *); -extern int yylex(void); -extern void setCurrentLineNumber(int lineNum, char * fileName, int mysteryNum); -extern void MIFFSetIFFName(const char *newFileName); -extern void MIFFinsertForm(const char *formName); -extern void MIFFinsertChunk(const char *chunkName); -extern void MIFFinsertChunkData(void * buffer, unsigned bufferSize); -extern int MIFFloadRawData(char *fname, void * buffer, unsigned maxBufferSize); -extern void MIFFexitChunk(void); -extern void MIFFexitForm(void); -extern unsigned long MIFFgetLabelHash(char *inputStream); - -/* local prototype declaration */ -void initGlobalVars(void); -void checkArgs(void); -void checkPragmas(void); - -void includeBinary(char *fname); - -void write32(long i32); -void write16(short i16); -void write8(char i8); -void writeU32(unsigned long ui32); -void writeU16(unsigned short ui16); -void writeU8(unsigned char u8); -void writeDouble(double d); -void writeFloat(float f); -void writeString(char *s); -void writeString16(char *s); -void writeLabelHash(char *s); -void writeTag(char *tag); -void writeSize(unsigned long size); -void writeData(void *dataPtr, unsigned dataSize); - -void initSymTable(void); -long searchEnumSymbolTable(char *symString); -long getEnumValue(long index); -void addEnumSymbol(char *symString, long value); -void parseESCstring(char *str, char *targetBuffer, int sizeOfTarget); - -/*----------------------------------------------** -** Global vars used by all functions and parser ** -**----------------------------------------------*/ -char err_msg[256]; -int errorFlag; - -/*-----------------------------------------------------------------------------** -** NOTE: this symbol table is ONLY used to construct symbols for enum table!!! ** -**-----------------------------------------------------------------------------*/ -#define MAX_SYMBOLS (1024) /* total number of symbols it can grow to... */ -#define MAX_SYMCHARS (128) /* I label thee insane if you have more the 128 char for your variable! */ -struct structEnumSymTableType -{ - char symbol[MAX_SYMCHARS]; - long value; -}; - -struct structEnumSymTableType symbolEnumTable[MAX_SYMBOLS]; -unsigned currSymIndex = 0; -long lastValue = -1; -char id[MAX_SYMCHARS]; - -/* vars set by pragmas */ -#define MAX_BUFFER_SIZE (16 * 1024 * 1024) -#define MAX_STRING_SIZE (512) -char drive[8]; -char directory[MAX_STRING_SIZE/2]; -char filename[MAX_STRING_SIZE/2]; -char extension[8]; -char outFileName[MAX_STRING_SIZE]; -int usePragmas; - -/*------------------------------------------------------------------------** -** The IRONY of these so-called temp-data's that are GLOBAL is ** -** that they aren't temp if functions called within are also using it ** -** This really gives me the creeps and goosbumps! DOWN with GLOBAL VARS! ** -**------------------------------------------------------------------------*/ -int iTemp, jTemp; -char byteTemp; -short wordTemp; -char tempStr[MAX_STRING_SIZE]; - -%} - -/*--------------------** -** Bison declarations ** -**--------------------*/ -%union { - long ltype; - double dtype; - char *stype; - char chtype; - - int tokentype; -} - -/*------------------------------------------------** -** define tokens defined in lex file ** -** NOTE: all LITERALs are treated as signed long ** -** all FLOAT_LITERALs are treated as double ** -**------------------------------------------------*/ -%token CHAR_LIT -%token STR_LIT -%token IDENTIFIER -%token LIT -%token FLOAT_LIT - -/* all command tokens are type */ -%token INT32 -%token INT16 -%token INT8 -%token UINT32 -%token UINT16 -%token UINT8 -%token FLOAT -%token DOUBLE -%token STRING -%token WSTRING -%token LABELHASH - -%token FORM -%token CHUNK -%token PRAGMA -%token PRAGMA_DRIVE PRAGMA_DIR PRAGMA_FNAME PRAGMA_EXT -%token ENUMSTRUCT -%token INCLUDESOURCE -%token INCLUDEBIN -%token INCLUDEIFF -%token SIN -%token COS -%token TAN -%token ACOS -%token ASIN -%token ATAN -%token POUND -%token SHIFTRIGHT -%token SHIFTLEFT -%token RAISEDPOWER - -%% - -/*------------------------------------------------------------------------** -** Begin Grammar rules ** -** ** -** Note: if possible, always try to use left recurrsion rather then right ** -** to save stack depth... ** -**------------------------------------------------------------------------*/ -mIFFSource: - { - /* initialize some global varibles before we start */ - initGlobalVars(); - checkArgs(); - } - preprocessor - { - /* take care of any mIFF related preprocessors that we might encounter */ - checkPragmas(); - } - body - ; - -/*----------------------** -** Preprocessor handler ** -**----------------------*/ -preprocessor: { /* we don't really have to have preprocessor */} - | preprocessor pragma - | preprocessor debugInfo /* we have to have debugInfo or else pragma gets confused when it finds a # line */ - ; - -pragma: PRAGMA PRAGMA_DRIVE STR_LIT { - if (usePragmas) - { - strcpy(drive, $3); - if (strlen(drive) > 2) - { - sprintf(err_msg, "Drive [%s] is not a valid drive [must be in C: format]", drive); - yyerror(err_msg); - } - drive[1] = ':'; - drive[2] = 0; - } - MIFFfreeString($3); - } - | PRAGMA PRAGMA_DIR STR_LIT { - if (usePragmas) - { - strcpy(directory, $3); - if (directory[strlen(directory)] != '\\') - directory[strlen(directory)] = '\\'; - directory[strlen(directory) + 1] = 0; - } - MIFFfreeString($3); - } - | PRAGMA PRAGMA_FNAME STR_LIT { - if (usePragmas) - strcpy(filename, $3); - MIFFfreeString($3); - } - | PRAGMA PRAGMA_EXT STR_LIT { - if (usePragmas) - strcpy(extension, $3); - MIFFfreeString($3); - } - | PRAGMA IDENTIFIER STR_LIT { - sprintf(err_msg, "Unknown PRAGMA identifier [%s]", $2); - yyerror(err_msg); - MIFFfreeString($2); - MIFFfreeString($3); - } - ; - -/*-------------------------------------------------------** -** This is the #line pragmas in a format of: ** -** # lineNum "FileName" mysteryNumber ** -** We call setCurrentLineNumber so when an error occurs, ** -** it will be sync'd to correct filename and linenumber ** -**-------------------------------------------------------*/ -debugInfo: POUND LIT STR_LIT { setCurrentLineNumber($2, $3, 0); MIFFfreeString($3);} - | POUND LIT STR_LIT LIT { setCurrentLineNumber($2, $3, $4); MIFFfreeString($3);} - ; - -/*-----------------------** -** The main body section ** -**-----------------------*/ -body: /* body can be empty */ - | body form formbody - | body chunk chunkbody - | body enumSection - | body includesource { /* do nothing... should not exist if went thru the preprocessor */ } - | body includeIFF - | body debugInfo - ; - -/*------------------------** -** Enumeration definition ** -**------------------------*/ -enumSection: ENUMSTRUCT enumDeclare '{' enumBody '}' enumType ';' { /* enumSection */ } - ; - -enumDeclare: { /* could have no declaration */ lastValue = -1; } - | IDENTIFIER { /* enumDeclare: ID */ lastValue = -1; MIFFfreeString($1);} - ; - -enumBody: { /* enumBody: can be empty list */ } - | enumAssign { /* enumAssign */ } - | enumBody ',' enumAssign { /* enumAssign, enumBody */ } - ; - -enumAssign: IDENTIFIER '=' exprL { - addEnumSymbol($1, $3); - MIFFfreeString($1); - } - | IDENTIFIER { /* in this case, inc 1 from last count */ - addEnumSymbol($1, ++lastValue); - MIFFfreeString($1); - } - ; - -enumType: /* type declaration can be empty */ - | enumList - ; - -enumList: IDENTIFIER { /* enumList: just ID */ MIFFfreeString($1);} - | enumList ',' IDENTIFIER { /* enumList: ID, enumList */ MIFFfreeString($3);} - ; - -/*----------------------------** -** different types of include ** -**----------------------------*/ -includesource: INCLUDESOURCE STR_LIT { /* do nothing... because CCCP/preprocessor takes care of this*/ MIFFfreeString($2);} - ; - -includebin: INCLUDEBIN STR_LIT { includeBinary($2); MIFFfreeString($2);} - ; - -includeIFF: INCLUDEIFF STR_LIT { includeBinary($2); MIFFfreeString($2);} - ; - -/*------------------** -** the FORM section ** -**------------------*/ -form: FORM STR_LIT { - /* first make sure we have 4 char for FORM name */ - if (strlen($2) > 4) - { - sprintf(err_msg, "FORM name %s greater then 4 char", $2); - yyerror(err_msg); - } - else if (!errorFlag) - { - /* pack the string with ' ' (spaces) if less then 4 chars */ - strcpy(tempStr, $2); - if (strlen(tempStr) < 4) - { - /* pack the string */ - for (iTemp = strlen(tempStr);iTemp < 4; iTemp++) - { - tempStr[iTemp] = ' '; /* pack it with space */ - } - } - - /* let's make sure we don't have a smart ass who wants to do form "FORM" */ - if ((toupper(tempStr[0]) == 'F') && - (toupper(tempStr[1]) == 'O') && - (toupper(tempStr[2]) == 'R') && - (toupper(tempStr[3]) == 'M')) - { - yyerror("FORM name CANNOT BE 'FORM'... nice try bozo!"); - } - - /* FORM */ - MIFFinsertForm(tempStr); - } - MIFFfreeString($2); - } - ; - -formbody: '{' formelements '}' { if (!errorFlag) MIFFexitForm(); }; - -formelements: body { /* recursion of multiple depth in form is allowed */ } - | INCLUDEBIN STR_LIT { - yyerror("Found attempt to include binary file inside FORM\nBinary file inclusion ONLY allowed inside a CHUNK!\nError"); - MIFFfreeString($2); - } - ; - -/*-------------------** -** the CHUNK section ** -**-------------------*/ -chunk: CHUNK STR_LIT { - /* first make sure we have 4 char for CHUNK name */ - if (strlen($2) > 4) - { - sprintf(err_msg, "CHUNK name %s greater then 4 char", $2); - yyerror(err_msg); - } - else if (!errorFlag) - { - /* pack the string with ' ' (spaces) if less then 4 chars */ - strcpy(tempStr, $2); - if (strlen(tempStr) < 4) - { - /* pack the string */ - for (iTemp = strlen(tempStr);iTemp < 4; iTemp++) - { - tempStr[iTemp] = ' '; /* pack it with space */ - } - } - - /* let's make sure we don't have a smart ass who wants to do chunk "FORM" */ - if ((toupper(tempStr[0]) == 'F') && - (toupper(tempStr[1]) == 'O') && - (toupper(tempStr[2]) == 'R') && - (toupper(tempStr[3]) == 'M')) - { - yyerror("CHUNK name CANNOT BE 'FORM'... nice try bozo!"); - } - - MIFFinsertChunk(tempStr); - } - MIFFfreeString($2); - } - ; - -chunkbody: '{' chunkelements '}' { if (!errorFlag) MIFFexitChunk(); }; - -chunkelements: /* can be empty */ - | chunkelements memalloc - | chunkelements includebin - | chunkelements debugInfo - | chunkelements includeIFF { yyerror("Found attempt to include IFF (binary) file inside CHUNK\nIFF inclusion ONLY allowed outside a CHUNK!\nError"); } - ; - -memalloc: INT32 l32AllocExpr { } - | INT16 l16AllocExpr { } - | INT8 l8AllocExpr { } - | UINT32 lU32AllocExpr { } - | UINT16 lU16AllocExpr { } - | UINT8 lU8AllocExpr { } - | FLOAT fAllocExpr { } - | DOUBLE dAllocExpr { } - | LABELHASH STR_LIT { - writeLabelHash($2); - } - | STRING STR_LIT { writeString($2); - /* now, add a NULL termination for this string */ - byteTemp = 0; write8(byteTemp); - MIFFfreeString($2); - } - | WSTRING STR_LIT { writeString16($2); - /* now, add a NULL termination for this string */ - wordTemp = 0; write16(wordTemp); - MIFFfreeString($2); - } - ; - -l32AllocExpr: exprL { write32($1); } - | l32AllocExpr ',' exprL { write32($3); } - ; - -l16AllocExpr: exprL { write16((short) $1); } - | l16AllocExpr ',' exprL { write16((short) $3); } - ; - -l8AllocExpr: exprL { write8((char) $1); } - | l8AllocExpr ',' exprL { write8((char) $3); } - ; - -lU32AllocExpr: exprL { writeU32($1); } - | lU32AllocExpr ',' exprL { writeU32($3); } - ; - -lU16AllocExpr: exprL { writeU16((unsigned short) $1); } - | lU16AllocExpr ',' exprL { writeU16((unsigned short) $3); } - ; - -lU8AllocExpr: exprL { writeU8((unsigned char) $1); } - | lU8AllocExpr ',' exprL { writeU8((unsigned char) $3); } - ; - -fAllocExpr: exprD { writeFloat((float) $1); } - | fAllocExpr ',' exprD { writeFloat((float) $3); } - ; - -dAllocExpr: exprD { writeDouble($1); } - | dAllocExpr ',' exprD { writeDouble($3); } - ; - - -/*-------------------------** -** expression for integers ** -**-------------------------*/ -exprL: exprL '+' factorL { $$ = $1 + $3; } - | exprL '-' factorL { $$ = $1 - $3; } - | exprL SHIFTLEFT factorL { $$ = $1 << $3; } - | exprL SHIFTRIGHT factorL { $$ = $1 >> $3; } - | exprL '&' factorL { $$ = $1 & $3; } - | exprL '|' factorL { $$ = $1 | $3; } - | exprL '^' factorL { $$ = $1 ^ $3; } - | factorL { $$ = ($1); } - ; - -factorL: factorL '*' termL { $$ = $1 * $3; } - | factorL '/' termL { $$ = $1 / $3; } - | factorL '%' termL { $$ = $1 % $3; } - | termL { $$ = ($1); } - ; - -termL: LIT { $$ = $1; } - | '~' termL { $$ = ~$2; } /* bitwise NOT */ - | '-' termL { $$ = -$2; } /* Unary minus */ - | '+' termL { $$ = $2; } /* Unary plus */ - | '(' exprL ')' { $$ = ($2); } - | IDENTIFIER { /* assume it's enum symbol */ - $$ = (signed long) getEnumValue(searchEnumSymbolTable($1)); - MIFFfreeString($1); - } - ; - -/*-----------------------** -** expression for floats ** -**-----------------------*/ -exprD: exprD '+' factorD { $$ = $1 + $3; } - | exprD '-' factorD { $$ = $1 - $3; } - | exprD RAISEDPOWER factorD { $$ = pow($1, $3);} /* exponentiation */ - | factorD { $$ = ($1); } - ; - -factorD: factorD '*' termD { $$ = $1 * $3; } - | factorD '/' termD { $$ = $1 / $3; } - | termD { $$ = ($1); } - ; - -termD: FLOAT_LIT { $$ = $1; } - | LIT { $$ = (double) $1; } /* we should be able to handle values that are integer and treat it as float */ - | '-' termD { $$ = -$2; } /* Unary minus */ - | '+' termD { $$ = $2; } /* Unary plus */ - | '(' exprD ')' { $$ = ($2); } - | SIN '(' exprD ')' { $$ = sin( $3 ); } - | COS '(' exprD ')' { $$ = cos( $3 ); } - | TAN '(' exprD ')' { $$ = tan( $3 ); } - | ACOS '(' exprD ')' { $$ = acos( $3 ); } - | ASIN '(' exprD ')' { $$ = asin( $3 ); } - | ATAN '(' exprD ')' { $$ = atan( $3 ); } - | IDENTIFIER { /* assume it's enum symbol */ - $$ = (signed long) getEnumValue(searchEnumSymbolTable($1)); - MIFFfreeString($1); - } - ; - -%% - -/*-------------------------------------------** -** and now... the supporting C functions... ** -**-------------------------------------------*/ -void initGlobalVars(void) -{ - /* assign defaults */ - drive[0] = 0; - directory[0] = 0; - filename[0] = 0; - extension[0] = 0; - err_msg[0] = 0; - usePragmas = 1; /* default to #pragmas enabled because as a stand-alone .YAC, we have no knowledge of outFileName */ - - errorFlag = 0; - - initSymTable(); -} - -void checkPragmas(void) -{ - int indexOriginal, indexDest; - char _tempStr[512]; - - if (usePragmas) - { - /* check after pre processor if output target is still NULL */ - if (!drive[0] && !errorFlag) - { - yyerror("Drive pragma not defined"); - errorFlag = 1; - } - if (!directory[0] && !errorFlag) - { - yyerror("Directory pragma not defined"); - errorFlag = 1; - } - if (!filename[0] && !errorFlag) - { - yyerror("Filename pragma not defined"); - errorFlag = 1; - } - if (!extension[0] && !errorFlag) - { - yyerror("Extension pragma not defined"); - errorFlag = 1; - } - - if (!errorFlag) - { - /* create an output file */ - strcpy(_tempStr, directory); /* copy directory to _tempStr because we'll be messing with directory */ - for (indexOriginal = 0, indexDest = 0; indexOriginal < (int) strlen(_tempStr); indexOriginal++) - { - /* search for double-slashes and convert it to single slash */ - if ((_tempStr[indexOriginal] == '\\') && (_tempStr[indexOriginal+1] == '\\')) - { - directory[indexDest] = '\\'; - indexOriginal++; - } - else - directory[indexDest] = _tempStr[indexOriginal]; /* copy current position of _tempStr to directory */ - indexDest++; - directory[indexDest] = 0; /* force NULL termination */ - } - sprintf(outFileName, "%s%s%s%s", drive, directory, filename, extension); - } - } /* if usePragmas */ - - MIFFSetIFFName(outFileName); /* tell mIFF we want to use this filename instead of whatever it has! */ -} - -/*--------------------------------------------------------------------------------------** -** This function is called early in the process to find out if usePragma flag was set ** -** in the command line or not. If it was, mIFF already has the outfile and will stuff ** -** it into the outFileName data pool. Even if mIFF had an idea of what the output file ** -** name is, if usePragma flag returned said it is true, then #pragas in the mIFF source ** -** is used instead and overrides whatever file name it has returned. ** -** see usePragmas() for more details. ** -**--------------------------------------------------------------------------------------*/ -void checkArgs(void) -{ - /* request an external function (found in either mIFF.CPP or mIFFView.CPP) to see if pragmas and filename was set... */ - usePragmas = validateTargetFilename(outFileName, sizeof(outFileName)); -} - -/*----------------------------** -** Write to FILE functions... ** -**----------------------------*/ -void write32(long i32) -{ - MIFFinsertChunkData(&i32, sizeof(long)); -} - -void write16(short i16) -{ - MIFFinsertChunkData(&i16, sizeof(short)); -} - -void write8(char i8) -{ - MIFFinsertChunkData(&i8, sizeof(char)); -} - -void writeU32(unsigned long ui32) -{ - MIFFinsertChunkData(&ui32, sizeof(long)); -} - -void writeU16(unsigned short ui16) -{ - MIFFinsertChunkData(&ui16, sizeof(short)); -} - -void writeU8(unsigned char ui8) -{ - MIFFinsertChunkData(&ui8, sizeof(char)); -} - -void writeDouble(double d) -{ - MIFFinsertChunkData(&d, sizeof(double)); -} - -void writeFloat(float f) -{ - MIFFinsertChunkData(&f, sizeof(float)); -} - -void writeString(char *s) -{ - char tempS[MAX_STRING_SIZE]; - parseESCstring(s, tempS, MAX_STRING_SIZE); - - MIFFinsertChunkData(tempS, strlen(tempS)); -} - -void writeString16(char *s) -{ - char tempS[MAX_STRING_SIZE]; - int charCount = 0; - wchar_t wtempStr[512]; /* just to be on the safe side, allocating huge array... */ - - parseESCstring(s, tempS, MAX_STRING_SIZE); - - /* make sure string length is less then the allocated wchar size */ - if ((strlen(tempS) * sizeof(wchar_t)) > (512* sizeof(wchar_t))) - yyerror("wstring: 16bit string too long to handle in buffer!\n"); - else - { - /* call MultiByteString to WideCharString function */ - charCount = mbstowcs(wtempStr, tempS, strlen(tempS)); - writeData(wtempStr, charCount * sizeof(wchar_t)); - } -} - -void writeLabelHash(char *s) -{ - writeU32(MIFFgetLabelHash(s)); -} - -/* search from escape string such as \n and convert it to actual byte */ -void parseESCstring(char *str, char *targetBuffer, int sizeOfTarget) -{ - char *sPtr = str; - int strIndex = 0; - char numString[32]; /* hopefully, never go over 3 char i.e. \x0FF */ - int numIndex = 0; - int tempNum = 0; - int exitParser = 0; - int loopFlag = 0; - - /* memory hog but cute way to convert ascii hex to number */ - int hexTable[256]; - memset(hexTable, 0xFF, 256); - hexTable['0'] = 0x00; - hexTable['1'] = 0x01; - hexTable['2'] = 0x02; - hexTable['3'] = 0x03; - hexTable['4'] = 0x04; - hexTable['5'] = 0x05; - hexTable['6'] = 0x06; - hexTable['7'] = 0x07; - hexTable['8'] = 0x08; - hexTable['9'] = 0x09; - hexTable['A'] = 0x0A; hexTable['a'] = 0x0A; - hexTable['B'] = 0x0B; hexTable['b'] = 0x0B; - hexTable['C'] = 0x0C; hexTable['c'] = 0x0C; - hexTable['D'] = 0x0D; hexTable['d'] = 0x0D; - hexTable['E'] = 0x0E; hexTable['e'] = 0x0E; - hexTable['F'] = 0x0F; hexTable['f'] = 0x0F; - - memset(targetBuffer, 0, sizeOfTarget); - while ((*sPtr) && !exitParser) /* assume we can go until NULL termination */ - { - /* check for escape sequences */ - if (*sPtr == '\\') - { - sPtr++; /* check out next character */ - switch (tolower(*sPtr)) - { - case 'a': /* BELL */ - { - targetBuffer[strIndex++] = '\a'; - break; - } - - case 'b': /* BACKSPACE */ - { - targetBuffer[strIndex++] = '\b'; - break; - } - - case 'f': /* FORMFEED */ - { - targetBuffer[strIndex++] = '\a'; - break; - } - - case 'n': /* NEWLINE */ - { - targetBuffer[strIndex++] = '\n'; - break; - } - - case 'r': /* CARRIAGE RETURN */ - { - targetBuffer[strIndex++] = '\r'; - break; - } - - case 't': /* TAB */ - { - targetBuffer[strIndex++] = '\t'; - break; - } - - case 'v': /* VERTICAL TAB */ - { - targetBuffer[strIndex++] = '\v'; - break; - } - - case '\'': /* SINGLE QUOTE */ - { - targetBuffer[strIndex++] = '\''; - break; - } - - case '\"': /* DOUBLE QUOTE */ - { - targetBuffer[strIndex++] = '\"'; - break; - } - - case '\\': /* BACKSLASH */ - { - targetBuffer[strIndex++] = '\\'; - break; - } - - case '?': /* LITERAL QUESTION MARK */ - { - targetBuffer[strIndex++] = '\?'; - break; - } - - case '0': /* ASCII octal */ - case '1': /* ASCII octal */ - case '2': /* ASCII octal */ - case '3': /* ASCII octal */ - case '4': /* ASCII octal */ - case '5': /* ASCII octal */ - case '6': /* ASCII octal */ - case '7': /* ASCII octal */ - { - /* read until non-digit encountered - if octal value is greater then \377 (400 or more) it is bigger the 255! */ - numIndex = 0; - - while ((*sPtr >= '0') && (*sPtr <= '7') && (*sPtr)) - { - numString[numIndex++] = *sPtr; - sPtr++; - if (numIndex > 3) - { - sprintf(err_msg, "Escape sequence Octal numbers greater then\noctal o400 (256 decimal)! [more then 3 digits]", *sPtr); - yyerror(err_msg); - exitParser = 1; - } - } - - /* now we should have string of octal number in numString */ - if (!exitParser) - { - if (numIndex == 3) - tempNum = (hexTable[numString[0]] * 64) + (hexTable[numString[1]] * 8) + hexTable[numString[2]]; - else if (numIndex == 2) - tempNum = (hexTable[numString[0]] * 8) + hexTable[numString[1]]; - else - tempNum = hexTable[numString[0]]; - - if (tempNum > 255) - { - sprintf(err_msg, "Escape sequence Octal numbers greater then\noctal o400 (256 decimal)!", tempNum); - yyerror(err_msg); - exitParser = 1; - } - - if (!exitParser) - targetBuffer[strIndex++] = tempNum; - } - break; - } - - case 'x': /* ASCII hex */ - { - /* we have to make sure the hex value is less then 256! */ - numIndex = 0; - loopFlag = 1; - sPtr++; /* skip the 'x' */ - - while ((0xFF != hexTable[*sPtr]) && (*sPtr)) - { - numString[numIndex++] = *sPtr; - sPtr++; - if (numIndex > 3) - { - sprintf(err_msg, "Escape sequence HEX numbers greater then 0x100\n(256 decimal)! [more then 3 digits]", *sPtr); - yyerror(err_msg); - exitParser = 1; - } - } - - if (!exitParser) - { - if (numIndex == 3) - tempNum = (hexTable[numString[0]] * 0x100) + (hexTable[numString[1]] * 0x10) + hexTable[numString[2]]; - else if (numIndex == 2) - tempNum = (hexTable[numString[0]] * 0x10) + hexTable[numString[1]]; - else - tempNum = hexTable[numString[0]]; - } - - if (tempNum > 255) - { - sprintf(err_msg, "Escape sequence HEX numbers greater then 0x100\n(256 decimal)!", *sPtr); - yyerror(err_msg); - exitParser = 1; - } - - if (!exitParser) - targetBuffer[strIndex++] = tempNum; - - break; - } - - case '8': - case '9': - { - /* they tried to do octal mode, but 8 and 9 is not in the definition of octal */ - yyerror("Attempted to enter escape sequence with non-octal value"); - exitParser = 1; - break; - } - - default: - sprintf(err_msg, "Unknown ESCape sequence \\%c found in string.\n", *sPtr); - yyerror(err_msg); - exitParser = 1; - break; - } - } - else - targetBuffer[strIndex++] = *sPtr; - sPtr++; - } -} - - -void writeData(void *dataPtr, unsigned dataSize) -{ - MIFFinsertChunkData(dataPtr, dataSize); -} - - -/* NOTE: includeBinary modifies fsize for the caller to access for adjusting the chunk size */ -void includeBinary(char *fname) -{ - char buffer[MAX_BUFFER_SIZE+1]; - int fsize = 0; - - fsize = MIFFloadRawData(fname, buffer, MAX_BUFFER_SIZE); - MIFFinsertChunkData(buffer, fsize); -} - -/*--------------------------------------------------------------------------------** -** Following functions below are all used for constructing, adding, and searching ** -** the symbol table created by enum keyword. It is at this moment, set in a way ** -** that if two identical symbols are added to the list, it will use the first ** -** symbol added to the list and ignores the rest (because of forward search) ** -**--------------------------------------------------------------------------------*/ -void initSymTable(void) -{ - memset(symbolEnumTable, 0, sizeof(struct structEnumSymTableType) * MAX_SYMBOLS); - currSymIndex = 0; - lastValue = -1; -} - -/* Searches thru the symbol table and returns the index */ -long searchEnumSymbolTable(char *symString) -{ - long index = 0; - int found = 0; - while ((0 != symbolEnumTable[index].symbol[0]) && !found) - { - - if (0 == strcmp(symbolEnumTable[index].symbol, symString)) - { - found = 1; - break; - } - else - index++; - } - - if (!found) - { - index = -1; - sprintf(err_msg, "Undefined symbol %s", symString); - yyerror(err_msg); - } - - return(index); -} - -long getEnumValue(long index) -{ - if (index >= 0) - return(symbolEnumTable[index].value); - return(-1); -} - -void addEnumSymbol(char *symString, long value) -{ - if (MAX_SYMCHARS < strlen(symString)) - { - /* somebody insane decided to use variable longer then max size! */ - sprintf(err_msg, "%s is longer then %d characters! [value: %d]", symString, MAX_SYMCHARS, value); - yyerror(err_msg); - } - else - { - strcpy(symbolEnumTable[currSymIndex].symbol, symString); - symbolEnumTable[currSymIndex].value = value; - lastValue = value; - currSymIndex++; - if (MAX_SYMBOLS < currSymIndex) - { - sprintf(err_msg, "Symbol table reached maximum size of %d", MAX_SYMBOLS); - yyerror(err_msg); - } - } -} diff --git a/src/engine/shared/application/ArmorExporterTool/src/linux/dummy.cpp b/src/engine/shared/application/ArmorExporterTool/src/linux/dummy.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/engine/shared/application/CoreWeaponExporterTool/src/linux/dummy.cpp b/src/engine/shared/application/CoreWeaponExporterTool/src/linux/dummy.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/engine/shared/application/DataTableTool/src/linux/dummy.cpp b/src/engine/shared/application/DataTableTool/src/linux/dummy.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/engine/shared/application/TemplateCompiler/src/linux/FirstTemplateCompiler.cpp b/src/engine/shared/application/TemplateCompiler/src/linux/FirstTemplateCompiler.cpp deleted file mode 100644 index ef9c16dc0..000000000 --- a/src/engine/shared/application/TemplateCompiler/src/linux/FirstTemplateCompiler.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "FirstTemplateCompiler.h" diff --git a/src/engine/shared/application/TemplateCompiler/src/linux/FirstTemplateCompiler.h b/src/engine/shared/application/TemplateCompiler/src/linux/FirstTemplateCompiler.h deleted file mode 100644 index d06501059..000000000 --- a/src/engine/shared/application/TemplateCompiler/src/linux/FirstTemplateCompiler.h +++ /dev/null @@ -1,9 +0,0 @@ -#include "sharedFoundationTypes/FoundationTypes.h" -#include "sharedDebug/FirstSharedDebug.h" -#include "sharedFoundation/FirstSharedFoundation.h" -#include -#include -#include -#include -#include - diff --git a/src/engine/shared/application/TemplateDefinitionCompiler/src/linux/FirstTemplateDefinitionCompiler.cpp b/src/engine/shared/application/TemplateDefinitionCompiler/src/linux/FirstTemplateDefinitionCompiler.cpp deleted file mode 100644 index 7f0e4151d..000000000 --- a/src/engine/shared/application/TemplateDefinitionCompiler/src/linux/FirstTemplateDefinitionCompiler.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "FirstTemplateDefinitionCompiler.h" - diff --git a/src/engine/shared/application/TemplateDefinitionCompiler/src/linux/FirstTemplateDefinitionCompiler.h b/src/engine/shared/application/TemplateDefinitionCompiler/src/linux/FirstTemplateDefinitionCompiler.h deleted file mode 100644 index d06501059..000000000 --- a/src/engine/shared/application/TemplateDefinitionCompiler/src/linux/FirstTemplateDefinitionCompiler.h +++ /dev/null @@ -1,9 +0,0 @@ -#include "sharedFoundationTypes/FoundationTypes.h" -#include "sharedDebug/FirstSharedDebug.h" -#include "sharedFoundation/FirstSharedFoundation.h" -#include -#include -#include -#include -#include - diff --git a/src/engine/shared/application/Turf/src/linux/FirstTurf.h b/src/engine/shared/application/Turf/src/linux/FirstTurf.h deleted file mode 100644 index f95425fa0..000000000 --- a/src/engine/shared/application/Turf/src/linux/FirstTurf.h +++ /dev/null @@ -1,17 +0,0 @@ -// ====================================================================== -// -// FirstTerrainViewer.h -// copyright 2001, sony online entertainment -// -// ====================================================================== - -#ifndef INCLUDED_FirstTerrainViewer_H -#define INCLUDED_FirstTerrainViewer_H - -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" - -// ====================================================================== - -#endif diff --git a/src/engine/shared/application/WeaponExporterTool/src/linux/dummy.cpp b/src/engine/shared/application/WeaponExporterTool/src/linux/dummy.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/engine/shared/library/sharedDatabaseInterface/src/linux/SQLC_Defs.h b/src/engine/shared/library/sharedDatabaseInterface/src/linux/SQLC_Defs.h deleted file mode 100644 index 6443b953e..000000000 --- a/src/engine/shared/library/sharedDatabaseInterface/src/linux/SQLC_Defs.h +++ /dev/null @@ -1,18 +0,0 @@ -/* SQLC_Defs.h - * - * This file includes common definitions needed by the other SQLClasses header files. - * (Don't include this file directly -- files that require it will include it.) - * - * Note that this file is specific to each OS, because what header files are - * needed varies in each OS. In particular, Unix versions don't want windows.h. - * - * ODBC versions: includes definitions of ODBC datatypes needed by the various - * SQLClasses - */ - -#ifndef _SQLC_DEFS_H -#define _SQLC_DEFS_H - -#include - -#endif diff --git a/src/engine/shared/library/sharedDebug/src/linux/ConfigSharedDebugLinux.cpp b/src/engine/shared/library/sharedDebug/src/linux/ConfigSharedDebugLinux.cpp deleted file mode 100644 index e50ad47cc..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/ConfigSharedDebugLinux.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// ====================================================================== -// -// ConfigSharedDebugLinux.cpp -// Copyright 2002 Sony Online Entertainment, Inc. -// All Rights Reserved. -// -// ====================================================================== - -#include "sharedDebug/FirstSharedDebug.h" -#include "sharedDebug/ConfigSharedDebugLinux.h" - -#include "sharedDebug/Profiler.h" -#include "sharedFoundation/ConfigFile.h" - -//=================================================================== - -namespace ConfigSharedDebugLinuxNamespace -{ - bool s_useTty; - const char *s_debugMonitorOutputFilename; - bool s_logTtySetup; -} - -using namespace ConfigSharedDebugLinuxNamespace; - -//=================================================================== - -#define KEY_BOOL(a,b) (s_ ## a = ConfigFile::getKeyBool("SharedDebugLinux", #a, b)) -#define KEY_STRING(a,b) (s_ ## a = ConfigFile::getKeyString("SharedDebugLinux", #a, b)) -// #define KEY_INT(a,b) (s_ ## a = ConfigFile::getKeyInt("ClientAnimation", #a, b)) -// #define KEY_FLOAT(a,b) (s_ ## a = ConfigFile::getKeyFloat("ClientAnimation", #a, b)) - -//=================================================================== - -void ConfigSharedDebugLinux::install(void) -{ - KEY_BOOL(useTty, false); - KEY_STRING(debugMonitorOutputFilename, "ttySpecifier.txt"); - KEY_BOOL(logTtySetup, false); - - //-- Handle startup profiler handling here. - // @todo this should move into ConfigSharedDebug or be loaded - // by Profiler. Profiler can't load this config file option - // because the Profiler is installed prior to the config file - // system. - Profiler::enableProfilerOutput(ConfigFile::getKeyBool("SharedDebugLinux", "reportProfiler", false)); -} - -// ------------------------------------------------------------------ - -bool ConfigSharedDebugLinux::getUseTty() -{ - return s_useTty; -} - -// ------------------------------------------------------------------ - -char const *ConfigSharedDebugLinux::getDebugMonitorOutputFilename() -{ - return s_debugMonitorOutputFilename; -} - -// ------------------------------------------------------------------ - -bool ConfigSharedDebugLinux::getLogTtySetup() -{ - return s_logTtySetup; -} - -//=================================================================== diff --git a/src/engine/shared/library/sharedDebug/src/linux/ConfigSharedDebugLinux.h b/src/engine/shared/library/sharedDebug/src/linux/ConfigSharedDebugLinux.h deleted file mode 100644 index 9d23544d3..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/ConfigSharedDebugLinux.h +++ /dev/null @@ -1,29 +0,0 @@ -// ====================================================================== -// -// ConfigSharedDebugLinux.h -// Copyright 2002 Sony Online Entertainment, Inc. -// All Rights Reserved. -// -// ====================================================================== - -#ifndef INCLUDED_ConfigSharedDebugLinux_H -#define INCLUDED_ConfigSharedDebugLinux_H - -//=================================================================== - -class ConfigSharedDebugLinux -{ -public: - - static void install(); - - static bool getUseTty(); - static char const *getDebugMonitorOutputFilename(); - static bool getLogTtySetup(); - -}; - -//=================================================================== - -#endif - diff --git a/src/engine/shared/library/sharedDebug/src/linux/DebugHelp.cpp b/src/engine/shared/library/sharedDebug/src/linux/DebugHelp.cpp deleted file mode 100644 index e5e0c980a..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/DebugHelp.cpp +++ /dev/null @@ -1,677 +0,0 @@ -// ====================================================================== -// -// DebugHelp.cpp -// Copyright 2001-2003 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedDebug/FirstSharedDebug.h" -#include "sharedDebug/DebugHelp.h" -#include "sharedSynchronization/Mutex.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -// ====================================================================== - -class SymbolCache -{ -public: - - struct SymbolInfo - { - char const *srcLib; - char const *srcFile; - int srcLine; - bool found; - }; - - static void clear(); - static SymbolInfo const &lookup(void const *addr); - static char const *uniqueString(char const *s); - static void *memPoolAllocate(size_t size); - static const size_t cms_memPoolMaxBytes = 8*1024*1024; - -private: - static size_t ms_memPoolUsed; - static char ms_memPool[cms_memPoolMaxBytes]; - static char *ms_memPoolFreeList; - static Mutex ms_memPoolMutex; - static SymbolInfo ms_nullSym; -}; - -// ---------------------------------------------------------------------- - -template -class SymbolCacheAllocator -{ -public: - typedef size_t size_type; - typedef ptrdiff_t difference_type; - typedef T * pointer; - typedef T const * const_pointer; - typedef T & reference; - typedef T const & const_reference; - typedef T value_type; - -public: - SymbolCacheAllocator() {} - template SymbolCacheAllocator(SymbolCacheAllocator const &) {} - template struct rebind { typedef SymbolCacheAllocator other; }; - - pointer allocate(size_type n, const_pointer = 0) { return reinterpret_cast(SymbolCache::memPoolAllocate(n*sizeof(value_type))); } - void deallocate(const_pointer p, size_type n) {} - pointer address(reference x) const { return &x; } - const_pointer address(const_reference x) const { return &x; } - size_type max_size() const { return SymbolCache::cms_memPoolMaxBytes; } - void construct(pointer p, value_type const & x) { new(p) value_type(x); } - void destroy(pointer p) { p->~value_type(); } -}; - -// ---------------------------------------------------------------------- - -size_t SymbolCache::ms_memPoolUsed; -char SymbolCache::ms_memPool[SymbolCache::cms_memPoolMaxBytes]; -char *SymbolCache::ms_memPoolFreeList; -Mutex SymbolCache::ms_memPoolMutex; -SymbolCache::SymbolInfo SymbolCache::ms_nullSym; -typedef std::map, SymbolCacheAllocator > > SymbolMap; -typedef std::vector > UniqueStringVector; -static SymbolMap ms_cacheMap; -static UniqueStringVector ms_uniqueStringVector; - -// ---------------------------------------------------------------------- - -static Elf32_Shdr const *elfGetObjSectionHeader(void const *objBaseAddr, int sectionIndex) -{ - Elf32_Ehdr const *eh = reinterpret_cast(objBaseAddr); - if (sectionIndex >= 0 && sectionIndex < eh->e_shnum) - return reinterpret_cast(static_cast(objBaseAddr)+eh->e_shoff+sectionIndex*eh->e_shentsize); - return 0; -} - -// ---------------------------------------------------------------------- - -static char const *elfGetObjSectionData(void const *objBaseAddr, int sectionIndex) -{ - Elf32_Shdr const *sh = elfGetObjSectionHeader(objBaseAddr, sectionIndex); - if (sh) - return reinterpret_cast(objBaseAddr)+sh->sh_offset; - return 0; -} - -// ---------------------------------------------------------------------- - -static unsigned int elfGetObjSectionSize(void const *objBaseAddr, int sectionIndex) -{ - Elf32_Shdr const *sh = elfGetObjSectionHeader(objBaseAddr, sectionIndex); - if (sh) - return sh->sh_size; - return 0; -} - -// ---------------------------------------------------------------------- - -static char const *elfGetObjSectionName(void const *objBaseAddr, int sectionIndex) -{ - Elf32_Ehdr const *eh = reinterpret_cast(objBaseAddr); - char const *sectionStr = elfGetObjSectionData(objBaseAddr, eh->e_shstrndx); - if (sectionStr) - { - Elf32_Shdr const *sh = elfGetObjSectionHeader(objBaseAddr, sectionIndex); - if (sh) - return sectionStr+sh->sh_name; - } - return 0; -} - -// ---------------------------------------------------------------------- - -static int elfGetObjSectionByName(void const *objBaseAddr, char const *sectionName) -{ - int n = reinterpret_cast(objBaseAddr)->e_shnum; - for (int i = 0; i < n; ++i) - if (!strcmp(elfGetObjSectionName(objBaseAddr, i), sectionName)) - return i; - return -1; -} - -// ---------------------------------------------------------------------- - -inline unsigned int dwarfGet(char const *src, u_int8_t &dest) -{ - memcpy(&dest, src, sizeof(u_int8_t)); - return sizeof(u_int8_t); -} - -// ---------------------------------------------------------------------- - -inline unsigned int dwarfGet(char const *src, u_int16_t &dest) -{ - memcpy(&dest, src, sizeof(u_int16_t)); - return sizeof(u_int16_t); -} - -// ---------------------------------------------------------------------- - -inline unsigned int dwarfGet(char const *src, u_int32_t &dest) -{ - memcpy(&dest, src, sizeof(u_int32_t)); - return sizeof(u_int32_t); -} - -// ---------------------------------------------------------------------- - -class LEB128 -{ -public: - operator int() const { return value; } - int value; -}; - -// ---------------------------------------------------------------------- - -inline unsigned int dwarfGet(char const *src, LEB128 &dest) -{ - unsigned int pos = 0; - int shift = 7; - int byte = ((u_int8_t*)src)[pos++]; - dest.value = byte; - while (byte >= 0x80) - { - byte = ((u_int8_t *)src)[pos++] ^ 1; - dest.value ^= byte << shift; - shift += 7; - } - if (shift < 32 && (byte & 0x40)) - dest.value |= -(1L<= 0x80) - { - byte = ((u_int8_t *)src)[pos++] ^ 1; - dest.value ^= byte << shift; - shift += 7; - } - return pos; -} - -// ---------------------------------------------------------------------- - -static bool dwarfSearch(char const *dwarfLines, unsigned int linesLength, void const *addr, Dl_info const &info, char const *&retSrcFile, int &retSrcLine) -{ - enum - { - DW_LNE_end_sequence = 1, - DW_LNE_set_address = 2, - - DW_LNS_copy = 1, - DW_LNS_advance_pc = 2, - DW_LNS_advance_line = 3, - DW_LNS_set_file = 4, - DW_LNS_set_column = 5, - DW_LNS_negate_stmt = 6, - DW_LNS_set_basic_block = 7, - DW_LNS_const_add_pc = 8, - DW_LNS_fixed_advance_pc = 9, - }; -//// - void const *bestOverAddr = reinterpret_cast(0xffffffff); - void const *bestUnderAddr = 0; - char const *bestUnderSrcFileTable = 0; - int bestUnderSrcFileNum = 0; - int bestUnderSrcLine = 0; - - unsigned int stmtProgMaxLen = linesLength; - u_int32_t stmtProgLen = 0; - - for (unsigned int progBeginOffset = 0; progBeginOffset < linesLength; progBeginOffset += stmtProgLen+4, stmtProgMaxLen -= stmtProgLen+4) - { - char const *stmtProg = dwarfLines+progBeginOffset; - // get program length - stmtProg += dwarfGet(stmtProg, stmtProgLen); - if (stmtProgLen < 12 || stmtProgLen+4 > stmtProgMaxLen) - continue; - - char const *stmtProgEnd = stmtProg+stmtProgLen; - stmtProg += 2; // skip version - // get prologue length - u_int32_t stmtProgPrologueLen; stmtProg += dwarfGet(stmtProg, stmtProgPrologueLen); - if (stmtProgPrologueLen+10 > stmtProgMaxLen) - continue; - - char const *stmtProgStart = stmtProg; - u_int8_t stmtProgMinInstructionLen; stmtProg += dwarfGet(stmtProg, stmtProgMinInstructionLen); - if (stmtProgMinInstructionLen == 0) - continue; - ++stmtProg; // skip default_is_stmt - int8_t stmtProgLineBase; stmtProg += dwarfGet(stmtProg, *(u_int8_t*)&stmtProgLineBase); - u_int8_t stmtProgLineRange; stmtProg += dwarfGet(stmtProg, stmtProgLineRange); - if (stmtProgLineRange == 0) - continue; - u_int8_t stmtProgOpcodeBase; stmtProg += dwarfGet(stmtProg, stmtProgOpcodeBase); - u_int8_t const *stmtProgOpcodeLengths = reinterpret_cast(stmtProg); - stmtProg += stmtProgOpcodeBase-1; - // include dirs here - while (*stmtProg) - while (*stmtProg++); - char const *stmtProgFilenames = stmtProg; - stmtProg = stmtProgStart+stmtProgPrologueLen; - - // run program - - while (stmtProg < stmtProgEnd) - { - int progFile = 0; - int progLine = 1; - u_int32_t progAddr = 0; - bool done = false; - bool valid = false; - - while (!done) - { - u_int8_t opcode = *stmtProg++; - if (opcode < stmtProgOpcodeBase) - { - switch (opcode) - { - case 0: // extended - { - u_int8_t size, extendedOpcode; - stmtProg += dwarfGet(stmtProg, size); - stmtProg += dwarfGet(stmtProg, extendedOpcode); - switch (extendedOpcode) - { - case DW_LNE_end_sequence: - valid = true; - done = true; - break; - case DW_LNE_set_address: - stmtProg += dwarfGet(stmtProg, progAddr); - break; - default: // unimplemented extended opcode, skip parms - stmtProg += size-1; - break; - } - } - break; - case DW_LNS_advance_pc: - { - LEB128u incr; stmtProg += dwarfGet(stmtProg, incr); - progAddr += incr*stmtProgMinInstructionLen; - } - break; - case DW_LNS_const_add_pc: - progAddr += (255-stmtProgOpcodeBase)/stmtProgLineRange*stmtProgMinInstructionLen; - break; - case DW_LNS_fixed_advance_pc: - { - u_int16_t incr; stmtProg += dwarfGet(stmtProg, incr); - progAddr += incr; - } - break; - case DW_LNS_advance_line: - { - LEB128 incr; stmtProg += dwarfGet(stmtProg, incr); - progLine += incr; - } - break; - case DW_LNS_set_file: - { - LEB128u fileNum; stmtProg += dwarfGet(stmtProg, fileNum); - progFile = fileNum-1; - } - break; - case DW_LNS_copy: - valid = true; - break; - // ignored - case DW_LNS_set_column: - { - LEB128u col; stmtProg += dwarfGet(stmtProg, col); - } - break; - case DW_LNS_negate_stmt: - case DW_LNS_set_basic_block: - break; - default: - { - // unimplemented standard opcode - // look up standard opcode length and skip that many LEB128u's - LEB128u temp; - for (int i = 0; i < stmtProgOpcodeLengths[opcode-1]; ++i) - stmtProg += dwarfGet(stmtProg, temp); - } - break; - } - } - else // special opcode - { - progLine += stmtProgLineBase+(opcode-stmtProgOpcodeBase)%stmtProgLineRange; - progAddr += (opcode-stmtProgOpcodeBase)/stmtProgLineRange*stmtProgMinInstructionLen; - valid = true; - } - - if (valid) - { - unsigned int addrOffset = 0; - if (progAddr < reinterpret_cast(info.dli_fbase)) - addrOffset = reinterpret_cast(info.dli_fbase); - const void *testAddr = reinterpret_cast(progAddr+addrOffset); - if (testAddr >= addr) - { - if (testAddr < bestOverAddr) - bestOverAddr = testAddr; - } - else if (testAddr > bestUnderAddr) - { - bestUnderAddr = testAddr; - bestUnderSrcFileTable = stmtProgFilenames; - bestUnderSrcFileNum = progFile; - bestUnderSrcLine = progLine; - } - } - } - } - } - - if (bestUnderAddr && bestOverAddr != reinterpret_cast(0xffffffff)) - { - char const *srcFile = bestUnderSrcFileTable+1; - for (int i = 0; i < bestUnderSrcFileNum; ++i) - { - while (*srcFile++); - srcFile += 3; - } - retSrcFile = SymbolCache::uniqueString(srcFile); - retSrcLine = bestUnderSrcLine; - return true; - } - return false; -} - -// ---------------------------------------------------------------------- - -static bool dwarfFind(void const *addr, Dl_info const &info, char const *& retSrcFile, int &retSrcLine) -{ - bool found = false; - int fd = open(info.dli_fname, O_RDONLY); - if (fd != -1) - { - int fileSize = lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); - void const *mappedAddr = reinterpret_cast(mmap(0, fileSize, PROT_READ, MAP_PRIVATE, fd, 0)); - close(fd); - if (mappedAddr != MAP_FAILED) - { - int dwarfLinesIndex = elfGetObjSectionByName(mappedAddr, ".debug_line"); - if (dwarfLinesIndex != -1) - { - try - { - found = dwarfSearch( - elfGetObjSectionData(mappedAddr, dwarfLinesIndex), - elfGetObjSectionSize(mappedAddr, dwarfLinesIndex), - addr, - info, - retSrcFile, - retSrcLine); - } - catch (std::bad_alloc &) - { - munmap(const_cast(mappedAddr), fileSize); - throw std::bad_alloc(); - } - } - munmap(const_cast(mappedAddr), fileSize); - } - } - return found; -} - -// ---------------------------------------------------------------------- - -struct Stab -{ - unsigned int n_strx; // index into string table - unsigned char n_type; // type of stab entry - char n_other; - unsigned short n_desc; // for N_SLINE entries, line number - unsigned int n_value; // value of symbol -}; - -// ---------------------------------------------------------------------- - -static bool stabSearch(Stab const *stab, unsigned int stabSize, char const *stabStr, void const *addr, Dl_info const &info, char const *&retSrcFile, int &retSrcLine) -{ - enum - { - N_UNDF = 0, // undefined - N_FUN = 0x24, // function - N_SLINE = 0x44, // source line - N_SO = 0x64, // source file name - N_SOL = 0x84 // local source file name - }; - - unsigned int stabCount = stabSize/sizeof(Stab); - char const *srcFile = ""; - void const *funcBase = 0; - int foundSrcLine = -1; - - for (unsigned int i = 0; i < stabCount; ++i, ++stab) - { - if (stab->n_type == N_UNDF) // new stabs section, do a recursive search of it - { - if (stabSearch(stab+1, stab->n_desc*sizeof(Stab), stabStr, addr, info, retSrcFile, retSrcLine)) - return true; - i += stab->n_desc; - stab += stab->n_desc; - srcFile = ""; - continue; - } - else if (stab->n_type == N_SO || stab->n_type == N_SOL) // source or header file specification - srcFile = stabStr+stab->n_strx; - else if (stab->n_type == N_FUN) // function specification - { - // This may not be terribly accurate - it's attempting to differentiate between already relocated symbols (main program) - // and shared libs, which need to be offset by their file base - if (reinterpret_cast(stab->n_value) > info.dli_fbase) - funcBase = reinterpret_cast(stab->n_value); - else - funcBase = reinterpret_cast(reinterpret_cast(info.dli_fbase)+stab->n_value); - foundSrcLine = -1; - } - else if (stab->n_type == N_SLINE && addr >= funcBase) // source line - { - if (stab->n_value < reinterpret_cast(addr)-reinterpret_cast(funcBase)) - foundSrcLine = stab->n_desc; - else - { - retSrcLine = foundSrcLine == -1 ? stab->n_desc : foundSrcLine; - retSrcFile = SymbolCache::uniqueString(srcFile); - return true; - } - } - } - - return false; -} - -// ---------------------------------------------------------------------- - -static bool stabsFind(void const *addr, Dl_info const &info, char const *& retSrcFile, int &retSrcLine) -{ - bool found = false; - int fd = open(info.dli_fname, O_RDONLY); - if (fd != -1) - { - int fileSize = lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); - void const *mappedAddr = reinterpret_cast(mmap(0, fileSize, PROT_READ, MAP_PRIVATE, fd, 0)); - close(fd); - if (mappedAddr != MAP_FAILED) - { - int stabIndex = elfGetObjSectionByName(mappedAddr, ".stab"); - int stabStrIndex = elfGetObjSectionByName(mappedAddr, ".stabstr"); - if (stabIndex != -1 && stabStrIndex != -1) - { - try - { - found = stabSearch( - reinterpret_cast(elfGetObjSectionData(mappedAddr, stabIndex)), - elfGetObjSectionSize(mappedAddr, stabIndex), - elfGetObjSectionData(mappedAddr, stabStrIndex), - addr, - info, - retSrcFile, - retSrcLine); - } - catch (std::bad_alloc &) - { - munmap(const_cast(mappedAddr), fileSize); - throw std::bad_alloc(); - } - } - munmap(const_cast(mappedAddr), fileSize); - } - } - return found; -} - -// ---------------------------------------------------------------------- - -SymbolCache::SymbolInfo const &SymbolCache::lookup(void const *addr) -{ - SymbolMap::const_iterator i = ms_cacheMap.find(addr); - if (i != ms_cacheMap.end()) - return (*i).second; - - // allow for running out of the fixed memory pool and recover gracefully - for (int tries = 0; tries < 2; ++tries) - { - try - { - SymbolInfo &symInfo = ms_cacheMap[addr]; - Dl_info info; - if (dladdr(addr, &info)) - { - symInfo.srcLib = uniqueString(info.dli_fname); - if ( stabsFind(addr, info, symInfo.srcFile, symInfo.srcLine) - || dwarfFind(addr, info, symInfo.srcFile, symInfo.srcLine)) - symInfo.found = true; - } - return symInfo; - } - catch (std::bad_alloc &) - { - ms_uniqueStringVector.clear(); - ms_cacheMap.clear(); - ms_memPoolUsed = 0; - } - } - - return ms_nullSym; -} - -// ---------------------------------------------------------------------- - -char const *SymbolCache::uniqueString(char const *s) -{ - for (UniqueStringVector::const_iterator i = ms_uniqueStringVector.begin(); i != ms_uniqueStringVector.end(); ++i) - if (!strcmp(s, *i)) - return *i; - char *newString = static_cast(memPoolAllocate((strlen(s)+8)&(~7))); - strcpy(newString, s); - ms_uniqueStringVector.push_back(newString); - return newString; -} - -// ---------------------------------------------------------------------- - -void *SymbolCache::memPoolAllocate(size_t size) -{ - ms_memPoolMutex.enter(); - if (ms_memPoolUsed+size > cms_memPoolMaxBytes) - { - ms_memPoolMutex.leave(); - throw std::bad_alloc(); - } - void *ret = ms_memPool+ms_memPoolUsed; - ms_memPoolUsed += size; - ms_memPoolMutex.leave(); - return ret; -} - -// ---------------------------------------------------------------------- - -bool lookupAddressInfo(void const *addr, char *retSrcLib, char *retSrcFile, int &retSrcLine, int stringBufLengths) -{ - SymbolCache::SymbolInfo const &symInfo = SymbolCache::lookup(addr); - if (retSrcLib && symInfo.srcLib) - { - strncpy(retSrcLib, symInfo.srcLib, stringBufLengths); - retSrcLib[stringBufLengths-1] = '\0'; - } - if (symInfo.found && retSrcFile) - { - strncpy(retSrcFile, symInfo.srcFile, stringBufLengths); - retSrcFile[stringBufLengths-1] = '\0'; - } - retSrcLine = symInfo.srcLine; - return symInfo.found; -} - -//// -// ====================================================================== - -void DebugHelp::install() -{ -} - -// ---------------------------------------------------------------------- - -void DebugHelp::remove() -{ -} - -// ---------------------------------------------------------------------- - -bool DebugHelp::lookupAddress(uint32 address, char *libName, char *fileName, int fileNameLength, int &line) -{ - return lookupAddressInfo(reinterpret_cast(address), libName, fileName, line, fileNameLength); -} - -// ---------------------------------------------------------------------- - -void DebugHelp::getCallStack(uint32 *callStack, int sizeOfCallStack) -{ - for (int i = 0; i < sizeOfCallStack; ++i) - callStack[i] = 0; - IGNORE_RETURN(backtrace(reinterpret_cast(callStack), sizeOfCallStack)); -} - -// ====================================================================== - diff --git a/src/engine/shared/library/sharedDebug/src/linux/DebugHelp.h b/src/engine/shared/library/sharedDebug/src/linux/DebugHelp.h deleted file mode 100644 index 5068ea1d3..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/DebugHelp.h +++ /dev/null @@ -1,33 +0,0 @@ -// ====================================================================== -// -// DebugHelp.h -// copyright 2000 Verant Interactive -// -// ====================================================================== - -#ifndef DEBUG_HELP_H -#define DEBUG_HELP_H - -#include "sharedDebug/FirstSharedDebug.h" - -// ====================================================================== - -typedef unsigned long uint32; - -// ====================================================================== - -class DebugHelp -{ -public: - - static void install(); - static void remove(); - - static void getCallStack(uint32 *callStack, int sizeOfCallStack); - static bool lookupAddress(uint32 address, char *libName, char *fileName, int fileNameLength, int &line); -}; - -// ====================================================================== - -#endif - diff --git a/src/engine/shared/library/sharedDebug/src/linux/DebugMonitor.cpp b/src/engine/shared/library/sharedDebug/src/linux/DebugMonitor.cpp deleted file mode 100644 index 59cd24bc1..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/DebugMonitor.cpp +++ /dev/null @@ -1,445 +0,0 @@ -// ====================================================================== -// -// DebugMonitor.cpp -// Copyright 2002, Sony Online Entertainment.h -// All rights reserved. -// -// ====================================================================== - -#include "sharedDebug/FirstSharedDebug.h" -#include "sharedDebug/DebugMonitor.h" - -#ifdef _DEBUG - -#include "sharedDebug/ConfigSharedDebugLinux.h" -#include "sharedDebug/Profiler.h" -#include "sharedFoundation/ConfigSharedFoundation.h" - -#include -#include -#include -#include -#include - -// ====================================================================== - -namespace DebugMonitorNamespace -{ - bool s_installed; - SCREEN *s_initialScreen; - WINDOW *s_initialWindow; - - FILE *s_ttyOutputFile; - FILE *s_ttyInputFile; - SCREEN *s_outputScreen; - WINDOW *s_outputWindow; -} - -using namespace DebugMonitorNamespace; - -// ====================================================================== -// Install the debug monitor subsystem -// -// Remarks: -// -// This routine will first attempt to install the selected debug monitor. - -void DebugMonitor::install(void) -{ - DEBUG_FATAL(s_installed, ("DebugMonitor already installed.")); - - //-- Check if user wants to use a TTY for the DebugMonitor. - if (!ConfigSharedDebugLinux::getUseTty()) - { - // Do not use the DebugMonitor. - DEBUG_REPORT_LOG(ConfigSharedDebugLinux::getLogTtySetup(), ("DebugMonitor: skipping install, ConfigSharedDebugLinux/useTty is false.\n")); - return; - } - - //-- Open and retrieve the name of the TTY file for output from the TTY Specification file. - char const *const configFilename = ConfigSharedDebugLinux::getDebugMonitorOutputFilename(); - - if (!configFilename || (*configFilename == '\0')) - { - DEBUG_WARNING(true, ("DebugMonitor(): skipping installation, no debugMonitorOutputFilename specified.")); - return; - } - - char ttyFilename[1024]; - - if (configFilename[0] != '@') - { - // filename is the real output filename (usually a device) for DebugMonitor output. - strncpy(ttyFilename, configFilename, sizeof(ttyFilename) - 1); - ttyFilename[sizeof(ttyFilename)-1] = 0; - } - else - { - // filename is actually an indirection filename, the contents of this file contains the real filename. - FILE *ttySpecifierFile = fopen(configFilename + 1, "r"); - if (!ttySpecifierFile) - { - DEBUG_WARNING(true, ("DebugMonitor: failed to open tty specifier file [%s]: [%s].", configFilename + 1, strerror(errno))); - return; - } - - // Retrieve the TTY file name. - fgets(ttyFilename, sizeof(ttyFilename), ttySpecifierFile); - fclose(ttySpecifierFile); - } - - // Strip trailing newline from TTY filename. - const int filenameLength = strlen(ttyFilename); - if (filenameLength > 0) - { - // chop off trailing newline if present. - if (ttyFilename[filenameLength - 1] == '\n') - ttyFilename[filenameLength - 1] = '\0'; - } - - //-- Open the TTY file for output. - DEBUG_REPORT_LOG(ConfigSharedDebugLinux::getLogTtySetup(), ("DebugMonitor: opening TTY file [%s] for reading and writing.\n", ttyFilename)); - FILE *s_ttyOutputFile = fopen(ttyFilename, "w"); - if (!s_ttyOutputFile) - { - DEBUG_WARNING(true, ("DebugMonitor: failed to open tty file for output [%s]: [%s].", ttyFilename, strerror(errno))); - return; - } - - //-- Open the TTY file for input. - FILE *s_ttyInputFile = fopen(ttyFilename, "r"); - if (!s_ttyInputFile) - { - DEBUG_WARNING(true, ("DebugMonitor: failed to open tty file for input [%s]: [%s].", ttyFilename, strerror(errno))); - fclose(s_ttyOutputFile); - return; - } - -#if 1 - // NOTE: -TRF- I would not expect this chunk of termios setup - // code to be necessary. My expectation is that it should - // be handled by the curs_inopts (see man page) options I have - // selected below. Alas, these are needed. - - //-- Setup profiler window input mode. - const int inputFd = STDIN_FILENO; - - // Get terminal attributes. - termios terminalAttributes; - if (tcgetattr(inputFd, &terminalAttributes) != 0) - { - DEBUG_WARNING(true, ("DebugMonitor: tcgetattr failed [%s].", strerror(errno))); - return; - } - - // Turn off line-processing mode. We want a character at a time. - terminalAttributes.c_lflag &= ~ICANON; - - // Turn off echo. - terminalAttributes.c_lflag &= ~ECHO; - - // Specify that read should return immediately (non-blocking). - terminalAttributes.c_cc[VMIN] = 0; - terminalAttributes.c_cc[VTIME] = 0; - - // Set terminal attributes. - if (tcsetattr(inputFd, TCSAFLUSH, &terminalAttributes) != 0) - { - DEBUG_WARNING(true, ("DebugMonitor: tcsetattr failed [%s].", strerror(errno))); - return; - } -#endif - - //-- Create a curses screen to represent the DebugMonitor output tty. - // NOTE: for now the curses input is hooked up to the application's - // standard input. Later we may want to change that to - // handle input from the output terminal, particularly to - // handle profiler modifications when the output window - // is active. - s_outputScreen = newterm(NULL, s_ttyOutputFile, stdin); - if (!s_outputScreen) - { - DEBUG_WARNING(true, ("DebugMonitor: newterm() failed [%s].", strerror(errno))); - fclose(s_ttyOutputFile); - fclose(s_ttyInputFile); - return; - } - - //-- Initialize the curses library. - s_initialWindow = initscr(); - if (!s_initialWindow) - { - DEBUG_WARNING(true, ("DebugMonitor: initscr(): failed [%s].", strerror(errno))); - fclose(s_ttyOutputFile); - fclose(s_ttyInputFile); - return; - } - - //-- Restore the stdout window to its previous state. We won't use stdout. - endwin(); - - //-- Set the default terminal to be the output TTY's terminal screen. - s_initialScreen = set_term(s_outputScreen); - if (!s_initialScreen) - { - DEBUG_WARNING(true, ("DebugMonitor: set_term(): failed [%s].", strerror(errno))); - delscreen(s_outputScreen); - fclose(s_ttyOutputFile); - fclose(s_ttyInputFile); - return; - } - - //-- Create the curses WINDOW at the full size of the TTY. - s_outputWindow = newwin(0, 0, 0, 0); - if (!s_outputWindow) - { - DEBUG_WARNING(true, ("DebugMonitor: newwin(): failed [%s].", strerror(errno))); - delscreen(s_outputScreen); - fclose(s_ttyOutputFile); - fclose(s_ttyInputFile); - return; - } - - //-- Destroy curses data structures associated with the stdout TTY - delwin(s_initialWindow); - delscreen(s_initialScreen); - - //-- Additional profiler input setup. - // Allow translation of arrow keys. - if (keypad(s_outputWindow, true) == ERR) - { - DEBUG_WARNING(true, ("DebugMonitor: keypad() failed [%s].", strerror(errno))); - return; - } - - //-- Add the removal routine to the ExitChain. - s_installed = true; - - // NOTE: this can't go on the exit chain because the MemoryManager - // will write to it way late in processing. - //ExitChain::add(remove, "DebugMonitor"); -} - -// ---------------------------------------------------------------------- - -void DebugMonitor::remove(void) -{ - if (!s_installed) - { - // Exit silently rather than FATAL. There's any number of reasons why - // we might not be installed, and the ExitChain does not call remove, - // so this should be valid. - return; - } - - s_installed = false; - - //-- Restore the TTY's state. - endwin(); - - //-- Delete curses data structures associated with the output terminal. - delwin(s_outputWindow); - s_outputWindow = 0; - - delscreen(s_outputScreen); - s_outputScreen = 0; - - //-- Close file handle to output terminal. - fclose(s_ttyOutputFile); - s_ttyOutputFile = 0; - - fclose(s_ttyInputFile); - s_ttyInputFile = 0; -} - -// ---------------------------------------------------------------------- -/** - * Set the debug window's z-order. - */ - -void DebugMonitor::setBehindWindow(HWND window) -{ - UNREF(window); -} - -// ---------------------------------------------------------------------- -/** - * Clear the debug monitor and home the cursor. - * - * If the mono monitor is not installed, this routine does nothing. - * - * This routine will clear the contents of the debug monitor, reset the screen - * offset to 0, and move the cursor to the upper left corner of the screen. - * - * @see DebugMonitor::home(), DebugMonitor::clearToCursor() - */ - -void DebugMonitor::clearScreen(void) -{ - //-- Ignore request if DebugMonitor isn't installed. - if (!s_installed) - return; - - //-- Tell curses to clear the virtual screen. The actual - // clear will not take effect until the next showOutput() call - // is made. - IGNORE_RETURN(wclear(s_outputWindow)); - - //-- Goto upper left corner. - gotoXY(0, 0); -} - -// ---------------------------------------------------------------------- -/** - * Clear the debug monitor to the current cursor position and home the cursor. - * - * If the debug monitor is not installed, this routine does nothing. - * - * This routine will clear the contents of the debug monitor only up to the - * cursor position. If the cursor is not very far down on the screen, - * this routine may be significantly more efficient clearing the screen. - * - * It will also move the cursor to the upper left corner of the screen. - * - * @see DebugMonitor::clearScreen(), DebugMonitor::home() - */ - -void DebugMonitor::clearToCursor(void) -{ - //-- Ignore request if DebugMonitor isn't installed. - if (!s_installed) - return; - - //-- I don't see this functionality in curses. Just clear - // the entire screen. - clearScreen(); -} - -// ---------------------------------------------------------------------- -/** - * Position the cursor on the debug monitor screen. - * - * If the debug monitor is not installed, this routine does nothing. - * - * All printing happens at the cursor position. - * - * @param x New X position for the cursor - * @param y New Y position for the cursor - */ - -void DebugMonitor::gotoXY(int x, int y) -{ - //-- Ignore request if DebugMonitor isn't installed. - if (!s_installed) - return; - - //-- Move the cursor position to the specified location. - const int result = wmove(s_outputWindow, y, x); - DEBUG_REPORT_LOG(result == ERR, ("DebugMonitor: wmove(%d, %d) failed [%s].\n", y, x, strerror(errno))); - UNREF(result); -} - -// ---------------------------------------------------------------------- -/** - * Display a string on the debug monitor. - * * If the debug monitor is not installed, this routine does nothing. - * - * Printing occurs from the cursor position. - * - * Newline characters '\n' will cause the cursor position to advance to the - * beginning of the next line. If the cursor is already on the last line of - * the screen, the screen will scroll up one line and the cursor will move to - * the beginning of the last line. - * - * The backspace character '\b' will cause the cursor to move one character - * backwards. If at the beginning of the line, the cursor will move to the - * end of the previous line. If already on the first line of the screen, the - * cursor position and screen contents will be unchanged. - * - * All other characters are placed directly into the text frame buffer. - * After each character, the cursor will be logically advanced one - * character forward. If the cursor was on the last column, it will advance - * to the next line. If the cursor was already on the last line, the screen - * will be scrolled up one line and the cursor will move to the beginning of - * the last line. - * - * @param string String to display on the debug monitor - */ - -void DebugMonitor::print(const char *string) -{ - //-- Ignore request if DebugMonitor isn't installed. - if (!s_installed) - return; - - const int result = wprintw(s_outputWindow, const_cast(string)); - DEBUG_REPORT_LOG(result == ERR, ("WARNING: DebugMonitor: wprintw failed [%s].\n", strerror(errno))); - UNREF(result); -} - -// ---------------------------------------------------------------------- -/** - * Ensure all changes to the DebugMonitor have taken effect by the time - * this function returns. - * - * Note: some platforms may do nothing here. The Win32 platform does not - * require flushing. The Linux platform does. Call it assuming - * that it is needed. It will be a no-op when not required. - */ - -void DebugMonitor::flushOutput() -{ - //-- Ignore request if DebugMonitor isn't installed. - if (!s_installed) - return; - - //-- Tell curses to refresh the output window so that - // the virtual curses display is rendered to the real - // terminal display. - const int result = wrefresh(s_outputWindow); - DEBUG_REPORT_LOG(result == ERR, ("WARNING: DebugMonitor: wrefresh failed [%s].\n", strerror(errno))); - UNREF(result); - - //-- Handle tty input here. This is somewhat hacky. Unix tty input - // and output currently are intimately tied to the profiler. Later - // this can be separated out so we can handle multiple TTYs for - // multiple purposes, such as for handling a TTY-based popup debug - // menu for on-the-fly options changing. - const int input = wgetch(s_outputWindow); - if (input != ERR) - { -#if 0 - DEBUG_REPORT_LOG(true, ("DebugMonitor: received key [index=%d].\n", input)); -#endif - - //-- Handle input. - switch (input) - { - case '8': - case KEY_UP: - Profiler::selectionMoveUp(); - break; - - case '9': - case KEY_DOWN: - Profiler::selectionMoveDown(); - break; - - case '0': - case 10: - case KEY_LEFT: - case KEY_RIGHT: - Profiler::selectionToggleExpanded(); - break; - - default: - // Nothing to do. - break; - } - } -} - -// ====================================================================== - -#endif - diff --git a/src/engine/shared/library/sharedDebug/src/linux/DebugMonitor.h b/src/engine/shared/library/sharedDebug/src/linux/DebugMonitor.h deleted file mode 100644 index 092f01c6d..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/DebugMonitor.h +++ /dev/null @@ -1,67 +0,0 @@ -// ====================================================================== -// -// DebugMonitor.h -// Portions Copyright 1998, Bootprint Entertainment, Inc. -// Portions Copyright 2002, Sony Online Entertainment, Inc. -// -// ====================================================================== - -#ifndef INCLUDED_DebugMonitor_H -#define INCLUDED_DebugMonitor_H - -// ====================================================================== - -#ifdef _DEBUG - -class DebugMonitor -{ -private: - -public: - - static void install(void); - static void remove(void); - - typedef void* HWND; - - static void setBehindWindow(HWND window); - - static void clearScreen(void); - static void clearToCursor(void); - - static void home(void); - static void gotoXY(int x, int y); - static void print(const char *string); - - static void flushOutput(); -}; - -#endif - -// ====================================================================== -// Move the cursor to the upper left hand corner of the mono monitor screen -// -// Remarks: -// -// If the debug monitor is not installed, this routine does nothing. -// -// All printing happens at the cursor position. -// -// This routine is identical to calling gotoXY(0,0); -// -// See Also: -// -// DebugMonitor::gotoXY() - -#ifdef _DEBUG - -inline void DebugMonitor::home(void) -{ - gotoXY(0,0); -} - -#endif - -// ====================================================================== - -#endif diff --git a/src/engine/shared/library/sharedDebug/src/linux/PerformanceTimer.cpp b/src/engine/shared/library/sharedDebug/src/linux/PerformanceTimer.cpp deleted file mode 100644 index 68c36d8cb..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/PerformanceTimer.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//=================================================================== // -// -// PerformanceTimer.cpp -// copyright 2000-2004 Sony Online Entertainment -// All Rights Reserved -// -//=================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedDebug/PerformanceTimer.h" - -//=================================================================== - -#include - -//=================================================================== - -void PerformanceTimer::install() -{ -} - -//------------------------------------------------------------------- - -PerformanceTimer::PerformanceTimer() -{ - startTime.tv_sec = 0; - startTime.tv_usec = 0; - stopTime.tv_sec = 0; - stopTime.tv_usec = 0; -} - -//------------------------------------------------------------------- - -PerformanceTimer::~PerformanceTimer() -{ -} - -//------------------------------------------------------------------- - -void PerformanceTimer::start() -{ - int const result = gettimeofday(&startTime, NULL); - FATAL(result != 0,("PerformanceTimer::start failed")); -} - -//------------------------------------------------------------------- - -void PerformanceTimer::resume() -{ - long sec = stopTime.tv_sec - startTime.tv_sec; - long usec = stopTime.tv_usec - startTime.tv_usec; - if(usec < 0) - { - --sec; - usec += 1000000; - } - - int const result = gettimeofday(&startTime, NULL); - FATAL(result != 0,("PerformanceTimer::resume failed")); - - startTime.tv_sec -= sec; - startTime.tv_usec -= usec; - if(startTime.tv_usec < 0) - { - --startTime.tv_sec; - startTime.tv_usec += 1000000; - } -} - -//------------------------------------------------------------------- - -void PerformanceTimer::stop() -{ - int result = gettimeofday(&stopTime, NULL); - FATAL(result != 0,("PerformanceTimer::start failed")); -} - -//------------------------------------------------------------------- - -float PerformanceTimer::getElapsedTime() const -{ - long sec = stopTime.tv_sec - startTime.tv_sec; - long usec = stopTime.tv_usec - startTime.tv_usec; - if(usec < 0) - { - --sec; - usec += 1000000; - } - return static_cast(sec) +(static_cast(usec) / 1000000.0f); -} - -//------------------------------------------------------------------- - -float PerformanceTimer::getSplitTime() const -{ - timeval currentTime; - - int const result = gettimeofday(¤tTime, NULL); - FATAL(result != 0,("PerformanceTimer::getSplitTime failed")); - - long sec = currentTime.tv_sec - startTime.tv_sec; - long usec = currentTime.tv_usec - startTime.tv_usec; - if(usec < 0) - { - --sec; - usec += 1000000; - } - - return static_cast(sec) +(static_cast(usec) / 1000000.0f); -} - -//------------------------------------------------------------------- - -void PerformanceTimer::logElapsedTime(const char* string) const -{ - UNREF(string); - -#ifdef _DEBUG - static char buffer [1000]; - sprintf(buffer, "%s : %1.5f seconds\n", string ? string : "null", getElapsedTime()); - DEBUG_REPORT_LOG_PRINT(true, ("%s", buffer)); -#endif -} - -//------------------------------------------------------------------- diff --git a/src/engine/shared/library/sharedDebug/src/linux/PerformanceTimer.h b/src/engine/shared/library/sharedDebug/src/linux/PerformanceTimer.h deleted file mode 100644 index 4e933ae18..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/PerformanceTimer.h +++ /dev/null @@ -1,51 +0,0 @@ -//=================================================================== // -// -// PerformanceTimer.h -// copyright 2000-2004 Sony Online Entertainment -// All Rights Reserved -// -//=================================================================== - -#ifndef INCLUDED_PerformaceTimer_H -#define INCLUDED_PerformaceTimer_H - -//=================================================================== - -#include -#include - -//=================================================================== - -class PerformanceTimer -{ -public: - - static void install(); - -public: - - PerformanceTimer(); - ~PerformanceTimer(); - - void start(); - void resume(); - void stop(); - - float getElapsedTime() const; - float getSplitTime() const; - void logElapsedTime(const char* string) const; - -private: - - timeval startTime; - timeval stopTime; - -private: - - PerformanceTimer(PerformanceTimer const &); - PerformanceTimer & operator=(PerformanceTimer const &); -}; - -//=================================================================== - -#endif diff --git a/src/engine/shared/library/sharedDebug/src/linux/ProfilerTimer.cpp b/src/engine/shared/library/sharedDebug/src/linux/ProfilerTimer.cpp deleted file mode 100644 index 73aa4150e..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/ProfilerTimer.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// ====================================================================== -// -// ProfilerTimer.cpp -// copyright (c) 2001 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedDebug/FirstSharedDebug.h" -#include "sharedDebug/ProfilerTimer.h" - -// ====================================================================== - -void ProfilerTimer::install() -{ -} - -// ---------------------------------------------------------------------- - -void ProfilerTimer::getTime(Type &time) -{ - timeval tv; - gettimeofday(&tv, 0); - time = static_cast(tv.tv_sec)*static_cast(1000000)+static_cast(tv.tv_usec); -} - -// ---------------------------------------------------------------------- - -void ProfilerTimer::getCalibratedTime(Type &time, Type &frequency) -{ - getTime(time); - frequency = 1000000; -} - -void ProfilerTimer::getFrequency(Type &frequency) -{ - frequency = 1000000; -} - -// ====================================================================== diff --git a/src/engine/shared/library/sharedDebug/src/linux/ProfilerTimer.h b/src/engine/shared/library/sharedDebug/src/linux/ProfilerTimer.h deleted file mode 100644 index c5a5ae751..000000000 --- a/src/engine/shared/library/sharedDebug/src/linux/ProfilerTimer.h +++ /dev/null @@ -1,29 +0,0 @@ -// ====================================================================== -// -// ProfilerTimer.h -// copyright (c) 2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_ProfilerTimer_H -#define INCLUDED_ProfilerTimer_H - -// ====================================================================== - -class ProfilerTimer -{ -public: - - typedef uint64 Type; - -public: - - static void install(); - static void getTime(Type &type); - static void getCalibratedTime(Type &time, Type &frequency); - static void getFrequency(Type &frequency); -}; - -// ====================================================================== - -#endif diff --git a/src/engine/shared/library/sharedFile/src/linux/OsFile.cpp b/src/engine/shared/library/sharedFile/src/linux/OsFile.cpp deleted file mode 100644 index a132016f1..000000000 --- a/src/engine/shared/library/sharedFile/src/linux/OsFile.cpp +++ /dev/null @@ -1,123 +0,0 @@ -// ====================================================================== -// -// OsFile.cpp -// Copyright 2002, Sony Online Entertainment Inc. -// All Rights Reserved. -// -// ====================================================================== - -#include "sharedFile/FirstSharedFile.h" -#include "sharedFile/OsFile.h" - -#include -#include -#include -#include - -// ====================================================================== - -void OsFile::install() -{ -} - -// ---------------------------------------------------------------------- - -bool OsFile::exists(const char *fileName) -{ - struct stat statBuffer; - if (stat(fileName, &statBuffer) != 0) - return false; - - if (S_ISDIR(statBuffer.st_mode)) - return false; - - return true; -} - -// ---------------------------------------------------------------------- - -int OsFile::getFileSize(const char *fileName) -{ - struct stat statBuffer; - int fileSize = 0; - - if (stat(fileName, &statBuffer) == 0) - { - fileSize = static_cast(statBuffer.st_size); - } - return fileSize; -} - -// ---------------------------------------------------------------------- - -OsFile *OsFile::open(const char *fileName, bool randomAccess) -{ - UNREF(randomAccess); - - if (!exists(fileName)) - return 0; - - // attempt to open the file - const int handle = ::open(fileName, O_RDONLY); - FATAL(handle < 0, ("OsFile::open failed to open file %s, errno=%d, which does exist.", fileName, errno)); - - return new OsFile(handle, DuplicateString(fileName)); -} - -// ---------------------------------------------------------------------- - -OsFile::OsFile(int handle, char *fileName) -: - m_handle(handle), - m_length(0), - m_offset(0), - m_fileName(fileName) -{ - m_length = lseek(m_handle, 0, SEEK_END); - lseek(m_handle, 0, SEEK_SET); -} - -// ---------------------------------------------------------------------- - -OsFile::~OsFile() -{ - close(m_handle); - delete [] m_fileName; -} - -// ---------------------------------------------------------------------- - -int OsFile::length() const -{ - return m_length; -} - -// ---------------------------------------------------------------------- - -void OsFile::seek(int newFilePosition) -{ - if (m_offset != newFilePosition) - { - const int result = lseek(m_handle, newFilePosition, SEEK_SET); - DEBUG_FATAL(result != newFilePosition, ("SetFilePointer failed")); - UNREF(result); - m_offset = newFilePosition; - } -} - -// ---------------------------------------------------------------------- - -int OsFile::read(void *destinationBuffer, int numberOfBytes) -{ - int result = 0; - do - { - result = ::read(m_handle, destinationBuffer, numberOfBytes); - DEBUG_FATAL((result < 0 && errno != EAGAIN), ("Read failed for %s: %d %d %s", m_fileName, result, errno, strerror(errno))); - } while (result < 0); - - m_offset += result; - return result; -} - -// ====================================================================== diff --git a/src/engine/shared/library/sharedFile/src/linux/OsFile.h b/src/engine/shared/library/sharedFile/src/linux/OsFile.h deleted file mode 100644 index c7fdec5a8..000000000 --- a/src/engine/shared/library/sharedFile/src/linux/OsFile.h +++ /dev/null @@ -1,51 +0,0 @@ -// ====================================================================== -// -// OsFile.h -// Copyright 2002, Sony Online Entertainment Inc. -// All Rights Reserved. -// -// ====================================================================== - -#ifndef INCLUDED_OsFile_H -#define INCLUDED_OsFile_H - -// ====================================================================== - -class OsFile -{ -public: - - static void install(); - - static bool exists(const char *fileName); - static int getFileSize(const char *fileName); - static OsFile *open(const char *fileName, bool randomAccess=false); - -public: - - ~OsFile(); - - int length() const; - int tell() const; - void seek(int newFilePosition); - int read(void *destinationBuffer, int numberOfBytes); - -private: - - OsFile(int handle, char *fileName); - - OsFile(); - OsFile(const OsFile &); - OsFile &operator =(const OsFile &); - -private: - - int m_handle; - int m_length; - int m_offset; - char *m_fileName; -}; - -// ====================================================================== - -#endif diff --git a/src/engine/shared/library/sharedFoundation/src/linux/ByteOrder.h b/src/engine/shared/library/sharedFoundation/src/linux/ByteOrder.h deleted file mode 100644 index 0a3ff3348..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/ByteOrder.h +++ /dev/null @@ -1,20 +0,0 @@ -// ====================================================================== -// -// ByteOrder.h -// jeff grills -// -// copyright 1998 Bootprint Entertainment -// -// ====================================================================== - -#ifndef BYTE_ORDER_H -#define BYTE_ORDER_H - -// ====================================================================== - -#include "../../../../../../engine/shared/library/sharedFoundation/include/public/sharedFoundation/FirstPlatform.h" - -// ====================================================================== - -#endif - diff --git a/src/engine/shared/library/sharedFoundation/src/linux/ConfigSharedFoundation.cpp b/src/engine/shared/library/sharedFoundation/src/linux/ConfigSharedFoundation.cpp deleted file mode 100644 index 79aab4350..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/ConfigSharedFoundation.cpp +++ /dev/null @@ -1,289 +0,0 @@ -// ====================================================================== -// -// ConfigSharedFoundation.cpp -// copyright 1998 Bootprint Entertainment -// copyright 2001 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedFoundation/ConfigSharedFoundation.h" - -#include "sharedFoundation/ConfigFile.h" - -// ====================================================================== - -const int c_defaultFatalCallStackDepth = 32; -const int c_defaultWarningCallStackDepth = 8; - -// ====================================================================== - -namespace ConfigSharedFoundationNamespace -{ - real ms_frameRateLimit; - real ms_minFrameRate; - bool ms_noExceptionHandling; - - bool ms_fpuExceptionPrecision; - bool ms_fpuExceptionUnderflow; - bool ms_fpuExceptionOverflow; - bool ms_fpuExceptionZeroDivide; - bool ms_fpuExceptionDenormal; - bool ms_fpuExceptionInvalid; - - bool ms_demoMode; - - bool ms_useRemoteDebug; - int ms_defaultRemoteDebugPort; - - bool ms_profilerExpandAllBranches = true; - - bool ms_memoryManagerReportAllocations; - bool ms_memoryManagerReportOnOutOfMemory; - - bool ms_useMemoryBlockManager; - bool ms_memoryBlockManagerDebugDumpOnRemove; - - int ms_fatalCallStackDepth; - int ms_warningCallStackDepth; - bool ms_lookUpCallStackNames; - - bool ms_alwaysCanSeeWorldCell; - - bool ms_verboseWarnings; - - float ms_debugReportLongFrameTime; -} - -using namespace ConfigSharedFoundationNamespace; - -// ====================================================================== - -#define KEY_INT(a,b) (ms_ ## a = ConfigFile::getKeyInt("SharedFoundation", #a, b)) -#define KEY_BOOL(a,b) (ms_ ## a = ConfigFile::getKeyBool("SharedFoundation", #a, b)) -#define KEY_FLOAT(a,b) (ms_ ## a = ConfigFile::getKeyFloat("SharedFoundation", #a, b)) -// #define KEY_STRING(a,b) (ms_ ## a = ConfigFile::getKeyString("SharedFoundation", #a, b)) - -// ====================================================================== -// Determine the Platform-specific configuration information -// -// Remarks: -// -// This routine inspects the ConfigFile class to set some variables for rapid access -// by the rest of the engine. - -void ConfigSharedFoundation::install (const Defaults &defaults) -{ - KEY_BOOL(noExceptionHandling, false); - - KEY_BOOL(fpuExceptionPrecision, false); - KEY_BOOL(fpuExceptionUnderflow, false); - KEY_BOOL(fpuExceptionOverflow, false); - KEY_BOOL(fpuExceptionZeroDivide, false); - KEY_BOOL(fpuExceptionDenormal, false); - KEY_BOOL(fpuExceptionInvalid, false); - - KEY_BOOL(demoMode, false); - - KEY_FLOAT(frameRateLimit, defaults.frameRateLimit); - KEY_FLOAT(minFrameRate, 0.0f); - - KEY_BOOL(useRemoteDebug, false); - KEY_INT(defaultRemoteDebugPort, 4445); - - KEY_BOOL(profilerExpandAllBranches, true); - KEY_BOOL(memoryManagerReportAllocations, true); - KEY_BOOL(memoryManagerReportOnOutOfMemory, true); - - KEY_BOOL(useMemoryBlockManager, true); - KEY_BOOL(memoryBlockManagerDebugDumpOnRemove, false); - - KEY_INT(fatalCallStackDepth, c_defaultFatalCallStackDepth); - KEY_INT(warningCallStackDepth, c_defaultWarningCallStackDepth); - KEY_BOOL(lookUpCallStackNames, true); - - KEY_BOOL(alwaysCanSeeWorldCell, false); - - KEY_BOOL(verboseWarnings, false); - - KEY_FLOAT(debugReportLongFrameTime, 0.25f); -} - -// ====================================================================== -/** - * Return the frame rate limit value for the game. - * - * @return The initial frame rate limiter value - */ - -real ConfigSharedFoundation::getFrameRateLimit(void) -{ - return ms_frameRateLimit; -} - -// ---------------------------------------------------------------------- -/** - * Return the minimum frame rate limit value for the game. Frame that take longer - * will be set to the minimum and a message will be logged. - * - * @return The minimum frame rate value - */ - -real ConfigSharedFoundation::getMinFrameRate(void) -{ - return ms_minFrameRate; -} - -// ---------------------------------------------------------------------- -/** - * Return whether to run with exception handling enabled. - * - * @return True to run without exception handling - */ - -bool ConfigSharedFoundation::getNoExceptionHandling(void) -{ - return ms_noExceptionHandling; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getFpuExceptionPrecision(void) -{ - return ms_fpuExceptionPrecision; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getFpuExceptionUnderflow(void) -{ - return ms_fpuExceptionUnderflow; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getFpuExceptionOverflow(void) -{ - return ms_fpuExceptionOverflow; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getFpuExceptionZeroDivide(void) -{ - return ms_fpuExceptionZeroDivide; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getFpuExceptionDenormal(void) -{ - return ms_fpuExceptionDenormal; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getFpuExceptionInvalid(void) -{ - return ms_fpuExceptionInvalid; -} - -// ---------------------------------------------------------------------- - -int ConfigSharedFoundation::getFatalCallStackDepth() -{ - return ms_fatalCallStackDepth; -} - -// ---------------------------------------------------------------------- - -int ConfigSharedFoundation::getWarningCallStackDepth() -{ - return ms_warningCallStackDepth; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getProfilerExpandAllBranches() -{ - return ms_profilerExpandAllBranches; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getUseRemoteDebug() -{ - return ms_useRemoteDebug; -} - -// ---------------------------------------------------------------------- - -int ConfigSharedFoundation::getDefaultRemoteDebugPort() -{ - return ms_defaultRemoteDebugPort; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getDemoMode() -{ - return ms_demoMode; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getAlwaysCanSeeWorldCell() -{ - return ms_alwaysCanSeeWorldCell; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getLookUpCallStackNames() -{ - return ms_lookUpCallStackNames; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getMemoryManagerReportAllocations() -{ - return ms_memoryManagerReportAllocations; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getMemoryManagerReportOnOutOfMemory() -{ - return ms_memoryManagerReportOnOutOfMemory; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getUseMemoryBlockManager() -{ - return ms_useMemoryBlockManager; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getMemoryBlockManagerDebugDumpOnRemove () -{ - return ms_memoryBlockManagerDebugDumpOnRemove; -} - -// ---------------------------------------------------------------------- - -bool ConfigSharedFoundation::getVerboseWarnings() -{ - return ms_verboseWarnings; -} - -// ---------------------------------------------------------------------- - -float ConfigSharedFoundation::getDebugReportLongFrameTime() -{ - return ms_debugReportLongFrameTime; -} - -// ====================================================================== diff --git a/src/engine/shared/library/sharedFoundation/src/linux/ConfigSharedFoundation.h b/src/engine/shared/library/sharedFoundation/src/linux/ConfigSharedFoundation.h deleted file mode 100644 index ace081843..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/ConfigSharedFoundation.h +++ /dev/null @@ -1,64 +0,0 @@ -// ====================================================================== -// -// ConfigSharedFoundation.h -// copyright 1998 Bootprint Entertainment -// copyright (c) 2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_ConfigSharedFoundation_H -#define INCLUDED_ConfigSharedFoundation_H - -// ====================================================================== - -class ConfigSharedFoundation -{ -public: - - struct Defaults - { - real frameRateLimit; - }; - -public: - - static void install (const Defaults &defaults); - - static real getFrameRateLimit(); - static real getMinFrameRate(); - static bool getNoExceptionHandling(); - - static bool getFpuExceptionPrecision(); - static bool getFpuExceptionUnderflow(); - static bool getFpuExceptionOverflow(); - static bool getFpuExceptionZeroDivide(); - static bool getFpuExceptionDenormal(); - static bool getFpuExceptionInvalid(); - - static bool getDemoMode(); - - static bool getUseRemoteDebug(); - static int getDefaultRemoteDebugPort(); - - static bool getProfilerExpandAllBranches(); - - static bool getMemoryManagerReportAllocations(); - static bool getMemoryManagerReportOnOutOfMemory(); - - static bool getUseMemoryBlockManager(); - static bool getMemoryBlockManagerDebugDumpOnRemove(); - - static int getFatalCallStackDepth(); - static int getWarningCallStackDepth(); - static bool getLookUpCallStackNames(); - - static bool getAlwaysCanSeeWorldCell(); - - static bool getVerboseWarnings(); - - static float getDebugReportLongFrameTime(); -}; - -// ====================================================================== - -#endif diff --git a/src/engine/shared/library/sharedFoundation/src/linux/FirstPlatform.h b/src/engine/shared/library/sharedFoundation/src/linux/FirstPlatform.h deleted file mode 100644 index 1ab235dc0..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/FirstPlatform.h +++ /dev/null @@ -1,54 +0,0 @@ -// ====================================================================== -// -// FirstPlatform.h -// jeff grills -// -// copyright 1998 Bootprint Entertainment -// -// ====================================================================== - -#ifndef FIRST_PLATFORM_H -#define FIRST_PLATFORM_H - -// ====================================================================== - -#include - -#define DLLEXPORT - -// ====================================================================== - -// C4514 unreferenced inline function has been removed -// C4710 inline function not expanded -// C4291 no matching operator delete found; memory will not be freed if initialization throws an exception - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../../../../../../engine/shared/library/sharedFoundation/include/public/sharedFoundation/PlatformGlue.h" -#include "sharedMemoryManager/MemoryManager.h" - - -// ====================================================================== - -template -inline int ComGetReferenceCount(T *t) -{ - t->AddRef(); - return t->Release(); -} - -// ====================================================================== - -#define FATAL_HR(a,b) FATAL(FAILED(b), (a, HRESULT_CODE(b))) -#define DEBUG_FATAL_HR(a,b) DEBUG_FATAL(FAILED(b), (a, HRESULT_CODE(b))) - -// ====================================================================== - -#endif diff --git a/src/engine/shared/library/sharedFoundation/src/linux/FloatingPointUnit.cpp b/src/engine/shared/library/sharedFoundation/src/linux/FloatingPointUnit.cpp deleted file mode 100644 index 3ad0c9498..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/FloatingPointUnit.cpp +++ /dev/null @@ -1,266 +0,0 @@ -// ====================================================================== -// -// FloatingPointUnit.cpp -// jeff grills -// -// copyright 1999 Bootprint Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedFoundation/FloatingPointUnit.h" - -#include "sharedFoundation/ConfigSharedFoundation.h" - -// ====================================================================== - -int FloatingPointUnit::updateNumber; -WORD FloatingPointUnit::status; -FloatingPointUnit::Precision FloatingPointUnit::precision; -FloatingPointUnit::Rounding FloatingPointUnit::rounding; -bool FloatingPointUnit::exceptionEnabled[E_max]; - -// ====================================================================== - -const WORD PRECISION_MASK = BINARY4(0000,0011,0000,0000); -const WORD PRECISION_24 = BINARY4(0000,0000,0000,0000); -const WORD PRECISION_53 = BINARY4(0000,0010,0000,0000); -const WORD PRECISION_64 = BINARY4(0000,0011,0000,0000); - -const WORD ROUND_MASK = BINARY4(0000,1100,0000,0000); -const WORD ROUND_NEAREST = BINARY4(0000,0000,0000,0000); -const WORD ROUND_CHOP = BINARY4(0000,1100,0000,0000); -const WORD ROUND_DOWN = BINARY4(0000,0100,0000,0000); -const WORD ROUND_UP = BINARY4(0000,1000,0000,0000); - -const WORD EXCEPTION_PRECISION = BINARY4(0000,0000,0010,0000); -const WORD EXCEPTION_UNDERFLOW = BINARY4(0000,0000,0001,0000); -const WORD EXCEPTION_OVERFLOW = BINARY4(0000,0000,0000,1000); -const WORD EXCEPTION_ZERO_DIVIDE = BINARY4(0000,0000,0000,0100); -const WORD EXCEPTION_DENORMAL = BINARY4(0000,0000,0000,0010); -const WORD EXCEPTION_INVALID = BINARY4(0000,0000,0000,0001); -const WORD EXCEPTION_ALL = BINARY4(0000,0000,0011,1111); - -// ====================================================================== - -void FloatingPointUnit::install(void) -{ - precision = P_24; - rounding = R_roundToNearestOrEven; - memset(exceptionEnabled, 0, sizeof(exceptionEnabled)); - - // preserve all other bits - status = getControlWord(); - status &= ~(PRECISION_MASK | ROUND_MASK | EXCEPTION_ALL); - - // set to single precision, rounding, and all exceptions masked - status |= PRECISION_24 | ROUND_NEAREST | EXCEPTION_ALL; - - // check the config platform flags to see if we should enable some exceptions - if (ConfigSharedFoundation::getFpuExceptionPrecision()) - { - exceptionEnabled[E_precision] = true; - status &= ~EXCEPTION_PRECISION; - } - - if (ConfigSharedFoundation::getFpuExceptionUnderflow()) - { - exceptionEnabled[E_underflow] = true; - status &= ~EXCEPTION_UNDERFLOW; - } - - if (ConfigSharedFoundation::getFpuExceptionOverflow()) - { - exceptionEnabled[E_overflow] = true; - status &= ~EXCEPTION_OVERFLOW; - } - - if (ConfigSharedFoundation::getFpuExceptionZeroDivide()) - { - exceptionEnabled[E_zeroDivide] = true; - status &= ~EXCEPTION_ZERO_DIVIDE; - } - - if (ConfigSharedFoundation::getFpuExceptionDenormal()) - { - exceptionEnabled[E_denormal] = true; - status &= ~EXCEPTION_DENORMAL; - } - - if (ConfigSharedFoundation::getFpuExceptionInvalid()) - { - exceptionEnabled[E_invalid] = true; - status &= ~EXCEPTION_INVALID; - } - - setControlWord(status); -} - -// ---------------------------------------------------------------------- - -void FloatingPointUnit::update(void) -{ - WORD currentStatus = getControlWord(); - - if (currentStatus != status) - { - DEBUG_REPORT_LOG_PRINT(true, ("FPU: update=%d, in mode=%04x, should be in mode=%04x", updateNumber, static_cast(currentStatus), static_cast(status))); - setControlWord(status); - } - - ++updateNumber; -} - -// ---------------------------------------------------------------------- - -WORD FloatingPointUnit::getControlWord(void) -{ - //TODO wtf is this asm statement? -#if 0 - WORD controlWord = 0; - __asm fnstcw controlWord; - return controlWord; -#else - return status; -#endif -} - -// ---------------------------------------------------------------------- - -void FloatingPointUnit::setControlWord(WORD controlWord) -{ - //TODO see above? - - UNREF(controlWord); -#if 0 - __asm fldcw controlWord; -#endif -} - -// ---------------------------------------------------------------------- - -void FloatingPointUnit::setPrecision(Precision newPrecision) -{ - WORD bits = 0; - - switch (precision) - { - case P_24: - bits = PRECISION_24; - break; - - case P_53: - bits = PRECISION_53; - break; - - case P_64: - bits = PRECISION_64; - break; - - case P_max: - default: - DEBUG_FATAL(true, ("bad case")); - } - - // record the current state - precision = newPrecision; - - // set the proper bit pattern - status &= ~PRECISION_MASK; - status |= bits; - - // slam it into the FPU - setControlWord(status); -} - -// ---------------------------------------------------------------------- - -void FloatingPointUnit::setRounding(Rounding newRounding) -{ - WORD bits = 0; - - switch (newRounding) - { - case R_roundToNearestOrEven: - bits = ROUND_NEAREST; - break; - - case R_chop: - bits = ROUND_CHOP; - break; - - case R_roundDown: - bits = ROUND_DOWN; - break; - - case R_roundUp: - bits = ROUND_UP; - break; - - case R_max: - default: - DEBUG_FATAL(true, ("bad case")); - } - - // record the current state - rounding = newRounding; - - // set the proper bit pattern - status &= ~ROUND_MASK; - status |= bits; - - // slam it into the FPU - setControlWord(status); -} - -// ---------------------------------------------------------------------- - -void FloatingPointUnit::setExceptionEnabled(Exception exception, bool enabled) -{ - WORD bits = 0; - - switch (exception) - { - case E_precision: - bits = EXCEPTION_PRECISION; - break; - - case E_underflow: - bits = EXCEPTION_UNDERFLOW; - break; - - case E_overflow: - bits = EXCEPTION_OVERFLOW; - break; - - case E_zeroDivide: - bits = EXCEPTION_ZERO_DIVIDE; - break; - - case E_denormal: - bits = EXCEPTION_DENORMAL; - break; - - case E_invalid: - bits = EXCEPTION_INVALID; - break; - - case E_max: - default: - DEBUG_FATAL(true, ("bad case")); - } - - // record the current state - exceptionEnabled[exception] = enabled; - - // twiddle the bit appropriately. these bits masks, so set the bit to disable the exception, clear the bit to enable it. - if (enabled) - status &= ~bits; - else - status |= bits; - - // slam it into the FPU - setControlWord(status); -} - -// ====================================================================== diff --git a/src/engine/shared/library/sharedFoundation/src/linux/FloatingPointUnit.h b/src/engine/shared/library/sharedFoundation/src/linux/FloatingPointUnit.h deleted file mode 100644 index d435343af..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/FloatingPointUnit.h +++ /dev/null @@ -1,102 +0,0 @@ -// ====================================================================== -// -// FloatingPointUnit.h -// jeff grills -// -// copyright 1999 Bootprint Entertainment -// -// ====================================================================== - -#ifndef FLOATING_POINT_UNIT_H -#define FLOATING_POINT_UNIT_H - -// ====================================================================== - -class FloatingPointUnit -{ -public: - - enum Precision - { - P_24, - P_53, - P_64, - - P_max - }; - - enum Rounding - { - R_roundToNearestOrEven, - R_chop, - R_roundDown, - R_roundUp, - - R_max - }; - - enum Exception - { - E_precision, - E_underflow, - E_overflow, - E_zeroDivide, - E_denormal, - E_invalid, - - E_max - }; - -private: - - static int updateNumber; - static WORD status; - static Precision precision; - static Rounding rounding; - static bool exceptionEnabled[E_max]; - -public: - - static WORD getControlWord(void); - static void setControlWord(WORD controlWord); - -public: - - static void install(void); - - static void update(void); - - static void setPrecision(Precision newPrecision); - static void setRounding(Rounding newRounding); - static void setExceptionEnabled(Exception exception, bool enabled); - - static Precision getPrecision(void); - static Rounding getRounding(void); - static bool getExceptionEnabled(Exception exception); -}; - -// ====================================================================== - -inline FloatingPointUnit::Precision FloatingPointUnit::getPrecision(void) -{ - return precision; -} - -// ---------------------------------------------------------------------- - -inline FloatingPointUnit::Rounding FloatingPointUnit::getRounding(void) -{ - return rounding; -} - -// ---------------------------------------------------------------------- - -inline bool FloatingPointUnit::getExceptionEnabled(Exception exception) -{ - DEBUG_FATAL(static_cast(exception) < 0 || static_cast(exception) >= static_cast(E_max), ("exception out of range")); //lint !e568 // non-negative quantity is never less than 0 - return exceptionEnabled[exception]; -} - -// ====================================================================== - -#endif diff --git a/src/engine/shared/library/sharedFoundation/src/linux/Os.cpp b/src/engine/shared/library/sharedFoundation/src/linux/Os.cpp deleted file mode 100644 index e9f2b6217..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/Os.cpp +++ /dev/null @@ -1,468 +0,0 @@ -// ====================================================================== -// -// Os.cpp -// jeff grills -// -// copyright 1998 Bootprint Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedFoundation/Os.h" - -#include "sharedFoundation/Clock.h" -#include "sharedFoundation/ConfigSharedFoundation.h" -#include "sharedDebug/DebugMonitor.h" -#include "sharedFoundation/ExitChain.h" -#include "sharedFoundation/FloatingPointUnit.h" -#include "sharedIoWin/IoWinManager.h" - -#include -#include - -// ====================================================================== - -bool Os::installed; -bool Os::runInBackground; -int Os::numberOfUpdates; -int Os::menuValue; -bool Os::paused; -bool Os::wasPaused; -bool Os::gameOver; -bool Os::shouldReturnFromAbort; -char Os::programName[PROGRAM_NAME_SIZE]; -char *Os::shortProgramName; -pthread_t Os::mainThreadId; -bool Os::threadDied; - -bool Os::isMp; -int Os::processorCount; - -// ---------------------------------------------------------------------- - -namespace OsNamespace -{ - class UncatchableException - { - }; -} - - -// ---------------------------------------------------------------------- -/** - * Install the Os subsystem for non-games. - * - * This routine is supported for all platforms, although different platforms may - * require different arguments to this routine. - * - * This routine will add Os::remove to the ExitChain. - * - * @see Os::remove() - */ - -void Os::install(void) -{ - installCommon(); -} - -// ---------------------------------------------------------------------- -/** - * This routine will remove the Os subsystem. - * - * This routine should not be called directly. It will be called from the ExitChain. - * - * @see Os::install() - */ - -void Os::remove(void) -{ - DEBUG_FATAL(!installed, ("not installed")); - installed = false; -} - -// ---------------------------------------------------------------------- - -void Os::installCommon(void) -{ - DEBUG_FATAL(installed, ("already installed")); - - ExitChain::add(Os::remove, "Os::remove", 0, true); - -#if 0 //TODO For now we won't screw with the priority of the process - HANDLE threadHandle = GetCurrentThread(); - DEBUG_FATAL(!SetThreadPriority(threadHandle, THREAD_PRIORITY_ABOVE_NORMAL), ("Failed to set game thread priority")); -#endif - - numberOfUpdates = 0; - mainThreadId = pthread_self(); - - // get the name of the executable -//Can't find UNIX call for this: DWORD result = GetModuleFileName(NULL, programName, sizeof(programName)); - strcpy(programName, "TempName"); - DWORD result = 1; - - - FATAL(result == 0, ("GetModuleFileName failed")); - - // get the file name without the path - shortProgramName = strrchr(programName, '\\'); - if (shortProgramName) - ++shortProgramName; - else - shortProgramName = programName; - - // determine the number of processors by parsing /proc/cpuinfo - processorCount = 1; - FILE * f = fopen("/proc/cpuinfo", "r"); - if (f) - { - char buffer[512]; - while (!feof(f)) - { - fgets(buffer, 512, f); - if (strncmp(buffer, "processor\t: ", 12)==0) - { - processorCount = atoi(buffer+12)+1; - } - } - fclose(f); - } - isMp = processorCount > 1; - - // switch into single-precision floating point mode - FloatingPointUnit::install(); - - installed = true; -} - -// ---------------------------------------------------------------------- - -bool Os::isMainThread(void) -{ - // if the Os class hasn't been installed, then assume we are the main thread. - // otherwise, check to see if our thread id is the main thread id - return !installed || (pthread_self() == mainThreadId); -} - -// ---------------------------------------------------------------------- -/** - * Terminate the application because of an error condition. - * - * This routine is supported for all platforms. - * - * This routine should not be called directly. The engine and game should use the - * FATAL macro to terminate the application because of an error. - * - * Calling Os::returnFromAbort() will cause the routine to do nothing but return - * immediately. - * - * @see Os::returnFromAbort(), FATAL() - */ -#include -void Os::abort(void) -{ - if (!isMainThread()) - { - threadDied = true; - pthread_exit(NULL); - } - - if (!shouldReturnFromAbort) - { - // let the C runtime deal with the abnormal termination - int * dummy = NULL; - int forceCrash = *dummy; - UNREF(forceCrash); - for (;;) - { - // One of these should work: - pthread_kill(pthread_self(), SIGSEGV); - ::kill(0,SIGSEGV); - ::abort(); - OsNamespace::UncatchableException ex; - throw ex; - sleep(10); - } - } -} -//----------------------------------------------------------------- -/** -* Create the specified directory and all of it's parents. -* @param directory the path to a directory -* @return always true currently -*/ - -bool Os::createDirectories (const char *directory) -{ - //-- construct list of subdirectories all the way down to root - std::stack directoryStack; - - std::string currentDirectory = directory; - - static const char path_seps [] = { '\\', '/', 0 }; - - // build the stack - while (!currentDirectory.empty()) - { - // remove trailing backslash - if (currentDirectory[currentDirectory.size()-1] == '\\' || currentDirectory[currentDirectory.size()-1] == '/') - IGNORE_RETURN(currentDirectory.erase(currentDirectory.size()-1)); - - if (currentDirectory[currentDirectory.size()-1] == ':') - { - // we've hit something like c: - break; - } - - if (!currentDirectory.empty()) - directoryStack.push(currentDirectory); - - // now strip off current directory - size_t previousDirIndex = currentDirectory.find_last_of (path_seps); - if (previousDirIndex == currentDirectory.npos) - break; - else - IGNORE_RETURN(currentDirectory.erase(previousDirIndex)); - } - - //-- build all directories specified by the initial directory - while (!directoryStack.empty()) - { - // get the directory - currentDirectory = directoryStack.top(); - directoryStack.pop(); - - // try to create it (don't pass any security attributes) - IGNORE_RETURN (mkdir (currentDirectory.c_str(), 0)); - } - - return true; -} -// ---------------------------------------------------------------------- -/** - * Write out a file. - * - * The file name and where the file is written is system-dependent. - * - * @param fileName Name of the file to write - * @param data Data buffer to write to the file - */ - -bool Os::writeFile(const char *fileName, const void *data, int length) // Length of the data bufferto write -{ - BOOL result; - HANDLE handle; - DWORD written; - - // open the file for writing - handle = CreateFile(fileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - // check if it was opened - if (handle == INVALID_HANDLE_VALUE) - return false; - - // attempt to write the data - result = WriteFile(handle, data, static_cast(length), &written, NULL); - - // make sure the data was written okay - if (!result || written != static_cast(length)) - { - static_cast(CloseHandle(handle)); - return false; - } - - // close the file - result = CloseHandle(handle); - - // make sure the close was sucessful - if (!result) - return false; - - return true; -} - -// ---------------------------------------------------------------------- -/** - * Update the Os subsystem. - * - * This routine is supported for all platforms. - * - * For the Win* platforms, this routine will process the windows message pump. - */ - -bool Os::update(void) -{ - static int ppid = getppid(); - - FloatingPointUnit::update(); - - ++numberOfUpdates; - -#if 0 -#ifdef _DEBUG - - if (DEBUG_FLAG_PLATFORM(validateHeap)) - { - PROFILER_START("validate heap"); - MemoryManager::validate(); - PROFILER_STOP("validate heap"); - } - -#endif -#endif - - Clock::update(); - - wasPaused = false; - - // if our parent's pid has changed, we tell our caller it should exit - if (getppid() != ppid) - { - WARNING(true, ("Parent process exited!")); - // reset the parent process id, so we don't keep spamming warnings for processes that don't exit because of this - ppid = getppid(); - return false; - } - - return true; -} - -// ---------------------------------------------------------------------- -/** - * Formats a message error using GetLastError() and FormatMessge(). - * - * The buffer returned from this function is dynamically allocated to prevent - * issues with this routine being called from multiple threads. The caller - * must delete the buffer when it is done. - * - * @return A dynamically allocated buffer containing the error message - */ - -char *Os::getLastError(void) -{ - return DuplicateString(strerror(errno)); -} - -// ---------------------------------------------------------------------- - -bool Os::getAbsolutePath(const char *relativePath, char *absolutePath, int absolutePathBufferSize) -{ - // realpath sucks and could cause a buffer overrun. however, it's better than writing it ourselves for now. - char *result = realpath(relativePath, absolutePath); - if (!result) - return false; - - FATAL(istrlen(absolutePath)+1 > absolutePathBufferSize, ("buffer overrun")); - return true; -} - -// ---------------------------------------------------------------------- -/** - * Get the actual system time, in seconds since the epoch. - * - * Do not use this for most game systems, since it does not take into account - * clock sku, game loop times, etc. - */ -time_t Os::getRealSystemTime(void) -{ - return time(0); -} - -// ---------------------------------------------------------------------- -/** - * Convert a time in seconds since the epoch to GMT. - * - */ - -void Os::convertTimeToGMT(const time_t &time, tm &zulu) -{ - zulu=*gmtime(&time); // gmtime uses a single static tm structure. Yuck! -} - -// ---------------------------------------------------------------------- -/** - * Convert a tm structure to the time in seconds since the epoch. - * - */ - -time_t Os::convertGMTToTime(const tm &zulu) -{ - return mktime(const_cast(&zulu)); -} - -// ---------------------------------------------------------------------- -/** - * Get a unique identifier for this thread. - * - * @return A unique identifier for this thread. - */ - -Os::ThreadId Os::getThreadId() -{ - return pthread_self(); -} - -// ---------------------------------------------------------------------- -/** - * Assign the given thread a reasonable name (only works for MSDev 6.0 debugger) - * Since this is Linux-specific, make sure this fuction does nothing - * - */ - -void Os::setThreadName(DWORD threadID, const char* threadName) -{ -} - -// ---------------------------------------------------------------------- -/** - * Cause the current thread to sleep for a period of time. If the period is - * zero, the current thread yields it's timeslice. - */ - -void Os::sleep(int ms) -{ - if (ms == 0) - { - sched_yield(); - } - else - { - usleep(ms * 1000); - } -} - -// ---------------------------------------------------------------------- -/** - * Copy text to the system clipboard. - * - * This routine can be used if the application wants to make some data easily available for pasting (like crash call stacks). - */ - -bool Os::copyTextToClipboard(const char *text) -{ - UNREF(text); - return false; -} - -// ---------------------------------------------------------------------- - -Os::OsPID_t Os::getProcessId() -{ - return getpid(); -} - -// ---------------------------------------------------------------------- - -void Os::setProgramName(const char * name) -{ - strncpy(programName, name, Os::PROGRAM_NAME_SIZE); -} - -// ---------------------------------------------------------------------- - -bool Os::isFocused() -{ - return true; -} - -// ---------------------------------------------------------------------- diff --git a/src/engine/shared/library/sharedFoundation/src/linux/Os.h b/src/engine/shared/library/sharedFoundation/src/linux/Os.h deleted file mode 100644 index 44778b4ec..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/Os.h +++ /dev/null @@ -1,264 +0,0 @@ -// ====================================================================== -// -// Os.h -// jeff grills -// -// copyright 1998 Bootprint Entertainment -// -// ====================================================================== - -#ifndef OS_H -#define OS_H - -#include - -// ====================================================================== - -struct DebugMenuEntry; - -// ====================================================================== - -class Os -{ -public: - - typedef pthread_t ThreadId; - typedef pid_t OsPID_t; - - enum - { - MAX_PATH_LENGTH = 512 - }; - - typedef void (*QueueCharacterHookFunction)(int keyboard, int character); - typedef void (*SetSystemMouseCursorPositionHookFunction)(int x, int y); - typedef void (*QueueKeyDownHookFunction)(int keyboard, int character); - - -private: - - Os(void); - Os(const Os &); - Os &operator =(const Os &); - - enum - { - PROGRAM_NAME_SIZE = 512 - }; - -private: - - static void remove(void); - - static void installCommon(void); - -private: - - static bool installed; - static bool runInBackground; - static int numberOfUpdates; - static int menuValue; - static DebugMenuEntry *debugMenuGame; - static bool paused; - static bool wasPaused; - static bool gameOver; - static bool shouldReturnFromAbort; - static bool wantPopupDebugMenu; - static char programName[PROGRAM_NAME_SIZE]; - static char *shortProgramName; - static pthread_t mainThreadId; - static bool threadDied; - static bool isMp; - static int processorCount; - - -public: - - static void install(void); - - static bool isGameOver(void); - static bool isMainThread(void); - static bool wasApplicationPaused(void); - - static bool update(void); - - static void returnFromAbort(void); - static void abort(void); - - static void requestPopupDebugMenu(); - - static bool createDirectories (const char *dirname); - - static bool writeFile(const char *fileName, const void *data, int length); - - static int getNumberOfUpdates(void); - - static char *getLastError(void); - - static void setThreadName(DWORD threadID, const char* name); - static ThreadId getThreadId(); - - static const char *getProgramName(void); - static const char *getShortProgramName(void); - static void setProgramName(const char * name); - - static bool getAbsolutePath(const char *relativePath, char *absolutePath, int absolutePathBufferSize); - - static void sleep(int ms); - - static time_t getRealSystemTime(void); - static void convertTimeToGMT(const time_t &time, tm &zulu); - static time_t convertGMTToTime(const tm &zulu); - - static bool isMultiprocessor(); - static int getProcessorCount(); - - static bool copyTextToClipboard(const char *text); - - static bool wasFocusLost(); - static void setQueueCharacterHookFunction(QueueCharacterHookFunction queueCharacterHookFunction); - static void setSetSystemMouseCursorPositionHookFunction(SetSystemMouseCursorPositionHookFunction setSystemMouseCursorPositionHookFunction); - static OsPID_t getProcessId(); - static bool isFocused(); - - static void setQueueKeyDownHookFunction(QueueKeyDownHookFunction queueKeyDownHookFunction); -}; - -// ---------------------------------------------------------------------- -/** - * Return the full name of the running executable. - * - * The program name will include the path as well. - * - * @return The full name of the running executable - * @see Os::getShortProgramName() - */ - -inline const char *Os::getProgramName(void) -{ - return programName; -} - -// ---------------------------------------------------------------------- -/** - * Return the short name of the running executable. - * - * The program name will not include the path, but will just be the file name. - * - * @return The short name of the running executable - * @see Os::getProgramName() - */ - -inline const char *Os::getShortProgramName(void) -{ - return shortProgramName; -} - -// ---------------------------------------------------------------------- -/** - * Cause Os::abort() to return instead of abort the process. - * - * This routine should not be called directly by users. - * - * This routine is provided so that structured exception handling can catch - * an exception, call Fatal to run the ExitChain, and rethrow the exception - * so that the debugger will catch it. - */ - -inline void Os::returnFromAbort(void) -{ - shouldReturnFromAbort = true; -} - -// ---------------------------------------------------------------------- -/** - * Check if the Os knows the game needs to shut down. - * - * The Os can decide that the game need to end for a number of reasons, - * including closing the application or shutting the machine down. - * - * @return True if the game should quit, otherwise false - */ - -inline bool Os::isGameOver(void) -{ - return gameOver; -} - -// ---------------------------------------------------------------------- -/** - * Return the number of updates that the have occurred. - * - * @return This value is updated during the Os::update() routine. - */ - -inline int Os::getNumberOfUpdates(void) -{ - return numberOfUpdates; -} - -// ---------------------------------------------------------------------- -/** - * Indicate whether or not the application was paused. - * - * @return True if the application was in the background (paused), otherwise false - */ - -inline bool Os::wasApplicationPaused(void) -{ - return wasPaused; -} - -// ---------------------------------------------------------------------- -/** - * Return a flag indicating whether we are running a multiprocessor machine or not. - * - * @return True if the machine has more than one processor, false if not. - */ - -inline bool Os::isMultiprocessor(void) -{ - return isMp; -} - -// ---------------------------------------------------------------------- -/** - * Return the number of processors. - * - * @return The number of processors in the machine. - */ - -inline int Os::getProcessorCount(void) -{ - return processorCount; -} - -// ---------------------------------------------------------------------- - -inline bool Os::wasFocusLost() -{ - return false; -} - -// ---------------------------------------------------------------------- - -inline void Os::setQueueCharacterHookFunction(QueueCharacterHookFunction queueCharacterHookFunction) -{ -} - -// ---------------------------------------------------------------------- - -inline void Os::setSetSystemMouseCursorPositionHookFunction(SetSystemMouseCursorPositionHookFunction setSystemMouseCursorPositionHookFunction) -{ -} - -// ---------------------------------------------------------------------- - -inline void Os::setQueueKeyDownHookFunction(QueueKeyDownHookFunction) -{ -} - - -// ---------------------------------------------------------------------- - -#endif diff --git a/src/engine/shared/library/sharedFoundation/src/linux/PerThreadData.cpp b/src/engine/shared/library/sharedFoundation/src/linux/PerThreadData.cpp deleted file mode 100644 index 3d7f8584f..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/PerThreadData.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// ====================================================================== -// -// PerThreadData.cpp -// jeff grills -// -// copyright 1998 Bootprint Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedFoundation/PerThreadData.h" - -#include "sharedSynchronization/Gate.h" - -// ====================================================================== - -pthread_key_t PerThreadData::slot; -bool PerThreadData::slotCreated=false; - -// ====================================================================== -// Install the per-thread-data subsystem -// -// Remarks: -// -// This routine will install the per-thread-data subsystem that is required for several -// other subsystems in the engine. It should be called from the primary thread before -// any other threads have been created. It will also call threadInstall() for the -// primary thread. -// -// See Also: -// -// PerThreadData::remove() - -void PerThreadData::install(void) -{ - if (pthread_key_create(&slot, 0)!=0) - { - FATAL(true, ("pthread_key_create failed")); - } - slotCreated=true; - - threadInstall(); -} - -// ---------------------------------------------------------------------- -/** - * Remove the per-thread-subsystem. - * - * This routine should be called by the primary thread after all other threads have - * terminated, and no other uses of per-thread-data will occur. - * - * @see PerThreadData::install() - */ - -void PerThreadData::remove(void) -{ - threadRemove(); - - if (pthread_key_delete(slot)!=0) - { - FATAL(true, ("pthread_key_delete failed")); - } - - slotCreated=false; -} - -// ---------------------------------------------------------------------- -/** - * Get access to the per-thread-data. - * - * This routine will verify the per-thread-data subsystem has been installed and the - * threadInstall() function has been called for the current thread. - * - * @return A pointer to the per-thread-data. - */ - -PerThreadData::Data *PerThreadData::getData(bool allowReturnNull) -{ - UNREF(allowReturnNull); - - if (!slotCreated) - { - DEBUG_FATAL(true && !allowReturnNull, ("not installed")); - return NULL; - } - - Data * const data = reinterpret_cast(pthread_getspecific(slot)); - DEBUG_FATAL(!data && !allowReturnNull, ("not installed for this thread")); - return data; -} - -// ---------------------------------------------------------------------- -/** - * Create the per-thread-data for a new thread. - * - * This routine should be called in a thread before the first usage of per-thread-data. - * - * If the client is calling this function on a thread that existed before the engine was - * installed, the client should set isNewThread to false. Setting isNewThread to false - * prevents the function from validating that the thread's TLS is NULL. For threads existing - * before the engine is installed, the TLS data for the thread is undefined. - * - * @param isNewThread [IN] true if the thread was created after the engine was installed, false otherwise - * @see PerThreadData::threadRemove() - */ - -void PerThreadData::threadInstall(bool isNewThread) -{ - UNREF(isNewThread); - - DEBUG_FATAL(!slotCreated, ("not installed")); - - // only check for already-set data if this is supposed to be a new thread - DEBUG_FATAL(isNewThread && pthread_getspecific(slot), ("already installed for this thread")); - - // create the data - Data * const data = new Data; - - // initialize the data - memset(data, 0, sizeof(*data)); - - //create the event for file streaming reads - data->readGate = new Gate(false); - - // set the data into the thread slot - const BOOL result = pthread_setspecific(slot, data); - UNREF(result); - DEBUG_FATAL(result, ("pthread_setspecific failed")); //NB: unlike Windows, returns 0 on success. -} //lint !e429 // Warning -- Custodial pointer 'data' has not been freed or returned) // stored int thread-local-storage - -// ---------------------------------------------------------------------- -/** - * Destroythe per-thread-data for a terminating thread. - * - * This routine should be called in a thread after the last usage of per-thread-data. - * - * @see PerThreadData::threadInstall() - */ - -void PerThreadData::threadRemove(void) -{ - DEBUG_FATAL(!slotCreated, ("not installed")); - DEBUG_FATAL(!pthread_getspecific(slot), ("thread not installed")); - - // get the data - Data *data = getData(); - - //close the event used for file streaming reads - delete data->readGate; - data->readGate = NULL; - - // wipe the data in the thread slot - const BOOL result2 = pthread_setspecific(slot, NULL); - UNREF(result2); - DEBUG_FATAL(result2, ("TlsSetValue failed")); //NB: unlike Windows, returns 0 on success. - - // free the memory - delete data; -} - -// ====================================================================== diff --git a/src/engine/shared/library/sharedFoundation/src/linux/PerThreadData.h b/src/engine/shared/library/sharedFoundation/src/linux/PerThreadData.h deleted file mode 100644 index 596e65a3e..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/PerThreadData.h +++ /dev/null @@ -1,232 +0,0 @@ -// ====================================================================== -// -// PerThreadData.h -// jeff grills -// -// copyright 1998 Bootprint Entertainment -// -// ====================================================================== - -#ifndef PER_THREAD_DATA_H -#define PER_THREAD_DATA_H - -// ====================================================================== - -#include "../../../../../../engine/shared/library/sharedFoundation/include/public/sharedFoundation/ExitChain.h" - -class Gate; - -// ====================================================================== -/** - * Provide thread local storage functionality. - * - * This class' purpose is to allow each thread to maintain some storage that is local and private to each thread. - * The system must be installed before use. Each thread that may use per-thread-data will also need to call the - * threadInstall() routine after creation and threadRemove() just before termination of the thread. - */ -class PerThreadData -{ -private: - - struct Data - { - bool exitChainRunning; - bool exitChainFataling; - ExitChain::Entry *exitChainFirstEntry; - - int debugPrintFlags; - - Gate *readGate; - }; - - static pthread_key_t slot; - static bool slotCreated; - -private: - - static Data *getData(bool allowReturnNull=false); - -private: - - PerThreadData(void); - PerThreadData(const PerThreadData &); - PerThreadData &operator =(const PerThreadData &); - -public: - - static void install(void); - static void remove(void); - - static void threadInstall(bool isNewThread = true); - static void threadRemove(void); - - static bool isThreadInstalled(void); - - static bool getExitChainRunning(void); - static void setExitChainRunning(bool newValue); - - static bool getExitChainFataling(void); - static void setExitChainFataling(bool newValue); - - static ExitChain::Entry *getExitChainFirstEntry(void); - static void setExitChainFirstEntry(ExitChain::Entry *newValue); - - static int getDebugPrintFlags(void); - static void setDebugPrintFlags(int newValue); - - static Gate *getFileStreamerReadGate(void); -}; - -// ====================================================================== -/** - * Determine if the per-thread-data is available for this thread - * - * Return value: - * - * True if the per-thread-data is installed correctly, false otherwise - * - * Remarks: - * - * This routine is not intended for general use; it should only be used by the ExitChain class. - * - * -TRF- looks like Win98 does not zero out a new TLS slot for - * threads existing at the time of slot creation. Thus, if you build a - * plugin that only initializes the engine the first time it is - * used, and other threads already exist in the app, those threads - * will contain bogus non-null data in the TLS slot. If the plugin really - * wants to do lazy initialization of the engine, it will need - * to handle calling PerThreadData::threadInstall() for all existing threads - * (except the thread that initialized the engine, which already - * has its PerThreadData::threadInstall() called). - */ - -inline bool PerThreadData::isThreadInstalled(void) -{ - return (getData(true) != NULL); -} - -// ---------------------------------------------------------------------- -/** - * Get the exit chain running flag value. - * - * This routine is not intended for general use; it should only be used by the ExitChain class. - * - * @return True if the exit chain is running, false otherwise. - * @see ExitChain::isRunning() - */ - -inline bool PerThreadData::getExitChainRunning(void) -{ - return getData()->exitChainRunning; -} - -// ---------------------------------------------------------------------- -/** - * Set the exit chain running flag value. - * - * This routine is not intended for general use; it should only be used by the ExitChain class. - * - * @param newValue New value for the exit chain running flag - */ - -inline void PerThreadData::setExitChainRunning(bool newValue) -{ - getData()->exitChainRunning = newValue; -} - -// ---------------------------------------------------------------------- -/** - * Get the exit chain fataling flag value. - * - * This routine is not intended for general use; it should only be used by the ExitChain class. - * - * @return True if the exit chain is fataling, false otherwise. - * @see ExitChain::isFataling() - */ - -inline bool PerThreadData::getExitChainFataling(void) -{ - return getData()->exitChainFataling; -} - -// ---------------------------------------------------------------------- -/** - * Set the exit chain fataling flag value. - * - * This routine is not intended for general use; it should only be used by the ExitChain class. - * - * @param newValue New value for the exit chain fataling flag - */ - -inline void PerThreadData::setExitChainFataling(bool newValue) -{ - getData()->exitChainFataling = newValue; -} - -// ---------------------------------------------------------------------- -/** - * Get the first entry for the exit chain. - * - * This routine is not intended for general use; it should only be used by the ExitChain class. - * This routine may return NULL. - * - * @return Pointer to the first entry on the exit chain - * @see ExitChain::isFataling() - */ - -inline ExitChain::Entry *PerThreadData::getExitChainFirstEntry(void) -{ - return getData()->exitChainFirstEntry; -} - -// ---------------------------------------------------------------------- -/** - * Set the exit chain fataling flag value. - * - * This routine is not intended for general use; it should only be used by the ExitChain class. - * The parameter to this routine may be NULL. - * - * @param newValue New value for the exit chain first entry - */ - -inline void PerThreadData::setExitChainFirstEntry(ExitChain::Entry *newValue) -{ - getData()->exitChainFirstEntry = newValue; -} - -// ---------------------------------------------------------------------- -/** - * Get the debug print flags. - * - * This routine is not intended for general use; it should only be used by the DebugPrint functions. - * - * @return Current value of the debug print flags - */ - -inline int PerThreadData::getDebugPrintFlags(void) -{ - return getData()->debugPrintFlags; -} - -// ---------------------------------------------------------------------- -/** - * Set the debug print flags value. - * - * This routine is not intended for general use; it should only be used by the DebugPrint functions. - */ - -inline void PerThreadData::setDebugPrintFlags(int newValue) -{ - getData()->debugPrintFlags = newValue; -} - -// ---------------------------------------------------------------------- - -inline Gate *PerThreadData::getFileStreamerReadGate(void) -{ - return getData()->readGate; -} - -// ====================================================================== - -#endif diff --git a/src/engine/shared/library/sharedFoundation/src/linux/PlatformGlue.cpp b/src/engine/shared/library/sharedFoundation/src/linux/PlatformGlue.cpp deleted file mode 100644 index e2d7da295..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/PlatformGlue.cpp +++ /dev/null @@ -1,273 +0,0 @@ -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedFoundation/PlatformGlue.h" -#include - - -real abs(real x) -{ - return fabs(x); -} - -int _stricmp(const char* string1, const char* string2) -{ - int first, second; - - do - { - first = toupper(*string1); - second = toupper(*string2); - string1++; - string2++; - } while (first && first==second); - - return (first - second); -} - -char* _itoa(int value, char* stringOut, int radix) -{ - DEBUG_FATAL((radix != 10), ("itoa only supprts base 10")); - sprintf(stringOut, "%d", value); - return stringOut; -} - -bool QueryPerformanceCounter(__int64* time) -{ - struct timeval tv; - gettimeofday(&tv, NULL); - *time = static_cast(tv.tv_sec); - *time = (*time * 1000000) + static_cast(tv.tv_usec); - - return TRUE; -} - -bool QueryPerformanceFrequency(__int64 *freq) -{ - *freq = CLOCKS_PER_SEC; - return TRUE; - -} - -void Sleep(DWORD msecs) -{ - //Sleep takes a time to sleep in milliseconds. - usleep(msecs*1000); //usleep works with microseconds -} - -int GetLastError() -{ - return errno; -} - -void OutputDebugString(const char* stringOut) -{ - fprintf(stderr,"%s",stringOut); -} - - -//File Support -BOOL WriteFile(FILE* hFile, const void* lpBuffer, DWORD numBytesToWrite, DWORD* numBytesWritten, void* unsup) -{ - int retval; - - if(unsup) - return FALSE; //Windows doesn't support this overrlap buffer - - retval = fwrite(lpBuffer, sizeof(char), numBytesToWrite, hFile); - *numBytesWritten = retval; - return (retval < 0) ? FALSE : TRUE; - -} - -BOOL ReadFile(FILE* hFile, void* lpBuffer, DWORD numBytesToRead, DWORD* numBytesRead, void* unsup) -{ - int retval; - - if(unsup) - return FALSE; //Windows doesn't support this overrlap buffer - - retval = fread(lpBuffer, sizeof(char), numBytesToRead, hFile); - *numBytesRead = retval; - return (retval <= 0) ? FALSE : TRUE; - -} - -DWORD SetFilePointer(FILE* hFile, long lDistanceToMove, long* lpDistanceToMoveHigh, DWORD dwMoveMethod) -{ - //Mimics the Win32 function to set the position of a file pointer. return -1 on failure else current position. - - int retval; - retval = fseek(hFile, lDistanceToMove, dwMoveMethod); - - return (retval == 0) ? ftell(hFile) : -1; -} - -//TODO Consider using a call to open() instead of fopen() to get a better mapping of parameters to Win32 -FILE* CreateFile(const char* fileName, DWORD access, DWORD shareMode, void* unsupA, DWORD creationDisposition, DWORD flagsAndAttributes, FILE* unsupB) -{ - FILE* retval = 0; - - DEBUG_FATAL(flagsAndAttributes != FILE_ATTRIBUTE_NORMAL, ("Unsupported File mode call to CreateFile()")); - DEBUG_FATAL(unsupB != NULL, ("Unsupported File mode call to CreateFile()")); - //DEBUG_FATAL(shareMode != 0, ("Unsupported File mode call to CreateFile()")); - DEBUG_FATAL(unsupA != 0, ("Unsupported File mode call to CreateFile()")); - - switch(creationDisposition) - { - case CREATE_NEW: - retval = fopen(fileName, "r"); - if (retval) - { - fclose(retval); - retval = NULL; - } - else - { - fclose(retval); - retval = fopen(fileName, "w"); - } - break; - - case CREATE_ALWAYS: - retval = fopen(fileName, "w"); - break; - - case OPEN_EXISTING: - retval = fopen(fileName, "r"); - if ((access & GENERIC_WRITE) && retval) - { - fclose(retval); - retval = fopen(fileName, "a"); - rewind(retval); - } - break; - - case OPEN_ALWAYS: - if (access & GENERIC_WRITE) - { - retval = fopen(fileName, "a"); - rewind(retval); - } - else - { - retval = fopen(fileName, "r"); - } - break; - - case TRUNCATE_EXISTING: - DEBUG_FATAL(!(access & GENERIC_WRITE),("Must open truncate file with write access")); - retval = fopen(fileName, "w"); - break; - } - - return retval; -} - - -BOOL CloseHandle(FILE* hFile) -{ - int retval = fclose(hFile); - return (retval == 0) ? TRUE : FALSE; -} - -//TODO There must be a more elegant UNIX command to get file size...fstat() needs filename -DWORD GetFileSize(FILE* hFile, DWORD* lpHighSize) -{ - long int curPos; - DWORD endPos; - curPos = ftell(hFile); - fseek(hFile, 0, SEEK_END); - endPos = ftell(hFile); - fseek(hFile, curPos, SEEK_SET); - return endPos; - -#if 0 -//This is what I want to do, but I have no file des number - struct stat buf; - fstat(hFile, &buf); - return buf->st_size; -#endif -} - -BOOL FileExists(const char* filename) -{ - BOOL retval = false; - - struct stat info; - if (stat(filename, &info) == 0) - { - if (S_ISREG(info.st_mode)) - retval = true; - } - - return retval; -} - - - -//Memory Functions - -void* VirtualAlloc(void* location, DWORD size, DWORD flAllocationType, DWORD flProtect) -{ - if (location) - return location; - - return malloc(size); -} - -BOOL VirtualFree(void* location, DWORD size, DWORD freeType) -{ - free(location); - return TRUE; -} - -BOOL VirtualProtect(void* location, DWORD size, DWORD newProtect, DWORD* oldProect) -{ - //Unused. Function stub for compatibility - return TRUE; -} - -BOOL IsBadReadPtr(const void* location, unsigned int size) -{ - //unused - return TRUE; -} - -void MessageBox (void* unused, const char* message, const char* unused2, int flags) -{ - OutputDebugString(message); -} - -char *ConvertCommandLine(int argc, char ** argv) -{ - static char buffer[2048]; - - int totalSize=0; - for (int i=0; i1023) - { - int argIndex = 0; - fprintf(stderr, "Exceeded command line args length of %d. Total size is %d\n", sizeof(buffer), totalSize); - for(argIndex = 0; argIndex < argc; ++argIndex) - { - fprintf(stderr, "argv[%d]=\"%s\"\n", argIndex, argv[argIndex]); - } - FATAL(true,("Command line exceeds maximum length.")); - } - - buffer[0]='\0'; - - for (int i=0; i -#include -#include - -#include -#include -#include - -typedef unsigned short int WORD; -typedef unsigned long int DWORD; -typedef bool BOOL; -typedef long long __int64; //lint !e13 !e19 // Error: 13 (Bad type), Error: 19 (Useless declaration) // -TRF- Lint preprocessor discrepency, @todo look into this. -typedef __int64 LARGE_INTEGER; - -const BOOL FALSE = 0; -const BOOL TRUE = 1; - - -float abs(float x); -int _stricmp(const char* string1, const char* string2); - -//String to numeric conversions -char* _itoa(int value, char* stringOut, int radix); - -//Format specifier for non-portable printf -#define UINT64_FORMAT_SPECIFIER "%llu" -#define INT64_FORMAT_SPECIFIER "%lli" - -//Constant definition macro for 64 bit values -#define UINT64_LITERAL(a) a ## ull -#define INT64_LITERAL(a) a ## ll - -bool QueryPerformanceCounter(__int64 *time); -bool QueryPerformanceFrequency(__int64 *freq); -void Sleep(DWORD msecs); -int GetLastError(); -void OutputDebugString(const char* stringOut); - -//File Support -#include -#include -#include - -typedef FILE* HANDLE; - -#define INVALID_HANDLE_VALUE NULL //Have to use a #define because this may be a FILE* - - -const int GENERIC_READ = 1 << 0; -const int GENERIC_WRITE = 1 << 1; - -const int CREATE_NEW = 1; -const int CREATE_ALWAYS = 2; -const int OPEN_EXISTING = 3; -const int OPEN_ALWAYS = 4; -const int TRUNCATE_EXISTING = 5; - -const DWORD FILE_ATTRIBUTE_NORMAL = 1; - -const int FILE_CURRENT = SEEK_CUR; -const int FILE_BEGIN = SEEK_SET; -const int FILE_END = SEEK_END; - -const int FILE_SHARE_READ = 1; - -BOOL WriteFile(FILE* hFile, const void* lpBuffer, DWORD numBytesToWrite, DWORD* numBytesWritten, void* unsup=NULL); -BOOL ReadFile(FILE* hFile, void* lpBuffer, DWORD numBytesToWrite, DWORD* numBytesRead, void* unsup=NULL); -DWORD SetFilePointer(FILE* hFile, long lDistanceToMove, long* lpDistanceToMoveHigh, DWORD dwMoveMethod); -FILE* CreateFile(const char* fileName, DWORD access, DWORD shareMode, void* unsupA, DWORD creationDisposition, DWORD flagsAndAttributes, FILE* unsup2); -BOOL CloseHandle(FILE* hFile); -DWORD GetFileSize(FILE* hFile, DWORD* lpHighSize); -BOOL FileExists(const char* fileName); - - -//Memory Support - -const int MEM_RESERVE = 0; -const int MEM_COMMIT = 1; -const int PAGE_READWRITE = 0; -const int MEM_RELEASE = 0; -const int PAGE_NOACCESS = 0; - -void* VirtualAlloc(void* location, DWORD size, DWORD flAllocationType, DWORD flProtect); -BOOL VirtualFree(void* location, DWORD size, DWORD freeType); -BOOL VirtualProtect(void* location, DWORD size, DWORD newProtect, DWORD* oldProect); -BOOL IsBadReadPtr(const void* location, unsigned int size); - -//Misc output stuff - -const int MB_OK = 0; -const int MB_ICONEXCLAMATION = 1; -void MessageBox (void* unused, const char* message, const char* unused2, int flags); -char *ConvertCommandLine(int argc, char ** argv); - -//String functions -#define _vsnprintf vsnprintf - -//----------------------------------------------------------------- - -inline int _strnicmp (const char * a, const char * b, size_t count) -{ - return ::strncasecmp (a, b, count); -} - -//----------------------------------------------------------------- - -inline int _open(const char *filename, int oflag) { return open(filename, oflag); } -inline int _open(const char *filename, int oflag, mode_t pmode) { return open(filename, oflag, pmode); } -inline int _creat(const char *filename, mode_t pmode) { return creat(filename, pmode); } -inline int _close(int fd) { return close(fd); } -inline int _write(int fd, const void *buffer, unsigned int count) { return write(fd, buffer, count); } -inline int _dup(int fd) { return dup(fd); } -inline int _dup2(int oldfd, int newfd) { return dup2(oldfd, newfd); } -inline long _lseek(int fd, long offset, int origin) { return lseek(fd, offset, origin); } -inline int _read(int fd, void *buffer, unsigned int count) { return read(fd, buffer, count); } -inline long _tell(int fd) { return _lseek(fd,0,SEEK_CUR); } -inline int _umask(int pmode) { return umask(pmode); } -inline int _unlink(const char *pathname) { return unlink(pathname); } - -//----------------------------------------------------------------- - -#endif //INCLUDED_MISC_H diff --git a/src/engine/shared/library/sharedFoundation/src/linux/SetupSharedFoundation.cpp b/src/engine/shared/library/sharedFoundation/src/linux/SetupSharedFoundation.cpp deleted file mode 100644 index 0a2fc1ec9..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/SetupSharedFoundation.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// ====================================================================== -// -// SetupSharedFoundation.cpp -// copyright 1998 Bootprint Entertainment -// copyright 2001 - 2002 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedFoundation/SetupSharedFoundation.h" - -#include "sharedDebug/ConfigSharedDebugLinux.h" -#include "sharedDebug/DebugMonitor.h" -#include "sharedDebug/Profiler.h" -#include "sharedFoundation/Clock.h" -#include "sharedFoundation/CommandLine.h" -#include "sharedFoundation/ConfigFile.h" -#include "sharedFoundation/ConfigSharedFoundation.h" -#include "sharedFoundation/CrcLowerString.h" -#include "sharedFoundation/ExitChain.h" -#include "sharedFoundation/Os.h" -#include "sharedFoundation/PerThreadData.h" -#include "sharedFoundation/StaticCallbackEntry.h" - -#include -#include - -// ====================================================================== -/** - * Install the engine. - * - * The settings in the Data structure will determine which subsystems - * get initialized. - */ - -void SetupSharedFoundation::install(const Data &data) -{ - // and get the command line stuff in quick so we can make decisions based on the command line settings - CommandLine::install(); - ConfigFile::install(); - - if (data.lpCmdLine) - CommandLine::absorbString(data.lpCmdLine); - if (data.argc) - CommandLine::absorbStrings(const_cast(data.argv+1), data.argc-1); - -#if 0 - //currently there's a problem that we cannot override the defaults here. - if (data.configFile) - IGNORE_RETURN(ConfigFile::loadFile(data.configFile)); -#endif - - // get the post command-line text for the ConfigFile (key-value pairs) - const char *configString = CommandLine::getPostCommandLineString(); - if (configString) - ConfigFile::loadFromCommandLine(configString); - - //@todo there is a lot of stuff in win32 setup not here...like exitchain - Profiler::registerDebugFlags(); -#if _DEBUG - MemoryManager::registerDebugFlags(); -#endif//_DEBUG - - // Setup Linux DebugMonitor support. - // @todo fix this dependency: DebugMonitor really should be moved into Foundation the way things currently are. TRF is following the existing win32 setup. -#ifdef _DEBUG - ConfigSharedDebugLinux::install(); - DebugMonitor::install(); -#endif - - // setup the engine configuration - ConfigSharedFoundation::Defaults defaults; - defaults.frameRateLimit = data.frameRateLimit; - ConfigSharedFoundation::install(defaults); - SetWarningStrictFatal(ConfigFile::getKeyBool("SharedDebug", "strict", false)); - Report::install(); - Clock::install(data.runInBackground, false); - - PersistentCrcString::install(); - CrcLowerString::install(); - StaticCallbackEntry::install(); -} - -// ---------------------------------------------------------------------- -// Call a function with appropriate exception handling (not) -// -// Remarks: -// -// this is stubbed and exception handling is ignored currently - -void SetupSharedFoundation::callbackWithExceptionHandling( - void (*callback)(void) // Routine to call with exception handling - ) -{ - if (ConfigSharedFoundation::getNoExceptionHandling()) - { - callback(); - } - else - { -#if 0 - try - { - callback(); - } - catch (__exception * mathException) - { - FATAL(true, ("Math Exception: %s\n", mathException->name)); - } - catch (const char* message) - { - FATAL(true, ("Character Exception: %s\n", message)); - } - catch(std::exception & m) - { - const char * c = m.what(); - FATAL(true, ("Std::exception: %s\n", c)); - } - catch(...) - { - FATAL(true, ("Unknown exception\n")); - } -#else - callback(); -#endif - } -} - -// ---------------------------------------------------------------------- -/** - * Uninstall the engine. - * - * This routine will properly uninstall the engine componenets that were - * installed by SetupSharedFoundation::install(). - */ - -void SetupSharedFoundation::remove(void) -{ - ExitChain::quit(); - - if (GetNumberOfWarnings()) - REPORT(true, Report::RF_print | Report::RF_log | Report::RF_dialog, ("%d warnings logged", GetNumberOfWarnings())); - - // this routine can't be on the exit chain because the exit chain depends upon the PerThreadData class being around - //PerThreadData::remove(); -} - -// ---------------------------------------------------------------------- - -SetupSharedFoundation::Data::Data(Defaults defaults) -{ - Zero(*this); - - switch (defaults) - { - case D_game: - runInBackground = true; - - lpCmdLine = NULL; - argc = 0; - argv = NULL; - - configFile = NULL; - - frameRateLimit = CONST_REAL(0); - break; - - case D_console: - runInBackground = true; - - lpCmdLine = NULL; - argc = 0; - argv = NULL; - - configFile = NULL; - - frameRateLimit = CONST_REAL(0); - break; - - default: - DEBUG_FATAL(true, ("unknown case")); - } -} - -// ====================================================================== diff --git a/src/engine/shared/library/sharedFoundation/src/linux/SetupSharedFoundation.h b/src/engine/shared/library/sharedFoundation/src/linux/SetupSharedFoundation.h deleted file mode 100644 index 1d05421aa..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/SetupSharedFoundation.h +++ /dev/null @@ -1,58 +0,0 @@ -// ====================================================================== -// -// SetupSharedFoundation.h -// copyright 1998 Bootprint Entertainment -// copyright 2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_SetupSharedFoundation_H -#define INCLUDED_SetupSharedFoundation_H - -// ====================================================================== - -struct DebugMenuEntry; - -// ====================================================================== - -class SetupSharedFoundation -{ -public: - - struct Data - { - // allow running in background - bool runInBackground; - - // pointer to command line - char* lpCmdLine; - int argc; - char **argv; - - const char *configFile; - - real frameRateLimit; - - public: - - enum Defaults - { - D_game, - D_console - }; - - Data(Defaults defaults); - }; - -public: - - static void install(const Data &data); - static void remove(void); - - static void callbackWithExceptionHandling(void (*callback)(void)); - -}; - -// ====================================================================== - -#endif diff --git a/src/engine/shared/library/sharedFoundation/src/linux/vsnprintf.cpp b/src/engine/shared/library/sharedFoundation/src/linux/vsnprintf.cpp deleted file mode 100644 index 6b4c5647f..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/vsnprintf.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// ====================================================================== -// -// vsnprintf.cpp -// jeff grills -// -// copyright 1998 Bootprint Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedFoundation/vsnprintf.h" - -#include - -// ====================================================================== -// Format a printf-style string into a text buffer of fixed size -// -// Return value: -// -// The number of characters written into the buffer, or -1 if the buffer was too small -// -// Remarks: -// -// If the buffer would overflow, the null terminating character is not written and -1 -// will be returned. - -#ifdef _MSC_VER - -int vsnprintf(char *buffer, size_t count, const char *format, va_list va) -{ - return _vsnprintf(buffer, count, format, va); -} - -#endif -// ====================================================================== diff --git a/src/engine/shared/library/sharedFoundation/src/linux/vsnprintf.h b/src/engine/shared/library/sharedFoundation/src/linux/vsnprintf.h deleted file mode 100644 index 2dc530903..000000000 --- a/src/engine/shared/library/sharedFoundation/src/linux/vsnprintf.h +++ /dev/null @@ -1,24 +0,0 @@ -// ====================================================================== -// -// vsnprintf.h -// jeff grills -// -// copyright 1998 Bootprint Entertainment -// -// ====================================================================== - -#ifndef VSNPRINTF_H -#define VSNPRINTF_H - -// ====================================================================== - -#ifdef _MSC_VER - -int vsnprintf(char *buffer, size_t count, const char *format, va_list va); - -#endif - -// ====================================================================== - -#endif - diff --git a/src/engine/shared/library/sharedFoundation/src/win32/Os.cpp b/src/engine/shared/library/sharedFoundation/src/win32/Os.cpp index 928979e5d..2a8e88136 100644 --- a/src/engine/shared/library/sharedFoundation/src/win32/Os.cpp +++ b/src/engine/shared/library/sharedFoundation/src/win32/Os.cpp @@ -18,7 +18,6 @@ #include "sharedFoundation/Clock.h" #include "sharedFoundation/ConfigFile.h" #include "sharedFoundation/ConfigSharedFoundation.h" -#include "sharedFoundation/CrashReportInformation.h" #include "sharedFoundation/ExitChain.h" #include "sharedFoundation/FloatingPointUnit.h" #include "sharedFoundation/Production.h" @@ -80,7 +79,6 @@ namespace OsNamespace Os::IMEHookFunction ms_IMEHookFunction; Os::QueueKeyDownHookFunction ms_queueKeyDownHookFunction; - int ms_processorCount; int ms_debugKeyIndex; int ms_SystemMouseCursorPositionX; int ms_SystemMouseCursorPositionY; @@ -245,106 +243,6 @@ void Os::installCommon() // switch into single-precision floating point mode FloatingPointUnit::install(); - // get the amount of memory - MEMORYSTATUS memoryStatus; - GlobalMemoryStatus(&memoryStatus); - CrashReportInformation::addStaticText("Ram: %dmb\n", memoryStatus.dwTotalPhys / (1024 * 1024)); - - // log the os information - { - OSVERSIONINFO versionInfo; - Zero(versionInfo); - versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&versionInfo); - CrashReportInformation::addStaticText("Os1: %d.%d.%d\n", versionInfo.dwMajorVersion, versionInfo.dwMinorVersion, versionInfo.dwBuildNumber); - - char const * os = "Unknown"; - - char CDECL pwine_get_version; - HMODULE hntdll = GetModuleHandle("ntdll.dll"); - - switch (versionInfo.dwMajorVersion) { - case 4: - switch (versionInfo.dwMinorVersion){ - case 10: - os = "Windows 98"; - break; - case 90: - os = "Windows ME"; - break; - } - break; - case 5: - switch (versionInfo.dwMinorVersion) { - case 0: - os = "Windows 2000"; - break; - case 1: - os = "Windows XP"; - break; - case 2: - os = "Windows 2003"; - break; - } - break; - case 6: - switch (versionInfo.dwMinorVersion){ - case 0: - os = "Windows Vista"; - break; - case 1: - os = "Windows 7"; - break; - case 2: - os = "Windows 8"; - break; - case 3: - os = "Windows 8.1"; - break; - } - break; - case 10: - os = "Windows 10"; - break; - } - - //detect WINE - if (hntdll) - { - pwine_get_version = (char)GetProcAddress(hntdll, "wine_get_version"); - if (pwine_get_version) - { - os = strcat("Wine ", &pwine_get_version); - } - } - - CrashReportInformation::addStaticText("Os2: %s %s\n", os, versionInfo.szCSDVersion); - } - - // get the number of processors - SYSTEM_INFO si; - GetSystemInfo(&si); - ms_processorCount = static_cast(si.dwNumberOfProcessors); - REPORT_LOG (ConfigSharedFoundation::getVerboseHardwareLogging(), ("Processor Count: %i\n", ms_processorCount)); - CrashReportInformation::addStaticText("NumProc: %d\n", ms_processorCount); - - { - HKEY key; - LONG result = RegOpenKeyEx (HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_EXECUTE, &key); - - if (result == ERROR_SUCCESS) - { - DWORD data; - DWORD type = REG_DWORD; - DWORD size = sizeof (data); - result = RegQueryValueEx (key, "~MHz", NULL, &type, reinterpret_cast (&data), &size); - if ((result == ERROR_SUCCESS) && (size > 0)) - REPORT_LOG (ConfigSharedFoundation::getVerboseHardwareLogging(), ("Processor Speed: %i MHz\n", data)); - - RegCloseKey (key); - } - } - if (!GetKeyboardLayoutName(ms_keyboardLayout)) ms_keyboardLayout[0] = '\0'; @@ -495,30 +393,6 @@ bool Os::wasFocusLost() return ms_wasFocusLost; } -// ---------------------------------------------------------------------- -/** - * Return a flag indicating whether we are running a multiprocessor machine or not. - * - * @return True if the machine has more than one processor, false if not. - */ - -bool Os::isMultiprocessor() -{ - return ms_processorCount > 1; -} - -// ---------------------------------------------------------------------- -/** - * Return the number of processors. - * - * @return The number of processors in the machine. - */ - -int Os::getProcessorCount() -{ - return ms_processorCount; -} - // ---------------------------------------------------------------------- bool Os::isMainThread() @@ -1662,10 +1536,7 @@ bool Os::isFocused() bool Os::launchBrowser(std::string const & website) { std::string URL("http://"); - if (strncmp(URL.c_str(), website.c_str(),7)!=0) - URL+=website; - else - URL=website; + URL=website; int result = reinterpret_cast(ShellExecute(NULL, "open", URL.c_str(), NULL, NULL, SW_SHOWNORMAL)); return (result > 32); } diff --git a/src/engine/shared/library/sharedFoundation/src/win32/Os.h b/src/engine/shared/library/sharedFoundation/src/win32/Os.h index afb3be403..92ea8ef01 100644 --- a/src/engine/shared/library/sharedFoundation/src/win32/Os.h +++ b/src/engine/shared/library/sharedFoundation/src/win32/Os.h @@ -109,9 +109,6 @@ public: static void convertTimeToGMT(const time_t &time, tm &zulu); static time_t convertGMTToTime(const tm &zulu); - static bool isMultiprocessor(); - static int getProcessorCount(); - static void buildRelativePath(const char *baseDirectory, const char *targetPathname, std::string &relativePath); static bool getAbsolutePath(const char *relativePath, char *absolutePath, int absolutePathBufferSize); diff --git a/src/engine/shared/library/sharedFoundationTypes/src/linux/FoundationTypesLinux.h b/src/engine/shared/library/sharedFoundationTypes/src/linux/FoundationTypesLinux.h deleted file mode 100644 index 386c4ffb4..000000000 --- a/src/engine/shared/library/sharedFoundationTypes/src/linux/FoundationTypesLinux.h +++ /dev/null @@ -1,30 +0,0 @@ -// PRIVATE. Do not export this header file outside the package. - -#ifndef INCLUDED_FoundationTypesLinux_H -#define INCLUDED_FoundationTypesLinux_H - -// ====================================================================== -// specify what platform we're running on. - -#define PLATFORM_UNIX -#define PLATFORM_LINUX - -#include -// ====================================================================== -// basic types that we assume to be around - -typedef unsigned int uint; -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef unsigned long uint32; -typedef signed char int8; -typedef signed short int16; -typedef signed long int32; -typedef signed long long int int64; -typedef unsigned long long int uint64; -typedef float real; -typedef FILE* FILE_HANDLE; - -#endif - - diff --git a/src/engine/shared/library/sharedLog/src/linux/StderrLogger.cpp b/src/engine/shared/library/sharedLog/src/linux/StderrLogger.cpp deleted file mode 100644 index 963684d27..000000000 --- a/src/engine/shared/library/sharedLog/src/linux/StderrLogger.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// ====================================================================== -// -// StderrLogger.cpp -// -// Copyright 2003 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedLog/FirstSharedLog.h" -#include "sharedLog/StderrLogger.h" -#include "sharedLog/Log.h" -#include -#include - -// ====================================================================== - -namespace StderrLoggerNamespace -{ - bool s_installed; - int s_oldStderr; - int s_stderrPipe[2]; -} -using namespace StderrLoggerNamespace; - -// ====================================================================== - -void StderrLogger::install() -{ - DEBUG_FATAL(s_installed, ("StderrLogger already installed")); - s_installed = true; - s_oldStderr = dup(2); - pipe(s_stderrPipe); - dup2(s_stderrPipe[1], 2); - fcntl(s_stderrPipe[0], F_SETFL, O_NONBLOCK); -} - -// ---------------------------------------------------------------------- - -void StderrLogger::remove() -{ - DEBUG_FATAL(!s_installed, ("StderrLogger not installed")); - dup2(s_oldStderr, 2); - close(s_stderrPipe[0]); - close(s_stderrPipe[1]); - s_installed = false; -} - -// ---------------------------------------------------------------------- - -void StderrLogger::update() -{ - if (!s_installed) - return; - - char buf[8192]; - int nRead = read(s_stderrPipe[0], buf, sizeof(buf)-1); - if (nRead > 0) - { - int startPos = 0; - while (startPos < nRead) - { - int endPos = startPos; - while (buf[endPos] != '\n' && endPos < nRead) - ++endPos; - buf[endPos] = 0; - if (endPos > startPos) - LOG("stderr", ("%s", buf+startPos)); - startPos = endPos+1; - } - } -} - -// ====================================================================== - diff --git a/src/engine/shared/library/sharedMemoryManager/src/linux/OsMemory.cpp b/src/engine/shared/library/sharedMemoryManager/src/linux/OsMemory.cpp deleted file mode 100644 index 6a63523ba..000000000 --- a/src/engine/shared/library/sharedMemoryManager/src/linux/OsMemory.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// ====================================================================== -// -// OsMemory.cpp -// -// Copyright 2002 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedMemoryManager/FirstSharedMemoryManager.h" -#include "sharedMemoryManager/OsMemory.h" - -// ====================================================================== - -void OsMemory::install() -{ -} - -// ---------------------------------------------------------------------- - -void OsMemory::remove() -{ -} - -// ---------------------------------------------------------------------- - -void *OsMemory::commit(void *, size_t bytes) -{ - return ::malloc(bytes); -} - -// ---------------------------------------------------------------------- - -bool OsMemory::free(void *addr, size_t) -{ - ::free(addr); - - return true; -} - -// ====================================================================== diff --git a/src/engine/shared/library/sharedMemoryManager/src/linux/OsMemory.h b/src/engine/shared/library/sharedMemoryManager/src/linux/OsMemory.h deleted file mode 100644 index 8bc52ae51..000000000 --- a/src/engine/shared/library/sharedMemoryManager/src/linux/OsMemory.h +++ /dev/null @@ -1,29 +0,0 @@ -// ====================================================================== -// -// OsMemory.h -// -// Copyright 2002 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_OsMemory_H -#define INCLUDED_OsMemory_H - -// ====================================================================== - -class OsMemory -{ -public: - static void install(); - static void remove(); - - static void * reserve(size_t bytes); - static void * commit(void *addr, size_t bytes); - static bool free(void *addr, size_t bytes); - static bool protect(void *addr, size_t bytes, bool allowAccess); -}; - -// ====================================================================== - -#endif // INCLUDED_OsMemory_H - diff --git a/src/engine/shared/library/sharedMemoryManager/src/linux/OsNewDel.cpp b/src/engine/shared/library/sharedMemoryManager/src/linux/OsNewDel.cpp deleted file mode 100644 index 553adc93c..000000000 --- a/src/engine/shared/library/sharedMemoryManager/src/linux/OsNewDel.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// ====================================================================== -// -// OsNewDel.cpp -// -// Copyright 2002 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedMemoryManager/FirstSharedMemoryManager.h" -#include "sharedMemoryManager/MemoryManager.h" -#include "sharedMemoryManager/OsNewDel.h" - -#include -#include -#include - -static MemoryManager memoryManager __attribute__ ((init_priority (101))); - -#define USE_LIBC_MALLOC_HOOKS 0 - -#if USE_LIBC_MALLOC_HOOKS -extern "C" -{ - void memoryManagerFreeHook(__malloc_ptr_t __ptr, __const __malloc_ptr_t) - { - delete[] (char *)__ptr; - } - - __malloc_ptr_t memoryManagerMallocHook(size_t __size, const __malloc_ptr_t) - { - return new char[__size]; - } - - __malloc_ptr_t memoryManagerReallocHook(__malloc_ptr_t __ptr, size_t size, __const __malloc_ptr_t) - { - if(! __ptr) - return new char[size]; - - return MemoryManager::reallocate(__ptr, size); - } - - __malloc_ptr_t memoryManagerMemAlignHook(size_t alignment, size_t size, __const __malloc_ptr_t) - { - DEBUG_FATAL(true, ("memalign not implemented!")); - return new char[size]; - } - - static void memoryManagerMallocInitializeHook(void) - { - __free_hook = memoryManagerFreeHook; - __malloc_hook = memoryManagerMallocHook; - __realloc_hook = memoryManagerReallocHook; - __memalign_hook = memoryManagerMemAlignHook; - } - void (*__malloc_initialize_hook) (void) = memoryManagerMallocInitializeHook; -} - -#endif//USE_LIBC_MALLOC_HOOKS - -// ====================================================================== - -void *operator new(size_t size, MemoryManagerNotALeak) throw (std::bad_alloc) -{ - return MemoryManager::allocate(size, reinterpret_cast(__builtin_return_address(0)), false, false); -} - -// ---------------------------------------------------------------------- - -void *operator new(size_t size) throw (std::bad_alloc) -{ - return MemoryManager::allocate(size, reinterpret_cast(__builtin_return_address(0)), false, true); -} - -// ---------------------------------------------------------------------- - -void *operator new[](size_t size) throw (std::bad_alloc) -{ - return MemoryManager::allocate(size, reinterpret_cast(__builtin_return_address(0)), true, true); -} - -// ---------------------------------------------------------------------- - -void *operator new(size_t size, const char *file, int line) throw (std::bad_alloc) -{ - return MemoryManager::allocate(size, reinterpret_cast(__builtin_return_address(0)), false, true); -} - -// ---------------------------------------------------------------------- - -void *operator new[](size_t size, const char *file, int line) throw (std::bad_alloc) -{ - return MemoryManager::allocate(size, reinterpret_cast(__builtin_return_address(0)), true, true); -} - -// ---------------------------------------------------------------------- - -void operator delete(void *pointer) throw() -{ - if (pointer) - MemoryManager::free(pointer, false); -} - -// ---------------------------------------------------------------------- - -void operator delete[](void *pointer) throw() -{ - if (pointer) - MemoryManager::free(pointer, true); -} - -// ---------------------------------------------------------------------- - -void operator delete(void *pointer, const char *file, int line) throw() -{ - UNREF(file); - UNREF(line); - - if (pointer) - MemoryManager::free(pointer, false); -} - -// ---------------------------------------------------------------------- - -void operator delete[](void *pointer, const char *file, int line) throw() -{ - UNREF(file); - UNREF(line); - - if (pointer) - MemoryManager::free(pointer, true); -} - -// ====================================================================== - diff --git a/src/engine/shared/library/sharedMemoryManager/src/linux/OsNewDel.h b/src/engine/shared/library/sharedMemoryManager/src/linux/OsNewDel.h deleted file mode 100644 index ad3d4df87..000000000 --- a/src/engine/shared/library/sharedMemoryManager/src/linux/OsNewDel.h +++ /dev/null @@ -1,33 +0,0 @@ -// ====================================================================== -// -// OsNewDel.h -// -// Copyright 2002 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_OsNewDel_H -#define INCLUDED_OsNewDel_H - -// ====================================================================== - -enum MemoryManagerNotALeak -{ - MM_notALeak -}; - -void *operator new(size_t size, MemoryManagerNotALeak) throw(std::bad_alloc); -void *operator new(size_t size) throw(std::bad_alloc); -void *operator new[](size_t size) throw(std::bad_alloc); -void *operator new(size_t size, char const *file, int line) throw(std::bad_alloc); -void *operator new[](size_t size, char const *file, int line) throw(std::bad_alloc); - -void operator delete(void *pointer) throw(); -void operator delete[](void *pointer) throw(); -void operator delete(void *pointer, char const *file, int line) throw(); -void operator delete[](void *pointer, char const *file, int line) throw(); - -// ====================================================================== - -#endif // INCLUDED_OsNewDel_H - diff --git a/src/engine/shared/library/sharedNetwork/src/linux/Address.cpp b/src/engine/shared/library/sharedNetwork/src/linux/Address.cpp deleted file mode 100644 index 3832558fd..000000000 --- a/src/engine/shared/library/sharedNetwork/src/linux/Address.cpp +++ /dev/null @@ -1,372 +0,0 @@ -//--------------------------------------------------------------------- - -#include "FirstSharedNetwork.h" -#include "Address.h" -#include -#include -#include -#include -#include -#include - -//--------------------------------------------------------------------- - -Address::Address() : -addr4(new struct sockaddr_in), -hostAddress("0.0.0.0") -{ - memset(addr4, 0, sizeof(struct sockaddr_in)); - addr4->sin_family = AF_INET; -} - -//--------------------------------------------------------------------- - -Address::Address(const std::string & newHostAddress, unsigned short newHostPort) : -addr4(new struct sockaddr_in), -hostAddress(newHostAddress) -{ - struct hostent * h; - unsigned long u; - - memset(addr4, 0, sizeof(struct sockaddr_in)); - addr4->sin_port = htons(newHostPort); - addr4->sin_family = AF_INET; - // was an address supplied? - if(hostAddress.size() > 0) - { - // Is the first byte a number? (IP names begin with an alpha) - if(!isdigit(hostAddress[0])) - { - // The first byte is a letter, resolve it - if( (h = gethostbyname(hostAddress.c_str())) != 0) - { - memcpy(&addr4->sin_addr, h->h_addr_list[0], sizeof(addr4->sin_addr)); - } - else - { - // boom! grab the entry from the h_addr member instead! - if( (h = gethostbyname(hostAddress.c_str())) != 0) - { - memcpy(&addr4->sin_addr, h->h_addr, sizeof(addr4->sin_addr)); - } - else - { - // no resolution, INADDR_ANY - memset(&addr4->sin_addr, 0, sizeof(addr4->sin_addr)); - - // in debug, fail, something is wrong. - // potential problems - an insanely bogus address was - // passed or the host system is misconfigured and cannot - // resolve the name - assert(false); - } - } - char addrbuf[17] = {"\0"}; - unsigned char * a = (unsigned char *)&addr4->sin_addr; - snprintf(addrbuf, sizeof(addrbuf), "%u.%u.%u.%u", a[0], a[1], a[2], a[3]); - hostAddress = addrbuf; - } - else - { - // A dotted decimal ip number string was supplied. Convert for sin_addr - u = inet_addr(hostAddress.c_str()); - memcpy(&addr4->sin_addr, &u, sizeof(addr4->sin_addr)); - } - } - else - { - // nothing was supplied, assign INADDR_ANY - addr4->sin_addr.s_addr = INADDR_ANY; - } -} - -//--------------------------------------------------------------------- - -Address::Address(const Address & source) : -addr4(new struct sockaddr_in), -hostAddress(source.hostAddress) -{ - *addr4 = *source.addr4; -} - -//--------------------------------------------------------------------- - -Address::Address(const struct sockaddr_in & ipv4addr) : -addr4(new struct sockaddr_in), -hostAddress("") -{ - convertFromSockAddr(ipv4addr); -} - -//--------------------------------------------------------------------- - -Address::~Address() -{ - delete addr4; -} - -//--------------------------------------------------------------------- - -Address & Address::operator = (const Address & rhs) -{ - if(this != &rhs) - { - hostAddress = rhs.hostAddress; - *addr4 = *rhs.addr4; - } - return *this; -} - -//--------------------------------------------------------------------- - -Address & Address::operator = (const struct sockaddr_in & rhs) -{ - convertFromSockAddr(rhs); - return *this; -} - -//--------------------------------------------------------------------- - -void Address::convertFromSockAddr(const struct sockaddr_in & source) -{ - // extract IP bytes from ipv4add4 - const unsigned char * ip; - char name[17] = {"\0"}; - - ip = reinterpret_cast(&source.sin_addr); - snprintf(name, 17, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]); //lint !e534 - hostAddress = name; - *addr4 = source; -} - -//--------------------------------------------------------------------- -/** - @brief get a human readable host address - - Example: - \code - void foo(struct sockaddr_in & a) - { - Address b(a); - printf("address = %%s\\n", b.getHostAddress().c_str()); - } - \endcode - - @return A human readable host address string - - @author Justin Randall -*/ -const std::string & Address::getHostAddress() const -{ - return hostAddress; -} - -//--------------------------------------------------------------------- -/** - @brief get the port associated with this address - - Example: - \code - void foo(struct sockaddr_in & a) - { - Address b(a); - printf("port = %%i\\n", b.getHostPort()); - } - \endcode - - @return A human readable port in host-byte order associated with - this address. - - @author Justin Randall -*/ -const unsigned short Address::getHostPort() const -{ - return ntohs(addr4->sin_port); -} - -//--------------------------------------------------------------------- -/** - @brief get the BSD sockaddr describing this address - - Example: - \code - void foo(SOCKET s, unsigned char * d, int l, const Address & a) - { - int t = sizeof(struct sockaddr_in); - sendto(s, s, l, 0, reinterpret_cast(&(a.getSockAddr4())), t); - } - \endcode - - @return a BSD sockaddr that describes this IPv4 address - - @author Justin Randall -*/ -const struct sockaddr_in & Address::getSockAddr4() const -{ - return *addr4; -} - -//--------------------------------------------------------------------- -/** - @brief equality operator - - The equality operator compares the ip address, ip port, - and address family to establish equality. - - Example: - \code - Address a("127.0.0.1", 55443); - Address b; - - b = a; - assert(b == a); - \endcode - - @return True of the right hand side is equal to this address - - @author Justin Randall -*/ -const bool Address::operator == (const Address & rhs) const -{ - return (addr4->sin_addr.s_addr == rhs.addr4->sin_addr.s_addr && - addr4->sin_family == rhs.addr4->sin_family && - addr4->sin_port == rhs.addr4->sin_port); -} - -//--------------------------------------------------------------------- -/** - @brief less-than comparison operator - - The < comparison operator compares the IP number and port. If - the IP numbers are identical, but the left hand side port is - less than the right hand side port, the operator will return - true. - - @return true if the left hand side's IP number is less than - the right hand side IP number. If the numbers are equal, it - will return true if the left hand side IP port is less - than the right hand side port. Otherwise it returns false. - - @author Justin Randall -*/ -const bool Address::operator < (const Address & rhs) const -{ - return(addr4->sin_addr.s_addr < rhs.addr4->sin_addr.s_addr || - addr4->sin_addr.s_addr == rhs.addr4->sin_addr.s_addr && - addr4->sin_port < rhs.addr4->sin_port); -} - -//--------------------------------------------------------------------- -/** - @brief inequality operator - - Leverages the equality operator, so whenever == returns true, - this returns false, and visa versa. - - @return true if the right hand side is not equal to the left - hand side. False if they are equal. - - @see Adress::operator== - - @author Justin Randall -*/ -const bool Address::operator != (const Address & rhs) const -{ - return(! (rhs == *this)); -} - -//--------------------------------------------------------------------- -/** - @brief greater-than comparison operator - - The > comparison operator compares the IP number and port. If - the IP numbers are identical, but the right hand side port is - lesser than the left hand side port, the operator will return - true. - - @return true if the left hand side's IP number is greater than - the right hand side IP number. If the numbers are equal, it - will return true if the left hand side IP port is greater - than the right hand side port. Otherwise it returns false. - - @author Justin Randall -*/ -const bool Address::operator > (const Address & rhs) const -{ - return(addr4->sin_addr.s_addr > rhs.addr4->sin_addr.s_addr || - addr4->sin_addr.s_addr == rhs.addr4->sin_addr.s_addr && - addr4->sin_port > rhs.addr4->sin_port); -} - -//--------------------------------------------------------------------- -/** - @brief a hash_map support routine - - The STL hash_map (present in most STL implementations) requires - a size_t return from a hash function to identify which bucket - a particular value should reside in. On 32 bit or better platforms - the sockaddr_in.sin_addr.s_addr member is small enough to - qualify as a hash-result, provides reasonably unique values - and is reproducable given an address input. - - Example: - \code - typedef std::hash_map AddressMap; - \endcode - - @return the ip number member of a sockaddr_in struct - - @author Justin Randall -*/ -size_t Address::hashFunction() const -{ - return addr4->sin_addr.s_addr; -} - -//--------------------------------------------------------------------- -/** - @brief STL map support routine - - STL maps (including hash_maps) require unique keys, and therefore - need to compare a key for equality with an existing target. - - The functor uses Address::operator = for the comparison. - - Example: - \code - typedef std::hash_map AddressMap; - \endcode - - @return true if the left hand side and right hand side are equal - using Address::operator = - @see Address::operator= - -*/ -bool Address::EqualFunction::operator () (const Address & lhs, const Address & rhs) const -{ - return lhs == rhs; -} - -//--------------------------------------------------------------------- -/** - @brief STL hash_map support routine - - The HashFunction::operator() invokes Address::hashFunction to - determine an appropriate hash for the address. - - Example: - \code - typedef std::hash_map AddressMap; - \endcode - - @see Address::hashFunction - - @author Justin Randall -*/ -size_t Address::HashFunction::operator () (const Address & a) const -{ - return a.hashFunction(); -} -//--------------------------------------------------------------------- - - diff --git a/src/engine/shared/library/sharedNetwork/src/linux/NetworkGetHostName.cpp b/src/engine/shared/library/sharedNetwork/src/linux/NetworkGetHostName.cpp deleted file mode 100644 index a68bba8d3..000000000 --- a/src/engine/shared/library/sharedNetwork/src/linux/NetworkGetHostName.cpp +++ /dev/null @@ -1,141 +0,0 @@ -// NetworkGetHostName.cpp -// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved. -// Author: Justin Randall - -//----------------------------------------------------------------------- - -#include "FirstSharedNetwork.h" -#include "Address.h" -#include "sharedNetwork/NetworkHandler.h" -#include -#include -#include -#include -#include -#include -#include - -//----------------------------------------------------------------------- - -struct HN -{ - HN(); - std::string hostName; -}; - -//----------------------------------------------------------------------- - -HN::HN() -{ - char name[512] = {"\0"}; - if(gethostname(name, sizeof(name)) == 0) - { - Address a(name, 0); - //hostName = name; - hostName = a.getHostAddress(); - } -} - -//----------------------------------------------------------------------- - -const std::string & NetworkHandler::getHostName() -{ - static HN hn; - return hn.hostName; -} - -//----------------------------------------------------------------------- - -const std::string & NetworkHandler::getHumanReadableHostName() -{ - char name[512] = {"\0"}; - static std::string nameString; - if(nameString.empty()) - { - if(gethostname(name, sizeof(name)) == 0) - { - name[sizeof(name) - 1] = 0; - //hostName = name; - nameString = name; - } - } - return nameString; -} - -//----------------------------------------------------------------------- - -struct HL -{ - HL(); - std::vector > addrList; -}; - -//----------------------------------------------------------------------- - -HL::HL() : -addrList() -{ - struct ifconf ifc; - int sock = socket(AF_INET, SOCK_DGRAM, 0); - - // create a socket to perform SIOCGIFCONF on - if(sock > -1) - { - // determine buffer size to receive array of if_req's, initialize it - // when length is appropriate - int reqSize = 100 * sizeof(struct ifreq); - int lastReqSize = reqSize; - for(;;) - { - char * buf = new char[reqSize]; - ifc.ifc_len = reqSize; - ifc.ifc_buf = buf; - memset(ifc.ifc_buf, 0, reqSize); - if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) - { - if (errno != EINVAL || lastReqSize != 0) - { - WARNING(true, ("Error getting interface list: %s", strerror(errno))); - delete buf; - return; - } - } - else - { - if(ifc.ifc_len == lastReqSize) - break; // we have the reqs - lastReqSize = ifc.ifc_len; - } - - // need more buffer space for request - reqSize += sizeof(struct ifreq); - delete [] buf; - } - - int reqCount = reqSize / sizeof(struct ifreq); - int i; - ifreq * reqs = (struct ifreq *)ifc.ifc_buf; - for(i = 0; i < reqCount; ++i) - { - struct sockaddr_in * sa = (struct sockaddr_in *)&reqs[i].ifr_addr; - if(sa->sin_family == AF_INET) - { - char addrbuf[17] = {"\0"}; - unsigned char * a = (unsigned char *)&sa->sin_addr; - snprintf(addrbuf, sizeof(addrbuf), "%u.%u.%u.%u", a[0], a[1], a[2], a[3]); - addrList.push_back(std::make_pair(std::string(reqs[i].ifr_name), std::string(addrbuf))); - } - } - - } -} - -//----------------------------------------------------------------------- - -const std::vector > & NetworkHandler::getInterfaceAddresses() -{ - static HL hl; - return hl.addrList; -} - -//----------------------------------------------------------------------- diff --git a/src/engine/shared/library/sharedNetwork/src/linux/Sock.cpp b/src/engine/shared/library/sharedNetwork/src/linux/Sock.cpp deleted file mode 100644 index 22b293589..000000000 --- a/src/engine/shared/library/sharedNetwork/src/linux/Sock.cpp +++ /dev/null @@ -1,236 +0,0 @@ -//--------------------------------------------------------------------- -#pragma warning(disable : 4127) - -#include "FirstSharedNetwork.h" -#include -#include "Sock.h" -#include -#include -#include -#include -#include -#include - -const int INVALID_SOCKET = 0xFFFFFFFF; - -//--------------------------------------------------------------------- - -Sock::Sock() : -handle(INVALID_SOCKET), -lastError(Sock::SOCK_NO_ERROR), -bindAddress() -{ -} - -//--------------------------------------------------------------------- - -Sock::~Sock() -{ - // ensure we don't block, and that pending - // data is sent with a graceful shutdown - int err; - err = close(handle); - assert(err == 0); - handle = INVALID_SOCKET; -} - -//--------------------------------------------------------------------- -/** - @brief Bind the socket to the specified local address -*/ -bool Sock::bind(const Address & newBindAddress) -{ - bool result = false; - - int enable = 1; - setsockopt(handle, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)); - - bindAddress = newBindAddress; - assert(handle != INVALID_SOCKET); - socklen_t namelen = sizeof(struct sockaddr_in); - int err = ::bind(handle, reinterpret_cast(&(bindAddress.getSockAddr4())), namelen); - if(err == 0) - { - result = true; - struct sockaddr_in a; - int r; - r = getsockname(handle, reinterpret_cast(&a), &namelen); - assert(r == 0); - bindAddress = a; - } - else - { - result = false; - } - - assert(err == 0); - return result; -} - -//--------------------------------------------------------------------- - -bool Sock::bind() -{ - bool result = false; - struct sockaddr_in a; - socklen_t namelen = sizeof(struct sockaddr_in); - memset(&a, 0, sizeof(struct sockaddr_in)); - a.sin_family = AF_INET; - a.sin_port = 0; - a.sin_addr.s_addr = INADDR_ANY; - assert(handle != INVALID_SOCKET); - int err = ::bind(handle, reinterpret_cast(&a), namelen); - if(err == 0) - { - result = true; - int r; - r = getsockname(handle, reinterpret_cast(&a), &namelen); - assert(r == 0); - bindAddress = a; - } - assert(err == 0); - return result; -} - -//--------------------------------------------------------------------- - -bool Sock::canRecv() const -{ - pollfd r; - r.fd = handle; - r.events = POLLIN | POLLPRI | POLLERR; - - int err = poll(&r, 1, 0); - - if(err < 0) - { - switch(errno) - { - case EINTR: // the system has interrupted the call, it's too busy to send right now - break; - default: - break; - } - } - - return (err > 0); -} - -//--------------------------------------------------------------------- - -bool Sock::canSend() const -{ - pollfd w; - w.fd = handle; - w.events = POLLOUT | POLLERR; - int err = poll(&w, 1, 0); - - if(err < 0) - { - switch(errno) - { - case EINTR: // the system has interrupted the call, it's too busy to send right now - break; - default: - break; - } - } - - return (err > 0); -} - -//--------------------------------------------------------------------- - -const unsigned int Sock::getInputBytesPending() const -{ - unsigned long int bytes = 0; - int err; - err = ioctl(handle, FIONREAD, &bytes); //lint !e1924 (I don't know WHAT Microsoft is doing here!) - assert(err == 0); - return bytes; -} - -//--------------------------------------------------------------------- - -const std::string Sock::getLastError() const -{ - std::string errString; - - switch(errno) - { - case EBADF: - errString = "The argument s is not a valid descriptor."; - break; - case ENOTSOCK: - errString = "The argument s is a file, not a socket."; - break; - case ENOPROTOOPT: - errString = "The option is unknown at the level indicated."; - break; - case EFAULT: - errString = "The address pointed to by optval is not in a valid part of the process address space. For getsockopt, this error may also be returned if optlen is not in a valid part of the process address space."; - break; - case ENOTTY: - errString = "The scoket handle is not associated with a character special device."; - break; - case EINVAL: - errString = "argument is not valid."; - break; - case EAGAIN: - errString = "EAGAIN"; - break; - case EDEADLK: - errString = "EDEADLK"; - break; - case ECONNRESET: - errString = "The connection was reset by the peer."; - lastError = CONNECTION_RESET; - break; - default: - errString = strerror(errno); - break; - } - - return errString; -} - -//--------------------------------------------------------------------- - -void Sock::getPeerName(struct sockaddr_in & target, int s) -{ - socklen_t namelen = sizeof(struct sockaddr_in); - int err; - err = getpeername(s, reinterpret_cast(&(target)), &namelen); - assert(err != -1); -} - -//----------------------------------------------------------------------- -/** @brief determine the maximum message size that may be sent on this socket -*/ -const unsigned int Sock::getMaxMessageSendSize() const -{ - int maxMsgSize = 1500; - /** @todo get msg size via IP interface on Linux - int optlen = sizeof(int); - int result = getsockopt(handle, SOL_SOCKET, SO_MAX_MSG_SIZE, reinterpret_cast(&maxMsgSize), &optlen); - if(result != 0) - { - perror("Sock::getMaxMessageSendSize() : getsockopt()"); - } - */ - return static_cast(maxMsgSize); -} - -//--------------------------------------------------------------------- - -void Sock::setNonBlocking() const -{ - assert(handle != INVALID_SOCKET); - unsigned long int nb = 1; - int err; - err = ioctl(handle, FIONBIO, &nb); //lint !e569 // loss of precision in the FIONBIO macro, beyond my control - assert(err == 0); -} - -//--------------------------------------------------------------------- - diff --git a/src/engine/shared/library/sharedNetwork/src/linux/Sock.h b/src/engine/shared/library/sharedNetwork/src/linux/Sock.h deleted file mode 100644 index bdc1b4be5..000000000 --- a/src/engine/shared/library/sharedNetwork/src/linux/Sock.h +++ /dev/null @@ -1,128 +0,0 @@ -// ====================================================================== -// -// Sock.h -// -// Copyright 2003 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_Sock_H -#define INCLUDED_Sock_H - -// ====================================================================== - -#include "sharedNetwork/Address.h" - -// ====================================================================== - -const unsigned int SOCK_ERROR = 0xFFFFFFFF; - -/** - @brief a BSD socket abstraction - - Sock abstracts BSD sockets for platform independant operation. It - also provides common socket operations to simplify socket management. - - @see BroadcastSock - @see TcpSock - @see UdpSock - - @author Justin Randall -*/ -class Sock -{ -public: - /** - @brief failure states for a socket - */ - enum ErrorCodes - { - SOCK_NO_ERROR, - CONNECTION_FAILED, - CONNECTION_CLOSED, - CONNECTION_RESET - }; - - Sock(); - virtual ~Sock() = 0; - bool bind(const Address & bindAddress); - bool bind(); - bool canSend() const; - bool canRecv() const; - const Address & getBindAddress() const; - const int getHandle() const; - const unsigned int getInputBytesPending() const; - const std::string getLastError() const; - const enum ErrorCodes getLastErrorCode() const; - const unsigned int getMaxMessageSendSize() const; - static void getPeerName(struct sockaddr_in & target, int s); - -private: - // disabled - Sock(const Sock & source); - Sock & operator= (const Sock & source); - -protected: - void setNonBlocking() const; -protected: - int handle; - - /** - @brief support for setting/getting last error from derived - sock classes - */ - mutable enum ErrorCodes lastError; -private: - Address bindAddress; -}; - -//--------------------------------------------------------------------- -/** - @brief return the local address of the socket - - Until a socket is bound, the bind address may be reported as - 0.0.0.0:0 - - @return a const Address reference describing the local address - of the socket. - - @author Justin Randall -*/ -inline const Address & Sock::getBindAddress() const -{ - return bindAddress; -} - -//--------------------------------------------------------------------- -/** - @brief return the platform specific socket handle - - the handle returned is not portable and should only be used locally - for Sock specific operations. - - @author Justin Randall -*/ -inline const int Sock::getHandle() const -{ - return handle; -} - -//--------------------------------------------------------------------- -/** - @brief get the last error code on the socket - - @return the last error code on the socket - - @see Sock::ErrorCodes - - @author Justin Randall -*/ -inline const enum Sock::ErrorCodes Sock::getLastErrorCode() const -{ - return lastError; -} - -//--------------------------------------------------------------------- - -#endif // _Sock_H - diff --git a/src/engine/shared/library/sharedNetwork/src/linux/TcpClient.cpp b/src/engine/shared/library/sharedNetwork/src/linux/TcpClient.cpp deleted file mode 100644 index 8dfa16057..000000000 --- a/src/engine/shared/library/sharedNetwork/src/linux/TcpClient.cpp +++ /dev/null @@ -1,610 +0,0 @@ -//--------------------------------------------------------------------- - -#include "sharedNetwork/FirstSharedNetwork.h" -#include "TcpClient.h" -#include "TcpServer.h" - -#include "Archive/Archive.h" -#include "sharedFoundation/Clock.h" -#include "sharedFoundation/Os.h" -#include "sharedLog/Log.h" -#include "sharedLog/NetLogConnection.h" -#include "sharedNetwork/Connection.h" -#include "sharedNetwork/ConfigSharedNetwork.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//----------------------------------------------------------------------- - -const unsigned long KEEPALIVE_MS = 1000; - -//----------------------------------------------------------------------- - -namespace TcpClientNamespace -{ - std::set s_pendingConnectionSends; - std::set s_tcpClients; - bool s_installed = false; -} - -using namespace TcpClientNamespace; - -//--------------------------------------------------------------------- - -TcpClient::TcpClient (int sockHandle, TcpServer * server) : -m_socket(sockHandle), -m_tcpServer(server), -m_pendingSend(), -m_connection(0), -m_recvBuffer(0), -m_recvBufferLength(0), -m_remoteAddress(), -m_refCount(0), -m_connected (true), -m_lastSendTime(0), -m_bindPort(0), -m_rawTCP( false ) -{ - s_tcpClients.insert(this); - setSockOptions(); - - struct sockaddr_in target; - socklen_t namelen = sizeof(struct sockaddr_in); - if (getpeername(sockHandle, reinterpret_cast(&target), &namelen) == 0) - m_remoteAddress = target; - struct sockaddr_in bindAddr; - - if(getsockname(sockHandle, reinterpret_cast(&bindAddr), &namelen) == 0) - { - m_bindPort = ntohs(bindAddr.sin_port); - } -} - -// ---------------------------------------------------------------------- - -TcpClient::TcpClient (const std::string & a, const unsigned short port) : -m_socket(-1), -m_tcpServer(0), -m_connection(0), -m_recvBuffer(0), -m_recvBufferLength(0), -m_remoteAddress(a, port), -m_refCount(0), -m_connected (false), -m_lastSendTime(0), -m_bindPort(0), -m_rawTCP( false ) -{ - FATAL(! s_installed, ("TcpClient is not installed!")); - - s_tcpClients.insert(this); - setupSocket(); -} - -//--------------------------------------------------------------------- - -TcpClient::~TcpClient() -{ - FATAL(m_refCount > 0, ("Attempting to destroy a TcpClient while references still exist!")); - std::set::iterator f = s_tcpClients.find(this); - if(f != s_tcpClients.end()) - s_tcpClients.erase(f); - f = s_pendingConnectionSends.find(this); - if(f != s_pendingConnectionSends.end()) - s_pendingConnectionSends.erase(f); - - delete[] m_recvBuffer; - if(m_socket != -1) - close (m_socket); -} - -//--------------------------------------------------------------------- - -void TcpClient::addRef() -{ - m_refCount++; -} - -//--------------------------------------------------------------------- -std::string const &TcpClient::getRemoteAddress() const -{ - return m_remoteAddress.getHostAddress(); -} - -//--------------------------------------------------------------------- - -unsigned short TcpClient::getRemotePort() const -{ - return m_remoteAddress.getHostPort(); -} - -//--------------------------------------------------------------------- - -void TcpClient::setSockOptions() -{ - int optval = 1; - setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); - setsockopt(m_socket, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(optval)); - ioctl(m_socket, FIONBIO, &optval); -} - -//--------------------------------------------------------------------- - - -void TcpClient::commit() -{ - int sent = 0; - const unsigned char * ptr = m_pendingSend.getBuffer(); - const unsigned char * const end = ptr + m_pendingSend.getSize(); - static Archive::ByteStream s_localScratchBuffer; - s_localScratchBuffer.clear(); - int retries = 0; - static const int maxRetries = ConfigSharedNetwork::getMaxTCPRetries(); - bool sentSomething = false; - - do - { - // attempt to push pending data to socket - sent = ::send (m_socket, ptr, end - ptr, MSG_NOSIGNAL); - if(sent == -1) - { - // failed - switch(errno) - { - // because it would block on a non-blocking socket - case EAGAIN: - case ENOBUFS: - case ENOMEM: - case EINTR: - { - retries++; - // requeue - break; - } - // an unhandled error (connection reset, for example) - default: - { - m_pendingSend.clear(); - perror("send: "); - if (m_connection) - m_connection->setDisconnectReason("TcpClient::commit send returned -1, errno=%d", errno); - onConnectionClosed(); - return; - break; - } - } - } - else if(sent > 0) - { - sentSomething=true; - ptr += sent; - if(sent < end - ptr) - { - // data was passed to the socket, but not all - // of it could be committed, keep trying! - retries = 0; - Os::sleep(1); - } - } - else if(sent == 0) - { - // tried to send and got nothing through (should have returned an error, but be thorough) - retries ++; - Os::sleep(1); - } - - } while(ptr < end && retries < maxRetries); - - if(ptr == end) - { - // all data was committed, clear pending buffer - m_pendingSend.clear(); - } - else - { - // bailed out before all data was committed, save unsent data for - // next pass on commit() - if (sentSomething) - { - s_localScratchBuffer.put(ptr, end - ptr); - m_pendingSend.clear(); - m_pendingSend.put(s_localScratchBuffer.getBuffer(), s_localScratchBuffer.getSize()); - } - s_pendingConnectionSends.insert(this); - } - - // clean up local accounting - s_localScratchBuffer.clear(); -} - -//--------------------------------------------------------------------- - -void TcpClient::flush() -{ - if (m_connected && m_pendingSend.getSize() > 0) - { - // flush pending buffer - commit(); - } -} - -//----------------------------------------------------------------------- - -void TcpClient::flushPendingWrites() -{ - std::set sends = s_pendingConnectionSends; - s_pendingConnectionSends.clear(); - - for (std::set::const_iterator i = sends.begin(); i != sends.end(); ++i) - { - TcpClient * const c = *i; - - if (c->m_connected) - { - c->flush(); - - if ( c->m_connection - && c->m_pendingSend.getSize() - && ConfigSharedNetwork::getLogSendingTooMuchData() - && !dynamic_cast(c->m_connection)) - { - WARNING(true, ("(%s) Failed to commit %d bytes this frame to %s:%d. This process is sending more data than the remote can receive!", c->m_connection->getConnectionDescription().c_str(), c->m_pendingSend.getSize(), c->getRemoteAddress().c_str(), c->getRemotePort())); - LOG("Network", ("(%s) Failed to commit %d bytes this frame to %s:%d. This process is sending more data than the remote can receive!", c->m_connection->getConnectionDescription().c_str(), c->m_pendingSend.getSize(), c->getRemoteAddress().c_str(), c->getRemotePort())); - } - } - } -} - -//--------------------------------------------------------------------- - -unsigned short TcpClient::getBindPort() const -{ - return m_bindPort; -} - -//--------------------------------------------------------------------- - -int TcpClient::getSocket() const -{ - return m_socket; -} - -//--------------------------------------------------------------------- - -void TcpClient::install() -{ - FATAL(s_installed, ("TcpClient is already installed!")); - s_installed = true; - signal(SIGPIPE, SIG_IGN); -} - -//--------------------------------------------------------------------- - -void TcpClient::onConnectionClosed() -{ - if (m_connection) - m_connection->setDisconnectReason("TcpClient::onConnectionClosed called"); - m_connected = false; - shutdown(m_socket, SHUT_RDWR); - if(m_tcpServer) - { - m_tcpServer->removeClient(this); - } - close(m_socket); - m_socket = -1; - if(m_connection) - { - NetworkHandler::onTerminate(m_connection); - } -} - -//--------------------------------------------------------------------- - -void TcpClient::onConnectionOpened() -{ - // Get the local port this socket was bound to. If - // a client socket repeatedly attempts to connect to a local - // service that should be listening on a port that the operating - // system may assign AND the service isn't actually running and - // using the port, the client socket may connect to itself. - // For example, A client connecting to 127.0.0.1:50005, the operating - // system may assign the client socket port 50005 and the connection - // succeeds, but it is in fact a connection to itself, meaning the - // client isn't actually talking to any valid service. - struct sockaddr_in bindAddr; - socklen_t addrLen = sizeof(struct sockaddr_in); - if(getsockname(m_socket, reinterpret_cast(&bindAddr), &addrLen) == 0) - { - m_bindPort = ntohs(bindAddr.sin_port); - } - - // this *might* be a valid connection to a remote address, but - // to easily catch all cases of loopback connections, attempt a - // reconnect if the remote port is identical to the local port - if(m_remoteAddress.getHostPort() == m_bindPort && ! m_tcpServer) - { - shutdown(m_socket, SHUT_RDWR); - DEBUG_FATAL(m_tcpServer, ("Detected a loopback client connection on a TCP SERVER!!!")); - close(m_socket); - m_socket = -1; - - // reconnect the socket - // address and port info is initialized in the constructor - setupSocket(); - LOG("Network", ("Detected a loopback, closing socket and reconnecting")); - } - else - { - m_connected = true; - if(m_connection) - { - m_connection->onConnectionOpened(); - } - flush(); - } -} - -//--------------------------------------------------------------------- - -void TcpClient::onReceive (const unsigned char * const recvBuf, const int bytes) -{ - if(m_connection) - { - m_connection->receive(recvBuf, bytes); - } -} - -//--------------------------------------------------------------------- - -void TcpClient::queryConnect () -{ - struct pollfd pfd; - pfd.fd = m_socket; - pfd.events = POLLOUT; - pfd.revents = 0; - int pollResult = poll(&pfd, 1, 0); - if(pollResult > 0) - { - if (pfd.revents & POLLERR) - { - if (m_connection) - m_connection->setDisconnectReason("TcpClient::queryConnect POLLERR"); - onConnectionClosed(); - } - else if (pfd.revents & POLLHUP) - { - if (m_connection) - m_connection->setDisconnectReason("TcpClient::queryConnect POLLHUP"); - onConnectionClosed(); - } - else - { - onConnectionOpened(); - } - } -} - -//----------------------------------------------------------------------- - -void TcpClient::release() -{ - m_refCount--; - if(m_refCount == 0) - { - if (m_connected) - { - if (m_connection) - m_connection->setDisconnectReason("TcpClient::release called"); - onConnectionClosed(); - } - delete this; - } -} - -//----------------------------------------------------------------------- - -void TcpClient::remove() -{ - FATAL(!s_installed, ("TcpClient already removed!")); - std::set::iterator i; - for(i = s_tcpClients.begin(); i != s_tcpClients.end(); ++i) - { - TcpClient * c = (*i); - c->release(); - } - s_installed = false; -} - -//--------------------------------------------------------------------- - -void TcpClient::send(const unsigned char * const buffer, const int bufferLen) -{ - if (bufferLen) - { - m_lastSendTime = Clock::getFrameStartTimeMs(); - s_pendingConnectionSends.insert(this); - if( !m_rawTCP ) - Archive::put(m_pendingSend, bufferLen); - m_pendingSend.put(buffer, bufferLen); - - static int const tcpMinimumFrame = ConfigSharedNetwork::getTcpMinimumFrame(); - if (static_cast(m_pendingSend.getSize()) >= tcpMinimumFrame) - flush(); - } -} - -//----------------------------------------------------------------------- - -void TcpClient::setConnection(Connection * c) -{ - m_connection = c; -} - -//--------------------------------------------------------------------- - -void TcpClient::checkKeepalive() -{ - if (m_connected) - { - unsigned long const timeNow = Clock::getFrameStartTimeMs(); - if (timeNow-m_lastSendTime > KEEPALIVE_MS) - { - m_lastSendTime = timeNow; - s_pendingConnectionSends.insert(this); - Archive::put(m_pendingSend, 0); - } - } -} - -//--------------------------------------------------------------------- - -void TcpClient::update() -{ - addRef(); - if(!m_connected) - { - queryConnect(); - } - - if(m_connected) - { - struct pollfd pfd; - pfd.fd = m_socket; - pfd.events = POLLIN|POLLHUP; - pfd.revents = 0; - int pollResult = poll (&pfd, 1, 0); - // POLLERR is mutually exclusive with POLLIN and POLLHUP. - // POLLIN and POLLHUP are not consistent cross-platform. Additionally, - // a POLLHUP doesn't mean that there's not data available. The best, - // cross-platform way to check for disconnection is to see if either - // POLLHUP or POLLIN are set, and then read from the socket. - // In cases where there's data, we'll just end up checking it next - // frame anyway. In cases where there's no data, it means we've - // disconnected so we can handle cleanup. - if (pollResult) - { - if (m_recvBuffer == NULL) - { - m_recvBufferLength = 1500; - m_recvBuffer = new unsigned char [m_recvBufferLength]; - } - int bytesReceived = recv(m_socket, m_recvBuffer, m_recvBufferLength, 0); - if (bytesReceived > 0) - { - onReceive(m_recvBuffer, bytesReceived); - } - else if (bytesReceived == -1) - { - switch (errno) - { - case EAGAIN: - case EINTR: - break; - default: - if (m_connection) - m_connection->setDisconnectReason("TcpClient::update recv returned -1, errno=%d", errno); - onConnectionClosed(); - break; - } - } - - else if (bytesReceived == 0) - { - // peer closed connection - - - - if (m_connection) - { - // Log this, as it's a pretty deep change. - LOG("Network", ("(%s) Read zero bytes on a successful poll (POLLIN|POLLHUP). Closing socket since we think it is closed.", m_connection->getConnectionDescription().c_str())); - m_connection->setDisconnectReason("TcpClient::update recv returned 0"); - } - else - { - LOG("Network", ("(null connection object) Read zero bytes on a successful poll (POLLIN|POLLHUP). Closing socket since we think it is closed.")); - } - onConnectionClosed(); - } - - if (bytesReceived == m_recvBufferLength) - { - // grow the buffer - delete [] m_recvBuffer; - m_recvBufferLength = m_recvBufferLength * 2; - m_recvBuffer = new unsigned char [m_recvBufferLength]; - } - } - } - release(); -} - -// ---------------------------------------------------------------------- - -void TcpClient::setupSocket() -{ - FATAL(! s_installed, ("TcpClient is not installed!")); - - protoent * p = getprotobyname ("tcp"); - const int entry = p->p_proto; - m_socket = socket (AF_INET, SOCK_STREAM, entry); - if (m_socket != -1) - { - setSockOptions(); - - int nameLen = sizeof (struct sockaddr_in); - int result; - result = connect (m_socket, reinterpret_cast (&m_remoteAddress.getSockAddr4 () ), nameLen); - if(result == -1) - { - switch(errno) - { - case EINPROGRESS: - case EALREADY: - break; - default: - perror("connect "); - if (m_connection) - m_connection->setDisconnectReason("TcpClient::TcpClient connect returned -1, errno=%d", errno); - onConnectionClosed(); - break; - } - } - else - { - struct sockaddr_in bindAddr; - socklen_t addrLen = sizeof(struct sockaddr_in); - if(getsockname(m_socket, reinterpret_cast(&bindAddr), &addrLen) == 0) - { - m_bindPort = ntohs(bindAddr.sin_port); - } - } - } -} - -// ---------------------------------------------------------------------- -void TcpClient::setRawTCP( bool bNewValue ) -{ - m_rawTCP = bNewValue; -} - -// ---------------------------------------------------------------------- - -void TcpClient::clearTcpServer() -{ - m_tcpServer = 0; -} - -// ====================================================================== - diff --git a/src/engine/shared/library/sharedNetwork/src/linux/TcpClient.h b/src/engine/shared/library/sharedNetwork/src/linux/TcpClient.h deleted file mode 100644 index dce06df5a..000000000 --- a/src/engine/shared/library/sharedNetwork/src/linux/TcpClient.h +++ /dev/null @@ -1,89 +0,0 @@ -// TcpClient.h -// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved. -// Author: Justin Randall - -#ifndef _INCLUDED_TcpClient_H -#define _INCLUDED_TcpClient_H - -//----------------------------------------------------------------------- - -#include "Archive/ByteStream.h" -#include "sharedNetwork/Address.h" -#include - -//----------------------------------------------------------------------- - -class Connection; -class TcpServer; - -//----------------------------------------------------------------------- - -class TcpClient -{ -public: - TcpClient(int sock, TcpServer *); - TcpClient(const std::string & address, const unsigned short port); - - void addRef(); - static void install(); - void release(); - static void remove(); - void send(const unsigned char * const buffer, const int length); - - unsigned short getBindPort() const; - std::string const &getRemoteAddress() const; - unsigned short getRemotePort() const; - void setPendingSendAllocatedSizeLimit(unsigned int limit); - - // only used by clients - void update(); - static void flushPendingWrites(); - -protected: - friend class TcpServer; - friend class Connection; - - void setSockOptions(); - void commit(); - int getSocket() const; - void onConnectionClosed(); - void onConnectionOpened(); - void onReceive(const unsigned char * const recvBuf, const int bytes); - void queryConnect(); - void queueReceive(); - void setConnection(Connection *); - void checkKeepalive(); - void clearTcpServer(); - void setRawTCP( bool bNewValue ); - -private: - TcpClient & operator = (const TcpClient & rhs); - TcpClient(const TcpClient & source); - ~TcpClient(); - void flush (); - void setupSocket(); - int m_socket; - TcpServer * m_tcpServer; - Archive::ByteStream m_pendingSend; - Connection * m_connection; - unsigned char * m_recvBuffer; - int m_recvBufferLength; - Address m_remoteAddress; - int m_refCount; - bool m_connected; - unsigned long m_lastSendTime; - unsigned short m_bindPort; - bool m_rawTCP; -}; - -//----------------------------------------------------------------------- - -inline void TcpClient::setPendingSendAllocatedSizeLimit(const unsigned int limit) -{ - m_pendingSend.setAllocatedSizeLimit(limit); -} - -//----------------------------------------------------------------------- - -#endif // _INCLUDED_TcpClient_H - diff --git a/src/engine/shared/library/sharedNetwork/src/linux/TcpServer.cpp b/src/engine/shared/library/sharedNetwork/src/linux/TcpServer.cpp deleted file mode 100644 index 2ca1b53bc..000000000 --- a/src/engine/shared/library/sharedNetwork/src/linux/TcpServer.cpp +++ /dev/null @@ -1,238 +0,0 @@ -// TcpServer.cpp -// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved. -// Author: Justin Randall - -//--------------------------------------------------------------------- - -#include "sharedNetwork/FirstSharedNetwork.h" -#include "TcpServer.h" - -#include "sharedNetwork/Connection.h" -#include "sharedNetwork/Service.h" -#include "TcpClient.h" -#include -#include -#include -#include -#include -#include -#include - -//--------------------------------------------------------------------- - -TcpServer::TcpServer(Service * service, const std::string & a, const unsigned short port) : -m_bindAddress(a, port), -m_handle(-1), -m_service(service), -m_connections(), -m_connectionSockets(), -m_inputBuffer(0), -m_inputBufferSize(0) -{ - protoent * p = getprotobyname("tcp"); - if(p) - { - int entry = p->p_proto; - m_handle = socket(AF_INET, SOCK_STREAM, entry); - FATAL(m_handle == -1, ("Failed to create a server socket %s:%d", a.c_str(), port)); - int optval = 1; - if(m_handle != -1) - { - int optResult = setsockopt(m_handle, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); - FATAL(optResult == -1, ("Failed to set socket option SO_REUSEADDR")); - unsigned long nb = 1; - int ctlResult = ioctl(m_handle, FIONBIO, &nb); - FATAL(ctlResult == -1, ("Failed to set socket non-blocking")); - socklen_t addrlen = sizeof(struct sockaddr_in); - int bindResult = bind(m_handle, (struct sockaddr *)(&m_bindAddress.getSockAddr4()), addrlen); - FATAL(bindResult != 0, ("Failed to bind to port %d", port)); - if(bindResult == 0) - { - int result = listen(m_handle, 256); - if(result == -1) - perror("listen "); - FATAL(result == -1, ("Failed to start listening on port %d", port)); - struct sockaddr_in b; - getsockname(m_handle, (struct sockaddr *)(&b), &addrlen); - m_bindAddress = b; - } - } - } -} - -//--------------------------------------------------------------------- - -TcpServer::~TcpServer() -{ - close(m_handle); - for (std::map::const_iterator i = m_connections.begin(); i != m_connections.end(); ++i) - (*i).second->clearTcpServer(); -} - -//--------------------------------------------------------------------- - -const std::string & TcpServer::getBindAddress() const -{ - return m_bindAddress.getHostAddress(); -} - -//--------------------------------------------------------------------- - -const unsigned short TcpServer::getBindPort() const -{ - return m_bindAddress.getHostPort(); -} - -//--------------------------------------------------------------------- - -void TcpServer::onConnectionClosed(TcpClient * c) -{ - if(c) - { - std::set::iterator f = m_pendingDestroys.find(c); - if(f == m_pendingDestroys.end()) - { - m_pendingDestroys.insert(c); - } - } -} - -//--------------------------------------------------------------------- -void TcpServer::removeClient(TcpClient * c) -{ - std::map::iterator f = m_connections.find(c->getSocket()); - if(f != m_connections.end()) - { -// c->release(); - m_connections.erase(f); - } - - std::vector::iterator s; - for(s = m_connectionSockets.begin(); s != m_connectionSockets.end(); ++s) - { - if((*s).fd == c->getSocket()) - { - m_connectionSockets.erase(s); - break; - } - } -} - -//--------------------------------------------------------------------- - -void TcpServer::update() -{ - struct pollfd pfd; - pfd.fd = m_handle; - pfd.events = POLLIN; - pfd.revents = 0; - - int result = poll(&pfd, 1, 0); - if(result > 0) - { - // connection established - struct sockaddr_in addr; - socklen_t len = sizeof(struct sockaddr_in); - int newSock = accept(m_handle, (struct sockaddr *)(&addr), &len); - if(newSock != -1) - { - TcpClient * ptc = new TcpClient(newSock, this); - ptc->addRef(); - m_connections.insert(std::make_pair(newSock, ptc)); - struct pollfd readFd; - readFd.fd = ptc->getSocket(); - readFd.events = POLLIN|POLLERR|POLLHUP; - readFd.revents = 0; - m_connectionSockets.push_back(readFd); - ptc->onConnectionOpened(); - if(m_service) - m_service->onConnectionOpened(ptc); - ptc->release(); - } - } - - struct pollfd * clients = &m_connectionSockets[0]; - - int readResult = poll (clients, m_connectionSockets.size (), 0); - if (readResult > 0) - { - std::vector::iterator i; - std::vector cs = m_connectionSockets; - for (i = cs.begin (); i != cs.end (); ++i) - { - if ((*i).revents & POLLERR) - { - std::map::iterator f = m_connections.find ( (*i).fd ); - if (f != m_connections.end ()) - { - TcpClient * c = (*f).second; - if (c->m_connection) - c->m_connection->setDisconnectReason("TcpServer::update POLLERR"); - c->onConnectionClosed(); - } - } - // POLLERR is mutually exclusive with POLLIN and POLLHUP. - // POLLIN and POLLHUP are not consistent cross-platform. Additionally, - // a POLLHUP doesn't mean that there's not data available. The best, - // cross-platform way to check for disconnection is to see if either - // POLLHUP or POLLIN are set, and then read from the socket. - // In cases where there's data, we'll just end up checking it next - // frame anyway. In cases where there's no data, it means we've - // disconnected so we can handle cleanup. - else if( (*i).revents & (POLLIN|POLLHUP) ) - { - - if (m_inputBuffer == 0) - { - m_inputBuffer = new unsigned char[1500]; - m_inputBufferSize = 1500; - } - int bytesReceived = recv ( (*i).fd, m_inputBuffer, m_inputBufferSize, 0); - std::map::iterator f = m_connections.find ( (*i).fd ); - if (f != m_connections.end ()) - { - TcpClient * c = (*f).second; - std::set::iterator pd = m_pendingDestroys.find(c); - if(pd == m_pendingDestroys.end()) - { - c->addRef(); - if(bytesReceived > 0) - { - c->onReceive(m_inputBuffer, bytesReceived); - } - else if (bytesReceived == -1) - { - if (c->m_connection) - c->m_connection->setDisconnectReason("TcpServer::update recv returned %d, errno=%d", bytesReceived, errno); - c->onConnectionClosed(); - } - else if (bytesReceived == 0) - { - // 0 bytes received on a read is the guaranteed signal for a - // closed connection. - if (c->m_connection) - c->m_connection->setDisconnectReason("TcpServer::update recv returned no bytes, singaling a closed socket (bytes=%d, errno=%d", bytesReceived, errno); - c->onConnectionClosed(); - } - c->release(); - } - } - if (bytesReceived == m_inputBufferSize) - { - delete [] m_inputBuffer; - m_inputBufferSize = m_inputBufferSize * 2; - m_inputBuffer = new unsigned char [m_inputBufferSize]; - } - } - } - std::set::iterator pdIter; - for(pdIter = m_pendingDestroys.begin(); pdIter != m_pendingDestroys.end(); ++pdIter) - { - removeClient((*pdIter)); - } - m_pendingDestroys.clear(); - } -} - -//--------------------------------------------------------------------- - diff --git a/src/engine/shared/library/sharedNetwork/src/linux/TcpServer.h b/src/engine/shared/library/sharedNetwork/src/linux/TcpServer.h deleted file mode 100644 index 50bccb007..000000000 --- a/src/engine/shared/library/sharedNetwork/src/linux/TcpServer.h +++ /dev/null @@ -1,52 +0,0 @@ -// TcpServer.h -// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved. -// Author: Justin Randall - -#ifndef _INCLUDED_TcpServer_H -#define _INCLUDED_TcpServer_H - -//----------------------------------------------------------------------- - -#include "Address.h" -#include -#include -#include -#include - -//----------------------------------------------------------------------- - -class Service; -class TcpClient; - -//----------------------------------------------------------------------- - -class TcpServer -{ -public: - TcpServer(Service * service, const std::string & bindAddress, const unsigned short bindPort); - ~TcpServer(); - - const std::string & getBindAddress () const; - const unsigned short getBindPort () const; - void onConnectionClosed (TcpClient *); - void removeClient (TcpClient *); - void update (); - -private: - TcpServer & operator = (const TcpServer & rhs); - TcpServer(const TcpServer & source); - -private: - Address m_bindAddress; - int m_handle; - Service * m_service; - std::map m_connections; - std::vector m_connectionSockets; - unsigned char * m_inputBuffer; - int m_inputBufferSize; - std::set m_pendingDestroys; -}; - -//----------------------------------------------------------------------- - -#endif // _INCLUDED_TcpServer_H diff --git a/src/engine/shared/library/sharedNetwork/src/linux/UdpSock.cpp b/src/engine/shared/library/sharedNetwork/src/linux/UdpSock.cpp deleted file mode 100644 index 673b6f9a8..000000000 --- a/src/engine/shared/library/sharedNetwork/src/linux/UdpSock.cpp +++ /dev/null @@ -1,63 +0,0 @@ - -//--------------------------------------------------------------------- - -#include "FirstSharedNetwork.h" -#include -#include -#include -#include -#include "sharedNetwork/UdpSock.h" - -const int INVALID_SOCKET = 0xFFFFFFFF; - -//--------------------------------------------------------------------- - -UdpSock::UdpSock() : -Sock() -{ - handle = socket(AF_INET, SOCK_DGRAM, 17); - assert(handle != INVALID_SOCKET); - setNonBlocking(); -} - -//--------------------------------------------------------------------- - -UdpSock::~UdpSock() -{ -} - -//--------------------------------------------------------------------- - -const unsigned int UdpSock::recvFrom(Address & outAddr, void * targetBuffer, const unsigned int bufferSize) const -{ - socklen_t fromLen = sizeof(struct sockaddr_in); - struct sockaddr_in addr; - unsigned int result = ::recvfrom(handle, static_cast(targetBuffer), static_cast(bufferSize), 0, reinterpret_cast(&addr), &fromLen); //lint !e732 // MS wants an int, should be unsigned IMO - outAddr = addr; - return result; -} - -//--------------------------------------------------------------------- - -const unsigned int UdpSock::sendTo(const Address & targetAddress, const void * sourceBuffer, const unsigned int length) const -{ - unsigned int bytesSent = 0; - if(canSend()) - { - socklen_t toLen = sizeof(struct sockaddr_in); - bytesSent = ::sendto(handle, sourceBuffer, static_cast(length), 0, reinterpret_cast(&(targetAddress.getSockAddr4())), toLen); //lint !e732 // MS wants an int, should be unsigned IMO - } - return bytesSent; -} - -//----------------------------------------------------------------------- - -void UdpSock::enableBroadcast() -{ - int optval = 1; - socklen_t optlen = sizeof(int); - setsockopt(handle, SOL_SOCKET, SO_BROADCAST, &optval, optlen); -} - -//--------------------------------------------------------------------- - diff --git a/src/engine/shared/library/sharedRegex/src/linux/RegexServices.cpp b/src/engine/shared/library/sharedRegex/src/linux/RegexServices.cpp deleted file mode 100644 index ea5464e78..000000000 --- a/src/engine/shared/library/sharedRegex/src/linux/RegexServices.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// ====================================================================== -// -// RegexServices.cpp -// Copyright 2003 Sony Online Entertainment, Inc. -// All Rights Reserved. -// -// ====================================================================== - -#include "sharedRegex/FirstSharedRegex.h" -#include "sharedRegex/RegexServices.h" - -// ====================================================================== - -void *RegexServices::allocateMemory(size_t byteCount) -{ - return new char[byteCount]; -} - -// ---------------------------------------------------------------------- - -void RegexServices::freeMemory(void *pointer) -{ - delete [] reinterpret_cast(pointer); -} - -// ====================================================================== diff --git a/src/engine/shared/library/sharedRegex/src/linux/RegexServices.h b/src/engine/shared/library/sharedRegex/src/linux/RegexServices.h deleted file mode 100644 index 762c80de9..000000000 --- a/src/engine/shared/library/sharedRegex/src/linux/RegexServices.h +++ /dev/null @@ -1,25 +0,0 @@ -// ====================================================================== -// -// RegexServices.h -// Copyright 2003 Sony Online Entertainment, Inc. -// All Rights Reserved. -// -// ====================================================================== - -#ifndef INCLUDED_RegexServices_H -#define INCLUDED_RegexServices_H - -// ====================================================================== - -class RegexServices -{ -public: - - static void *allocateMemory(size_t byteCount); - static void freeMemory(void *pointer); - -}; - -// ====================================================================== - -#endif diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/ConditionVariable.cpp b/src/engine/shared/library/sharedSynchronization/src/linux/ConditionVariable.cpp deleted file mode 100644 index 7a01259db..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/ConditionVariable.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// ====================================================================== -// -// ConditionVariable.cpp -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedSynchronization/ConditionVariable.h" - -ConditionVariable::ConditionVariable(Mutex &m) - : _mutex(m) -{ - pthread_cond_init(&cond, 0); -} - -ConditionVariable::~ConditionVariable() -{ - pthread_cond_destroy(&cond); -} - -void ConditionVariable::wait() -{ - pthread_cond_wait(&cond, &_mutex.getInternalMutex()); -} - -void ConditionVariable::signal() -{ - pthread_cond_signal(&cond); -} - -void ConditionVariable::broadcast() -{ - pthread_cond_broadcast(&cond); -} - diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/ConditionVariable.h b/src/engine/shared/library/sharedSynchronization/src/linux/ConditionVariable.h deleted file mode 100644 index 5ce3bf172..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/ConditionVariable.h +++ /dev/null @@ -1,34 +0,0 @@ -// ====================================================================== -// -// ConditionVariable.h -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_ConditionVariable_h -#define INCLUDED_ConditionVariable_h - -#include "sharedSynchronization/Mutex.h" - -class ConditionVariable -{ -public: - ConditionVariable(Mutex &m); - ~ConditionVariable(); - void wait(); - // You must own the mutex before calling signal. - void signal(); - void broadcast(); - Mutex &mutex() { return _mutex; } -private: - ConditionVariable(const ConditionVariable &o); - ConditionVariable &operator =(const ConditionVariable &o); - - Mutex &_mutex; - pthread_cond_t cond; -}; - - -#endif diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/Gate.cpp b/src/engine/shared/library/sharedSynchronization/src/linux/Gate.cpp deleted file mode 100644 index 677df742c..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/Gate.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// ====================================================================== -// -// Gate.cpp -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedSynchronization/Gate.h" - -Gate::Gate(bool open) -: cond(lock) -{ - opened = open; -} - -Gate::~Gate() -{ -} - -void Gate::wait() -{ - lock.enter(); - while (!opened) - cond.wait(); - lock.leave(); -} - -void Gate::close() -{ - lock.enter(); - opened = false; - lock.leave(); -} - -void Gate::open() -{ - lock.enter(); - opened = true; - cond.broadcast(); - lock.leave(); -} - diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/Gate.h b/src/engine/shared/library/sharedSynchronization/src/linux/Gate.h deleted file mode 100644 index 9f1266e1f..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/Gate.h +++ /dev/null @@ -1,35 +0,0 @@ -// ====================================================================== -// -// Gate.h -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_Gate_h -#define INCLUDED_Gate_h - -#include "sharedSynchronization/ConditionVariable.h" - -class Gate -{ -public: - Gate(bool open); - ~Gate(); - - void wait(); - - void close(); - void open(); -private: - Gate(const Gate &o); - Gate &operator =(const Gate &o); - - Mutex lock; - bool opened; - ConditionVariable cond; -}; - - -#endif diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/InterlockedInteger.h b/src/engine/shared/library/sharedSynchronization/src/linux/InterlockedInteger.h deleted file mode 100644 index 856333957..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/InterlockedInteger.h +++ /dev/null @@ -1,63 +0,0 @@ -// ====================================================================== -// -// InterlockedInteger.h -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_InterlockedInteger_h -#define INCLUDED_InterlockedInteger_h - -// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -class InterlockedInteger -{ -public: - explicit InterlockedInteger(int initialValue=0); - int operator =(int); // returns prior value (exchange) - int operator ++(); // returns new value - int operator --(); // returns new value - operator int() const { return value; } -private: - InterlockedInteger(const InterlockedInteger &o); - InterlockedInteger &operator =(const InterlockedInteger &o); - pthread_mutex_t lock; - volatile int value; -}; - -inline InterlockedInteger::InterlockedInteger(int i_value) -: value(i_value) -{ - pthread_mutex_init(&lock, 0); -} - -inline int InterlockedInteger::operator =(int i_value) -{ - pthread_mutex_lock(&lock); - int oldvalue = value; - value = i_value; - pthread_mutex_unlock(&lock); - return oldvalue; -} - -inline int InterlockedInteger::operator ++() -{ - pthread_mutex_lock(&lock); - int newvalue = value+1; - value = newvalue; - pthread_mutex_unlock(&lock); - return newvalue; -} - -inline int InterlockedInteger::operator --() -{ - pthread_mutex_lock(&lock); - int newvalue = value-1; - value = newvalue; - pthread_mutex_unlock(&lock); - return newvalue; -} - -#endif diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/InterlockedVoidPointer.h b/src/engine/shared/library/sharedSynchronization/src/linux/InterlockedVoidPointer.h deleted file mode 100644 index 04da79aeb..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/InterlockedVoidPointer.h +++ /dev/null @@ -1,53 +0,0 @@ -// ====================================================================== -// -// InterlockedVoidPointer.h -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_InterlockedVoidPointer_h -#define INCLUDED_InterlockedVoidPointer_h - -#include "sharedSynchronization/Mutex.h" - -// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -class InterlockedVoidPointer -{ -public: - explicit InterlockedVoidPointer(void * initialValue=0); - void * compareExchange(void * compare, void * exchange); // compare and exchange if same - operator void * () const { return reinterpret_cast(value); } -private: - InterlockedVoidPointer(const InterlockedVoidPointer &o); - InterlockedVoidPointer &operator =(const InterlockedVoidPointer &o); - Mutex lock; - void * volatile value; -}; - -template -class InterlockedPointer: public InterlockedVoidPointer -{ -public: - explicit InterlockedPointer(T * initialValue): InterlockedVoidPointer(initialValue) {} - operator T * () const { return static_cast(value); } -}; - -inline InterlockedVoidPointer::InterlockedVoidPointer(void * initialValue) -: value(initialValue) -{ -} - -inline void * InterlockedVoidPointer::compareExchange(void * compare, void * exchange) -{ - lock.enter(); - void * temp = value; - if (temp == compare) - value = exchange; - lock.leave(); - return temp; -} - -#endif \ No newline at end of file diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/Mutex.cpp b/src/engine/shared/library/sharedSynchronization/src/linux/Mutex.cpp deleted file mode 100644 index d51144330..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/Mutex.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// ====================================================================== -// -// Mutex.cpp -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedSynchronization/Mutex.h" - -Mutex::Mutex() -{ - pthread_mutex_init(&mutex, 0); -} - -Mutex::~Mutex() -{ - pthread_mutex_destroy(&mutex); -} - -void Mutex::enter() -{ - pthread_mutex_lock(&mutex); -} - -void Mutex::leave() -{ - pthread_mutex_unlock(&mutex); -} - diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/Mutex.h b/src/engine/shared/library/sharedSynchronization/src/linux/Mutex.h deleted file mode 100644 index be679dab0..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/Mutex.h +++ /dev/null @@ -1,31 +0,0 @@ -// ====================================================================== -// -// Mutex.h -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_Mutex_h -#define INCLUDED_Mutex_h - -class Mutex -{ -public: - Mutex(); - ~Mutex(); - - void enter(); - void leave(); - - pthread_mutex_t &getInternalMutex() { return mutex; } -private: - Mutex(const Mutex &o); - Mutex &operator =(const Mutex &o); - - pthread_mutex_t mutex; -}; - - -#endif diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/RecursiveMutex.cpp b/src/engine/shared/library/sharedSynchronization/src/linux/RecursiveMutex.cpp deleted file mode 100644 index a902b404a..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/RecursiveMutex.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// ====================================================================== -// -// RecursiveMutex.cpp -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedSynchronization/RecursiveMutex.h" - -RecursiveMutex::RecursiveMutex() -{ - pthread_mutexattr_t attributes; - - pthread_mutexattr_init(&attributes); - pthread_mutexattr_settype(&attributes,PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&mutex,&attributes); - pthread_mutexattr_destroy(&attributes); -} - -RecursiveMutex::~RecursiveMutex() -{ - pthread_mutex_destroy(&mutex); -} - -void RecursiveMutex::enter() -{ - pthread_mutex_lock(&mutex); -} - -void RecursiveMutex::leave() -{ - pthread_mutex_unlock(&mutex); -} - diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/RecursiveMutex.h b/src/engine/shared/library/sharedSynchronization/src/linux/RecursiveMutex.h deleted file mode 100644 index 494160103..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/RecursiveMutex.h +++ /dev/null @@ -1,31 +0,0 @@ -// ====================================================================== -// -// RecursiveMutex.h -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_RecursiveMutex_h -#define INCLUDED_RecursiveMutex_h - -#include "sharedSynchronization/InterlockedInteger.h" - -class RecursiveMutex -{ -public: - RecursiveMutex(); - ~RecursiveMutex(); - - void enter(); - void leave(); -private: - RecursiveMutex(const RecursiveMutex &o); - RecursiveMutex &operator =(const RecursiveMutex &o); - - pthread_mutex_t mutex; -}; - -#endif - diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/Semaphore.cpp b/src/engine/shared/library/sharedSynchronization/src/linux/Semaphore.cpp deleted file mode 100644 index 7950243dd..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/Semaphore.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// ====================================================================== -// -// Semaphore.cpp -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedSynchronization/Semaphore.h" - -Semaphore::Semaphore(int count, int initial) -{ - sem_init(&sem, false, initial); -} - -Semaphore::~Semaphore() -{ - sem_destroy(&sem); -} - -void Semaphore::wait() -{ - sem_wait(&sem); -} - -void Semaphore::wait(unsigned int maxDurationMs) -{ - timespec ts; - ts.tv_sec = maxDurationMs/1000000; - ts.tv_nsec = maxDurationMs%1000000; - sem_timedwait(&sem, &ts); -} - -void Semaphore::signal(int count) -{ - sem_post(&sem); -} - diff --git a/src/engine/shared/library/sharedSynchronization/src/linux/Semaphore.h b/src/engine/shared/library/sharedSynchronization/src/linux/Semaphore.h deleted file mode 100644 index e108ae6fa..000000000 --- a/src/engine/shared/library/sharedSynchronization/src/linux/Semaphore.h +++ /dev/null @@ -1,30 +0,0 @@ -// ====================================================================== -// -// Semaphore.h -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_Semaphore_h -#define INCLUDED_Semaphore_h - -class Semaphore -{ -public: - Semaphore(int count=0x7FFFFFFF, int initial=0); - ~Semaphore(); - - void wait(); - void wait(unsigned int maxDurationMs); - void signal(int count=1); -private: - Semaphore(const Semaphore &o); - Semaphore &operator =(const Semaphore &o); - - sem_t sem; -}; - -#endif - diff --git a/src/engine/shared/library/sharedTemplateDefinition/src/linux/FirstSharedTemplateDefinition.cpp b/src/engine/shared/library/sharedTemplateDefinition/src/linux/FirstSharedTemplateDefinition.cpp deleted file mode 100644 index b156d0fd4..000000000 --- a/src/engine/shared/library/sharedTemplateDefinition/src/linux/FirstSharedTemplateDefinition.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "sharedTemplateDefinition/FirstSharedTemplateDefinition.h" diff --git a/src/engine/shared/library/sharedThread/src/linux/Thread.cpp b/src/engine/shared/library/sharedThread/src/linux/Thread.cpp deleted file mode 100644 index 90de4e552..000000000 --- a/src/engine/shared/library/sharedThread/src/linux/Thread.cpp +++ /dev/null @@ -1,159 +0,0 @@ -// ====================================================================== -// -// Thread.cpp -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#include "sharedFoundation/FirstSharedFoundation.h" -#include "sharedThread/Thread.h" - -#include "sharedFoundation/ExitChain.h" -#include "sharedFoundation/Os.h" -#include "sharedFoundation/PerThreadData.h" -#include - -class MainThread: public Thread -{ -public: - MainThread(const std::string &name): Thread(name) {} -protected: - void run() {} -private: - MainThread(const MainThread &o); - MainThread &operator =(const MainThread &o); -}; - -pthread_key_t Thread::implindex; -Thread * Thread::mainThread; - -void Thread::install() -{ - DEBUG_FATAL(mainThread, ("Thread::install: already installed")); - ExitChain::add(remove, "Thread::remove"); - - pthread_key_create(&implindex, 0); - mainThread = new MainThread("Main"); - mainThread->attach(); -} - -void Thread::remove() -{ - DEBUG_FATAL(!mainThread, ("Thread::remove: not installed")); - DEBUG_FATAL(mainThread->refcount > 1, ("Someone still holds the main thread")); - delete mainThread; - pthread_key_delete(implindex); - - mainThread = 0; -} - -Thread::Thread(const std::string &i_name) -: refcount(1), name(i_name) -{ - doneFlag = false; -} - -void Thread::start() -{ - pthread_create(&thread, 0, threadFunc, this); - pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0); -} - -void Thread::attach() -{ - thread = pthread_self(); - pthread_setspecific(implindex, this); -} - -Thread::~Thread() -{ - pthread_detach(thread); -} - -void * Thread::threadFunc(void * i) -{ - Thread * impl = static_cast(i); - pthread_setspecific(implindex, impl); - pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0); - Os::setThreadName(impl->thread, impl->name.c_str()); - PerThreadData::threadInstall(true); - impl->run(); - PerThreadData::threadRemove(); - impl->kill(); - return 0; -} - -void Thread::kill() -{ - int t = getCurrentThread()->thread; - doneFlag = true; - deref(); - if (this == getCurrentThread()) - { - pthread_exit(0); - } - else - { - pthread_cancel(t); - } -} - -bool Thread::done() -{ - return doneFlag; -} - -void Thread::wait() -{ - if (!doneFlag) - { - void * junk; - pthread_join(thread, &junk); - } -} - -static inline int interpPriority(float t, int policy) -{ - return (int)(sched_get_priority_max(policy)*t + sched_get_priority_min(policy)*(1-t)); -} - -void Thread::setPriority(ePriority priority) -{ - static int policies[] = - { - SCHED_OTHER, - SCHED_OTHER, - SCHED_OTHER, - SCHED_OTHER, - SCHED_FIFO - }; - static int priorities[] = - { - interpPriority(0.0, SCHED_OTHER), - interpPriority(0.25, SCHED_OTHER), - interpPriority(0.5, SCHED_OTHER), - interpPriority(0.75, SCHED_OTHER), - interpPriority(0.75, SCHED_FIFO) - }; - sched_param p; - p.sched_priority = priorities[priority]; - pthread_setschedparam(thread, policies[priority], &p); -} - -// Make sure the header-only files compile :) - -#if 0 - -#include "sharedSynchronization/CountingSemaphore.h" -#include "sharedSynchronization/BlockingPointer.h" -#include "sharedSynchronization/BlockingQueue.h" -#include "sharedSynchronization/WriteOnce.h" - -Mutex t; -BlockingQueue bqint(t, 0, 0); -BlockingPointer bpint(t, 0, 0); -WriteOnce woint; - -#endif diff --git a/src/engine/shared/library/sharedThread/src/linux/Thread.h b/src/engine/shared/library/sharedThread/src/linux/Thread.h deleted file mode 100644 index 0c2faf80d..000000000 --- a/src/engine/shared/library/sharedThread/src/linux/Thread.h +++ /dev/null @@ -1,100 +0,0 @@ -// ====================================================================== -// -// Thread.h -// Acy Stapp -// -// Copyright 6/19/2001 Sony Online Entertainment -// -// ====================================================================== - -#ifndef INCLUDED_Thread_h -#define INCLUDED_Thread_h - -#include "sharedSynchronization/InterlockedInteger.h" -#include - -class Thread -{ - template friend class TypedThreadHandle; -public: - static void install(); - static void remove(); - - Thread(const std::string &i_name=std::string()); - - void kill(); - bool done(); - void wait(); - - enum ePriority - { - kIdle = 0, - kLow = 1, - kNormal = 2, - kHigh = 3, - kCritical = 4 - }; - void setPriority(ePriority priority); - - const std::string &getName() const; - void setName(const std::string &i_name); - - static Thread * getCurrentThread(); - static Thread * getMainThread(); -protected: - virtual ~Thread(); - virtual void run()=0; - - pthread_t thread; - - InterlockedInteger refcount; -private: - Thread(const Thread &o); - Thread &operator =(const Thread &o); - - void start(); - void attach(); // pick up the currently running thread - - void ref(); - void deref(); - - bool doneFlag; - - std::string name; - - static pthread_key_t implindex; - static Thread * mainThread; - static void * threadFunc(void * data); -}; - -inline void Thread::ref() -{ - ++refcount; -} - -inline void Thread::deref() -{ - if (--refcount == 0) delete this; -} - -inline Thread * Thread::getCurrentThread() -{ - return static_cast(pthread_getspecific(implindex)); -} - -inline Thread * Thread::getMainThread() -{ - return mainThread; -} - -inline const std::string &Thread::getName() const -{ - return name; -} - -inline void Thread::setName(const std::string &i_name) -{ - name = i_name; -} - -#endif diff --git a/src/external/3rd/library/java/include/linux/jawt_md.h b/src/external/3rd/library/java/include/linux/jawt_md.h deleted file mode 100644 index 7f5498eab..000000000 --- a/src/external/3rd/library/java/include/linux/jawt_md.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * @(#)jawt_md.h 1.4 00/02/02 - * - * Copyright 1999, 2000 Sun Microsystems, Inc. All Rights Reserved. - * - * This software is the proprietary information of Sun Microsystems, Inc. - * Use is subject to license terms. - * - */ - -#ifndef _JAVASOFT_JAWT_MD_H_ -#define _JAVASOFT_JAWT_MD_H_ - -#include -#include -#include -#include "jawt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * X11-specific declarations for AWT native interface. - * See notes in jawt.h for an example of use. - */ -typedef struct jawt_X11DrawingSurfaceInfo { - Drawable drawable; - Display* display; - VisualID visualID; - Colormap colormapID; - int depth; -} JAWT_X11DrawingSurfaceInfo; - -#ifdef __cplusplus -} -#endif - -#endif /* !_JAVASOFT_JAWT_MD_H_ */ diff --git a/src/external/3rd/library/java/include/linux/jni_md.h b/src/external/3rd/library/java/include/linux/jni_md.h deleted file mode 100644 index 9e953161e..000000000 --- a/src/external/3rd/library/java/include/linux/jni_md.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * @(#)jni_md.h 1.12 00/02/02 - * - * Copyright 1996-2000 Sun Microsystems, Inc. All Rights Reserved. - * - * This software is the proprietary information of Sun Microsystems, Inc. - * Use is subject to license terms. - * - */ - -#ifndef _JAVASOFT_JNI_MD_H_ -#define _JAVASOFT_JNI_MD_H_ - -#define JNIEXPORT -#define JNIIMPORT -#define JNICALL - -#ifdef _LP64 /* 64-bit Solaris */ -typedef int jint; -#else -typedef long jint; -#endif -typedef long long jlong; -typedef signed char jbyte; - -#endif /* !_JAVASOFT_JNI_MD_H_ */ diff --git a/src/external/3rd/library/pcre/4.1/linux/include/pcre/pcre.h b/src/external/3rd/library/pcre/4.1/linux/include/pcre/pcre.h deleted file mode 100644 index 82e3dedd5..000000000 --- a/src/external/3rd/library/pcre/4.1/linux/include/pcre/pcre.h +++ /dev/null @@ -1,184 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* Copyright (c) 1997-2003 University of Cambridge */ - -#ifndef _PCRE_H -#define _PCRE_H - -/* The file pcre.h is build by "configure". Do not edit it; instead -make changes to pcre.in. */ - -#define PCRE_MAJOR 4 -#define PCRE_MINOR 1 -#define PCRE_DATE 12-Mar-2003 - -/* Win32 uses DLL by default */ - -#ifdef _WIN32 -# ifdef PCRE_DEFINITION -# ifdef DLL_EXPORT -# define PCRE_DATA_SCOPE __declspec(dllexport) -# endif -# else -# ifndef PCRE_STATIC -# define PCRE_DATA_SCOPE __declspec(dllimport) -# endif -# endif -#endif -#ifndef PCRE_DATA_SCOPE -# define PCRE_DATA_SCOPE extern -#endif - -/* Have to include stdlib.h in order to ensure that size_t is defined; -it is needed here for malloc. */ - -#include - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options */ - -#define PCRE_CASELESS 0x0001 -#define PCRE_MULTILINE 0x0002 -#define PCRE_DOTALL 0x0004 -#define PCRE_EXTENDED 0x0008 -#define PCRE_ANCHORED 0x0010 -#define PCRE_DOLLAR_ENDONLY 0x0020 -#define PCRE_EXTRA 0x0040 -#define PCRE_NOTBOL 0x0080 -#define PCRE_NOTEOL 0x0100 -#define PCRE_UNGREEDY 0x0200 -#define PCRE_NOTEMPTY 0x0400 -#define PCRE_UTF8 0x0800 -#define PCRE_NO_AUTO_CAPTURE 0x1000 - -/* Exec-time and get/set-time error codes */ - -#define PCRE_ERROR_NOMATCH (-1) -#define PCRE_ERROR_NULL (-2) -#define PCRE_ERROR_BADOPTION (-3) -#define PCRE_ERROR_BADMAGIC (-4) -#define PCRE_ERROR_UNKNOWN_NODE (-5) -#define PCRE_ERROR_NOMEMORY (-6) -#define PCRE_ERROR_NOSUBSTRING (-7) -#define PCRE_ERROR_MATCHLIMIT (-8) -#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ - -/* Request types for pcre_fullinfo() */ - -#define PCRE_INFO_OPTIONS 0 -#define PCRE_INFO_SIZE 1 -#define PCRE_INFO_CAPTURECOUNT 2 -#define PCRE_INFO_BACKREFMAX 3 -#define PCRE_INFO_FIRSTBYTE 4 -#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ -#define PCRE_INFO_FIRSTTABLE 5 -#define PCRE_INFO_LASTLITERAL 6 -#define PCRE_INFO_NAMEENTRYSIZE 7 -#define PCRE_INFO_NAMECOUNT 8 -#define PCRE_INFO_NAMETABLE 9 -#define PCRE_INFO_STUDYSIZE 10 - -/* Request types for pcre_config() */ - -#define PCRE_CONFIG_UTF8 0 -#define PCRE_CONFIG_NEWLINE 1 -#define PCRE_CONFIG_LINK_SIZE 2 -#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 -#define PCRE_CONFIG_MATCH_LIMIT 4 - -/* Bit flags for the pcre_extra structure */ - -#define PCRE_EXTRA_STUDY_DATA 0x0001 -#define PCRE_EXTRA_MATCH_LIMIT 0x0002 -#define PCRE_EXTRA_CALLOUT_DATA 0x0004 - -/* Types */ - -struct real_pcre; /* declaration; the definition is private */ -typedef struct real_pcre pcre; - -/* The structure for passing additional data to pcre_exec(). This is defined in -such as way as to be extensible. */ - -typedef struct pcre_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ -} pcre_extra; - -/* The structure for passing out data via the pcre_callout_function. We use a -structure so that new fields can be added on the end in future versions, -without changing the API of the function, thereby allowing old clients to work -without modification. */ - -typedef struct pcre_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - const char *subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------------------------------------------------------ */ -} pcre_callout_block; - -/* Indirection for store get and free functions. These can be set to -alternative malloc/free functions if required. There is also an optional -callout function that is triggered by the (?) regex item. Some magic is -required for Win32 DLL; it is null on other OS. For Virtual Pascal, these -have to be different again. */ - -#ifndef VPCOMPAT -PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t); -PCRE_DATA_SCOPE void (*pcre_free)(void *); -PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *); -#else /* VPCOMPAT */ -extern void *pcre_malloc(size_t); -extern void pcre_free(void *); -extern int pcre_callout(pcre_callout_block *); -#endif /* VPCOMPAT */ - -/* Exported PCRE functions */ - -extern pcre *pcre_compile(const char *, int, const char **, - int *, const unsigned char *); -extern int pcre_config(int, void *); -extern int pcre_copy_named_substring(const pcre *, const char *, - int *, int, const char *, char *, int); -extern int pcre_copy_substring(const char *, int *, int, int, - char *, int); -extern int pcre_exec(const pcre *, const pcre_extra *, - const char *, int, int, int, int *, int); -extern void pcre_free_substring(const char *); -extern void pcre_free_substring_list(const char **); -extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, - void *); -extern int pcre_get_named_substring(const pcre *, const char *, - int *, int, const char *, const char **); -extern int pcre_get_stringnumber(const pcre *, const char *); -extern int pcre_get_substring(const char *, int *, int, int, - const char **); -extern int pcre_get_substring_list(const char *, int *, int, - const char ***); -extern int pcre_info(const pcre *, int *, int *); -extern const unsigned char *pcre_maketables(void); -extern pcre_extra *pcre_study(const pcre *, int, const char **); -extern const char *pcre_version(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcre.h */ diff --git a/src/external/3rd/library/pcre/4.1/linux/include/pcre/pcreposix.h b/src/external/3rd/library/pcre/4.1/linux/include/pcre/pcreposix.h deleted file mode 100644 index 05a0d7d6f..000000000 --- a/src/external/3rd/library/pcre/4.1/linux/include/pcre/pcreposix.h +++ /dev/null @@ -1,88 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* Copyright (c) 1997-2003 University of Cambridge */ - -#ifndef _PCREPOSIX_H -#define _PCREPOSIX_H - -/* This is the header for the POSIX wrapper interface to the PCRE Perl- -Compatible Regular Expression library. It defines the things POSIX says should -be there. I hope. */ - -/* Have to include stdlib.h in order to ensure that size_t is defined. */ - -#include - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options defined by POSIX. */ - -#define REG_ICASE 0x01 -#define REG_NEWLINE 0x02 -#define REG_NOTBOL 0x04 -#define REG_NOTEOL 0x08 - -/* These are not used by PCRE, but by defining them we make it easier -to slot PCRE into existing programs that make POSIX calls. */ - -#define REG_EXTENDED 0 -#define REG_NOSUB 0 - -/* Error values. Not all these are relevant or used by the wrapper. */ - -enum { - REG_ASSERT = 1, /* internal error ? */ - REG_BADBR, /* invalid repeat counts in {} */ - REG_BADPAT, /* pattern error */ - REG_BADRPT, /* ? * + invalid */ - REG_EBRACE, /* unbalanced {} */ - REG_EBRACK, /* unbalanced [] */ - REG_ECOLLATE, /* collation error - not relevant */ - REG_ECTYPE, /* bad class */ - REG_EESCAPE, /* bad escape sequence */ - REG_EMPTY, /* empty expression */ - REG_EPAREN, /* unbalanced () */ - REG_ERANGE, /* bad range inside [] */ - REG_ESIZE, /* expression too big */ - REG_ESPACE, /* failed to get memory */ - REG_ESUBREG, /* bad back reference */ - REG_INVARG, /* bad argument */ - REG_NOMATCH /* match failed */ -}; - - -/* The structure representing a compiled regular expression. */ - -typedef struct { - void *re_pcre; - size_t re_nsub; - size_t re_erroffset; -} regex_t; - -/* The structure in which a captured offset is returned. */ - -typedef int regoff_t; - -typedef struct { - regoff_t rm_so; - regoff_t rm_eo; -} regmatch_t; - -/* The functions */ - -extern int regcomp(regex_t *, const char *, int); -extern int regexec(regex_t *, const char *, size_t, regmatch_t *, int); -extern size_t regerror(int, const regex_t *, char *, size_t); -extern void regfree(regex_t *); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcreposix.h */ diff --git a/src/external/3rd/library/pcre/4.1/linux/lib/libpcre.a b/src/external/3rd/library/pcre/4.1/linux/lib/libpcre.a deleted file mode 100644 index 309cdb0c4bf9d70176277e153965f84783796bc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171760 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

6!Yt!%w3p=gZ%)6~& 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 VyOKDLIG#9xIFT49rif|c{|zPcbBX`} diff --git a/src/external/3rd/library/pcre/4.1/linux/lib/libpcre.la b/src/external/3rd/library/pcre/4.1/linux/lib/libpcre.la deleted file mode 100644 index 9eb4467db..000000000 --- a/src/external/3rd/library/pcre/4.1/linux/lib/libpcre.la +++ /dev/null @@ -1,32 +0,0 @@ -# libpcre.la - a libtool library file -# Generated by ltmain.sh - GNU libtool 1.4.3 (1.922.2.110 2002/10/23 01:39:54) -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='libpcre.so.0' - -# Names of this library. -library_names='libpcre.so.0.0.1 libpcre.so.0 libpcre.so' - -# The name of the static archive. -old_library='libpcre.a' - -# Libraries that this one depends upon. -dependency_libs='' - -# Version information for libpcre. -current=0 -age=0 -revision=1 - -# Is this an already installed library? -installed=yes - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/home/tfiala/swg/current/src/external/3rd/library/pcre/4.1/linux/lib' diff --git a/src/external/3rd/library/pcre/4.1/linux/lib/libpcre.so.0.0.1 b/src/external/3rd/library/pcre/4.1/linux/lib/libpcre.so.0.0.1 deleted file mode 100644 index 3da39c8221d5617dbab8735f3f726cf0976e460e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113284 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 z z@Y4^M@H8Dlqig;@CzPMs%kD=ez1sWB#J|okbQ$OYVAWI426!5cz8SDaUX50_fpdJi zANiV#Nq{CO@6;Rc`}kIR@%>xK$I$ZISB?WqN7C~Ev&fmi&;0wq*Gc#<7Ek>nev@*Q z-){lmWLW&&h`$MZf&AYV@D~FAs=?@~0n>y=-#-Gsj6B0~@}qr$4uk2nW z^yHcTDg5J4_K%-D{p48^socJ~?i9cBrnk6QY~2>2A}&7HM-$z2H?oa+GCNTfUKeQV zy(rLdIHN;RL2Uv~heNI3BQ;y54lF9&LD7sL1Y#bN=ac=mCKa<{6WjXKXd_ULGyc1B zwS)^y?dMW`rz=YYxw%&UDsCU|x@yGssONa+emzBU1x9Qun)zxPmaEy#@wC}Dd)pom zW?>q#-W86Gj+xNTR;_OUcY?H!V-g`Ra584Qq5*ApM)arsOW%$0D~X%gPzcvmtjPYA z8wj-8Y zc57URbi7ZB9n2&fDtfuEdpGYu?YIV-Yaz9eL(u<@>6J_q$<|aaGxR)@0( zdXB(!>&{%2(AZAg0bn^ap1B>7QOccbx0t&Ye2-%*hM=3m-VXe3HQi zF4Xx$=EXKEYTLLVd#H8(hC!=!(uS*!sezIM3=XuTiNjsrOmBTlFIzU*w*xGrltoAY G%l`mhDq0=@ diff --git a/src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.a b/src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.a deleted file mode 100644 index d8adbf0b546a7ea07c773d9f6af30f438e751765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26534 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 diff --git a/src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.la b/src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.la deleted file mode 100644 index ff969a30c..000000000 --- a/src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.la +++ /dev/null @@ -1,32 +0,0 @@ -# libpcreposix.la - a libtool library file -# Generated by ltmain.sh - GNU libtool 1.4.3 (1.922.2.110 2002/10/23 01:39:54) -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='libpcreposix.so.0' - -# Names of this library. -library_names='libpcreposix.so.0.0.0 libpcreposix.so.0 libpcreposix.so' - -# The name of the static archive. -old_library='libpcreposix.a' - -# Libraries that this one depends upon. -dependency_libs=' -L/home/tfiala/transfer/pcre-4.1 /home/tfiala/swg/current/src/external/3rd/library/pcre/4.1/linux/lib/libpcre.la' - -# Version information for libpcreposix. -current=0 -age=0 -revision=0 - -# Is this an already installed library? -installed=yes - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/home/tfiala/swg/current/src/external/3rd/library/pcre/4.1/linux/lib' diff --git a/src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.so.0.0.0 b/src/external/3rd/library/pcre/4.1/linux/lib/libpcreposix.so.0.0.0 deleted file mode 100644 index 4b495b021a12ae1b8ca2500c8910394ce79889b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30771 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 diff --git a/src/external/3rd/library/perforce/lib/linux/libclient.a b/src/external/3rd/library/perforce/lib/linux/libclient.a deleted file mode 100644 index a8a39960c53f21a3bb85acb073b6064e15f2ea45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169230 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 diff --git a/src/external/3rd/library/perforce/lib/linux/librpc.a b/src/external/3rd/library/perforce/lib/linux/librpc.a deleted file mode 100644 index 5ae498146a5781f053e216c918263d62c1d904cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80338 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 W9#G@0r_7(TPK<*Z6%XBJ!SFxucTV&G diff --git a/src/external/3rd/library/perforce/lib/linux/libsupp.a b/src/external/3rd/library/perforce/lib/linux/libsupp.a deleted file mode 100644 index 32ecef4f2ff5c94978fe3241a0e6c3371f0ef754..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 924320 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 R*fEa9Y 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%0Ao!~hJKf|l%NrR$F@u?`USg~M5 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

^9*j$E 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 diff --git a/src/external/3rd/library/platform/utils/Base/linux/Archive.h b/src/external/3rd/library/platform/utils/Base/linux/Archive.h deleted file mode 100644 index bb623b499..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Archive.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef BASE_LINUX_ARCHIVE_H -#define BASE_LINUX_ARCHIVE_H - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif - -namespace Base -{ - - -#ifdef PACK_BIG_ENDIAN - - inline double byteSwap(double value) { byteReverse(&value); return value; } - inline float byteSwap(float value) { byteReverse(&value); return value; } - inline uint64 byteSwap(uint64 value) { byteReverse(&value); return value; } - inline int64 byteSwap(int64 value) { byteReverse(&value); return value; } - inline uint32 byteSwap(uint32 value) { byteReverse(&value); return value; } - inline int32 byteSwap(int32 value) { byteReverse(&value); return value; } - inline uint16 byteSwap(uint16 value) { byteReverse(&value); return value; } - inline int16 byteSwap(int16 value) { byteReverse(&value); return value; } - -#else - - inline double byteSwap(double value) { return value; } - inline float byteSwap(float value) { return value; } - inline uint64 byteSwap(uint64 value) { return value; } - inline int64 byteSwap(int64 value) { return value; } - inline uint32 byteSwap(uint32 value) { return value; } - inline int32 byteSwap(int32 value) { return value; } - inline uint16 byteSwap(uint16 value) { return value; } - inline int16 byteSwap(int16 value) { return value; } - -#endif - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - -#endif diff --git a/src/external/3rd/library/platform/utils/Base/linux/BlockAllocator.cpp b/src/external/3rd/library/platform/utils/Base/linux/BlockAllocator.cpp deleted file mode 100644 index 00d01ec99..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/BlockAllocator.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "../BlockAllocator.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - BlockAllocator::BlockAllocator() - { - for(unsigned i = 0; i < 31; i++) - { - m_blocks[i] = NULL; - } - } - - BlockAllocator::~BlockAllocator() - { - // free all allocated memory blocks - for(unsigned i = 0; i < 31; i++) - { - while(m_blocks[i] != NULL) - { - unsigned *tmp = m_blocks[i]; - m_blocks[i] = (unsigned *)*m_blocks[i]; - free(tmp); - } - } - } - -// Allocate a block that is the next power of two greater than the # of bytes passed. -// 33 bytes yields a 64 byte block of memory and so forth. - - void *BlockAllocator::getBlock(unsigned bytes) - { - unsigned accum = 16, bits = 16; - unsigned *handle = NULL; - - // Perform a binary search looking for the highest bit. - - while(bits != 0) - { - // If bytes is less than the bit we're testing for, subtract half - // from the bit value and repeat - if(bytes < (unsigned)(1 << accum)) - { - bits /= 2; - accum -= bits; - } - // If bytes is greater than the bit we're testing for, add half - // from the but value and repeat - else if(bytes > (unsigned)(1 << accum)) - { - bits /= 2; - accum += bits; - } - // Got lucky and hit the value dead on - else - { - break; - } - } - // At this point accum contains the most significant bit index, increment - accum++; - if(accum < 2) - { - accum = 2; - } - - // Note that when memory is actually allocated, 8 extra bytes will be allocated.at the front - // The first integer is the address of the next block of memory when the block is in the allocator - // The second integer is the bit length of the block - // Memory is allocated on 4 byte boundaries to sidestep byte alignment problems - - - // Check if the allocator already has a block of that size - if(m_blocks[accum] == 0) - { - // remove the pre allocated block from the linked list - handle = (unsigned *)calloc(((1 << accum) / 4) + 2, sizeof(unsigned)); - handle[1] = accum; - handle[0] = 0; - } - else - { - // Allocate a new block - handle = m_blocks[accum]; - m_blocks[accum] = (unsigned *)handle[0]; - handle[0] = 0; - } - // return a pointer that skips over the header used for the allocator's purposes - return(handle + 2); - } - - void BlockAllocator::returnBlock(unsigned *handle) - { - // C++ allows for safe deletion of a NULL pointer - if(handle) - { - // Update the allocator linked list, insert this entry at the head - *(handle - 2) = (unsigned)m_blocks[*(handle - 1)]; - // Add this entry to the proper linked list node - m_blocks[*(handle - 1)] = (handle - 2); - } - } -}; -#ifdef EXTERNAL_DISTRO -}; -#endif diff --git a/src/external/3rd/library/platform/utils/Base/linux/Event.cpp b/src/external/3rd/library/platform/utils/Base/linux/Event.cpp deleted file mode 100644 index a3cce3b15..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Event.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//////////////////////////////////////// -// Event.cpp -// -// Purpose: -// 1. Implementation of the CEvent class. -// -// Revisions: -// 07/10/2001 Created -// - -#if defined(_REENTRANT) - - -#include "Event.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - CEvent::CEvent() : - mMutex(), - mCond(), - mThreadCount(0) - { - pthread_mutex_init(&mMutex, NULL); - pthread_cond_init(&mCond, NULL); - } - - CEvent::~CEvent() - { - pthread_cond_destroy(&mCond); - pthread_mutex_destroy(&mMutex); - } - - bool CEvent::Signal() - { - pthread_mutex_lock(&mMutex); - if (mThreadCount == 0) - mThreadCount = SIGNALED; - pthread_cond_signal(&mCond); - - pthread_mutex_unlock(&mMutex); - - return true; - } - - int32 CEvent::Wait(uint32 timeout) - { - int result; - - pthread_mutex_lock(&mMutex); - if (mThreadCount == SIGNALED) - { - mThreadCount = 0; - pthread_mutex_unlock(&mMutex); - - return eWAIT_SIGNAL; - } - - if (!timeout) - { - mThreadCount++; - result = pthread_cond_wait(&mCond, &mMutex); - mThreadCount--; - - pthread_mutex_unlock(&mMutex); - } - else - { - struct timeval now; - struct timespec abs_timeout; - - gettimeofday(&now, NULL); - abs_timeout.tv_sec = now.tv_sec + timeout/1000; - abs_timeout.tv_nsec = now.tv_usec * 1000 + (timeout%1000)*1000000; - abs_timeout.tv_sec += abs_timeout.tv_nsec / 1000000000; - abs_timeout.tv_nsec %= 1000000000; - - mThreadCount++; - result = pthread_cond_timedwait(&mCond, &mMutex, &abs_timeout); - mThreadCount--; - - pthread_mutex_unlock(&mMutex); - } - - if (result == 0 || result == EINTR) - return eWAIT_SIGNAL; - else if (result == ETIMEDOUT) - return eWAIT_TIMEOUT; - else - return eWAIT_ERROR; - } - -} - -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_REENTRANT) diff --git a/src/external/3rd/library/platform/utils/Base/linux/Event.h b/src/external/3rd/library/platform/utils/Base/linux/Event.h deleted file mode 100644 index 4801a9b20..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Event.h +++ /dev/null @@ -1,74 +0,0 @@ -//////////////////////////////////////// -// Event.h -// -// Purpose: -// 1. Declair the CEvent class that encapsulates the functionality of a -// single-locking semaphore. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_EVENT_H -#define BASE_LINUX_EVENT_H - -#if !defined(_REENTRANT) -# pragma message( "Excluding Base::CEvent - requires multi-threaded compile. (_REENTRANT)" ) -#else - - -#include -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CEvent - // - // Purpose: - // Encapsulates the functionality of a singal-locking semaphore. - // This class is valuable for thread syncronization when a thead's - // execution needs to be dependent upon another thread. - // - // Public Methods: - // Signal() : Signals a thread that has called Wait() so that it can - // continue execution. This function returns true if the waiting - // thread was signalled successfully, otherwise false is returned. - // Wait() : Halts the calling thread's execution indefinately until - // a Singal() call is made by an external thread. If the thread is - // successfully signalled, the function returns eWAIT_SIGNAL. If - // timeout period expires without a signal, eWAIT_TIMEOUT is returned. - // If the function fails, eWAIT_ERROR is returned. - // - class CEvent - { - public: - CEvent(); - virtual ~CEvent(); - - bool Signal(); - int32 Wait(uint32 timeout = 0); - - public: - enum { eWAIT_ERROR, eWAIT_SIGNAL, eWAIT_TIMEOUT }; - enum { SIGNALED = -1 }; - private: - pthread_mutex_t mMutex; - pthread_cond_t mCond; - int mThreadCount; - }; - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_MT) - -#endif // BASE_LINUX_EVENT_H diff --git a/src/external/3rd/library/platform/utils/Base/linux/Logger.cpp b/src/external/3rd/library/platform/utils/Base/linux/Logger.cpp deleted file mode 100644 index f305703d5..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Logger.cpp +++ /dev/null @@ -1,390 +0,0 @@ -#include "../Logger.h" -#include "Mutex.h" -#include - -using namespace std; - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - -const char file_sep = '/'; - -Logger::Logger(const char *prefix, int level, unsigned size, bool rollDate) -: m_defaultLevel(level), m_defaultSize(size), m_dirPrefix(prefix), m_rollDate(rollDate) -{ - char buf[1024]; - FILE *logDir = NULL; - - logDir = fopen(m_dirPrefix.c_str(), "r+"); - if(errno == ENOENT) - { - cmkdir(m_dirPrefix.c_str(), 0755); - } - else if(logDir != NULL) - { - fclose(logDir); - } - - tm now; - time_t t = time(NULL); - localtime_r(&t, &now); - - memcpy(&m_lastDateTime, &now, sizeof(tm)); - if(m_rollDate) - { - sprintf(buf, "%s%c%2.2d-%2.2d-%2.2d", m_dirPrefix.c_str(), file_sep, (now.tm_mon + 1), now.tm_mday, (now.tm_year % 100)); - } - else - { - sprintf(buf, "%s", m_dirPrefix.c_str()); - } - logDir = fopen(buf, "r+"); - if(errno == ENOENT) - { - cmkdir(buf, 0755); - } - else if(logDir != NULL) - { - fclose(logDir); - } - m_logPrefix = buf; -} - -Logger::~Logger() -{ - map::iterator iter; - for(iter = m_logTable.begin(); iter != m_logTable.end(); iter++) - { - log((*iter).first, LOG_FILEONLY, "---=== Log Stopped ===---"); - fflush((*iter).second->file); - fclose((*iter).second->file); - delete((*iter).second); - - } - m_logTable.clear(); -} - -void Logger::flush(unsigned logenum) -{ - map::iterator iter = m_logTable.find(logenum); - - if(iter != m_logTable.end()) - { - LogInfo *info = (*iter).second; - fflush(info->file); - info->used = 0; - } -} - -void Logger::flushAll() -{ - map::iterator iter; - - for(iter = m_logTable.begin(); iter != m_logTable.end(); iter++) - { - LogInfo *info = (*iter).second; - fflush(info->file); - info->used = 0; - } -} - -void Logger::addLog(const char *id, unsigned logenum, int level, unsigned size) -{ - LogInfo *newLog = new LogInfo; - newLog->filename = m_logPrefix + file_sep + id + ".log"; - newLog->name = id; - newLog->used = 0; - newLog->max = size; - newLog->last = 0; - newLog->level = level; - - m_logTable.insert(pair(logenum, newLog)); - - if(strcmp("stdout", id) == 0) - { - newLog->file = stdout; - } - else if(strcmp("stderr", id) == 0) - { - newLog->file = stderr; - } - else - { - newLog->file = fopen(newLog->filename.c_str(), "a+"); - } - log(logenum, LOG_FILEONLY, "---=== Log Started ===---"); -} - -void Logger::addLog(const char *id, unsigned logenum) -{ - LogInfo *newLog = new LogInfo; - newLog->filename = m_logPrefix + file_sep + id + ".log"; - newLog->name = id; - newLog->used = 0; - newLog->max = m_defaultSize; - newLog->last = 0; - newLog->level = m_defaultLevel; - - m_logTable.insert(pair(logenum, newLog)); - - if(strcmp("stdout", id) == 0) - { - newLog->file = stdout; - } - else if(strcmp("stderr", id) == 0) - { - newLog->file = stderr; - } - else - { - newLog->file = fopen(newLog->filename.c_str(), "a+"); - } - log(logenum, LOG_FILEONLY, "---===Log Started ===---"); -} - -void Logger::updateLog(unsigned logenum, int level, unsigned size) -{ - map::iterator iter = m_logTable.find(logenum); - - if(iter != m_logTable.end()) - { - (*iter).second->level = level; - (*iter).second->max = size; - } -} - -void Logger::removeLog(unsigned logenum) -{ - map::iterator iter = m_logTable.find(logenum); - - if(iter != m_logTable.end()) - { - log((*iter).first, LOG_ALWAYS, "---=== Log Stopped ===---"); - fflush((*iter).second->file); - fclose((*iter).second->file); - delete((*iter).second); - } -} - -void Logger::logSimple(unsigned logenum, int level, const char *message) -{ - map::iterator iter = m_logTable.find(logenum); - if(iter == m_logTable.end()) - { - return; - } - time_t t = time(NULL); - LogInfo *info = (*iter).second; - if(level >= info->level) - { - return; - } - if(level == LOG_FILEONLY && ((info->file == stderr) || (info->file == stdout))) - { - return; - } - if(info->last != t) - { - memcpy(&info->ts, localtime(&t), sizeof(tm)); - info->last = t; - } - - if(m_rollDate && info->ts.tm_mday != m_lastDateTime.tm_mday) - { -#if defined(_REENTRANT) - rLock.Lock(); -#endif - if(info->ts.tm_mday != m_lastDateTime.tm_mday) - { - memcpy(&m_lastDateTime, &info->ts, sizeof(tm)); - rollDate(t); - } -#if defined(_REENTRANT) - rLock.Unlock(); -#endif - } - if(iter != m_logTable.end()) - { - if(info->max > 0) - { - int tmp = fprintf(info->file, "[%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d] %s\n", (info->ts.tm_mon + 1), info->ts.tm_mday, (info->ts.tm_year % 100), info->ts.tm_hour, info->ts.tm_min, info->ts.tm_sec, message); - info->used += tmp; - if(info->used > info->max) - { - fflush(info->file); - info->used = 0; - } - } - else - { - fprintf(info->file, "[%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d] %s\n", (info->ts.tm_mon + 1), info->ts.tm_mday, (info->ts.tm_year % 100), info->ts.tm_hour, info->ts.tm_min, info->ts.tm_sec, message); - fflush(info->file); - } - } -} -void Logger::log(unsigned logenum, int level, const char *message, ...) -{ - char buf[2048]; - va_list varg; - va_start(varg, message); - vsnprintf(buf, 2047, message, varg); - buf[2047] = 0; - va_end(varg); - - map::iterator iter = m_logTable.find(logenum); - if(iter == m_logTable.end()) - { - return; - } - time_t t = time(NULL); - LogInfo *info = (*iter).second; - if(level >= info->level) - { - return; - } - if(level == LOG_FILEONLY && ((info->file == stderr) || (info->file == stdout))) - { - return; - } - if(info->last != t) - { - localtime_r(&t, &info->ts); - info->last = t; - } - if(m_rollDate && info->ts.tm_mday != m_lastDateTime.tm_mday) - { -#if defined(_REENTRANT) - rLock.Lock(); -#endif - if(info->ts.tm_mday != m_lastDateTime.tm_mday) - { - memcpy(&m_lastDateTime, &info->ts, sizeof(tm)); - rollDate(t); - } -#if defined(_REENTRANT) - rLock.Unlock(); -#endif - } - - if(iter != m_logTable.end()) - { - if(info->max > 0) - { - int tmp = fprintf(info->file, "[%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d] %s\n", (info->ts.tm_mon + 1), info->ts.tm_mday, (info->ts.tm_year % 100), info->ts.tm_hour, info->ts.tm_min, info->ts.tm_sec, buf); - info->used += tmp; - if(info->used > info->max) - { - fflush(info->file); - info->used = 0; - } - } - else - { - fprintf(info->file, "[%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d] %s\n", (info->ts.tm_mon + 1), info->ts.tm_mday, (info->ts.tm_year % 100), info->ts.tm_hour, info->ts.tm_min, info->ts.tm_sec, buf); - fflush(info->file); - } - } -} - -void Logger::rollDate(time_t t) -{ - char buf[80]; - FILE *logDir = NULL; - - logDir = fopen(m_dirPrefix.c_str(), "r+"); - if(errno == ENOENT) - { - cmkdir(m_dirPrefix.c_str(), 0755); - } - else if(logDir != NULL) - { - fclose(logDir); - } - - tm now; - localtime_r(&t, &now); - - sprintf(buf, "%s%c%2.2d-%2.2d-%2.2d", m_dirPrefix.c_str(), file_sep, (now.tm_mon + 1), now.tm_mday, (now.tm_year % 100)); - logDir = fopen(buf, "r+"); - - if(errno == ENOENT) - { - cmkdir(buf, 0755); - } - else if(logDir != NULL) - { - fclose(logDir); - } - m_logPrefix = buf; - - map::iterator iter; - for(iter = m_logTable.begin(); iter != m_logTable.end(); iter++) - { - (*iter).second->filename = m_logPrefix + file_sep + (*iter).second->name.c_str() + ".log"; - fflush((*iter).second->file); - fclose((*iter).second->file); - (*iter).second->file = fopen((*iter).second->filename.c_str(), "a+"); - memcpy(&((*iter).second->ts), &now, sizeof(tm)); - } -} - -// mkdir function that creates intermediate directories -void Logger::cmkdir(const char *dir, int mode) -{ - char dirbuf[128]; - strncpy(dirbuf, dir, 127); - dirbuf[127] = 0; - char *j = dirbuf, *i = dirbuf; - int handle; - - while(*i) - { - if(*i == file_sep) - { - (*i) = 0; -// handle = open(j, O_EXCL); // Ben's original code -// if((handle > 0) || (errno != EISDIR && errno != ENOENT)) -// { -// perror("Logger::cmkdir():"); -// abort(); -// } - -// This doesnt work under Linux, it returns a valid handle -// Instead: see if file exists. If it doesnt, create directory ok -// If it exists, do stat to see if it is a dir. -// If it is a dir, then ok, create the directory. -// If it is a file, error -// ging 9-16-2002 - - handle = open(j, O_RDONLY); - if (handle > 0) - { - struct stat stat_buffer; - int ret = fstat(handle,&stat_buffer); - if ((ret == -1) || ((stat_buffer.st_mode | S_IFDIR) == 0)) - { - perror("Logger::cmkdir():"); - abort(); - } - } - - mkdir(j, mode); - close(handle); - (*i) = file_sep; - } - else if(*(i + 1) == 0) - { - mkdir(j, mode); - } - i++; - } -} -#ifdef EXTERNAL_DISTRO -}; -#endif -}; diff --git a/src/external/3rd/library/platform/utils/Base/linux/Mutex.cpp b/src/external/3rd/library/platform/utils/Base/linux/Mutex.cpp deleted file mode 100644 index 36fe5b292..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Mutex.cpp +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////// -// Mutex.cpp -// -// Purpose: -// 1. Implementation of the CMutex class. -// -// Revisions: -// 07/10/2001 Created -// - -#if defined(_REENTRANT) - - -#include "Mutex.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - -CMutex::CMutex() - { - mInitialized = (pthread_mutex_init(&mMutex, 0) == 0); - } - -CMutex::~CMutex() - { - if (mInitialized) - pthread_mutex_destroy(&mMutex); - } - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - -#endif // #if defined(_REENTRANT) diff --git a/src/external/3rd/library/platform/utils/Base/linux/Mutex.h b/src/external/3rd/library/platform/utils/Base/linux/Mutex.h deleted file mode 100644 index dd56e3fcc..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Mutex.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////// -// Mutex.h -// -// Purpose: -// 1. Declair the CMutex class that encapsulates the functionality of a -// mutually-exclusive device. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_MUTEX_H -#define BASE_LINUX_MUTEX_H - -#if !defined(_REENTRANT) -# pragma message( "Excluding Base::CMutex - requires multi-threaded compile. (_REENTRANT)" ) -#else - - -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CMutex - // - // Purpose: - // Encapsulates the functionality of a mutually-exclusive device. - // This class is valuable for protecting against race conditions - // within threaded applications. The CMutex class can be used to - // only allow a single thread to run within a specified code - // segment at a time. - // - // Public Methods: - // Lock() : Locks the mutex. If the mutex is already locked, the - // operating system will block the calling thread until another - // thread has unlocked the mutex. - // Unlock() : Unlocks the mutex. - // - class CMutex - { - public: - CMutex(); - ~CMutex(); - - void Lock(); - void Unlock(); - private: - pthread_mutex_t mMutex; - bool mInitialized; - }; - - inline void CMutex::Lock(void) - { - if (mInitialized) - pthread_mutex_lock(&mMutex); - } - - inline void CMutex::Unlock(void) - { - if (mInitialized) - pthread_mutex_unlock(&mMutex); - } - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_MT) - -#endif // BASE_LINUX_MUTEX_H - diff --git a/src/external/3rd/library/platform/utils/Base/linux/Platform.cpp b/src/external/3rd/library/platform/utils/Base/linux/Platform.cpp deleted file mode 100644 index 4b24492c9..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Platform.cpp +++ /dev/null @@ -1,55 +0,0 @@ -//////////////////////////////////////// -// Platform.cpp -// -// Purpose: -// 1. Implementation of the global functionality declaired in Platform.h. -// -// Revisions: -// 07/10/2001 Created -// - -#include -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void _strlwr(char * s) - { - while (*s) - { - *s = tolower(*s); - s++; - } - } - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void _strupr(char * s) - { - while (*s) - { - *s = toupper(*s); - s++; - } - } - - - CTimer::CTimer() : - mTimer(0) - { - } - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - diff --git a/src/external/3rd/library/platform/utils/Base/linux/Platform.h b/src/external/3rd/library/platform/utils/Base/linux/Platform.h deleted file mode 100644 index 41da39728..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Platform.h +++ /dev/null @@ -1,112 +0,0 @@ -//////////////////////////////////////// -// Platform.h -// -// Purpose: -// 1. Include relevent system headers that are platform specific. -// 2. Declair global platform specific functionality. -// 3. Include primative type definitions -// -// Global Functions: -// getTimer() : Return the current high resolution clock count. -// getTimerFrequency() : Return the frequency of the high resolution clock. -// sleep() : Voluntarily relinquish timeslice of the calling thread for a -// specified number of milliseconds. -// strlwr() : Alters the contents of a string, making it all lower-case. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_PLATFORM_H -#define BASE_LINUX_PLATFORM_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Types.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - uint64 getTimer(void); - uint64 getTimerFrequency(void); - void sleep(uint32 ms); - - inline uint64 getTimer(void) - { - uint64 t; - struct timeval tv; - - gettimeofday(&tv, 0); - t = tv.tv_sec; - t = t * 1000000; - t += tv.tv_usec; - return t; - } - - inline uint64 getTimerFrequency(void) - { - uint64 f = 1000000; - return f; - } - - inline void sleep(uint32 ms) - { - usleep(static_cast(ms * 1000)); - } - - void _strlwr(char * s); - void _strupr(char * s); - - - class CTimer - { - public: - CTimer(); - - void Set(uint32 seconds); - void Signal(); - bool Expired(); - - private: - uint32 mTimer; - }; - - inline void CTimer::Set(uint32 interval) - { - mTimer = (uint32)time(0) + interval; - } - - inline void CTimer::Signal() - { - mTimer = 0; - } - - inline bool CTimer::Expired() - { - return (mTimer <= (uint32)time(0)); - } - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // BASE_LINUX_PLATFORM_H diff --git a/src/external/3rd/library/platform/utils/Base/linux/Thread.cpp b/src/external/3rd/library/platform/utils/Base/linux/Thread.cpp deleted file mode 100644 index 2bc4f26b2..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Thread.cpp +++ /dev/null @@ -1,274 +0,0 @@ -//////////////////////////////////////// -// Thread.cpp -// -// Purpose: -// 1. Implementation of the CThread class. -// -// Revisions: -// 07/10/2001 Created -// - -#if defined(_REENTRANT) - - -#include -#include -#include "Thread.h" - -using namespace std; - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - void *threadProc(void *threadPtr) - { - CThread &thread = *((CThread*)threadPtr); - thread.mThreadActive = true; - thread.ThreadProc(); - thread.mThreadActive = false; - - return 0; - } - - CThread::CThread() - { - mThreadID = 0; - mThreadActive = false; - mThreadContinue = false; - } - - CThread::~CThread() - { - StopThread(); - } - - void CThread::StartThread() - { - mThreadContinue = true; - pthread_create(&mThreadID,0,threadProc,this); - while (!IsThreadActive()) - Base::sleep(1); - } - - int32 CThread::StopThread(int timeout) - { - timeout += time(0); - - mThreadContinue = false; - while (mThreadActive && time(0)OnStartup(this); - while (mThreadContinue) - { - mParent->OnIdle(this); - mSemaphore.Wait(mParent->GetTimeOut()*1000); - - if (mFunction) - { - mFunction(mArgument); - mArgument = NULL; - mFunction = NULL; - } - else if (mParent->OnDestory(this)) - mThreadContinue = false; - } - } - - -//////////////////////////////////////////////////////////////////////////////// - - - CThreadPool::CThreadPool(uint32 maxThreads, uint32 minThreads, uint32 timeout) : - mMutex(), - mIdleMember(), - mBusyMember(), - mNullMember(), - mThreadCount(0), - mMaxThreads(maxThreads), - mMinThreads(minThreads), - mTimeOut(timeout) - { - if (mMaxThreads == 0) mMaxThreads = 1; - if (mMinThreads == 0) mMinThreads = 1; - if (mMinThreads > mMaxThreads) mMinThreads = mMaxThreads; - - for (uint32 i=0; i::iterator setIterator; - - //////////////////////////////////////// - // (1) Destory all busy member threads - mMutex.Lock(); - setIterator = mBusyMember.begin(); - while (setIterator != mBusyMember.end()) - (*setIterator++)->Destroy(); - mMutex.Unlock(); - - //////////////////////////////////////// - // (2) Destory all idle member threads - while (mThreadCount) - { - mMutex.Lock(); - setIterator = mIdleMember.begin(); - while (setIterator != mIdleMember.end()) - (*setIterator++)->Destroy(); - mMutex.Unlock(); - - sleep(1); - } - - //////////////////////////////////////// - // (3) Delete the null member threads - mMutex.Lock(); - while (!mNullMember.empty()) - { - delete mNullMember.front(); - mNullMember.pop_front(); - } - mMutex.Unlock(); - } - - bool CThreadPool::Execute(void( *function )( void * ), void * arg) - { - mMutex.Lock(); - - //////////////////////////////////////// - // (1) If no idle members, return false to indicate that no threads - // were available. If the thread count is below the max, create - // a new thread. - if (mIdleMember.empty()) - { - if (mThreadCount < mMaxThreads) - new CMember(this); - mMutex.Unlock(); - return false; - } - - //////////////////////////////////////// - // (2) Delete any null member threads. - while (!mNullMember.empty()) - { - delete mNullMember.front(); - mNullMember.pop_front(); - } - - //////////////////////////////////////// - // (3) Move the first idle thread to the busy set and signal the - // thread to execute the specified function. - CMember * member = *(mIdleMember.begin()); - mIdleMember.erase(member); - mBusyMember.insert(member); - member->Execute(function,arg); - - mMutex.Unlock(); - return true; - } - - uint32 CThreadPool::GetTimeOut() - { - return mTimeOut; - } - - void CThreadPool::OnStartup(CMember * member) - { - mMutex.Lock(); - - mThreadCount++; - mIdleMember.insert(member); - - mMutex.Unlock(); - } - - void CThreadPool::OnIdle(CMember * member) - { - mMutex.Lock(); - - mBusyMember.erase(member); - mIdleMember.insert(member); - - mMutex.Unlock(); - } - - bool CThreadPool::OnDestory(CMember * member) - { - set::iterator setIterator; - - mMutex.Lock(); - - bool result = (setIterator = mIdleMember.find(member)) != mIdleMember.end(); - if (result) - { - mNullMember.push_back(member); - mIdleMember.erase(setIterator); - mThreadCount--; - } - - mMutex.Unlock(); - - return result; - } - - -//////////////////////////////////////////////////////////////////////////////// - - -} - -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_REENTRANT) diff --git a/src/external/3rd/library/platform/utils/Base/linux/Thread.h b/src/external/3rd/library/platform/utils/Base/linux/Thread.h deleted file mode 100644 index 4d42274b6..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Thread.h +++ /dev/null @@ -1,146 +0,0 @@ -//////////////////////////////////////// -// Thread.h -// -// Purpose: -// 1. Declair the CThread class that encapsulates threading functionality. -// This abstract base class in intended to be used to encapsulate -// individual tasks that require threading in derived classes. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_THREAD_H -#define BASE_LINUX_THREAD_H - -#if !defined(_REENTRANT) -# pragma message( "Excluding Base::CThread - requires multi-threaded compile. (_REENTRANT)" ) -#else - - -#pragma warning( disable : 4786) - -#include -#include -#include "Platform.h" -#include "Mutex.h" -#include "Event.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CThread - // - // Purpose: - // Encapsulates threading functionality. Creating classes derived - // from CThread provides an easy way to encapsulate tasks that require - // their own thread. - // - // Public Methods: - // StartThread() : Creates the low-level thread handle and begins executing - // the CThread::ThreadProc() function within the new thread. - // StopThread() : Signals the ThreadProc() function to stop executing using - // the mThreadContinue member variable, and waits for the ThreadProc() - // function to exit. By default, the function will block for a maximum - // of 5 seconds before exiting without the thread halting. - // IsThreadActive() : Returns true if the physical thread is still executing - // within the ThreadProc() function, otherwise it returns false. - // ThreadProc() : Pure-virtual function that will be executed when the StartThread() - // function is called. Derived classes must implement this function. The - // mThreadContinue member variable should be used internal the the ThreadProc() - // function to indicate whether it should continue executing or exit. - // Protected Attributes: - // mThreadContinue : Boolean value indicating to the ThreadProc() function - // whether to continue executing or to exit. If mThreadContinue is true, - // ThreadProc() should continue, otherwise ThreadProc() should exit. It - // left up to the derived class to implement a ThreadProc() function that - // uses the mThreadContinue member. - // - // - class CThread - { - friend void * threadProc(void *); - - public: - enum { eSTOP_SUCCESS, eSTOP_TIMEOUT }; - public: - CThread(); - virtual ~CThread(); - - void StartThread(); - int32 StopThread(int timeout=5); - bool IsThreadActive() { return mThreadActive; } - - protected: - virtual void ThreadProc() {} - - protected: - bool mThreadContinue; - private: - pthread_t mThreadID; - bool mThreadActive; - }; - - - class CThreadPool - { - private: - class CMember : public CThread - { - public: - CMember(CThreadPool * parent); - virtual ~CMember(); - - bool Execute(void( *function )( void * ), void * arg); - void Destroy(); - - protected: - virtual void ThreadProc(); - - private: - CThreadPool * mParent; - void( * mFunction )( void * ); - void * mArgument; - CEvent mSemaphore; - }; - friend class CMember; - - public: - CThreadPool(uint32 maxThreads, uint32 minThreads=1, uint32 timeout=15*60); - ~CThreadPool(); - - bool Execute(void( *function )( void * ), void * arg); - - private: - uint32 GetTimeOut(); - void OnStartup(CMember * member); - void OnIdle(CMember * member); - bool OnDestory(CMember * member); - - private: - CMutex mMutex; - std::set mIdleMember; - std::set mBusyMember; - std::list mNullMember; - uint32 mThreadCount; - - uint32 mMaxThreads; - uint32 mMinThreads; - uint32 mTimeOut; - }; - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_REENTRANT) - -#endif // BASE_LINUX_THREAD_H diff --git a/src/external/3rd/library/platform/utils/Base/linux/Types.h b/src/external/3rd/library/platform/utils/Base/linux/Types.h deleted file mode 100644 index bc869bac6..000000000 --- a/src/external/3rd/library/platform/utils/Base/linux/Types.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////// -// Types.h -// -// Purpose: -// 1. Define integer types that are unambiguous with respect to size -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_TYPES_H -#define BASE_LINUX_TYPES_H - -#include - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif - -namespace Base -{ -#define INT32_MAX 0x7FFFFFFF -#define INT32_MIN 0x80000000 -#define UINT32_MAX 0xFFFFFFFF - -typedef signed char int8; -typedef unsigned char uint8; -typedef signed short int16; -typedef unsigned short uint16; - -typedef int32_t int32; -typedef u_int32_t uint32; -typedef int64_t int64; -typedef u_int64_t uint64; -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // BASE_LINUX_TYPES_H - diff --git a/src/external/3rd/library/soePlatform/Base/linux/Event.cpp b/src/external/3rd/library/soePlatform/Base/linux/Event.cpp deleted file mode 100644 index 797bbcd7d..000000000 --- a/src/external/3rd/library/soePlatform/Base/linux/Event.cpp +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////////////////////// -// Event.cpp -// -// Purpose: -// 1. Implementation of the CEvent class. -// -// Revisions: -// 07/10/2001 Created -// - -#include "./Event.h" - -namespace Base -{ - - CEvent::CEvent() - { - mInitialized = false; - if (pthread_cond_init( &mCond, NULL ) != 0) - { - return; - } - - if (pthread_mutex_init( &mMutex, NULL ) != 0) - { - pthread_cond_destroy( &mCond ); - return; - } - mInitialized = true; - } - - CEvent::~CEvent() - { - if (mInitialized) - { - pthread_cond_destroy(&mCond); - pthread_mutex_destroy(&mMutex); - } - } - - int32 CEvent::Wait(uint32 timeout) - { - if (!mInitialized) - return CEvent::eWAIT_ERROR; - - int result; - if (!timeout) - result = pthread_cond_wait(&mCond, &mMutex); - else - { - struct timespec wake_time; - - // linux 2.0 is not fully POSIX compliant with high-resolution timers - // so we use the older gettimeofday() - struct timeval tv; - - // get high resolution time and convert to POSIX 4 struct - if (gettimeofday(&tv, NULL) != 0) - return CEvent::eWAIT_ERROR; - TIMEVAL_TO_TIMESPEC(&tv, &wake_time); - - // add time out - wake_time.tv_sec += timeout/1000; - wake_time.tv_nsec += (timeout%1000)*1000000; - - // normalize new time - wake_time.tv_sec += wake_time.tv_nsec / 1000000000; - wake_time.tv_nsec %= 1000000000; - - // wait on condition with time out - result = pthread_cond_timedwait(&mCond, &mMutex, &wake_time ); - } - - if (result == 0 || result == EINTR) - return CEvent::eWAIT_SIGNAL; - else if (result == ETIMEDOUT) - return CEvent::eWAIT_TIMEOUT; - else - return CEvent::eWAIT_ERROR; - } - -} diff --git a/src/external/3rd/library/soePlatform/Base/linux/Event.h b/src/external/3rd/library/soePlatform/Base/linux/Event.h deleted file mode 100644 index b92a76730..000000000 --- a/src/external/3rd/library/soePlatform/Base/linux/Event.h +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////// -// Event.h -// -// Purpose: -// 1. Declair the CEvent class that encapsulates the functionality of a -// single-locking semaphore. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_EVENT_H -#define BASE_LINUX_EVENT_H - -#include "Platform.h" - -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CEvent - // - // Purpose: - // Encapsulates the functionality of a singal-locking semaphore. - // This class is valuable for thread syncronization when a thead's - // execution needs to be dependent upon another thread. - // - // Public Methods: - // Signal() : Signals a thread that has called Wait() so that it can - // continue execution. This function returns true if the waiting - // thread was signalled successfully, otherwise false is returned. - // Wait() : Halts the calling thread's execution indefinately until - // a Singal() call is made by an external thread. If the thread is - // successfully signalled, the function returns eWAIT_SIGNAL. If - // timeout period expires without a signal, eWAIT_TIMEOUT is returned. - // If the function fails, eWAIT_ERROR is returned. - // - class CEvent - { - public: - CEvent(); - virtual ~CEvent(); - - bool Signal(); - int32 Wait(uint32 timeout = 0); - - public: - enum { eWAIT_ERROR, eWAIT_SIGNAL, eWAIT_TIMEOUT }; - private: - pthread_mutex_t mMutex; - pthread_cond_t mCond; - bool mInitialized; - }; - - inline bool CEvent::Signal() - { - if (!mInitialized) - return false; - - pthread_cond_signal(&mCond); - return true; - } - -} - -#endif // BASE_LINUX_EVENT_H diff --git a/src/external/3rd/library/soePlatform/Base/linux/Mutex.cpp b/src/external/3rd/library/soePlatform/Base/linux/Mutex.cpp deleted file mode 100644 index 6018b3855..000000000 --- a/src/external/3rd/library/soePlatform/Base/linux/Mutex.cpp +++ /dev/null @@ -1,28 +0,0 @@ -//////////////////////////////////////// -// Mutex.cpp -// -// Purpose: -// 1. Implementation of the CMutex class. -// -// Revisions: -// 07/10/2001 Created -// - -#include "./Mutex.h" - -namespace Base -{ - -CMutex::CMutex() - { - mInitialized = (pthread_mutex_init(&mMutex, 0) == 0); - } - -CMutex::~CMutex() - { - if (mInitialized) - pthread_mutex_destroy(&mMutex); - } - -} - diff --git a/src/external/3rd/library/soePlatform/Base/linux/Mutex.h b/src/external/3rd/library/soePlatform/Base/linux/Mutex.h deleted file mode 100644 index 09b9426c8..000000000 --- a/src/external/3rd/library/soePlatform/Base/linux/Mutex.h +++ /dev/null @@ -1,65 +0,0 @@ -//////////////////////////////////////// -// Mutex.h -// -// Purpose: -// 1. Declair the CMutex class that encapsulates the functionality of a -// mutually-exclusive device. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_MUTEX_H -#define BASE_LINUX_MUTEX_H - -#include "Platform.h" - -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CMutex - // - // Purpose: - // Encapsulates the functionality of a mutually-exclusive device. - // This class is valuable for protecting against race conditions - // within threaded applications. The CMutex class can be used to - // only allow a single thread to run within a specified code - // segment at a time. - // - // Public Methods: - // Lock() : Locks the mutex. If the mutex is already locked, the - // operating system will block the calling thread until another - // thread has unlocked the mutex. - // Unlock() : Unlocks the mutex. - // - class CMutex - { - public: - CMutex(); - ~CMutex(); - - void Lock(); - void Unlock(); - private: - pthread_mutex_t mMutex; - bool mInitialized; - }; - - inline void CMutex::Lock(void) - { - if (mInitialized) - pthread_mutex_lock(&mMutex); - } - - inline void CMutex::Unlock(void) - { - if (mInitialized) - pthread_mutex_unlock(&mMutex); - } - -} - -#endif // BASE_LINUX_MUTEX_H - diff --git a/src/external/3rd/library/soePlatform/Base/linux/Platform.cpp b/src/external/3rd/library/soePlatform/Base/linux/Platform.cpp deleted file mode 100644 index 3b8198dde..000000000 --- a/src/external/3rd/library/soePlatform/Base/linux/Platform.cpp +++ /dev/null @@ -1,39 +0,0 @@ -//////////////////////////////////////// -// Platform.cpp -// -// Purpose: -// 1. Implementation of the global functionality declaired in Platform.h. -// -// Revisions: -// 07/10/2001 Created -// - -#include -#include "Platform.h" - -namespace Base -{ - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void _strlwr(char * s) - { - while (*s) - { - *s = tolower(*s); - s++; - } - } - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void _strupr(char * s) - { - while (*s) - { - *s = toupper(*s); - s++; - } - } -} - diff --git a/src/external/3rd/library/soePlatform/Base/linux/Platform.h b/src/external/3rd/library/soePlatform/Base/linux/Platform.h deleted file mode 100644 index 22981d63f..000000000 --- a/src/external/3rd/library/soePlatform/Base/linux/Platform.h +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////// -// Platform.h -// -// Purpose: -// 1. Include relevent system headers that are platform specific. -// 2. Declair global platform specific functionality. -// 3. Include primative type definitions -// -// Global Functions: -// getTimer() : Return the current high resolution clock count. -// getTimerFrequency() : Return the frequency of the high resolution clock. -// sleep() : Voluntarily relinquish timeslice of the calling thread for a -// specified number of milliseconds. -// strlwr() : Alters the contents of a string, making it all lower-case. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_PLATFORM_H -#define BASE_LINUX_PLATFORM_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Types.h" - -namespace Base -{ -int64 getTimer(void); -int64 getTimerFrequency(void); -void sleep(uint32 ms); - -inline int64 getTimer(void) - { - int64 t; - struct timeval tv; - - gettimeofday(&tv, 0); - t = tv.tv_sec; - t = t * 1000000; - t += tv.tv_usec; - return t; - } - -inline int64 getTimerFrequency(void) - { - int64 f = 1000000; - return f; - } - -inline void sleep(uint32 ms) - { - usleep(static_cast(ms * 1000)); - } - -void _strlwr(char * s); -void _strupr(char * s); - -} - -#endif // BASE_LINUX_PLATFORM_H - diff --git a/src/external/3rd/library/soePlatform/Base/linux/Thread.cpp b/src/external/3rd/library/soePlatform/Base/linux/Thread.cpp deleted file mode 100644 index 2c1c1e8d2..000000000 --- a/src/external/3rd/library/soePlatform/Base/linux/Thread.cpp +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////// -// Thread.cpp -// -// Purpose: -// 1. Implementation of the CThread class. -// -// Revisions: -// 07/10/2001 Created -// - -#include -#include "./Thread.h" - -namespace Base -{ - - void *threadProc(void *threadPtr) - { - CThread &thread = *((CThread*)threadPtr); - thread.mThreadActive = true; - thread.ThreadProc(); - thread.mThreadActive = false; - - return 0; - } - - CThread::CThread() - { - mThreadID = 0; - mThreadActive = false; - mThreadContinue = false; - } - - CThread::~CThread() - { - StopThread(); - } - - void CThread::StartThread() - { - mThreadContinue = true; - pthread_create(&mThreadID,0,threadProc,this); - while (!IsThreadActive()) - Base::sleep(1); - } - - int32 CThread::StopThread(int timeout) - { - timeout += time(0); - - mThreadContinue = false; - while (mThreadActive && time(0) - -namespace Base -{ -#define INT32_MAX 0x7FFFFFFF -#define INT32_MIN 0x80000000 -#define UINT32_MAX 0xFFFFFFFF - -typedef signed char int8; -typedef unsigned char uint8; -typedef signed short int16; -typedef unsigned short uint16; - -typedef int32_t int32; -typedef u_int32_t uint32; -typedef int64_t int64; -typedef u_int64_t uint64; -} - -#endif // BASE_LINUX_TYPES_H - diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Archive.h b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Archive.h deleted file mode 100644 index bb623b499..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Archive.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef BASE_LINUX_ARCHIVE_H -#define BASE_LINUX_ARCHIVE_H - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif - -namespace Base -{ - - -#ifdef PACK_BIG_ENDIAN - - inline double byteSwap(double value) { byteReverse(&value); return value; } - inline float byteSwap(float value) { byteReverse(&value); return value; } - inline uint64 byteSwap(uint64 value) { byteReverse(&value); return value; } - inline int64 byteSwap(int64 value) { byteReverse(&value); return value; } - inline uint32 byteSwap(uint32 value) { byteReverse(&value); return value; } - inline int32 byteSwap(int32 value) { byteReverse(&value); return value; } - inline uint16 byteSwap(uint16 value) { byteReverse(&value); return value; } - inline int16 byteSwap(int16 value) { byteReverse(&value); return value; } - -#else - - inline double byteSwap(double value) { return value; } - inline float byteSwap(float value) { return value; } - inline uint64 byteSwap(uint64 value) { return value; } - inline int64 byteSwap(int64 value) { return value; } - inline uint32 byteSwap(uint32 value) { return value; } - inline int32 byteSwap(int32 value) { return value; } - inline uint16 byteSwap(uint16 value) { return value; } - inline int16 byteSwap(int16 value) { return value; } - -#endif - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - -#endif diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/BlockAllocator.cpp b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/BlockAllocator.cpp deleted file mode 100644 index 00d01ec99..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/BlockAllocator.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "../BlockAllocator.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - BlockAllocator::BlockAllocator() - { - for(unsigned i = 0; i < 31; i++) - { - m_blocks[i] = NULL; - } - } - - BlockAllocator::~BlockAllocator() - { - // free all allocated memory blocks - for(unsigned i = 0; i < 31; i++) - { - while(m_blocks[i] != NULL) - { - unsigned *tmp = m_blocks[i]; - m_blocks[i] = (unsigned *)*m_blocks[i]; - free(tmp); - } - } - } - -// Allocate a block that is the next power of two greater than the # of bytes passed. -// 33 bytes yields a 64 byte block of memory and so forth. - - void *BlockAllocator::getBlock(unsigned bytes) - { - unsigned accum = 16, bits = 16; - unsigned *handle = NULL; - - // Perform a binary search looking for the highest bit. - - while(bits != 0) - { - // If bytes is less than the bit we're testing for, subtract half - // from the bit value and repeat - if(bytes < (unsigned)(1 << accum)) - { - bits /= 2; - accum -= bits; - } - // If bytes is greater than the bit we're testing for, add half - // from the but value and repeat - else if(bytes > (unsigned)(1 << accum)) - { - bits /= 2; - accum += bits; - } - // Got lucky and hit the value dead on - else - { - break; - } - } - // At this point accum contains the most significant bit index, increment - accum++; - if(accum < 2) - { - accum = 2; - } - - // Note that when memory is actually allocated, 8 extra bytes will be allocated.at the front - // The first integer is the address of the next block of memory when the block is in the allocator - // The second integer is the bit length of the block - // Memory is allocated on 4 byte boundaries to sidestep byte alignment problems - - - // Check if the allocator already has a block of that size - if(m_blocks[accum] == 0) - { - // remove the pre allocated block from the linked list - handle = (unsigned *)calloc(((1 << accum) / 4) + 2, sizeof(unsigned)); - handle[1] = accum; - handle[0] = 0; - } - else - { - // Allocate a new block - handle = m_blocks[accum]; - m_blocks[accum] = (unsigned *)handle[0]; - handle[0] = 0; - } - // return a pointer that skips over the header used for the allocator's purposes - return(handle + 2); - } - - void BlockAllocator::returnBlock(unsigned *handle) - { - // C++ allows for safe deletion of a NULL pointer - if(handle) - { - // Update the allocator linked list, insert this entry at the head - *(handle - 2) = (unsigned)m_blocks[*(handle - 1)]; - // Add this entry to the proper linked list node - m_blocks[*(handle - 1)] = (handle - 2); - } - } -}; -#ifdef EXTERNAL_DISTRO -}; -#endif diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Event.cpp b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Event.cpp deleted file mode 100644 index a3cce3b15..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Event.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//////////////////////////////////////// -// Event.cpp -// -// Purpose: -// 1. Implementation of the CEvent class. -// -// Revisions: -// 07/10/2001 Created -// - -#if defined(_REENTRANT) - - -#include "Event.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - CEvent::CEvent() : - mMutex(), - mCond(), - mThreadCount(0) - { - pthread_mutex_init(&mMutex, NULL); - pthread_cond_init(&mCond, NULL); - } - - CEvent::~CEvent() - { - pthread_cond_destroy(&mCond); - pthread_mutex_destroy(&mMutex); - } - - bool CEvent::Signal() - { - pthread_mutex_lock(&mMutex); - if (mThreadCount == 0) - mThreadCount = SIGNALED; - pthread_cond_signal(&mCond); - - pthread_mutex_unlock(&mMutex); - - return true; - } - - int32 CEvent::Wait(uint32 timeout) - { - int result; - - pthread_mutex_lock(&mMutex); - if (mThreadCount == SIGNALED) - { - mThreadCount = 0; - pthread_mutex_unlock(&mMutex); - - return eWAIT_SIGNAL; - } - - if (!timeout) - { - mThreadCount++; - result = pthread_cond_wait(&mCond, &mMutex); - mThreadCount--; - - pthread_mutex_unlock(&mMutex); - } - else - { - struct timeval now; - struct timespec abs_timeout; - - gettimeofday(&now, NULL); - abs_timeout.tv_sec = now.tv_sec + timeout/1000; - abs_timeout.tv_nsec = now.tv_usec * 1000 + (timeout%1000)*1000000; - abs_timeout.tv_sec += abs_timeout.tv_nsec / 1000000000; - abs_timeout.tv_nsec %= 1000000000; - - mThreadCount++; - result = pthread_cond_timedwait(&mCond, &mMutex, &abs_timeout); - mThreadCount--; - - pthread_mutex_unlock(&mMutex); - } - - if (result == 0 || result == EINTR) - return eWAIT_SIGNAL; - else if (result == ETIMEDOUT) - return eWAIT_TIMEOUT; - else - return eWAIT_ERROR; - } - -} - -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_REENTRANT) diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Event.h b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Event.h deleted file mode 100644 index 4801a9b20..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Event.h +++ /dev/null @@ -1,74 +0,0 @@ -//////////////////////////////////////// -// Event.h -// -// Purpose: -// 1. Declair the CEvent class that encapsulates the functionality of a -// single-locking semaphore. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_EVENT_H -#define BASE_LINUX_EVENT_H - -#if !defined(_REENTRANT) -# pragma message( "Excluding Base::CEvent - requires multi-threaded compile. (_REENTRANT)" ) -#else - - -#include -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CEvent - // - // Purpose: - // Encapsulates the functionality of a singal-locking semaphore. - // This class is valuable for thread syncronization when a thead's - // execution needs to be dependent upon another thread. - // - // Public Methods: - // Signal() : Signals a thread that has called Wait() so that it can - // continue execution. This function returns true if the waiting - // thread was signalled successfully, otherwise false is returned. - // Wait() : Halts the calling thread's execution indefinately until - // a Singal() call is made by an external thread. If the thread is - // successfully signalled, the function returns eWAIT_SIGNAL. If - // timeout period expires without a signal, eWAIT_TIMEOUT is returned. - // If the function fails, eWAIT_ERROR is returned. - // - class CEvent - { - public: - CEvent(); - virtual ~CEvent(); - - bool Signal(); - int32 Wait(uint32 timeout = 0); - - public: - enum { eWAIT_ERROR, eWAIT_SIGNAL, eWAIT_TIMEOUT }; - enum { SIGNALED = -1 }; - private: - pthread_mutex_t mMutex; - pthread_cond_t mCond; - int mThreadCount; - }; - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_MT) - -#endif // BASE_LINUX_EVENT_H diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Mutex.cpp b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Mutex.cpp deleted file mode 100644 index 36fe5b292..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Mutex.cpp +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////// -// Mutex.cpp -// -// Purpose: -// 1. Implementation of the CMutex class. -// -// Revisions: -// 07/10/2001 Created -// - -#if defined(_REENTRANT) - - -#include "Mutex.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - -CMutex::CMutex() - { - mInitialized = (pthread_mutex_init(&mMutex, 0) == 0); - } - -CMutex::~CMutex() - { - if (mInitialized) - pthread_mutex_destroy(&mMutex); - } - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - -#endif // #if defined(_REENTRANT) diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Mutex.h b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Mutex.h deleted file mode 100644 index dd56e3fcc..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Mutex.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////// -// Mutex.h -// -// Purpose: -// 1. Declair the CMutex class that encapsulates the functionality of a -// mutually-exclusive device. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_MUTEX_H -#define BASE_LINUX_MUTEX_H - -#if !defined(_REENTRANT) -# pragma message( "Excluding Base::CMutex - requires multi-threaded compile. (_REENTRANT)" ) -#else - - -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CMutex - // - // Purpose: - // Encapsulates the functionality of a mutually-exclusive device. - // This class is valuable for protecting against race conditions - // within threaded applications. The CMutex class can be used to - // only allow a single thread to run within a specified code - // segment at a time. - // - // Public Methods: - // Lock() : Locks the mutex. If the mutex is already locked, the - // operating system will block the calling thread until another - // thread has unlocked the mutex. - // Unlock() : Unlocks the mutex. - // - class CMutex - { - public: - CMutex(); - ~CMutex(); - - void Lock(); - void Unlock(); - private: - pthread_mutex_t mMutex; - bool mInitialized; - }; - - inline void CMutex::Lock(void) - { - if (mInitialized) - pthread_mutex_lock(&mMutex); - } - - inline void CMutex::Unlock(void) - { - if (mInitialized) - pthread_mutex_unlock(&mMutex); - } - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_MT) - -#endif // BASE_LINUX_MUTEX_H - diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Platform.cpp b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Platform.cpp deleted file mode 100644 index 4b24492c9..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Platform.cpp +++ /dev/null @@ -1,55 +0,0 @@ -//////////////////////////////////////// -// Platform.cpp -// -// Purpose: -// 1. Implementation of the global functionality declaired in Platform.h. -// -// Revisions: -// 07/10/2001 Created -// - -#include -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void _strlwr(char * s) - { - while (*s) - { - *s = tolower(*s); - s++; - } - } - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void _strupr(char * s) - { - while (*s) - { - *s = toupper(*s); - s++; - } - } - - - CTimer::CTimer() : - mTimer(0) - { - } - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Platform.h b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Platform.h deleted file mode 100644 index 41da39728..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Platform.h +++ /dev/null @@ -1,112 +0,0 @@ -//////////////////////////////////////// -// Platform.h -// -// Purpose: -// 1. Include relevent system headers that are platform specific. -// 2. Declair global platform specific functionality. -// 3. Include primative type definitions -// -// Global Functions: -// getTimer() : Return the current high resolution clock count. -// getTimerFrequency() : Return the frequency of the high resolution clock. -// sleep() : Voluntarily relinquish timeslice of the calling thread for a -// specified number of milliseconds. -// strlwr() : Alters the contents of a string, making it all lower-case. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_PLATFORM_H -#define BASE_LINUX_PLATFORM_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Types.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - uint64 getTimer(void); - uint64 getTimerFrequency(void); - void sleep(uint32 ms); - - inline uint64 getTimer(void) - { - uint64 t; - struct timeval tv; - - gettimeofday(&tv, 0); - t = tv.tv_sec; - t = t * 1000000; - t += tv.tv_usec; - return t; - } - - inline uint64 getTimerFrequency(void) - { - uint64 f = 1000000; - return f; - } - - inline void sleep(uint32 ms) - { - usleep(static_cast(ms * 1000)); - } - - void _strlwr(char * s); - void _strupr(char * s); - - - class CTimer - { - public: - CTimer(); - - void Set(uint32 seconds); - void Signal(); - bool Expired(); - - private: - uint32 mTimer; - }; - - inline void CTimer::Set(uint32 interval) - { - mTimer = (uint32)time(0) + interval; - } - - inline void CTimer::Signal() - { - mTimer = 0; - } - - inline bool CTimer::Expired() - { - return (mTimer <= (uint32)time(0)); - } - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // BASE_LINUX_PLATFORM_H diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Thread.cpp b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Thread.cpp deleted file mode 100644 index 2bc4f26b2..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Thread.cpp +++ /dev/null @@ -1,274 +0,0 @@ -//////////////////////////////////////// -// Thread.cpp -// -// Purpose: -// 1. Implementation of the CThread class. -// -// Revisions: -// 07/10/2001 Created -// - -#if defined(_REENTRANT) - - -#include -#include -#include "Thread.h" - -using namespace std; - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - void *threadProc(void *threadPtr) - { - CThread &thread = *((CThread*)threadPtr); - thread.mThreadActive = true; - thread.ThreadProc(); - thread.mThreadActive = false; - - return 0; - } - - CThread::CThread() - { - mThreadID = 0; - mThreadActive = false; - mThreadContinue = false; - } - - CThread::~CThread() - { - StopThread(); - } - - void CThread::StartThread() - { - mThreadContinue = true; - pthread_create(&mThreadID,0,threadProc,this); - while (!IsThreadActive()) - Base::sleep(1); - } - - int32 CThread::StopThread(int timeout) - { - timeout += time(0); - - mThreadContinue = false; - while (mThreadActive && time(0)OnStartup(this); - while (mThreadContinue) - { - mParent->OnIdle(this); - mSemaphore.Wait(mParent->GetTimeOut()*1000); - - if (mFunction) - { - mFunction(mArgument); - mArgument = NULL; - mFunction = NULL; - } - else if (mParent->OnDestory(this)) - mThreadContinue = false; - } - } - - -//////////////////////////////////////////////////////////////////////////////// - - - CThreadPool::CThreadPool(uint32 maxThreads, uint32 minThreads, uint32 timeout) : - mMutex(), - mIdleMember(), - mBusyMember(), - mNullMember(), - mThreadCount(0), - mMaxThreads(maxThreads), - mMinThreads(minThreads), - mTimeOut(timeout) - { - if (mMaxThreads == 0) mMaxThreads = 1; - if (mMinThreads == 0) mMinThreads = 1; - if (mMinThreads > mMaxThreads) mMinThreads = mMaxThreads; - - for (uint32 i=0; i::iterator setIterator; - - //////////////////////////////////////// - // (1) Destory all busy member threads - mMutex.Lock(); - setIterator = mBusyMember.begin(); - while (setIterator != mBusyMember.end()) - (*setIterator++)->Destroy(); - mMutex.Unlock(); - - //////////////////////////////////////// - // (2) Destory all idle member threads - while (mThreadCount) - { - mMutex.Lock(); - setIterator = mIdleMember.begin(); - while (setIterator != mIdleMember.end()) - (*setIterator++)->Destroy(); - mMutex.Unlock(); - - sleep(1); - } - - //////////////////////////////////////// - // (3) Delete the null member threads - mMutex.Lock(); - while (!mNullMember.empty()) - { - delete mNullMember.front(); - mNullMember.pop_front(); - } - mMutex.Unlock(); - } - - bool CThreadPool::Execute(void( *function )( void * ), void * arg) - { - mMutex.Lock(); - - //////////////////////////////////////// - // (1) If no idle members, return false to indicate that no threads - // were available. If the thread count is below the max, create - // a new thread. - if (mIdleMember.empty()) - { - if (mThreadCount < mMaxThreads) - new CMember(this); - mMutex.Unlock(); - return false; - } - - //////////////////////////////////////// - // (2) Delete any null member threads. - while (!mNullMember.empty()) - { - delete mNullMember.front(); - mNullMember.pop_front(); - } - - //////////////////////////////////////// - // (3) Move the first idle thread to the busy set and signal the - // thread to execute the specified function. - CMember * member = *(mIdleMember.begin()); - mIdleMember.erase(member); - mBusyMember.insert(member); - member->Execute(function,arg); - - mMutex.Unlock(); - return true; - } - - uint32 CThreadPool::GetTimeOut() - { - return mTimeOut; - } - - void CThreadPool::OnStartup(CMember * member) - { - mMutex.Lock(); - - mThreadCount++; - mIdleMember.insert(member); - - mMutex.Unlock(); - } - - void CThreadPool::OnIdle(CMember * member) - { - mMutex.Lock(); - - mBusyMember.erase(member); - mIdleMember.insert(member); - - mMutex.Unlock(); - } - - bool CThreadPool::OnDestory(CMember * member) - { - set::iterator setIterator; - - mMutex.Lock(); - - bool result = (setIterator = mIdleMember.find(member)) != mIdleMember.end(); - if (result) - { - mNullMember.push_back(member); - mIdleMember.erase(setIterator); - mThreadCount--; - } - - mMutex.Unlock(); - - return result; - } - - -//////////////////////////////////////////////////////////////////////////////// - - -} - -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_REENTRANT) diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Thread.h b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Thread.h deleted file mode 100644 index 4d42274b6..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Thread.h +++ /dev/null @@ -1,146 +0,0 @@ -//////////////////////////////////////// -// Thread.h -// -// Purpose: -// 1. Declair the CThread class that encapsulates threading functionality. -// This abstract base class in intended to be used to encapsulate -// individual tasks that require threading in derived classes. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_THREAD_H -#define BASE_LINUX_THREAD_H - -#if !defined(_REENTRANT) -# pragma message( "Excluding Base::CThread - requires multi-threaded compile. (_REENTRANT)" ) -#else - - -#pragma warning( disable : 4786) - -#include -#include -#include "Platform.h" -#include "Mutex.h" -#include "Event.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CThread - // - // Purpose: - // Encapsulates threading functionality. Creating classes derived - // from CThread provides an easy way to encapsulate tasks that require - // their own thread. - // - // Public Methods: - // StartThread() : Creates the low-level thread handle and begins executing - // the CThread::ThreadProc() function within the new thread. - // StopThread() : Signals the ThreadProc() function to stop executing using - // the mThreadContinue member variable, and waits for the ThreadProc() - // function to exit. By default, the function will block for a maximum - // of 5 seconds before exiting without the thread halting. - // IsThreadActive() : Returns true if the physical thread is still executing - // within the ThreadProc() function, otherwise it returns false. - // ThreadProc() : Pure-virtual function that will be executed when the StartThread() - // function is called. Derived classes must implement this function. The - // mThreadContinue member variable should be used internal the the ThreadProc() - // function to indicate whether it should continue executing or exit. - // Protected Attributes: - // mThreadContinue : Boolean value indicating to the ThreadProc() function - // whether to continue executing or to exit. If mThreadContinue is true, - // ThreadProc() should continue, otherwise ThreadProc() should exit. It - // left up to the derived class to implement a ThreadProc() function that - // uses the mThreadContinue member. - // - // - class CThread - { - friend void * threadProc(void *); - - public: - enum { eSTOP_SUCCESS, eSTOP_TIMEOUT }; - public: - CThread(); - virtual ~CThread(); - - void StartThread(); - int32 StopThread(int timeout=5); - bool IsThreadActive() { return mThreadActive; } - - protected: - virtual void ThreadProc() {} - - protected: - bool mThreadContinue; - private: - pthread_t mThreadID; - bool mThreadActive; - }; - - - class CThreadPool - { - private: - class CMember : public CThread - { - public: - CMember(CThreadPool * parent); - virtual ~CMember(); - - bool Execute(void( *function )( void * ), void * arg); - void Destroy(); - - protected: - virtual void ThreadProc(); - - private: - CThreadPool * mParent; - void( * mFunction )( void * ); - void * mArgument; - CEvent mSemaphore; - }; - friend class CMember; - - public: - CThreadPool(uint32 maxThreads, uint32 minThreads=1, uint32 timeout=15*60); - ~CThreadPool(); - - bool Execute(void( *function )( void * ), void * arg); - - private: - uint32 GetTimeOut(); - void OnStartup(CMember * member); - void OnIdle(CMember * member); - bool OnDestory(CMember * member); - - private: - CMutex mMutex; - std::set mIdleMember; - std::set mBusyMember; - std::list mNullMember; - uint32 mThreadCount; - - uint32 mMaxThreads; - uint32 mMinThreads; - uint32 mTimeOut; - }; - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_REENTRANT) - -#endif // BASE_LINUX_THREAD_H diff --git a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Types.h b/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Types.h deleted file mode 100644 index bc869bac6..000000000 --- a/src/external/3rd/library/soePlatform/CSAssist/utils/Base/linux/Types.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////// -// Types.h -// -// Purpose: -// 1. Define integer types that are unambiguous with respect to size -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_TYPES_H -#define BASE_LINUX_TYPES_H - -#include - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif - -namespace Base -{ -#define INT32_MAX 0x7FFFFFFF -#define INT32_MIN 0x80000000 -#define UINT32_MAX 0xFFFFFFFF - -typedef signed char int8; -typedef unsigned char uint8; -typedef signed short int16; -typedef unsigned short uint16; - -typedef int32_t int32; -typedef u_int32_t uint32; -typedef int64_t int64; -typedef u_int64_t uint64; -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // BASE_LINUX_TYPES_H - diff --git a/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Archive.h b/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Archive.h deleted file mode 100644 index bb623b499..000000000 --- a/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Archive.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef BASE_LINUX_ARCHIVE_H -#define BASE_LINUX_ARCHIVE_H - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif - -namespace Base -{ - - -#ifdef PACK_BIG_ENDIAN - - inline double byteSwap(double value) { byteReverse(&value); return value; } - inline float byteSwap(float value) { byteReverse(&value); return value; } - inline uint64 byteSwap(uint64 value) { byteReverse(&value); return value; } - inline int64 byteSwap(int64 value) { byteReverse(&value); return value; } - inline uint32 byteSwap(uint32 value) { byteReverse(&value); return value; } - inline int32 byteSwap(int32 value) { byteReverse(&value); return value; } - inline uint16 byteSwap(uint16 value) { byteReverse(&value); return value; } - inline int16 byteSwap(int16 value) { byteReverse(&value); return value; } - -#else - - inline double byteSwap(double value) { return value; } - inline float byteSwap(float value) { return value; } - inline uint64 byteSwap(uint64 value) { return value; } - inline int64 byteSwap(int64 value) { return value; } - inline uint32 byteSwap(uint32 value) { return value; } - inline int32 byteSwap(int32 value) { return value; } - inline uint16 byteSwap(uint16 value) { return value; } - inline int16 byteSwap(int16 value) { return value; } - -#endif - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - -#endif diff --git a/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Platform.cpp b/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Platform.cpp deleted file mode 100644 index 4b24492c9..000000000 --- a/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Platform.cpp +++ /dev/null @@ -1,55 +0,0 @@ -//////////////////////////////////////// -// Platform.cpp -// -// Purpose: -// 1. Implementation of the global functionality declaired in Platform.h. -// -// Revisions: -// 07/10/2001 Created -// - -#include -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void _strlwr(char * s) - { - while (*s) - { - *s = tolower(*s); - s++; - } - } - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void _strupr(char * s) - { - while (*s) - { - *s = toupper(*s); - s++; - } - } - - - CTimer::CTimer() : - mTimer(0) - { - } - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - diff --git a/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Platform.h b/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Platform.h deleted file mode 100644 index 41da39728..000000000 --- a/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Platform.h +++ /dev/null @@ -1,112 +0,0 @@ -//////////////////////////////////////// -// Platform.h -// -// Purpose: -// 1. Include relevent system headers that are platform specific. -// 2. Declair global platform specific functionality. -// 3. Include primative type definitions -// -// Global Functions: -// getTimer() : Return the current high resolution clock count. -// getTimerFrequency() : Return the frequency of the high resolution clock. -// sleep() : Voluntarily relinquish timeslice of the calling thread for a -// specified number of milliseconds. -// strlwr() : Alters the contents of a string, making it all lower-case. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_PLATFORM_H -#define BASE_LINUX_PLATFORM_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Types.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - uint64 getTimer(void); - uint64 getTimerFrequency(void); - void sleep(uint32 ms); - - inline uint64 getTimer(void) - { - uint64 t; - struct timeval tv; - - gettimeofday(&tv, 0); - t = tv.tv_sec; - t = t * 1000000; - t += tv.tv_usec; - return t; - } - - inline uint64 getTimerFrequency(void) - { - uint64 f = 1000000; - return f; - } - - inline void sleep(uint32 ms) - { - usleep(static_cast(ms * 1000)); - } - - void _strlwr(char * s); - void _strupr(char * s); - - - class CTimer - { - public: - CTimer(); - - void Set(uint32 seconds); - void Signal(); - bool Expired(); - - private: - uint32 mTimer; - }; - - inline void CTimer::Set(uint32 interval) - { - mTimer = (uint32)time(0) + interval; - } - - inline void CTimer::Signal() - { - mTimer = 0; - } - - inline bool CTimer::Expired() - { - return (mTimer <= (uint32)time(0)); - } - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // BASE_LINUX_PLATFORM_H diff --git a/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Types.h b/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Types.h deleted file mode 100644 index bc869bac6..000000000 --- a/src/external/3rd/library/soePlatform/CTServiceGameAPI/Base/linux/Types.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////// -// Types.h -// -// Purpose: -// 1. Define integer types that are unambiguous with respect to size -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_TYPES_H -#define BASE_LINUX_TYPES_H - -#include - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif - -namespace Base -{ -#define INT32_MAX 0x7FFFFFFF -#define INT32_MIN 0x80000000 -#define UINT32_MAX 0xFFFFFFFF - -typedef signed char int8; -typedef unsigned char uint8; -typedef signed short int16; -typedef unsigned short uint16; - -typedef int32_t int32; -typedef u_int32_t uint32; -typedef int64_t int64; -typedef u_int64_t uint64; -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // BASE_LINUX_TYPES_H - diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Archive.h b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Archive.h deleted file mode 100644 index bb623b499..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Archive.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef BASE_LINUX_ARCHIVE_H -#define BASE_LINUX_ARCHIVE_H - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif - -namespace Base -{ - - -#ifdef PACK_BIG_ENDIAN - - inline double byteSwap(double value) { byteReverse(&value); return value; } - inline float byteSwap(float value) { byteReverse(&value); return value; } - inline uint64 byteSwap(uint64 value) { byteReverse(&value); return value; } - inline int64 byteSwap(int64 value) { byteReverse(&value); return value; } - inline uint32 byteSwap(uint32 value) { byteReverse(&value); return value; } - inline int32 byteSwap(int32 value) { byteReverse(&value); return value; } - inline uint16 byteSwap(uint16 value) { byteReverse(&value); return value; } - inline int16 byteSwap(int16 value) { byteReverse(&value); return value; } - -#else - - inline double byteSwap(double value) { return value; } - inline float byteSwap(float value) { return value; } - inline uint64 byteSwap(uint64 value) { return value; } - inline int64 byteSwap(int64 value) { return value; } - inline uint32 byteSwap(uint32 value) { return value; } - inline int32 byteSwap(int32 value) { return value; } - inline uint16 byteSwap(uint16 value) { return value; } - inline int16 byteSwap(int16 value) { return value; } - -#endif - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - -#endif diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/BlockAllocator.cpp b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/BlockAllocator.cpp deleted file mode 100644 index 00d01ec99..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/BlockAllocator.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "../BlockAllocator.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - BlockAllocator::BlockAllocator() - { - for(unsigned i = 0; i < 31; i++) - { - m_blocks[i] = NULL; - } - } - - BlockAllocator::~BlockAllocator() - { - // free all allocated memory blocks - for(unsigned i = 0; i < 31; i++) - { - while(m_blocks[i] != NULL) - { - unsigned *tmp = m_blocks[i]; - m_blocks[i] = (unsigned *)*m_blocks[i]; - free(tmp); - } - } - } - -// Allocate a block that is the next power of two greater than the # of bytes passed. -// 33 bytes yields a 64 byte block of memory and so forth. - - void *BlockAllocator::getBlock(unsigned bytes) - { - unsigned accum = 16, bits = 16; - unsigned *handle = NULL; - - // Perform a binary search looking for the highest bit. - - while(bits != 0) - { - // If bytes is less than the bit we're testing for, subtract half - // from the bit value and repeat - if(bytes < (unsigned)(1 << accum)) - { - bits /= 2; - accum -= bits; - } - // If bytes is greater than the bit we're testing for, add half - // from the but value and repeat - else if(bytes > (unsigned)(1 << accum)) - { - bits /= 2; - accum += bits; - } - // Got lucky and hit the value dead on - else - { - break; - } - } - // At this point accum contains the most significant bit index, increment - accum++; - if(accum < 2) - { - accum = 2; - } - - // Note that when memory is actually allocated, 8 extra bytes will be allocated.at the front - // The first integer is the address of the next block of memory when the block is in the allocator - // The second integer is the bit length of the block - // Memory is allocated on 4 byte boundaries to sidestep byte alignment problems - - - // Check if the allocator already has a block of that size - if(m_blocks[accum] == 0) - { - // remove the pre allocated block from the linked list - handle = (unsigned *)calloc(((1 << accum) / 4) + 2, sizeof(unsigned)); - handle[1] = accum; - handle[0] = 0; - } - else - { - // Allocate a new block - handle = m_blocks[accum]; - m_blocks[accum] = (unsigned *)handle[0]; - handle[0] = 0; - } - // return a pointer that skips over the header used for the allocator's purposes - return(handle + 2); - } - - void BlockAllocator::returnBlock(unsigned *handle) - { - // C++ allows for safe deletion of a NULL pointer - if(handle) - { - // Update the allocator linked list, insert this entry at the head - *(handle - 2) = (unsigned)m_blocks[*(handle - 1)]; - // Add this entry to the proper linked list node - m_blocks[*(handle - 1)] = (handle - 2); - } - } -}; -#ifdef EXTERNAL_DISTRO -}; -#endif diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Event.cpp b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Event.cpp deleted file mode 100644 index a3cce3b15..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Event.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//////////////////////////////////////// -// Event.cpp -// -// Purpose: -// 1. Implementation of the CEvent class. -// -// Revisions: -// 07/10/2001 Created -// - -#if defined(_REENTRANT) - - -#include "Event.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - CEvent::CEvent() : - mMutex(), - mCond(), - mThreadCount(0) - { - pthread_mutex_init(&mMutex, NULL); - pthread_cond_init(&mCond, NULL); - } - - CEvent::~CEvent() - { - pthread_cond_destroy(&mCond); - pthread_mutex_destroy(&mMutex); - } - - bool CEvent::Signal() - { - pthread_mutex_lock(&mMutex); - if (mThreadCount == 0) - mThreadCount = SIGNALED; - pthread_cond_signal(&mCond); - - pthread_mutex_unlock(&mMutex); - - return true; - } - - int32 CEvent::Wait(uint32 timeout) - { - int result; - - pthread_mutex_lock(&mMutex); - if (mThreadCount == SIGNALED) - { - mThreadCount = 0; - pthread_mutex_unlock(&mMutex); - - return eWAIT_SIGNAL; - } - - if (!timeout) - { - mThreadCount++; - result = pthread_cond_wait(&mCond, &mMutex); - mThreadCount--; - - pthread_mutex_unlock(&mMutex); - } - else - { - struct timeval now; - struct timespec abs_timeout; - - gettimeofday(&now, NULL); - abs_timeout.tv_sec = now.tv_sec + timeout/1000; - abs_timeout.tv_nsec = now.tv_usec * 1000 + (timeout%1000)*1000000; - abs_timeout.tv_sec += abs_timeout.tv_nsec / 1000000000; - abs_timeout.tv_nsec %= 1000000000; - - mThreadCount++; - result = pthread_cond_timedwait(&mCond, &mMutex, &abs_timeout); - mThreadCount--; - - pthread_mutex_unlock(&mMutex); - } - - if (result == 0 || result == EINTR) - return eWAIT_SIGNAL; - else if (result == ETIMEDOUT) - return eWAIT_TIMEOUT; - else - return eWAIT_ERROR; - } - -} - -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_REENTRANT) diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Event.h b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Event.h deleted file mode 100644 index 4801a9b20..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Event.h +++ /dev/null @@ -1,74 +0,0 @@ -//////////////////////////////////////// -// Event.h -// -// Purpose: -// 1. Declair the CEvent class that encapsulates the functionality of a -// single-locking semaphore. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_EVENT_H -#define BASE_LINUX_EVENT_H - -#if !defined(_REENTRANT) -# pragma message( "Excluding Base::CEvent - requires multi-threaded compile. (_REENTRANT)" ) -#else - - -#include -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CEvent - // - // Purpose: - // Encapsulates the functionality of a singal-locking semaphore. - // This class is valuable for thread syncronization when a thead's - // execution needs to be dependent upon another thread. - // - // Public Methods: - // Signal() : Signals a thread that has called Wait() so that it can - // continue execution. This function returns true if the waiting - // thread was signalled successfully, otherwise false is returned. - // Wait() : Halts the calling thread's execution indefinately until - // a Singal() call is made by an external thread. If the thread is - // successfully signalled, the function returns eWAIT_SIGNAL. If - // timeout period expires without a signal, eWAIT_TIMEOUT is returned. - // If the function fails, eWAIT_ERROR is returned. - // - class CEvent - { - public: - CEvent(); - virtual ~CEvent(); - - bool Signal(); - int32 Wait(uint32 timeout = 0); - - public: - enum { eWAIT_ERROR, eWAIT_SIGNAL, eWAIT_TIMEOUT }; - enum { SIGNALED = -1 }; - private: - pthread_mutex_t mMutex; - pthread_cond_t mCond; - int mThreadCount; - }; - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_MT) - -#endif // BASE_LINUX_EVENT_H diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Mutex.cpp b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Mutex.cpp deleted file mode 100644 index 36fe5b292..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Mutex.cpp +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////// -// Mutex.cpp -// -// Purpose: -// 1. Implementation of the CMutex class. -// -// Revisions: -// 07/10/2001 Created -// - -#if defined(_REENTRANT) - - -#include "Mutex.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - -CMutex::CMutex() - { - mInitialized = (pthread_mutex_init(&mMutex, 0) == 0); - } - -CMutex::~CMutex() - { - if (mInitialized) - pthread_mutex_destroy(&mMutex); - } - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - -#endif // #if defined(_REENTRANT) diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Mutex.h b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Mutex.h deleted file mode 100644 index dd56e3fcc..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Mutex.h +++ /dev/null @@ -1,79 +0,0 @@ -//////////////////////////////////////// -// Mutex.h -// -// Purpose: -// 1. Declair the CMutex class that encapsulates the functionality of a -// mutually-exclusive device. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_MUTEX_H -#define BASE_LINUX_MUTEX_H - -#if !defined(_REENTRANT) -# pragma message( "Excluding Base::CMutex - requires multi-threaded compile. (_REENTRANT)" ) -#else - - -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CMutex - // - // Purpose: - // Encapsulates the functionality of a mutually-exclusive device. - // This class is valuable for protecting against race conditions - // within threaded applications. The CMutex class can be used to - // only allow a single thread to run within a specified code - // segment at a time. - // - // Public Methods: - // Lock() : Locks the mutex. If the mutex is already locked, the - // operating system will block the calling thread until another - // thread has unlocked the mutex. - // Unlock() : Unlocks the mutex. - // - class CMutex - { - public: - CMutex(); - ~CMutex(); - - void Lock(); - void Unlock(); - private: - pthread_mutex_t mMutex; - bool mInitialized; - }; - - inline void CMutex::Lock(void) - { - if (mInitialized) - pthread_mutex_lock(&mMutex); - } - - inline void CMutex::Unlock(void) - { - if (mInitialized) - pthread_mutex_unlock(&mMutex); - } - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_MT) - -#endif // BASE_LINUX_MUTEX_H - diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Platform.cpp b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Platform.cpp deleted file mode 100644 index eeadd498b..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Platform.cpp +++ /dev/null @@ -1,55 +0,0 @@ -//////////////////////////////////////// -// Platform.cpp -// -// Purpose: -// 1. Implementation of the global functionality declaired in Platform.h. -// -// Revisions: -// 07/10/2001 Created -// - -#include -#include "Platform.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void strlwr(char * s) - { - while (*s) - { - *s = tolower(*s); - s++; - } - } - - // Implementation of microsoft strlwr extension - // This non-ANSI function is not supported under UNIX - void strupr(char * s) - { - while (*s) - { - *s = toupper(*s); - s++; - } - } - - - CTimer::CTimer() : - mTimer(0) - { - } - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif - diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Platform.h b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Platform.h deleted file mode 100644 index 9e6d51b49..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Platform.h +++ /dev/null @@ -1,112 +0,0 @@ -//////////////////////////////////////// -// Platform.h -// -// Purpose: -// 1. Include relevent system headers that are platform specific. -// 2. Declair global platform specific functionality. -// 3. Include primative type definitions -// -// Global Functions: -// getTimer() : Return the current high resolution clock count. -// getTimerFrequency() : Return the frequency of the high resolution clock. -// sleep() : Voluntarily relinquish timeslice of the calling thread for a -// specified number of milliseconds. -// strlwr() : Alters the contents of a string, making it all lower-case. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_PLATFORM_H -#define BASE_LINUX_PLATFORM_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Types.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - uint64 getTimer(void); - uint64 getTimerFrequency(void); - void sleep(uint32 ms); - - inline uint64 getTimer(void) - { - uint64 t; - struct timeval tv; - - gettimeofday(&tv, 0); - t = tv.tv_sec; - t = t * 1000000; - t += tv.tv_usec; - return t; - } - - inline uint64 getTimerFrequency(void) - { - uint64 f = 1000000; - return f; - } - - inline void sleep(uint32 ms) - { - usleep(static_cast(ms * 1000)); - } - - void strlwr(char * s); - void strupr(char * s); - - - class CTimer - { - public: - CTimer(); - - void Set(uint32 seconds); - void Signal(); - bool Expired(); - - private: - uint32 mTimer; - }; - - inline void CTimer::Set(uint32 interval) - { - mTimer = (uint32)time(0) + interval; - } - - inline void CTimer::Signal() - { - mTimer = 0; - } - - inline bool CTimer::Expired() - { - return (mTimer <= (uint32)time(0)); - } - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // BASE_LINUX_PLATFORM_H diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Thread.cpp b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Thread.cpp deleted file mode 100644 index a4b1e3a2e..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Thread.cpp +++ /dev/null @@ -1,299 +0,0 @@ -//////////////////////////////////////// -// Thread.cpp -// -// Purpose: -// 1. Implementation of the CThread class. -// -// Revisions: -// 07/10/2001 Created -// - -#if defined(_REENTRANT) - - -#include -#include -#include "Thread.h" - -using namespace std; - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - void *threadProc(void *threadPtr) - { - CThread &thread = *((CThread*)threadPtr); - thread.mThreadActive = true; - thread.ThreadProc(); - thread.mThreadActive = false; - - return 0; - } - - CThread::CThread() - { - mThreadID = 0; - mThreadActive = false; - mThreadContinue = false; - } - - CThread::~CThread() - { - StopThread(); - } - - void CThread::StartThread() - { - mThreadContinue = true; - if (pthread_create(&mThreadID,0,threadProc,this) == 0) - pthread_detach(mThreadID); - while (!IsThreadActive()) - Base::sleep(1); - } - - int32 CThread::StopThread(int timeout) - { - timeout += time(0); - - mThreadContinue = false; - while (mThreadActive && time(0)OnStartup(this); - while (mThreadContinue) - { - mParent->OnIdle(this); - mSemaphore.Wait(mParent->GetTimeOut()*1000); - - if (mFunction) - { - mFunction(mArgument); - mArgument = NULL; - mFunction = NULL; - } - else if (mParent->OnDestory(this)) - mThreadContinue = false; - } - } - - -//////////////////////////////////////////////////////////////////////////////// - - - CThreadPool::CThreadPool(uint32 maxThreads, uint32 minThreads, uint32 timeout) : - mMutex(), - mIdleMember(), - mBusyMember(), - mNullMember(), - mThreadCount(0), - mMaxThreads(maxThreads), - mMinThreads(minThreads), - mTimeOut(timeout) - { - if (mMaxThreads == 0) mMaxThreads = 1; - if (mMinThreads == 0) mMinThreads = 1; - if (mMinThreads > mMaxThreads) mMinThreads = mMaxThreads; - - for (uint32 i=0; i::iterator setIterator; - - //////////////////////////////////////// - // (1) Destory all busy member threads - mMutex.Lock(); - setIterator = mBusyMember.begin(); - while (setIterator != mBusyMember.end()) - (*setIterator++)->Destroy(); - mMutex.Unlock(); - - //////////////////////////////////////// - // (2) Destory all idle member threads - while (mThreadCount) - { - mMutex.Lock(); - setIterator = mIdleMember.begin(); - while (setIterator != mIdleMember.end()) - (*setIterator++)->Destroy(); - mMutex.Unlock(); - - sleep(1); - } - - //////////////////////////////////////// - // (3) Delete the null member threads - mMutex.Lock(); - while (!mNullMember.empty()) - { - delete mNullMember.front(); - mNullMember.pop_front(); - } - mMutex.Unlock(); - } - - bool CThreadPool::Execute(void( *function )( void * ), void * arg, uint32 poolGrowthSize ) - { - mMutex.Lock(); - - //////////////////////////////////////// - // (1) If no idle members, return false to indicate that no threads - // were available. If the thread count is below the max, create - // a new thread. - if (mIdleMember.empty()) - { - if (mThreadCount < mMaxThreads) - { - if (!poolGrowthSize) - poolGrowthSize = mMinThreads; - - if ((mThreadCount + poolGrowthSize) > mMaxThreads) - poolGrowthSize = mMaxThreads - mThreadCount; - - for (uint32 i(0); i < poolGrowthSize; i++) - new CMember(this); - mMutex.Unlock(); - time_t idleTimeout = time(0) + 5; - while(mIdleMember.empty()) - { - if (time(0) >= idleTimeout) - { - return false; - } - Base::sleep(10); - } - mMutex.Lock(); - - } - else - { - mMutex.Unlock(); - return false; - } - } - - //////////////////////////////////////// - // (2) Delete any null member threads. - while (!mNullMember.empty()) - { - delete mNullMember.front(); - mNullMember.pop_front(); - } - - //////////////////////////////////////// - // (3) Move the first idle thread to the busy set and signal the - // thread to execute the specified function. - CMember * member = *(mIdleMember.begin()); - mIdleMember.erase(member); - mBusyMember.insert(member); - member->Execute(function,arg); - - mMutex.Unlock(); - return true; - } - - uint32 CThreadPool::GetTimeOut() - { - return mTimeOut; - } - - void CThreadPool::OnStartup(CMember * member) - { - mMutex.Lock(); - - mThreadCount++; - mIdleMember.insert(member); - - mMutex.Unlock(); - } - - void CThreadPool::OnIdle(CMember * member) - { - mMutex.Lock(); - - mBusyMember.erase(member); - mIdleMember.insert(member); - - mMutex.Unlock(); - } - - bool CThreadPool::OnDestory(CMember * member) - { - set::iterator setIterator; - - mMutex.Lock(); - - bool result = (setIterator = mIdleMember.find(member)) != mIdleMember.end(); - if (result) - { - mNullMember.push_back(member); - mIdleMember.erase(setIterator); - mThreadCount--; - } - - mMutex.Unlock(); - - return result; - } - - -//////////////////////////////////////////////////////////////////////////////// - - -} - -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_REENTRANT) diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Thread.h b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Thread.h deleted file mode 100644 index bb6d1cb2d..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Thread.h +++ /dev/null @@ -1,146 +0,0 @@ -//////////////////////////////////////// -// Thread.h -// -// Purpose: -// 1. Declair the CThread class that encapsulates threading functionality. -// This abstract base class in intended to be used to encapsulate -// individual tasks that require threading in derived classes. -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_THREAD_H -#define BASE_LINUX_THREAD_H - -#if !defined(_REENTRANT) -# pragma message( "Excluding Base::CThread - requires multi-threaded compile. (_REENTRANT)" ) -#else - - -#pragma warning( disable : 4786) - -#include -#include -#include "Platform.h" -#include "Mutex.h" -#include "Event.h" - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif -namespace Base -{ - - //////////////////////////////////////// - // Class: - // CThread - // - // Purpose: - // Encapsulates threading functionality. Creating classes derived - // from CThread provides an easy way to encapsulate tasks that require - // their own thread. - // - // Public Methods: - // StartThread() : Creates the low-level thread handle and begins executing - // the CThread::ThreadProc() function within the new thread. - // StopThread() : Signals the ThreadProc() function to stop executing using - // the mThreadContinue member variable, and waits for the ThreadProc() - // function to exit. By default, the function will block for a maximum - // of 5 seconds before exiting without the thread halting. - // IsThreadActive() : Returns true if the physical thread is still executing - // within the ThreadProc() function, otherwise it returns false. - // ThreadProc() : Pure-virtual function that will be executed when the StartThread() - // function is called. Derived classes must implement this function. The - // mThreadContinue member variable should be used internal the the ThreadProc() - // function to indicate whether it should continue executing or exit. - // Protected Attributes: - // mThreadContinue : Boolean value indicating to the ThreadProc() function - // whether to continue executing or to exit. If mThreadContinue is true, - // ThreadProc() should continue, otherwise ThreadProc() should exit. It - // left up to the derived class to implement a ThreadProc() function that - // uses the mThreadContinue member. - // - // - class CThread - { - friend void * threadProc(void *); - - public: - enum { eSTOP_SUCCESS, eSTOP_TIMEOUT }; - public: - CThread(); - virtual ~CThread(); - - void StartThread(); - int32 StopThread(int timeout=5); - bool IsThreadActive() { return mThreadActive; } - - protected: - virtual void ThreadProc() {} - - protected: - bool mThreadContinue; - private: - pthread_t mThreadID; - bool mThreadActive; - }; - - - class CThreadPool - { - private: - class CMember : public CThread - { - public: - CMember(CThreadPool * parent); - virtual ~CMember(); - - bool Execute(void( *function )( void * ), void * arg); - void Destroy(); - - protected: - virtual void ThreadProc(); - - private: - CThreadPool * mParent; - void( * mFunction )( void * ); - void * mArgument; - CEvent mSemaphore; - }; - friend class CMember; - - public: - CThreadPool(uint32 maxThreads, uint32 minThreads=1, uint32 timeout=15*60); - virtual ~CThreadPool(); - - virtual bool Execute(void( *function )( void * ), void * arg, uint32 poolGrowthSize = 0); - - private: - uint32 GetTimeOut(); - void OnStartup(CMember * member); - void OnIdle(CMember * member); - bool OnDestory(CMember * member); - - private: - CMutex mMutex; - std::set mIdleMember; - std::set mBusyMember; - std::list mNullMember; - uint32 mThreadCount; - - uint32 mMaxThreads; - uint32 mMinThreads; - uint32 mTimeOut; - }; - - -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // #if defined(_REENTRANT) - -#endif // BASE_LINUX_THREAD_H diff --git a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Types.h b/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Types.h deleted file mode 100644 index bc869bac6..000000000 --- a/src/external/3rd/library/soePlatform/ChatAPI2/ChatAPI/utils/Base/linux/Types.h +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////// -// Types.h -// -// Purpose: -// 1. Define integer types that are unambiguous with respect to size -// -// Revisions: -// 07/10/2001 Created -// - -#ifndef BASE_LINUX_TYPES_H -#define BASE_LINUX_TYPES_H - -#include - -#ifdef EXTERNAL_DISTRO -namespace NAMESPACE -{ - -#endif - -namespace Base -{ -#define INT32_MAX 0x7FFFFFFF -#define INT32_MIN 0x80000000 -#define UINT32_MAX 0xFFFFFFFF - -typedef signed char int8; -typedef unsigned char uint8; -typedef signed short int16; -typedef unsigned short uint16; - -typedef int32_t int32; -typedef u_int32_t uint32; -typedef int64_t int64; -typedef u_int64_t uint64; -} -#ifdef EXTERNAL_DISTRO -}; -#endif -#endif // BASE_LINUX_TYPES_H - diff --git a/src/external/3rd/library/zlib/lib/linux/libz.a b/src/external/3rd/library/zlib/lib/linux/libz.a deleted file mode 100644 index 793bb72a2bf793e9385b5060942305f60cd6df72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65922 zcmeFa4SZC^^*?+!*@OiGyI|CaQC2}p1TjI-L{LM*CI|!qAq15WLS7&kNKAGKZwW6; zfXj827Ex+_ZPnV=wpb7XC?OJj|3OiL?Nf6V<=gBl zlNF^SyX$v~5@`SaiJ}ny}aVX>=x7GQZn!Gj{WqG&E7sVF@&77;`;7gzJ-h;wjgo=p|XKr!v z0`XPuEGa9z#ve;Lwl$ps3|2I;XT<*=@aS#B~A>hWLnr+pmt<^q6t6_#sX8c!At7n(_HeRVH^TM_h#JuZ1YqdV|7$SJKFh}c_a8sS> zkJc@yl@3EB43*FUn({j|~*}FWO`!P2In?zA;+@RPvz=xK0TB@WbC*NuBpE@ox#y)sZ!q7pt*$2nQ z#>L(iH`Lz0tf06cx4a-mQ3jPSm;)XO=q%IWEaMB22007nJC#BCxz1c=&8!-`9&HIKqLFx<+mhn