From 38e4ebbdc0f740832094300243d260195f429f61 Mon Sep 17 00:00:00 2001 From: FrancisANDRE Date: Mon, 18 Jul 2016 14:34:53 +0200 Subject: [PATCH] Initial upload. --- FSM/FSM_vs120.sln | 33 + FSM/FSMc_vs120.vcxproj | 367 +++++ FSM/FSMc_vs120.vcxproj.filters | 75 + FSM/Makefile | 77 + FSM/SMC Manual_6_6_0.pdf | Bin 0 -> 658584 bytes FSM/SmcMan_6_6_0.tgz | Bin 0 -> 161457 bytes FSM/fsmc.properties | 19 + FSM/include/Poco/FSM/statemap.h | 712 ++++++++ FSM/samples/Makefile | 12 + FSM/samples/TCP/AppClient.cpp | 377 +++++ FSM/samples/TCP/AppClient.h | 135 ++ FSM/samples/TCP/AppServer.cpp | 285 ++++ FSM/samples/TCP/AppServer.h | 147 ++ FSM/samples/TCP/Eventloop.cpp | 621 +++++++ FSM/samples/TCP/Eventloop.h | 163 ++ FSM/samples/TCP/InputListener.h | 68 + FSM/samples/TCP/TCP.sm | 630 ++++++++ FSM/samples/TCP/TCP_vs120.vcxproj | 127 ++ FSM/samples/TCP/TcpClient.cpp | 157 ++ FSM/samples/TCP/TcpClient.h | 104 ++ FSM/samples/TCP/TcpConnection.cpp | 1428 +++++++++++++++++ FSM/samples/TCP/TcpConnection.h | 237 +++ FSM/samples/TCP/TcpConnectionListener.h | 81 + FSM/samples/TCP/TcpSegment.cpp | 471 ++++++ FSM/samples/TCP/TcpSegment.h | 145 ++ FSM/samples/TCP/TcpServer.cpp | 85 + FSM/samples/TCP/TcpServer.h | 77 + FSM/samples/TCP/TimerListener.h | 68 + FSM/samples/TCP/client.cpp | 277 ++++ FSM/samples/TCP/server.cpp | 209 +++ FSM/samples/TCP/stdafx.cpp | 8 + FSM/samples/TCP/stdafx.h | 15 + FSM/samples/TCP/targetver.h | 8 + FSM/samples/TCP/winsock_strerror.cpp | 199 +++ FSM/samples/TrafficLight/Makefile | 36 + FSM/samples/TrafficLight/Stoplight_sm.cpp | 84 + FSM/samples/TrafficLight/Stoplight_sm.h | 126 ++ FSM/samples/TrafficLight/TrafficLight.sm | 63 + .../TrafficLight/TrafficLight_vs120.vcxproj | 114 ++ .../TrafficLight_vs120.vcxproj.filters | 52 + FSM/samples/TrafficLight/src/Stoplight_sm.cpp | 84 + FSM/samples/TrafficLight/src/TrafficLight.cpp | 94 ++ FSM/samples/TrafficLight/src/stdafx.cpp | 8 + FSM/samples/TrafficLight/src/stdafx.h | 15 + FSM/samples/TrafficLight/src/stoplight.cpp | 154 ++ FSM/samples/TrafficLight/src/stoplight.h | 80 + FSM/samples/TrafficLight/src/stoplight_sm.h | 126 ++ FSM/samples/TrafficLight/src/stoplightdefs.h | 55 + FSM/samples/TrafficLight/src/targetver.h | 8 + FSM/samples/samples_vs120.sln | 28 + FSM/src/Action.cpp | 44 + FSM/src/ActionForCpp.cpp | 36 + FSM/src/Actions.cpp | 19 + FSM/src/Argument.cpp | 27 + FSM/src/ArgumentForCpp.cpp | 28 + FSM/src/BinaryOperation.cpp | 48 + FSM/src/BinaryOperationForCpp.cpp | 50 + FSM/src/Character.cpp | 89 + FSM/src/Comment.cpp | 89 + FSM/src/CompilableForCpp.cpp | 22 + FSM/src/Dumper.cpp | 19 + FSM/src/Element.cpp | 19 + FSM/src/ElementForCpp.cpp | 22 + FSM/src/Entry.cpp | 39 + FSM/src/EntryForCpp.cpp | 27 + FSM/src/Exit.cpp | 38 + FSM/src/ExitForCpp.cpp | 27 + FSM/src/Expression.cpp | 19 + FSM/src/ExpressionForCpp.cpp | 22 + FSM/src/FSM.cpp | 62 + FSM/src/FSMForCpp.cpp | 112 ++ FSM/src/FactoryForCpp.cpp | 111 ++ FSM/src/Function.cpp | 39 + FSM/src/FunctionForCpp.cpp | 25 + FSM/src/Guard.cpp | 57 + FSM/src/GuardForCpp.cpp | 27 + FSM/src/Identifier.cpp | 55 + FSM/src/IndentStream.cpp | 22 + FSM/src/Keyword.cpp | 111 ++ FSM/src/Literal.cpp | 26 + FSM/src/LiteralForCpp.cpp | 21 + FSM/src/Map.cpp | 58 + FSM/src/MapForCpp.cpp | 252 +++ FSM/src/Number.cpp | 49 + FSM/src/Operation.cpp | 32 + FSM/src/Operator.cpp | 212 +++ FSM/src/Parameter.cpp | 28 + FSM/src/ParameterForCpp.cpp | 31 + FSM/src/Parser.cpp | 1021 ++++++++++++ FSM/src/Print.cpp | 57 + FSM/src/Reference.cpp | 33 + FSM/src/ReferenceForCpp.cpp | 58 + FSM/src/State.cpp | 67 + FSM/src/StateForCpp.cpp | 118 ++ FSM/src/String.cpp | 90 ++ FSM/src/Token.cpp | 50 + FSM/src/Tokenizer.cpp | 47 + FSM/src/Transition.cpp | 155 ++ FSM/src/TransitionForCpp.cpp | 175 ++ FSM/src/UnaryOperation.cpp | 31 + FSM/src/UnaryOperationForCpp.cpp | 36 + FSM/src/Variable.cpp | 22 + FSM/src/VariableForCpp.cpp | 27 + FSM/src/cpp/ActionForCpp.h | 35 + FSM/src/cpp/ArgumentForCpp.h | 34 + FSM/src/cpp/BinaryOperationForCpp.h | 34 + FSM/src/cpp/CompilableForCpp.h | 38 + FSM/src/cpp/ElementForCpp.h | 42 + FSM/src/cpp/EntryForCpp.h | 35 + FSM/src/cpp/ExitForCpp.h | 35 + FSM/src/cpp/ExpressionForCpp.h | 32 + FSM/src/cpp/FSMForCpp.h | 40 + FSM/src/cpp/FactoryForCpp.h | 52 + FSM/src/cpp/FunctionForCpp.h | 35 + FSM/src/cpp/GuardForCpp.h | 36 + FSM/src/cpp/LiteralForCpp.h | 33 + FSM/src/cpp/MapForCpp.h | 38 + FSM/src/cpp/ParameterForCpp.h | 34 + FSM/src/cpp/ReferenceForCpp.h | 54 + FSM/src/cpp/StateForCpp.h | 43 + FSM/src/cpp/TransitionForCpp.h | 37 + FSM/src/cpp/UnaryOperationForCpp.h | 34 + FSM/src/cpp/VariableForCpp.h | 33 + FSM/src/fsmc.cpp | 191 +++ FSM/src/model/Action.h | 39 + FSM/src/model/Actions.h | 36 + FSM/src/model/Argument.h | 30 + FSM/src/model/BinaryOperation.h | 104 ++ FSM/src/model/Compilable.h | 31 + FSM/src/model/Dumper.h | 33 + FSM/src/model/Element.h | 42 + FSM/src/model/Entry.h | 30 + FSM/src/model/Exit.h | 33 + FSM/src/model/Expression.h | 39 + FSM/src/model/FSM.h | 132 ++ FSM/src/model/Factory.h | 66 + FSM/src/model/Function.h | 38 + FSM/src/model/Guard.h | 87 + FSM/src/model/Literal.h | 32 + FSM/src/model/Map.h | 56 + FSM/src/model/Operation.h | 45 + FSM/src/model/Parameter.h | 38 + FSM/src/model/Print.h | 41 + FSM/src/model/Reference.h | 57 + FSM/src/model/SMC.h | 75 + FSM/src/model/State.h | 60 + FSM/src/model/Transition.h | 61 + FSM/src/model/UnaryOperation.h | 36 + FSM/src/model/Variable.h | 31 + FSM/src/parser/BNF.txt | 127 ++ FSM/src/parser/Character.h | 30 + FSM/src/parser/Comment.h | 31 + FSM/src/parser/Identifier.h | 30 + FSM/src/parser/IndentStream.h | 69 + FSM/src/parser/Keyword.h | 53 + FSM/src/parser/Number.h | 30 + FSM/src/parser/Operator.h | 90 ++ FSM/src/parser/Parser.h | 141 ++ FSM/src/parser/String.h | 31 + FSM/src/parser/Token.h | 31 + FSM/src/parser/Tokenizer.h | 31 + 161 files changed, 15456 insertions(+) create mode 100644 FSM/FSM_vs120.sln create mode 100644 FSM/FSMc_vs120.vcxproj create mode 100644 FSM/FSMc_vs120.vcxproj.filters create mode 100644 FSM/Makefile create mode 100644 FSM/SMC Manual_6_6_0.pdf create mode 100644 FSM/SmcMan_6_6_0.tgz create mode 100644 FSM/fsmc.properties create mode 100644 FSM/include/Poco/FSM/statemap.h create mode 100644 FSM/samples/Makefile create mode 100644 FSM/samples/TCP/AppClient.cpp create mode 100644 FSM/samples/TCP/AppClient.h create mode 100644 FSM/samples/TCP/AppServer.cpp create mode 100644 FSM/samples/TCP/AppServer.h create mode 100644 FSM/samples/TCP/Eventloop.cpp create mode 100644 FSM/samples/TCP/Eventloop.h create mode 100644 FSM/samples/TCP/InputListener.h create mode 100644 FSM/samples/TCP/TCP.sm create mode 100644 FSM/samples/TCP/TCP_vs120.vcxproj create mode 100644 FSM/samples/TCP/TcpClient.cpp create mode 100644 FSM/samples/TCP/TcpClient.h create mode 100644 FSM/samples/TCP/TcpConnection.cpp create mode 100644 FSM/samples/TCP/TcpConnection.h create mode 100644 FSM/samples/TCP/TcpConnectionListener.h create mode 100644 FSM/samples/TCP/TcpSegment.cpp create mode 100644 FSM/samples/TCP/TcpSegment.h create mode 100644 FSM/samples/TCP/TcpServer.cpp create mode 100644 FSM/samples/TCP/TcpServer.h create mode 100644 FSM/samples/TCP/TimerListener.h create mode 100644 FSM/samples/TCP/client.cpp create mode 100644 FSM/samples/TCP/server.cpp create mode 100644 FSM/samples/TCP/stdafx.cpp create mode 100644 FSM/samples/TCP/stdafx.h create mode 100644 FSM/samples/TCP/targetver.h create mode 100644 FSM/samples/TCP/winsock_strerror.cpp create mode 100644 FSM/samples/TrafficLight/Makefile create mode 100644 FSM/samples/TrafficLight/Stoplight_sm.cpp create mode 100644 FSM/samples/TrafficLight/Stoplight_sm.h create mode 100644 FSM/samples/TrafficLight/TrafficLight.sm create mode 100644 FSM/samples/TrafficLight/TrafficLight_vs120.vcxproj create mode 100644 FSM/samples/TrafficLight/TrafficLight_vs120.vcxproj.filters create mode 100644 FSM/samples/TrafficLight/src/Stoplight_sm.cpp create mode 100644 FSM/samples/TrafficLight/src/TrafficLight.cpp create mode 100644 FSM/samples/TrafficLight/src/stdafx.cpp create mode 100644 FSM/samples/TrafficLight/src/stdafx.h create mode 100644 FSM/samples/TrafficLight/src/stoplight.cpp create mode 100644 FSM/samples/TrafficLight/src/stoplight.h create mode 100644 FSM/samples/TrafficLight/src/stoplight_sm.h create mode 100644 FSM/samples/TrafficLight/src/stoplightdefs.h create mode 100644 FSM/samples/TrafficLight/src/targetver.h create mode 100644 FSM/samples/samples_vs120.sln create mode 100644 FSM/src/Action.cpp create mode 100644 FSM/src/ActionForCpp.cpp create mode 100644 FSM/src/Actions.cpp create mode 100644 FSM/src/Argument.cpp create mode 100644 FSM/src/ArgumentForCpp.cpp create mode 100644 FSM/src/BinaryOperation.cpp create mode 100644 FSM/src/BinaryOperationForCpp.cpp create mode 100644 FSM/src/Character.cpp create mode 100644 FSM/src/Comment.cpp create mode 100644 FSM/src/CompilableForCpp.cpp create mode 100644 FSM/src/Dumper.cpp create mode 100644 FSM/src/Element.cpp create mode 100644 FSM/src/ElementForCpp.cpp create mode 100644 FSM/src/Entry.cpp create mode 100644 FSM/src/EntryForCpp.cpp create mode 100644 FSM/src/Exit.cpp create mode 100644 FSM/src/ExitForCpp.cpp create mode 100644 FSM/src/Expression.cpp create mode 100644 FSM/src/ExpressionForCpp.cpp create mode 100644 FSM/src/FSM.cpp create mode 100644 FSM/src/FSMForCpp.cpp create mode 100644 FSM/src/FactoryForCpp.cpp create mode 100644 FSM/src/Function.cpp create mode 100644 FSM/src/FunctionForCpp.cpp create mode 100644 FSM/src/Guard.cpp create mode 100644 FSM/src/GuardForCpp.cpp create mode 100644 FSM/src/Identifier.cpp create mode 100644 FSM/src/IndentStream.cpp create mode 100644 FSM/src/Keyword.cpp create mode 100644 FSM/src/Literal.cpp create mode 100644 FSM/src/LiteralForCpp.cpp create mode 100644 FSM/src/Map.cpp create mode 100644 FSM/src/MapForCpp.cpp create mode 100644 FSM/src/Number.cpp create mode 100644 FSM/src/Operation.cpp create mode 100644 FSM/src/Operator.cpp create mode 100644 FSM/src/Parameter.cpp create mode 100644 FSM/src/ParameterForCpp.cpp create mode 100644 FSM/src/Parser.cpp create mode 100644 FSM/src/Print.cpp create mode 100644 FSM/src/Reference.cpp create mode 100644 FSM/src/ReferenceForCpp.cpp create mode 100644 FSM/src/State.cpp create mode 100644 FSM/src/StateForCpp.cpp create mode 100644 FSM/src/String.cpp create mode 100644 FSM/src/Token.cpp create mode 100644 FSM/src/Tokenizer.cpp create mode 100644 FSM/src/Transition.cpp create mode 100644 FSM/src/TransitionForCpp.cpp create mode 100644 FSM/src/UnaryOperation.cpp create mode 100644 FSM/src/UnaryOperationForCpp.cpp create mode 100644 FSM/src/Variable.cpp create mode 100644 FSM/src/VariableForCpp.cpp create mode 100644 FSM/src/cpp/ActionForCpp.h create mode 100644 FSM/src/cpp/ArgumentForCpp.h create mode 100644 FSM/src/cpp/BinaryOperationForCpp.h create mode 100644 FSM/src/cpp/CompilableForCpp.h create mode 100644 FSM/src/cpp/ElementForCpp.h create mode 100644 FSM/src/cpp/EntryForCpp.h create mode 100644 FSM/src/cpp/ExitForCpp.h create mode 100644 FSM/src/cpp/ExpressionForCpp.h create mode 100644 FSM/src/cpp/FSMForCpp.h create mode 100644 FSM/src/cpp/FactoryForCpp.h create mode 100644 FSM/src/cpp/FunctionForCpp.h create mode 100644 FSM/src/cpp/GuardForCpp.h create mode 100644 FSM/src/cpp/LiteralForCpp.h create mode 100644 FSM/src/cpp/MapForCpp.h create mode 100644 FSM/src/cpp/ParameterForCpp.h create mode 100644 FSM/src/cpp/ReferenceForCpp.h create mode 100644 FSM/src/cpp/StateForCpp.h create mode 100644 FSM/src/cpp/TransitionForCpp.h create mode 100644 FSM/src/cpp/UnaryOperationForCpp.h create mode 100644 FSM/src/cpp/VariableForCpp.h create mode 100644 FSM/src/fsmc.cpp create mode 100644 FSM/src/model/Action.h create mode 100644 FSM/src/model/Actions.h create mode 100644 FSM/src/model/Argument.h create mode 100644 FSM/src/model/BinaryOperation.h create mode 100644 FSM/src/model/Compilable.h create mode 100644 FSM/src/model/Dumper.h create mode 100644 FSM/src/model/Element.h create mode 100644 FSM/src/model/Entry.h create mode 100644 FSM/src/model/Exit.h create mode 100644 FSM/src/model/Expression.h create mode 100644 FSM/src/model/FSM.h create mode 100644 FSM/src/model/Factory.h create mode 100644 FSM/src/model/Function.h create mode 100644 FSM/src/model/Guard.h create mode 100644 FSM/src/model/Literal.h create mode 100644 FSM/src/model/Map.h create mode 100644 FSM/src/model/Operation.h create mode 100644 FSM/src/model/Parameter.h create mode 100644 FSM/src/model/Print.h create mode 100644 FSM/src/model/Reference.h create mode 100644 FSM/src/model/SMC.h create mode 100644 FSM/src/model/State.h create mode 100644 FSM/src/model/Transition.h create mode 100644 FSM/src/model/UnaryOperation.h create mode 100644 FSM/src/model/Variable.h create mode 100644 FSM/src/parser/BNF.txt create mode 100644 FSM/src/parser/Character.h create mode 100644 FSM/src/parser/Comment.h create mode 100644 FSM/src/parser/Identifier.h create mode 100644 FSM/src/parser/IndentStream.h create mode 100644 FSM/src/parser/Keyword.h create mode 100644 FSM/src/parser/Number.h create mode 100644 FSM/src/parser/Operator.h create mode 100644 FSM/src/parser/Parser.h create mode 100644 FSM/src/parser/String.h create mode 100644 FSM/src/parser/Token.h create mode 100644 FSM/src/parser/Tokenizer.h diff --git a/FSM/FSM_vs120.sln b/FSM/FSM_vs120.sln new file mode 100644 index 000000000..db593c606 --- /dev/null +++ b/FSM/FSM_vs120.sln @@ -0,0 +1,33 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2013 for Windows Desktop +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FMSc", "FSMc_vs120.vcxproj", "{E12E5C71-79A4-495A-848F-F1710111E610}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + debug_shared|Win32 = debug_shared|Win32 + debug_static_md|Win32 = debug_static_md|Win32 + debug_static_mt|Win32 = debug_static_mt|Win32 + release_shared|Win32 = release_shared|Win32 + release_static_md|Win32 = release_static_md|Win32 + release_static_mt|Win32 = release_static_mt|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E12E5C71-79A4-495A-848F-F1710111E610}.debug_shared|Win32.ActiveCfg = debug_shared|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.debug_shared|Win32.Build.0 = debug_shared|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.debug_static_md|Win32.ActiveCfg = debug_static_md|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.debug_static_md|Win32.Build.0 = debug_static_md|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.debug_static_mt|Win32.ActiveCfg = debug_static_mt|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.debug_static_mt|Win32.Build.0 = debug_static_mt|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.release_shared|Win32.ActiveCfg = release_shared|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.release_shared|Win32.Build.0 = release_shared|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.release_static_md|Win32.ActiveCfg = release_static_md|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.release_static_md|Win32.Build.0 = release_static_md|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.release_static_mt|Win32.ActiveCfg = release_static_mt|Win32 + {E12E5C71-79A4-495A-848F-F1710111E610}.release_static_mt|Win32.Build.0 = release_static_mt|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/FSM/FSMc_vs120.vcxproj b/FSM/FSMc_vs120.vcxproj new file mode 100644 index 000000000..de878caa1 --- /dev/null +++ b/FSM/FSMc_vs120.vcxproj @@ -0,0 +1,367 @@ + + + + + debug_shared + Win32 + + + debug_static_md + Win32 + + + debug_static_mt + Win32 + + + release_shared + Win32 + + + release_static_md + Win32 + + + release_static_mt + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FSMc + {E12E5C71-79A4-495A-848F-F1710111E610} + FSMc + Win32Proj + + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>12.0.30501.0 + $(ProjectName)d + $(ProjectName)d + $(ProjectName)d + $(ProjectName) + $(ProjectName) + $(ProjectName) + + + bin\ + obj\$(ProjectName)\$(Configuration)\ + true + + + bin\ + obj\$(ProjectName)\$(Configuration)\ + false + + + bin\static_mt\ + obj\$(ProjectName)\$(Configuration)\ + true + + + bin\static_mt\ + obj\$(ProjectName)\$(Configuration)\ + false + + + bin\static_md\ + obj\$(ProjectName)\$(Configuration)\ + true + + + bin\static_md\ + obj\$(ProjectName)\$(Configuration)\ + false + + + + Disabled + src;.\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;WINVER=0x0500;%(PreprocessorDefinitions) + true + true + EnableFastChecks + MultiThreadedDebugDLL + true + true + true + true + + Level3 + ProgramDatabase + Default + + + ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) + bin\$(TargetName)$(TargetExt) + ..\lib;%(AdditionalLibraryDirectories) + true + true + bin\$(TargetName).pdb + Console + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + Speed + true + src;.\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;WINVER=0x0500;%(PreprocessorDefinitions) + true + MultiThreadedDLL + false + true + true + true + + Level3 + + Default + + + ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) + bin\$(TargetName)$(TargetExt) + ..\lib;%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX86 + + + + + Disabled + src;.\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;WINVER=0x0500;POCO_STATIC;%(PreprocessorDefinitions) + true + true + EnableFastChecks + MultiThreadedDebug + true + true + true + true + + Level3 + ProgramDatabase + Default + + + iphlpapi.lib;winmm.lib;ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) + bin\static_mt\$(TargetName)$(TargetExt) + ..\lib;%(AdditionalLibraryDirectories) + true + true + bin\static_mt\$(TargetName).pdb + Console + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + Speed + true + src;.\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;WINVER=0x0500;POCO_STATIC;%(PreprocessorDefinitions) + true + MultiThreaded + false + true + true + true + + Level3 + + Default + + + iphlpapi.lib;winmm.lib;ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) + bin\static_mt\$(TargetName)$(TargetExt) + ..\lib;%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX86 + + + + + Disabled + src;.\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;WINVER=0x0500;POCO_STATIC;%(PreprocessorDefinitions) + true + true + EnableFastChecks + MultiThreadedDebugDLL + true + true + true + true + + Level3 + ProgramDatabase + Default + + + iphlpapi.lib;winmm.lib;ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) + bin\static_md\$(TargetName)$(TargetExt) + ..\lib;%(AdditionalLibraryDirectories) + true + true + bin\static_md\$(TargetName).pdb + Console + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + Speed + true + src;.\include;..\Foundation\include;..\XML\include;..\Util\include;..\Net\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;WINVER=0x0500;POCO_STATIC;%(PreprocessorDefinitions) + true + MultiThreadedDLL + false + true + true + true + + Level3 + + Default + + + iphlpapi.lib;winmm.lib;ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) + bin\static_md\$(TargetName)$(TargetExt) + ..\lib;%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX86 + + + + + \ No newline at end of file diff --git a/FSM/FSMc_vs120.vcxproj.filters b/FSM/FSMc_vs120.vcxproj.filters new file mode 100644 index 000000000..336dae463 --- /dev/null +++ b/FSM/FSMc_vs120.vcxproj.filters @@ -0,0 +1,75 @@ + + + + + {60fd8794-fb4f-47a7-822e-b7eeaedaa5bc} + + + {718e55ba-57a5-460a-b9d6-2cc3e8e17da9} + + + {a8451f20-ad5b-42c6-8137-7d9f5f4dc222} + + + + + parser + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FSM/Makefile b/FSM/Makefile new file mode 100644 index 000000000..da2de86bc --- /dev/null +++ b/FSM/Makefile @@ -0,0 +1,77 @@ +# +# Makefile +# +# $Id: //poco/1.4/FSM/Makefile#1 $ +# +# Makefile for Poco C++ Finite State Machine Compiler +# + +include $(POCO_BASE)/build/rules/global +INCLUDE += -Isrc +CXXFLAGS += -std=c++11 -fno-operator-names + +objects = \ +Action \ +ActionForCpp \ +Actions \ +Argument \ +ArgumentForCpp \ +BinaryOperation \ +BinaryOperationForCpp \ +Character \ +Comment \ +CompilableForCpp \ +Dumper \ +Element \ +ElementForCpp \ +Entry \ +EntryForCpp \ +Exit \ +ExitForCpp \ +Expression \ +ExpressionForCpp \ +FactoryForCpp \ +FSM \ +fsmc \ +FSMForCpp \ +Function \ +FunctionForCpp \ +Guard \ +GuardForCpp \ +Identifier \ +IndentStream \ +Keyword \ +Literal \ +LiteralForCpp \ +Map \ +MapForCpp \ +Number \ +Operation \ +Operator \ +Parameter \ +ParameterForCpp \ +Parser \ +Print \ +Reference \ +ReferenceForCpp \ +State \ +StateForCpp \ +String \ +Token \ +Tokenizer \ +Transition \ +TransitionForCpp \ +UnaryOperation \ +UnaryOperationForCpp \ +Variable \ +VariableForCpp + +ifdef POCO_UNBUNDLED + SYSLIBS += -lz -lpcre -lexpat +endif + +target = fsmc +target_version = 1 +target_libs = PocoUtil PocoXML PocoJSON PocoFoundation + +include $(POCO_BASE)/build/rules/exec diff --git a/FSM/SMC Manual_6_6_0.pdf b/FSM/SMC Manual_6_6_0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..555f488b23f47df9f3756492e595689688ae2e06 GIT binary patch literal 658584 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 JmVF9eSdZ! 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
T_E$CdYR_qxdkwB7gfO^fuWyNN7q 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

eVQFA9I|1TZ z3H6nc+ZbWG=Zg?hMC1H>C0%HiWHjs3)K;jj{;aKwMPzX}7Y1NVl1!Om`56WJ_ja1w z798K)qgs?yy>JNT+}o)=t&`hPF|f^x+cb%qt9TYQR6MCjo?RWHQup&1){ShTk?m{b z0zkYMxnWP7rES|;SFcfz5bu_rGuYfglTZ0ya2;judEv%%u-#gmutl?fK)0!Kztk$d zOA}kq<_20{5df5qrl}~k-%_QpE)5s@8@AIhSyFsErTsQlT6_53)>;qpijUxe57NIr zm@=n(UKxv0)AOm168Ww?)ZrV=s;-YZs;}9R?rHgELPC#nnCj3FXW$fg8;4HKBk0xl z>uV|`?GyUCIoxYuh5HTnWN(jG7^!En7Slu1s}3$Ul#0n=f#{b$BxfmXD zT*M!2N+)}6w%XRZ+ny0b`^{eY5dY$HrE^jJ1;&_HLwn~JCdxKoDvw;gC6p#Hm$f|J ztMOxAN(QYAey(Y4&6L)k#hcURZ*>ttOHEDk1CESO~(@m3@wM0EKDRuY^9a;}wzsh)dfy_8PI7C)x*oFa_Y;*(RW|RO(@Y zOV30s>apOoTtOiN+RVzca`{oj!$^eWF+tcKy&)sWVu+!spn{vCMXw>k3<+vPu$Io`yTU+G@{Yk}jR%ft7EPy7)X_FL}xCnCfCDvz9} zaDPM>Kns$67*9>j%-mQIK_XUL4#CK4L_9-}`+$p%Mi!{{E{~{JjFJo~)MWf_?fqj^4=;rq4AbAlhpqsG?+;u92y z)zOCvi_q32VSh80n867MrJ8EkT9X0syrDT;rh3EF&g7My@y*HIT-t{qXSq-bQUc9; zGS>Tf9xY=6qecErdGex$l&FuZCx^9O7#0k!?Z8x9Fx%@Y|FI4x5@91c@!^;fCcdFXb7|N^``0tjYz{*$$+axS@wo z>`92Fj#Gl0>V5PK1gjLzWQUyrHBAzk4BAnT_&qYZwisWYfNHE~^5Xo?K_;;l;)9Y= z6(#duS*WQja}OqsC%=G!FIBe1r_?U2F7dR$Z<~kg#g=J)u_MqzoE8({z2iY_gY+Qm z)4t(H>3Nc&44m~BhLsg#qwe|<(7k3~& zI!?s4m-1LOXWSJkGj?$Iz!EL844NsiuU?Z0u`g*4sMaN~CtSMx><2H{LY^qxCC@Ri zo9X;FGU7ZDI{F6#;G5|o={J0Yvi6%|Q0bmvv;fXcSD(E=6>o-aptGCgs@O9@L)7LP zV74BJWguKVP)i^9|JZmf^4;Q@l0p8v`{hq4mLh|)g2d1FyN`~Jwp zaDlz`l zeBK&NKO4U&@bNK-zVZ8ZiINf%J>X~mZ=^~|iTQW)H(4d6KZ87Pcgfk?7%Cb&YBI

OTi^SegH- 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

#?ZTcn# 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 j+)-Ldp};D;e|3} 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

I;6FB&_U?g>a{msmzsAfQ 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 NW5!IIGyOfg{}+YGOUVEL literal 0 HcmV?d00001 diff --git a/FSM/SmcMan_6_6_0.tgz b/FSM/SmcMan_6_6_0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..93aa86a5bb1fe19b49c5ef8289c142423b0ec85d GIT binary patch literal 161457 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

-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%0A2uGhvg zGLg@+4{*2~&NMcg-L!hWc#=!3?-L2N!5|JS#_(6hv&Vq45SI5YDU9}_~`v&VYuAsE|GC@j3$%cqC~p4F19PE zyzGDf1a-SR9T^#MaB$G9HI9;aT3=sJV|PMDLu0j4EX{nK|#SZ4wvW!ddK7W$Vm7snSOIM6_szq@1mxrM(1|_jAkX- z=6b_sz0M;k`D>Wy;|I{I-?Ot!Y;4Vqjg7gv0z8cS! zYd+l^-E9QomTR^swZ8!Bv9huffx}65p#50r9{2@^<2%*6SQar@G?e5db&$-?&OY6q z=&hw(zR%mvG4f1}rm+LIfQp3FB@qN#E2yff>I(r&$H+J{HMP}@D)@5V^(DGTK6QL< z&P%lY{egf$|CK0L#Akd~?woPE-mkLTlTucm12lx}+qc|-+eu+PUENi;vo=3JKft_2 za7X(4ou5t`i0ob~IzmFA?Ch@A*MGQMLV<`)R_O^_Sy`2r$SCOOZ1jYpk&~0hxyTv@ zkp^Q8tfwzDnM~!6kB@hD@`<2Ltmh`(&v>I+aCMTia`+(?2UK3mT2; z`ErO_US1xJLd6s=lX8aNcOjLOln`MfM#+3P&#_zinon>&{1Zs^Z2oB(Ya;=sdY0YL!nPT%1--GP=qp7vSHQvoEZuSgX?O1Ny$9d#K3#e!14-_g+4T zSnteUKAj(5*7dlgL3dx@SO&MYtE3gC|NCNr#h-wx06xY}6Py7S2ps3lfFDn4YGR#J ztmRO2l>@xw&$+aMf`YU(>^a5XLq8;`|0$sSoI^tmsYiMLAH??dcI31Ld}DM{lBfXS zE|%j#CEr65!}?}VX!M)icT&>epxiTWkP4FbX>hPatTy`t#6ZUBxjF53inqD7#YzE& z{61wC=>X_s;1^stY&HfG5)wwnxDq-l?RE`0IXe6OaX>jo_fj`@-eX^NI5vBJd3n3n znDaS`+ri_mjGs+Fvj5BZUKh8wuR!pAeLSKjaJ}A_ z1&&ozR79JtUpNC5csOZT6B82)`p(G6NJz*(u%%~=`q!vBySX7vL=g&qd&{6R2)P_O zzqlwWD$+Tfw+8MEnDIee?|Jk4jQ6v6gXIdu7o6eY>VUvNc2-s(K9F|6eEReW6Eg*< zV3i6M4i1;?wg@31;Z6c5)Vq!JUtU}Qs>bT^cs*01oRmdI(%RNGmd1{TjqUOF>LGE} zzWbN915WJT{WX=K<1O01=8Gfqv4Lv-Q$%E_}@Wf0fTYdn^Bm->G z&ej&$1gLsZdAXLRW}DaB>umYq4g&*2NJvPsVn9ueT?UtjTE(}>_X#LReIT$Jji$=B zz6{2Zt5x?8H^AKCIYC5i`)j ze8x4C_Z^FBe>C-x%1>)7&#o&pS=UU%{EN|Wcn5exG3mVmm#jPdwSp%-auXgrg>)WK z0R&LDpWKGRf0>0LV}|73e(KQP}G6sq>-tD>3y^{!R6Af5%+{vz8wM74fM(G^oUJJ zjwm(KgXB6qP>aR7dC95=^aoAzmU-#QJIKq(1r5V?^UK2lDK4o+h((DfpwdYbxn(6~ zF%45r>1)5#xu{$%u7_9X!4G{(0xOuDn{vb>+TXgK)UfMrCDyk7nj;=q=~s+;ZF%X@ zy@(c*2Ss+O$Ov``YwAKg2|ikeSGE;FP67jBCJwd5!$F8 zxAbs_%-Q}mD}SXc%*xwn^K<*a=&c{|&+N=_YJS%FFurJZbT+!?BZkjrU{AmbOmP42 zPP{8yVgz&*jD9C60q)0FW5#aNaduw`x0FGv4}tF*ufMo7P1w)x8Iv?Ub5eSQvn?e@ z9-z;~8Ta*V=iUSK=`rGnT9h|}n!{0IURGYUi{W-@*U9?NpUx+L-KxX|dfnR~*ilSV z|2q60{B$#pu3bOc5scE9&riKf-uxU@U+q3x{Qg(#gftq*L-B0S6wjL|y?UzM&Y4ZUO?qx{=? zTGrasZ)?r9f46(B%;7BJz0*zgEU zQc{Wm)5@9XwS+J&n&hCvqr)WrY&8VClxtTVP7+4`p}&4slXCqe&no4b4xP=T@Ord) zk&R$-atblD=b-9fGBBOn!}It`FHM4dMZB>fufTw@TP$gYFZ4Y?*8Zeo((Hu@C&~`V zh8h^vp$}XM?y%cgk1HKgjR&K&o3bSe472#vbF;bD@KU~}=w;fkP!_I+g$zsi=^Z#7 zZlBpy=;abF6qQwQzE3%fhmE6OOD|u}+ymX5)@)H+P3AxQ7w7_+fA4LcqTEjvnRGNv z|80I9fcq!?Qw7q{xX7oTR__V+_{T+8g29myi)x};igy_llhK0|_vNdW7&6876u|nMBmi(#CCJ!tQ<)x zA%Qo~xW2ft>OW<={;tIE^#>mIO8^>me)7-q%+f%cR7=z@`;)A-1N0UTdo(~AZ(7MX zsoD8l~IzhGg*u3$NN)D z|4VLyW(peQWaz43Y>R)h35WrZ047+jwhlO;fPjpH0I~h;)8$M^zT}@0TA&mVQ9&tza=srvApem6dxVPG z*k0dC&yHHuLdVF!j#}PAPeI4dOj5_1%G%QCf6qN=XlR%i81UZTnVA^>&HKABGt)5P z(b6z7(lIjvXENi_(9zJ+(SYF5{O`H_e_tHz>~(B`s^}T(*qR&I+5Si8{g00S-4?um ze*eEjf@P$HVWBVp_W%MbDk2~U0s_hiyoeydfWJNPb?hJ@U?4IQ3W9HMZ~yJpzX4hP z{hwXu|3u;8;rTyZh5xVQ$B&=?(V?F||HDK7V_E-Sxc2|3ygi*~X6F7!M?Ko)yMQ-P zdpRk25T4z6L*N6dy`YM{yp^H7la8$ch>?jQ9pE$Z=&0za=<*R{LqR}b4vSH(ar2VXVYwwLA{+8e3(DQ11pZf+w zxmd3_rF?_$!sX?}Hu_kvnRYYr;m;I|KF_Vc?V+-H!^EzQN2uP7=9!J46IP{DxXO3t zs=*eg`~FT9)V`U=%zVvS;UiC{=Z~RVrYpaDEPd}sF^>~}Ox>(8{6<*#@SR3;Rz@eyUivDutKwi!^B=VXWniUf+u-Sje z_isN+ff@+Tr&ZkfgVW4rw9az(J&uCwxAsNM#pTHcG{y^EjBo^Hf5nP8HoRGaDyMh8jxrc@`CrZ1`=!{nUGZvFCzHq8w(v0;C3^6;v6 z%!LJbZG>0u(emFl#Cap5FNo0W61O&IG{vwO7*x??`iSFFP^NefvgP3!rfVEwZY)OT zST@J0w$LA`f$-NA)mKO^DcBwsX{8;Y+LT2u4`hdj&LV7v6ZSYdS^UsYAGUeP2Kh_} zD{CR8v;-dFGkvRXQKf6$)(xYm#57oQzRXGLW2Z!NcH=-F>ze!-qb23luMSFkeP*c3 zu^2X`4wii3m0BZ((@0UWk*Tnr_f2_gyHlP>iv9_y&od!W9Z11|0kqKZm7XzWO|%i*_JEMXlFQV_m0X z?3*<@P@wn|TT~va&8mgHOanm4boC3$KAeZ=B3bt1D+8S5Vm??R+F6 zEr!*$Xk30*VAjrH%lWMzj9qDJLj}{oxZ%RY72V&6Q;GDu_yM&q6-b4cQeIzT}z?bSw zN6>$CCzCy>L8K&rAQk5*4)*1g&{?-330FEu$C*B%{L;d>i72MBzRccqrL==rpGbzm zFA;vslf4y5k&BoTpHsai@GTWOkK5alUaE=MOM3d+xFoa_ZwW4uW085T=k@;T#9$MPl`Z!-a^9V`r( zeY)!X_RO@nGME&b?{}smM|Qed&MMOAU}q|r$H-a!$2L84;Z&f3ETvA=s2`K?T4Zl| zS=a;2Nl#U53Ms|2asv~oFoO2J_=Hovh#zz#|bjo2B!b&5B2YRh+5$+)+aTrfZb57YIzbYJxLPB z{TTMrOSW&km{?#Cv)ANXn2{N}BhO5wp5Ngdm*rUr;>U?+FP|aJRFN4b!@kwpI4uy4 zi?lTtVxyj>-%3r7vhIAMjne;-D13C)-NO->fJ|Divc<-*aS^85gTWGhJ@BEws~t7q zwk@mM&9V!N2}bFMGJ4{l&tH|sRf?RYe0{VlV*XYV7HXfwMMsq-pm>5WLmd=WQISP za*=qaAAKqroSxTl+vayOe!p3Go z--jVjR!383cNq9?_NLqflbF|-`RqM%qw}?lNngZRBh%4`veWXZB;v3Rn3{Bcf zLYApQA~%o?DFJx;&ZgocMg|HB_bQ7e-Fm;=eSF4&87k7rh&{He8n(my)%TV})&5fZ z!V)L+rD-&@M9iv+Ej;z!R_bHi(1JIbY74gBGFXA6F8N)(lc#`z6I{07_=^Q@J|py7 z>fU8SU#L%ScNQOT%QnxPpO&C0;YUxOFTA{XzwEVNHn4uS*|nZOA{CZKSbYxc%z=sN zE^!ZHKBoE}PyTsh#H-)D*m@SOGi5j>FbH9E(go??yrNx@1}B4&M&WLlvQ859kyiDY z;79mtHB@Ck8+9(Rj<&vOnRU){oKmwwOCh}tFCswSn?Lt%4(P%5;o9vg?(lt6wG_$F zNWpHe4%}H8S`>c5uzVP7C`63#zs99pr9I$Q<*1tUI_GwIiE6x_k~Fniht)?=h>-eY zwQUZSolP+2?4ptWxS=!IFAq*5`BJHCG5B?S`qLG7B@P4{K0P{EK>u(n))g4c!-rWH zuvC?`p((lj8b;!KPwq#jhYA1j<1o;;G~7)4D+m^w9p`NmuMzR=uCS@d-ODe0}EdL#?28oA>oyYlT8T%dGf}ndrS~MTo4>nOsR++V)BD`_3b@ zdrng&gmyHJjzvnH1K)QMZT8=45IPn^7%`mOd{gqJLs-qU8=) z%t);{wdPuUAkPC)Xj{+G{HEK7Q0} z7c3Y`POq}pPA0(dsA$=HR-08Z!$}3pd*jt?$rgPmFI>e&`WCuvzpNY2`ZJK*;@BrX z(&kH!?pNe%AIe{)=a@A7A6IiPLbF{3DNsH}{nZ$1-de}2z)Hs-0RkW>IDQcArT%gZ z+yyQ_aNrhPom7}gB~PF0^|;T?MLs?sG^keA`}LGmcoUkX8k`}2?X&c2m$-6X*p#tgSI_=`U-svJnE#=t zr~Q}w4+A3&9t|xs6CLe8@<0C>^55ovKvsa4*kAb{FV84J5Rea#|6%^;KUJo^{ts8+ zAM*c8>9O@J1o?lP`2qX!Pnn-&*y<8I82^PYPui=@SFWKy?q%T#dfMrxW(XkoS|htaK?6H9)&#`-@G>X3$VrV!B(^Z9D(w}_CXNdrRfho*Mcv9+ws&*r9M9ejb*v*Y|*GeYFuD*Um5notx)Ri??qb#i`Df|+NQ_yg&b|6ko zHG#aQWUy_6Z4o^gT{5rTQ7SS=?|BvX)Y$0hnct#wua_$qmF!T?3+uw5Tisx>Sb83( zm6IjDHn@4@p?}Zq!iS(!8R0DLh_<(ag9h}h)i_*xu;RI!NCLdoDSjObBrYk_*U4me zq(^>pFB>9jDQKCVAi8j!)gPG<p^DMsmtA(aF-kD+_o&hl4Hf$KHp+2jA84< zRWL@2Glj?EG>z;kzMN(5XdtxMD(QHz(x^x-zDYmAu`^FKT0W(7;F~E3oZDxqEPBz7 z?*-nD-(k)BKPXD(CCe2Pr)4BU@>@saBdrg*$>&v;K+fqBvsvTMl;)icGsF!nJh`*1 z)M;^?tZ<)^T}$-r)L7b7>jWtI4WQ*gjBxZ%{eJ3 z9RZm|&dMe(6ApQ-p7FXi0{UHbZ3S|VUCxsIoLkMXD_Xz_TtVIXp!`gNAMRl%^eWI2 zyEYt3(*TjtttnSDyv~;mbrZFrOqqWSCoMg~)I7x}WN9Id5)zI~YT?1xg`)H~6$3cO z+&NPJkW^tcVQM|L!^(D*xaecXy$~ilsRz%Qyk5cZ>F-vfDzobk^>Hg|T07z%yCM^E z7nm&t)muMsb2C`UtFAB&UNz!*Z6P>o6*wFInULapj>2lmWBL+gVMhC zxObzWw|MNWWk?$w!`Mp1;C-MNI<K%ZBic9>l+wL3&&IRi@*uZ&;i!V6@)>MzK*n;S z=a=`piT-2i@qbqSef(!@^q+|T-hcb>U*SKxzwsaaKk(mwhWtD8fA7l!LjJ;k^&Re$ z|K0h&|5W)0{`-ggpA!X689I>vwP12>BiJT7)EI}LXy-;+4Y)|QL*W7#b)q+Eu&Ek%)X{)Xp>fYg~wrN(>z zU)X^idv{<>zh+LB&kj+obcl$@cXmDIlZYIR$Sjg!4@ zj-rgXH)$PYk;C47Ynw+XgP$YV;8wFom`yOJ{CLrBB6?x_xNjxJ%7y)*PhSry?2dWW z>QXMz@wphl4HBZ?&U`+?^MUatKjzT)Vp@IUcLmR1Ixg{7X*ryaT=qM;RA) zU5@1+r<}^R#R8<6j_;7yO(w@%Jl9b48?8!2bOnVNyt<}mnfUXzTlrz3{K{uBiJHP@ za(+%Cj`ogZOTOP`;FK~C_~iogslS&qC~+zGnR+)#6br>ZMP*BbG>gi2p_tOyu`6ZZ z3)&Y$ln)oX`cvV7#%}2WY|5iQIHxF!0v*s-(f(As9j)vk~&cY0OfX(DT9>ZRc=Ikk7Pfcl(DN^UtL( z^6;(v_tt}5Cc-9H*T^NNO`XY?fuG2*M1|}G4F!x9JEBI$7g*=jQc|7dBL9EFfJ+77K}l^kz=Dmb1=5sEZ(w4eD{(xCrX z6bOaYtL~9te;&p$5dv75dkCdkB*BDKIZ1LjLlSkpfNlA_ezAW|V5g3L?xUjD)izC{!;v@SkY{F@ z%1`n5Vkovady%ybCV}2S{s+P#Sj9ERNV`+niAu5zTHaV3u5M2Evn#l~(X${59GnoC z;s(^CpI0$~nbmG4-JJi9Wj=8*76RO(hJ+-cf;`-b(eHv4B>a-Lg#lfHbe#YcECz*(y4ei=C4DvIncFn&nY067D zrB4{^kC5BPnJ5LPkycI1qsIksf@7LTYQ9~f7|bCprFomFC8+tN9$hgXSk{333PPcf zBR7!BWBU%{g0P^7h3M_3P|G(6(HdJJgJtVN84T@`8(vfCEQ@4^2s0>bQE}vJ{Hy-p zb7$Gdn-4l1@hUc+h@@`HOWry2$5I#GpN!E-k69s#Y<`|A<%m4o#R!U_+gyOKeGdA@ zy{#_>=E(7Yt3W{1k^WO`gsUYFE~+@$qq>AE+kdk*Mtc+=C9n`pE|^urL#Q%%w0(6c zJ=H5$67#B9=`XHG z`LoEcOA*PR(|5H*@@oY0+TPO?u4E`B17(iYbV+zx&+~O(IKDupXF$HyLfMCNn$CGm zB@tW=bJhBawGy_2c2i%pGZS!xN;F}hhAH<^rCJYK9kJG8T$#5!F;8Kbt#`+f5Y#=( zLl@yFeegUdLsjYTt+O1nO&m#&t_zx^h}^^YwyE}vBlpPa9UE@;@==bLV({aJ24C*; z!X1)GUGfkq_v*FCO6;GDZjFSseyGD}?i<1+!+c>Wt*La~7kPPXxv|pXgNSK6^2kSm zn`6_m)ta$VBr`NQ=pz4VK2!XF`1h57 zi2qD=2310v`}~Cmog&X*V$@ExPh8V0DTN&6(}t~T+!D>hqqy4RY0S|_v>_SQlZkxk zOWcN%$+VEEOY|#Y)z54#QVa0#tnwe^sW?4@B*49<1ohFsjIF?@6^ljS(mnkyQA^k> z36@UN@P7%(>+9H3?svq0c~ILeiCzD&F>r!w562y`u??y99$^2$;r>s^zsvuG9dvB< z|I^lgGSJe||6Be?M?=f_5B~R`BL6}D-{UX-X9$`v^N;-hKji=4@;{aT|G4u{%r6x> zx)cva@SXXs7P-DOqwswc_!R`FAo+&pCyvMcHH|#}KpBx+@{RjXarBs#L`rOPbWYs2 z=9e&UsPrM}Mk#3AZ=<&M@}7w8xGIWtq0Vx4{@E0cEi%z%FlqT@9al2B66H#Rc5a2y z@+;Ld+23j})eL5i?{o-gWlK&U1|Qxs3=>JdQJHkQfX2XA8Y}f69Db(VX!M1zha}(G zzs@ag?kdj3-f)U#m?>Us($%u6XPYt)a@d?J5ukJ}u74|7xCB$T?6M{Gi#xG6!N4XD@X$skdd$(`VVNYG&QT za&(6a{^BN60J_qg*x*u6qVPfp;+k|8$K^>lPOfCzQ%le7E#H1@sCsx@fD%HPPx$Qf zCH+uxdPGREo_lc2$#23Xf%--YlhG>o)BNni!wr~CVhrWK4VTpt#IC|PoI^E z)!6*=Elw}J`{bW9D$g1WQj3EU+e?O}k0ZBy`ulPlpU{SPKZNfbQ7Dv0n;8c?@;^b5Z8?xzkN{02{yb{+(eLQwIg7e6lKgjcTF@KekvIW~W$&nZ3vSH9`5=;I z*!%;P?-6oUj?OFL?*?(<>qHBau~9m-tf^f;dV{wCeZrs8#FSd!={Pr9F->Wc8pm_y z9k{{~Ttsp#%IBMc(rWY@$ORg^lwA7R2*LoVsWPbjM_H) zDycb;nhiPua(j+ZQFZ!OX{yGxy*_CH6@B_5c z+wPws(RqQu4!zWr=HBWlyo84PKsNhmHn20Q1@xRDiZi8svbx_2q2<(NmvU(?`6><< zh6_aH_}OPRN9rpqFJBg}L#X_c{N}#nAkS^o+h%BWrmR||oy)M?d*-m1C(X+qxRAZ!oS%b5R&#W8gPpXTYs#s-fQz_AcpbtFHb z=`{35*Z3tpS|t_K!M)SK#&hoKAh&1Xh)VnLz)7_*C}l0^6xJz<40q$MGwuM#>%}M& zb04DF+Y)$tg=${rcX9sId}DI|XIQDC+KsvS1|OEcB#drwriA|PV}J9DaEF?R>c=!@ zRn+h$XaTFxUVMZ6fY;&K% z5T?W1OhBtC-u>i10Q~=j@?YbBBU>vgM;A(SDQay@k;W7fGmLV%}QqhpFdlRsM>*m zKqI}sKtYmIzXD$p{2N3h>tLd1reI=WfX76|i1%GmM-NY09#4f7gw3vp9XR`wy{M$% zr)f~E&)~3@T>&ot<(HzJQ;*Z2?U5Ce`%0QqBG3E5?0I>3c8FvNzT=gAkaa8iAyhw{2xP>!Nc*#j z!yM{_;?bBNB&;ua(rJh4cMmIXFKcHlcS?OQA3q2Q5Xf!xAe}-9d?O%=hLj_eWBukc zeTi%!CTL!4i$@rXE;j=lw2i0L>(w_jv|MhaT}CM~MdUSgf%03d z*KAo%O*I&bhs9=NSe_}81HNw(_4M>yYxiKbSnT!)MWu8+T}H>m#5@&K#13{=*dZ=a zDy#lsih&cc_uCsxzCa4r=~r>A0LzUjICygY!_^qK)A9Vp`9@cm$Lq7Fm$}As{x8ha z_NP;8<;oBdKluu!pQJxL9uEqm%qBa?9}{2Mu3nT?@M!F z)S97_Et#?LE2IbqNzc{Y*m0@e0ve49#_6OuNWk!|1VtsrOTLrJKPRd z*7jgrb|{5H+qOOAxPc$>~Nf!0|>w_NnsZXvOFxb;k~L- zfCWnw`}o^+sBHyE}wj86>aJm^xI{DY_h;Hqbw@uz!OACG*@?L3%P>)kdkQ^s_U4T$Wk3!3`_oNlMzPsj zcXw)Am$8Og=tlCy6NKPC#`BWl%IydQ=@3GMJX*gzE~mnOH(749adl-&jD!%2EiLzJNPS+asOA1gksL z-w*j&-fzL>{(NI7fts2+EMy&Jfn821ef9eg3?)WBWV({v9dg*mA`g9+I&-12k1WG@Sw9}~6yDLy_v1--x4I=sAGyyFlqPg~Axx2k3WKts?EuO6X7BSuWM zhQaz~O#7UUndcci+J6f69L<)69;?MEks-Ey*}v9Y!03)Q}B9tlZFO?prDB-IxZR)N*Ffh^HLM}_9I&hZDXU^S zl`mPQR+mhxCj>YP1wP}OtqAV+!O0m_lZY|-A0I6x%-sM*4EZ77@YBSsr`XQP7^PHC zs~|sL$gxa}3I)5!M+A%TndE5Y%LvTLbkS6)YK`OBDyQwX$nfmJRKeZp3MNlqZ!g?e z8lEu$Yy#4nQkAL?XCuYZ-W`q_&o2?2!Gwy75WK3@v{k47!h5MtnR(gjS{U%Fe`MomrE~WNvW!XXEx{wnA*u7Dyy5 z{nat*^8|eI<%$+L2*JMYub$#J2UAA<)T#oxDnrzDvr6KO!> z9qw;bRaG@yia&j*dwzbVo8xuNb-$I3VS`Qi<{%wK`8pZ0wl&gbon?77+hE@~R_UZ$ zBW)y^&e1eUX%Z+%#vsT0wHK=#hDrhNdnIXv;b`jTxWOeyS40>kC$7D*3~D><^;Tx8 zv59oR7b%xuM@*2iKjk4tpL;9CG~ZkZ_RQ~r{!%QV+a~!yAXlqkoEwhAsfL=XuN^{O zPwLL<_3EBV#w-!l*vL{|AeA-=W;R_YDi=Y_2^(1Ibf~nUUPXNZ&jD*&GbmOylI5B}A1B9;FBS3d??& z9%{|CZgCDj8PG_t@Dc0J;1zk)u(R)Af=&e;tD#V%z!f>uG~PZoAsG&k%I5YYm$AV?#JOUdtzMAAW=cY#FdB`5LY{Ax^ktlJ24#>Y2Qg5&OJ5A*^rrRFu7ID{ybT{74d$c z+TMkf;2(V*-g4)dDZYquyHV_!K(dwom@yY)cX|IX)iG@{-wzqi5|F)EN2V*BIh+C> z=ai5&UK7`m-@mc{8HrfM=&)Aa{ovr>Yv|^&bSg`g(O9~m{s(JsYGz#bbMHlMqCNgV zIL^oYoKQ6CfM9Vs^vVwn=#HE}Y*->p7WKNs<4=i_@xIjR*chJ9yKWZXR(o=ZiMYQ& zFm7$?n)dZ|_sp5hvlKgWjK;Lf|G=N82|s%?9ecB6@mxQ$GaCCiJk*Cg@mnu~lL*{#?WQ>qR#O^&V{_t&btS+*Mk6;Q}hE;WvdiDU>g zR1?-IkDYIH?liHQ;7*d9`mQXctOWm=TW$g}XkzB$^giao8rlqWqCn#pR?g4KC_x9` zUVbwoJ4~SVv6>M&!>2%AD(3n0gDx0gB^h4b-i1F;EoH(ceqf=!YzydvC^T7wg!NJE z-n&Vj%=R{+j)7lRKP&v0qe`nuFt0e1sf(|Jfw)N)DJ1K~iF*?ZBTF3_SK!~awDlvf zQv5y&N(}3eSitM;qxr!FxGCHV-+(dqkF!RMTPaXh5oOYOa3~VQKJkzE@bImo$CH{M z1)or3W?Mfh$!Tu>7>Ock6_()}h1j8zVPsKqAP<|K(D&b*Chuj)Phne<%@O*gyA<|P zZtgC6+90%D|4{^#}|O0n2_x+&*S`Gib`qbX3Ny~%0)9) z+h|8=wz%G&?b=su`mj};6Ey}Q+3ij_43qSZ#BY=`S@bkHSMLr`%LBRIN*o&fxayH6 z<3HiLSBfW4-4k&?pZn@maGS3*D^l{pKTK1TaH-ahLn0?C@qO*Y(0qHCmai?>>kHr4 zzuFy%wjPS7yfkgh(ZxR+NGw%vDBn=K827jNnjj;5!nb8PcvR;DVhLi9!el{5Pv2m% z7UjVvp6yX*G$SyJ8t!oqvIyFx8Y9D2ICwzjsq=3Bv- z3hvwe2&{T!Gd~sR-duv%)@ejDw@&VNh7!JDG7U#ja$X!1WYk-(GC`A<>)%q+iYZ1rw~&7=x{t~zO&eZ~V)6G5_wL+S9=o=THc16GQ zB#vWMARS#m?TIRy5MyR#X9PpheD9eW*21?UzN9B7yPACFLkghvm1&je%5P&dn~h9; z9!q5<^w{I#7pe7!M(bQ?zRG2e6y7W$HBu<`S+Z=Agek8W$tB)|Y z7OC^$gJ>2@k@$=S7?VQ&LPUa5Ar$qLYPCTnp}Z!7HxMIMZA~X>l1q+ZMd}fFszFg1 z2DP<6)~p$iwSUK?46zl<9u;V2yo{xCqkb#_xpq2PUI0*Lceg;6P?u2FYX{Mbe0GUdp##~M4m?p<3wrF z9`G5T<)>J|Js^GknJF4WJUmCPT&_>mlBGlVQixWp-Rev`fPMTO+7wu^IPZ#VFPiZ(KD_O;T`~d(g^xB%>^m@6N-e}V{e0`}| zuGxbQBVRq_J^7A>nCB|^R%^L=)%d~Ge?};!w<#O`-4wrq_oy1`k`em=j(qW_ihCf^?QCR za>3J^`$E79g?$B${uZg~o0Ndb<8@Tlz-9|Mude-@fr&{;L|hKx_4@vz+Viu3^S4j| z;~zkOqiI?*AFmn^Kp<6b@jT;y`7*f$;*_u1{3ogs=zQS_9Psu-_Ye1OTfdm~qYB6n*&oPl+BY6awR_&oC?8Jz_6FOThFhWac)SLnmrUWM z80cmQ3b_z~39QeI!*$-QnWU*Hp;g{~bp5{N^gLH*5qy+#TnxF74EH3l-3>2GSxap< zz4QavbvX9&5p2+H;>gtjqk)C z+F~5OpW8W!8!`4?m`GM3PSemPk0TJpQ|U{Pl}LQOe=&}5Fp8{ zcKIL3H@5mBoD|}S_mBG4gYW5j9gpX|iSRb|DTfS={}B0eU1=A&`g>FB1=wgMwh5CN zdfl&5EuLKnfIou|y9L}{^-OxWk{w98Hmz&i4xHWcWt&ZUHRz1ub}T(KwASo>{PA!b zfe-dInV&RFI>4al&Ro1ba|a$0<|{4BSAx^1LwX6axz?Aqwq7p6lAU)Hbd}PC?oLH5 zy4b=Vu#450plp)Wepw;#fYqD{ov*O(Co4ckc3`cPTMUxCy~!`bAf?~W6z$sr*_FO8 z8cy;JHL8(N3`^Zof#x{047>vU_q$Gk|{BHaYl8(p5GN28f zke?5fSxt2<=r9u={c&O~So;FYziBY>LgcqC0|0I`hI$&2-XSv}yPVFKQih8BEt6M6 z$|H7PLlP6Q#UA%IaPDKyBp;v8g+yD;ib&k3kni=U$Y>9~kSR`kgmV&K;Tz-Mb&C}p zA(TXj+O1N;E#sw25lZBUpqPC=A`5N`p9jRW6@SbZ-h5mqVn?>@F8l_UD~F0srcs=H zWC=zeJ>S?oZY@lTm(F(NK&bvg4kchR8FA}1UrqJ}6-CA0GWQcc9*Eck%Ura^nLPtx zBXtY$5-VRhzHCTB2M@7&SQvTDg6QahF+Q*TKa>CM? zXmxkrj|BrxPprC5!FVd%cJO%m)$12mXc!sNq34&2Y>BJS2^_3jHAS$d31%R)s-gIY z5!?MBEx&&cN*7Ppz-x?G_Um8xoVId+(HHX70c7*h`$sZye*GBIPR$z{R&0?J`**~= zr|J1~^n?W;2|ob?p7@;DH_Kuf3T#Jz{A_%&+b;+7vJv~@j1=4T?Ms?74WK&^KPO=y z1xQi-mq27b{QQ}KlYPsCO=4)TqY=E5$)f0$t1Mc6{rv*G=rA*k?L_9dBuF8BqoATJ zn+o4Q8z~ze@o?)G8+^7joxaEomLDZsZ8*`qc<;Ow9TFWmUp6y?S(%o?bW5DONGR9M zK_1qfUd2Ycmq5D0@8^i++q`rorsfY+xnfgLDdYm(BGxd1jlQ6$)dK|E1Mrh6!_Jj&HT8@` zZnZoYI~A*nWLeLyMn(E%Kg;=iwdM{JJv|v@K78CqM9dEe@VtaM=tNQ-EpBF)`0UQ# za3Jkai(>eZouH(updc<@&aN*@7$G^w{O%`o(dMN8HCG&@S4@XnI;rk#HXR(;a26UF z@lt&U98a9z#&kw1IgjdNE}^GyNKSkp6njJg1(S$R|EcQN_UXBLDBoB0`maQlXgA+n z?VyevoW*+-B5kdU5m~`_ltBD3`)(Vm<>P*L3uJoxWAnv1Fihl1Epp%o; z@{ZEeb++?9^qyaWQb8b~{JQ_WU969SjD~A7r;=iZZZ}t0)KaqBKCgM!E0!HBIgYE+MC1c)!RLan!eJItsqivP7lH(bwM6=zoAVjlk*;B9`*Xp3h4=%0TlLBGCqWe z%BeHutksf1+_tr59k*XhqZ(Qs3CXPYM;=`c@iO$o!C7;(M#F-V84Qq9?BRi{M`NtlIcJSqNdedIJ1U8_eC2d zc!edmTm$!pkIEBL8Ztt%5pGcxzY{tA_dvPKl21Cw-1zCo7%cBlxUoz|(SdHnVi3aJ z*j5R|KL>;CjNEP?R*i}~iAn-N6;7t28&iK*IvQWL=oUYs%V>E&mc@ThY}Cre9EE$QuTJ zwPcPG>{AFTsFIpT@$WvB5e1F~PWeDtnrn>v8xOWy(TwM##w>iLcDQy=^2mg;#gSCRFx8-()e8+f)LE^(lFXD=-&IHTycRt#K>h)e+Lf$ek^-C@9$4(iuKv3x+n!Y?5GXwTXMc#rh!mQb zn9zO7!eBnC;C?!;sc5|%TyC->(&{SB%mk4WHZQ9AQrV4jlbi8OVRKR4TRhbF#$2-5 zscgaACfcB`M#fT$Mm&*kQ8PA7G~{)?Z;q?oah@1xsgQ7WVsw11s;YW2tA>;bp=qko zWSdu4H#36IY_*!}LH$i0r4Pruvy*Qzcn90rECiB8Qlk!??9v|ZsyQ`siK(mWbe+et z%9dDz4t+5I(E@AJTG-gwkP(Dg4d-lyjEB2a+)`tszo0X{vjEJXwh5^JI8vEod9 ztw|)Ef_?R#)&((gX6P=k-mHc0gBxJ#={?)?N7L?(<6kTyVb$7toGVi=Sb2VVDN`S( zvAp$>6BmHNmV(X>J-r49C(GUoNBEO>LXw)iyu7R`>8ejo$IFOS=9-?KUQZ)=v1>-! z2W*j(ITZv@O%>UZ z+3F}&R?>m*)Tum)Wkl&H9~8t-brmijAS?{7{CC&)^z;tZ%GoiQAos&VLZSmcT_B0v zT!$5FA()V|W!K>58tr+_Ju3fOz^+-*_vd5Q`X{_%hTqd!LxxrmU(hLjgNhg#5|aw` z%qr{6qaXO(oHbRT0T*bnnP|uTK;A(DNDYhmK}$z?G&D4rP8!XOqLi^rG(Q@eiAjkJ zFMNi+39)f(cI(ya0Y}#5ul|_b-+>JXDeq;P*0TM?vL!$Z*XC?ZSkR=z@RwmsV_{)o znlsNoeYxn8cdaa}KZP>`0FaFTz6(&=@0!B3fcRy(!;{0*`SplXtt?-!YkOPYK+v

wHQZ;? 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 z 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 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#if defined(SMC_USES_IOSTREAMS) +#include +#endif // SMC_USES_IOSTREAMS +#if defined(SMC_NO_EXCEPTIONS) +#include +#endif // SMC_NO_EXCEPTIONS +#include +#elif defined(WIN32) +#if defined(SMC_NO_EXCEPTIONS) +#include +#endif // SMC_NO_EXCEPTIONS +#else +#if defined(SMC_NO_EXCEPTIONS) +#include +#endif // SMC_NO_EXCEPTIONS +#include +#endif +#if ! defined(SMC_NO_EXCEPTIONS) +#include +#include +#endif + +#define MAX_NAME_LEN 32 + +namespace statemap { +//--------------------------------------------------------------- +// Routines. +// + +#ifdef SMC_FIXED_STACK +// When static memory is used, a string has only one copy. +inline char* copyString(const char *s) { + // Cast your const upon the waters and see what blows up. + return (const_cast(s)); +} +#else +inline char* copyString(const char *s) { + char *retval = nullptr; + + if (s != nullptr) { + retval = new char[MAX_NAME_LEN + 1]; + retval[MAX_NAME_LEN] = '\0'; + (void) std::strncpy(retval, s, MAX_NAME_LEN); + } + + return (retval); +} +#endif +//--------------------------------------------------------------- +// Exception Classes. +// + +//#define SMC_NO_EXCEPTIONS +#ifndef SMC_NO_EXCEPTIONS +// Base class for all SMC exceptions. +class SmcException : public std::runtime_error { + public: + + virtual ~SmcException() throw() { + }; + + protected: + SmcException(const std::string& reason) + : std::runtime_error(reason) { + }; + + private: + SmcException(); +}; + +#ifdef SMC_FIXED_STACK +class PushOnFullStateStackException : + public SmcException { + //----------------------------------------------------------- + // Member methods. + // + public: + + // Default constructor. + PushOnFullStateStackException() + : SmcException("cannot push on full state stack") { + }; + + // Destructor. + virtual ~PushOnFullStateStackException() throw() { + }; + + protected: + private: + + //----------------------------------------------------------- + // Member data. + // + public: + protected: + private: +}; +#endif + +// This class is thrown when a pop is issued on an empty +// state stack. +class PopOnEmptyStateStackException : + public SmcException { + public: + + // Default constructor. + PopOnEmptyStateStackException() + : SmcException("no state to pop from state stack") { + }; + + // Destructor. + virtual ~PopOnEmptyStateStackException() throw() { + }; + +}; + +// This class is thrown when a transition is issued +// but there is no current state. This happens when +// a transition is issued from within a transition +// action. +class StateUndefinedException : + public SmcException { + public: + + // Default constructor. + StateUndefinedException() + : SmcException("transition invoked while in transition") { + }; + + // Destructor. + virtual ~StateUndefinedException() throw() { + }; + +}; + +// This class is thrown when a transition is issued +// but there is no code to handle it. +class TransitionUndefinedException : + public SmcException { + public: + + // Default constructor. + TransitionUndefinedException() + : SmcException("no such transition in current state"), + _state(nullptr), + _transition(nullptr) { + }; + + // Construct an exception using the specified state + // and transition. + TransitionUndefinedException(const char *state, + const char *transition) + : SmcException("no such transition in current state"), + _state(copyString(state)), + _transition(copyString(transition)) { + }; + + // Copy constructor. + TransitionUndefinedException( + const TransitionUndefinedException& ex) + : SmcException("no such transition in current state"), + _state(copyString(ex._state)), + _transition(copyString(ex._transition)) { + }; + + virtual ~TransitionUndefinedException() throw() { + if (_state != nullptr) { + delete[] _state; + _state = nullptr; + } + + if (_transition != nullptr) { + delete[] _transition; + _transition = nullptr; + } + }; + + const TransitionUndefinedException& + operator=(const TransitionUndefinedException& ex) { + // Don't do self assignment. + if (this != &ex) { + if (_state != nullptr) { + delete[] _state; + _state = nullptr; + } + + if (_transition != nullptr) { + delete[] _transition; + _transition = nullptr; + } + + _state = copyString(ex._state); + _transition = copyString(ex._transition); + } + + return (*this); + }; + + // Returns the state. May be nullptr. + const char* getState() const { + return(_state); + }; + + // Returns the transition. May be nullptr. + const char* getTransition() const { + return (_transition); + }; + + private: + char *_state; + char *_transition; +}; + +// This class is thrown when a state ID is either less than +// the minimal value or greater than the maximal value. +class IndexOutOfBoundsException : + public SmcException { + public: + + IndexOutOfBoundsException() + : SmcException("index out of bounds"), + _index(0), + _minIndex(0), + _maxIndex(0) { + }; + + // Constructs an exception using the specified index, + // minimum index and maximum index. + IndexOutOfBoundsException(const int index, + const int minIndex, + const int maxIndex) + : SmcException("index out of bounds"), + _index(index), + _minIndex(minIndex), + _maxIndex(maxIndex) { + }; + + // Copy constructor. + IndexOutOfBoundsException( + const IndexOutOfBoundsException& ex) + : SmcException("index out of bounds"), + _index(ex._index), + _minIndex(ex._minIndex), + _maxIndex(ex._maxIndex) { + }; + + virtual ~IndexOutOfBoundsException() throw() { + }; + + const IndexOutOfBoundsException& + operator=(const IndexOutOfBoundsException& ex) { + // Don't do self assignment. + if (this != &ex) { + _index = ex._index; + _minIndex = ex._minIndex; + _maxIndex = ex._maxIndex; + } + + return (*this); + }; + + // Returns the out-of-bounds index. + int getIndex() const { + return(_index); + }; + + // Returns the minimum allowed index value. + int getMinIndex() const { + return (_minIndex); + }; + + // Returns the maximum allowed index value. + int getMaxIndex() const { + return (_maxIndex); + }; + + private: + int _index; + int _minIndex; + int _maxIndex; +}; +#endif +// +// end of Exception Classes. +//--------------------------------------------------------------- + +class State { +public: + const char* getName() const { + return (_name); + }; + + int getId() const { + return (_stateId); + } + +protected: + State() = delete; + State(const State&) = delete; + + State(const char *name, int stateId) + : _name(nullptr), + _stateId(stateId) { + if (name != nullptr) { + _name = copyString(name); + } else { + _name = copyString("NAME NOT SET"); + } + }; + + virtual ~State() { +#ifndef SMC_FIXED_STACK + if (_name != nullptr) { + delete[] _name; + _name = nullptr; + } +#endif + }; + + private: + public: + protected: + char *_name; // This state's printable name. + int _stateId; // This state's unique identifier. + + private: +}; + +enum class Event { + Enter, + Leave, + Switch, + Transition, + Push, + Pop +}; + +class Notifier { + public: + virtual void operator()(const Event& event, const char* s) = 0; + virtual void operator()(const Event& event, const State* state) = 0; + virtual void operator()(const Event& event, const State* previous, const State* next) = 0; +}; +class FSMContext { + private: + class StateEntry { + public: + StateEntry(State *state, StateEntry *next) + : _state(state), + _next(next) { + }; + + ~StateEntry() { + _state = nullptr; + _next = nullptr; + }; + + State* getState() { + return(_state); + }; + + const State* getState() const { + return(_state); + }; + + StateEntry* getNext() { + return(_next); + }; + + private: + State *_state; + StateEntry *_next; + + friend class FSMContext; + }; + + public: + + virtual ~FSMContext() { +#ifdef SMC_FIXED_STACK + _transition = nullptr; +#else // ! SMC_FIXED_STACK + StateEntry *state; + + if (_transition != nullptr) { + delete[] _transition; + _transition = nullptr; + } + + // But we did allocate the state stack. + while (_state_stack != nullptr) { + state = _state_stack; + _state_stack = _state_stack->_next; + delete state; + } +#endif // ! SMC_FIXED_STACK + }; + + FSMContext& operator=(const FSMContext& fsm) { + // Don't do the assignment if the left and right + // hand sides are the same object. + if (this != &fsm) { + _state = fsm._state; + } + + return(*this); + }; + + // Starts the finite state machine running by executing + // the initial state's entry actions. + virtual void enterStartState()=0; + + // Exact same object (is it me?) + int same(const FSMContext& fsm) const { + return(this == &fsm); + }; + + bool getDebugFlag() { + return(_debug_flag); + }; + + void setDebugFlag(bool flag) { + _debug_flag = flag; + }; + + // Is this state machine already inside a transition? + // Yes if state is null. + bool isInTransition() const { + return(_state == nullptr ? true : false); + }; + + // Returns the current transition's name. + // Used only for debugging purposes. + char* getTransition() const { + return (_transition); + }; + + // Saves away the transition name only if debugging + // is turned on. + void setTransition(const char *transition) { +#ifndef SMC_FIXED_STACK + if (_transition != nullptr) { + delete[] _transition; + _transition = nullptr; + } +#endif // ! SMC_FIXED_STACK + + _transition = copyString(transition); + if (getDebugFlag() && transition) + _notify(Event::Transition, transition); + + return; + }; + + // Clears the current state. + void clearState() { + _previous_state = _state; + _state = nullptr; + }; + + // Returns the state which a transition left. + // May be nullptr. + State* getPreviousState() { + return (_previous_state); + } + + // Sets the current state to the specified state. + void setState(const State& state) { + // clearState() is not called when a transition has + // no actions, so set _previous_state to _state in + // that situation. We know clearState() was not + // called when _state is not null. + if (_state != nullptr) { + if (_debug_flag) { + _notify(Event::Leave, _state); + } + _previous_state = _state; + } + + _state = const_cast(&state); + + if (_debug_flag) { + _notify(Event::Switch, _previous_state, _state); + } + }; + +#ifdef SMC_FIXED_STACK + // Returns true if the state stack is empty and false + // otherwise. + bool isStateStackEmpty() const { + return (_state_stack_depth == 0); + } + + // Returns the state stack's depth. + int getStateStackDepth() const { + return (_state_stack_depth); + } + + // Push the current state on top of the state stack + // and make the specified state the current state. + void pushState(const State& state) { +#ifdef SMC_NO_EXCEPTIONS + assert (_state_stack_depth < SMC_STATE_STACK_SIZE); +#else + if (_state_stack_depth == SMC_STATE_STACK_SIZE) { + throw PushOnFullStateStackException(); + } +#endif + + // Do the push only if there is a state to be pushed + // on the stack. + if (_state != nullptr) { + _state_stack[_state_stack_depth] = _state; + ++_state_stack_depth; + } + + _previous_state = _state; + _state = const_cast(&state); + + if (_debug_flag == true) { + _notify(Event::PUSH_STATE, _state); + } + }; + + // Make the state on top of the state stack the + // current state. + void popState() { + // Popping when there was no previous push is an error. +#ifdef SMC_NO_EXCEPTIONS + poco_assert(_state_stack_depth > 0); +#else + if (_state_stack_depth == 0) { + throw PopOnEmptyStateStackException(); + } +#endif + + _previous_state = _state; + --_state_stack_depth; + _state = _state_stack[_state_stack_depth]; + + if (_debug_flag == true) { + _notify(Event::POP, _state); + } + }; + + // Remove all states from the state stack. + void emptyStateStack() { + _state_stack_depth = 0; + }; +#else // ! SMC_FIXED_STACK + // Returns true if the state stack is empty and false + // otherwise. + bool isStateStackEmpty() const { + return (_state_stack == nullptr); + } + + // Returns the state stack's depth. + int getStateStackDepth() const { + StateEntry *state_ptr; + int retval; + + for (state_ptr = _state_stack, retval = 0; + state_ptr != nullptr; + state_ptr = state_ptr->getNext(), ++retval) + ; + + return (retval); + } + + // Push the current state on top of the state stack + // and make the specified state the current state. + void pushState(const State& state) { + StateEntry *new_entry; + + // Do the push only if there is a state to be pushed + // on the stack. + if (_state != nullptr) { + new_entry = new StateEntry(_state, _state_stack); + _state_stack = new_entry; + } + + _previous_state = _state; + _state = const_cast(&state); + + if (_debug_flag == true) { + _notify(Event::Push, _state); + } + }; + + // Make the state on top of the state stack the + // current state. + void popState() { + StateEntry *entry; + + // Popping when there was no previous push is an error. +#ifdef SMC_NO_EXCEPTIONS + poco_assert(_state_stack != nullptr); +#else + if (_state_stack == nullptr) { + throw PopOnEmptyStateStackException(); + } +#endif // SMC_NO_EXCEPTIONS + + _previous_state = _state; + _state = _state_stack->getState(); + entry = _state_stack; + _state_stack = _state_stack->getNext(); + delete entry; + + if (_debug_flag == true) { + _notify(Event::Pop, _state); + } + }; + + // Remove all states from the state stack. + void emptyStateStack() { + StateEntry *state_ptr, *next_ptr; + + for (state_ptr = _state_stack; state_ptr != nullptr; state_ptr = next_ptr) { + next_ptr = state_ptr->getNext(); + delete state_ptr; + } + _state_stack = nullptr; + }; +#endif + + protected: + FSMContext(const FSMContext&) = delete; + // Default constructor. + FSMContext(Notifier& notifier, const State& state) + : _state(const_cast(&state)), + _previous_state(nullptr), +#ifdef SMC_FIXED_STACK + _state_stack_depth(0), +#else + _state_stack(nullptr), +#endif + _transition(nullptr), + _debug_flag(false), + _notify(notifier) + {}; + + public: + protected: + + // The current state of the finite state machine. + State *_state; + + // Remember which state a transition left. + State *_previous_state; + + // The stack of pushed states. +#ifdef SMC_FIXED_STACK + State* _state_stack[SMC_STATE_STACK_SIZE]; + int _state_stack_depth; +#else + StateEntry *_state_stack; +#endif + char *_transition; + + private: + bool _debug_flag; + Notifier& _notify; +}; +} +#endif diff --git a/FSM/samples/Makefile b/FSM/samples/Makefile new file mode 100644 index 000000000..27105cd41 --- /dev/null +++ b/FSM/samples/Makefile @@ -0,0 +1,12 @@ +# +# Makefile +# +# $Id: //poco/1.4/PageCompiler/samples/Makefile#1 $ +# +# Makefile for Poco PageCompiler Samples +# + +.PHONY: projects +clean all: projects +projects: + $(MAKE) -C TrafficLight $(MAKECMDGOALS) diff --git a/FSM/samples/TCP/AppClient.cpp b/FSM/samples/TCP/AppClient.cpp new file mode 100644 index 000000000..1c7f2a45a --- /dev/null +++ b/FSM/samples/TCP/AppClient.cpp @@ -0,0 +1,377 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// AppClient.cpp +// +// Description +// TcpClient listener object. +// +// RCS ID +// $Id: AppClient.cpp,v 1.6 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: AppClient.cpp,v $ +// Revision 1.6 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.5 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:34:34 charlesr +// Initial revision +// + +#include "AppClient.h" +#include "AppServer.h" +#include "Eventloop.h" +#if defined(WIN32) +#include +#include +#include +#else +#include +#endif +#include +#include + +using namespace std; + +// Externally defined global variables. +extern Eventloop *Gevent_loop; + +// Class variables. +int AppClient::_initFlag = 0; +const long AppClient::MIN_SLEEP_TIME = 100; +const long AppClient::MAX_SLEEP_TIME = 30000; + +//--------------------------------------------------------------- +// AppClient() (Public) +// Default constructor. +// +AppClient::AppClient() +: _client_socket(NULL), + _owner(NULL), + _host(), + _messageCount(0) +{} + +//--------------------------------------------------------------- +// AppClient(const char*, TcpClient&, AppServer&) (Public) +// An "accept" construct. +// +AppClient::AppClient(const string& host, + TcpClient& tcp_client, + AppServer& owner) +: _client_socket(&tcp_client), + _owner(&owner), + _host(host), + _messageCount(0) +{ + // Tell the client that this object is now listening to it. + tcp_client.setListener(*this); + + // Since this client is already connected, set the + // random transmit timer. + setTransmitTimer(); + return; +} // end of AppClient::AppClient(TcpClient&, AppServer&) + +//--------------------------------------------------------------- +// ~AppClient() (Public) +// Destructor. +// +AppClient::~AppClient() +{ + if (_client_socket != NULL) + { + delete _client_socket; + _client_socket = NULL; + } + + return; +} // end of AppClient::~AppClient() + +//--------------------------------------------------------------- +// getHost() const (Public) +// Return the host name. +// +const string& AppClient::getHost() const +{ + return(_host); +} // end of AppClient::getHost() const + +//--------------------------------------------------------------- +// open(const string&, const sockaddr_in&) (Public) +// Open a connection to the named TCP service. +// +void AppClient::open(const string& host, + const sockaddr_in& address) +{ + if (_client_socket == NULL) + { + // Store away the host name. + _host = host; + + cout << "Opening connection to " + << host + << ":" + << ntohs(address.sin_port) + << " ... "; + + // Create the client object and open it. + _client_socket = new TcpClient(*this); + _client_socket->open(address); + } + + return; +} // end of AppClient::open(const string&, const sockaddr_in&) + +//--------------------------------------------------------------- +// close() (Public) +// Close the client connection. +// +void AppClient::close() +{ + if (_client_socket != NULL) + { + cout << "Closing connection to " + << _host + << ":" + << ntohs((_client_socket->getServerAddress()).sin_port) + << " ... "; + + _client_socket->doClose(); + } + + return; +} // end of AppClient::close() + +//--------------------------------------------------------------- +// opened(TcpConnection&) (Public) +// TCP client connection successful. +// +void AppClient::opened(TcpConnection&) +{ + cout << "open successful." << endl; + + // Set the transmit timer. + setTransmitTimer(); + + return; +} // end of AppClient::opened(TcpConnection&) + +//--------------------------------------------------------------- +// openFailed(const char*, TcpConnection&) (Public) +// TCP client connection failed. +// +void AppClient::openFailed(const char *reason, TcpConnection&) +{ + void socketClosed(); + + cout << "open failed"; + if (reason == NULL) + { + cout << "." << endl; + } + else + { + cout << " - " + << reason + << endl; + } + + // Let the application know that the socket is closed. + socketClosed(); + + return; +} // end of AppClient::openFailed(const char*, TcpConnection&) + +//--------------------------------------------------------------- +// transmitted(TcpConnection&) (Public) +// Data successfully transmitted. +// +void AppClient::transmitted(TcpConnection&) +{ + // Set the timer for the next transmission. + setTransmitTimer(); + + cout << "transmit successful." << endl; + return; +} // end of AppClient::transmitted(TcpConnection&) + +//--------------------------------------------------------------- +// transmitFailed(const char*, TcpConnection&) (Public) +// Failed to send data to far-end. +// +void AppClient::transmitFailed(const char *reason, TcpConnection&) +{ + cout << "transmit failed - " << reason << "." << endl; + return; +} // end of AppClient::transmitFailed(const char*, TcpConnection&) + +//--------------------------------------------------------------- +// receive(const char*, int, TcpConnection&) (Public) +// Received data from far end. +// +void AppClient::receive(const char *data, + int size, + TcpConnection&) +{ + const sockaddr_in& address = _client_socket->getServerAddress(); + char *string = new char[size + 1]; + + // Turn the data into a string. + (void) memcpy(string, data, size); + string[size] = '\0'; + + cout << "Received data from " + << inet_ntoa(address.sin_addr) + << ":" + << ntohs(address.sin_port) + << ": \"" + << string + << "\"" + << endl; + + delete[] string; + + return; +} // end of AppClient::receive(const char*, int, TcpConnection&) + +//--------------------------------------------------------------- +// halfClosed(TcpConnection&) (Public) +// This far end has closed its connection. Close down this side. +// +void AppClient::halfClosed(TcpConnection&) +{ + const sockaddr_in& address = _client_socket->getServerAddress(); + + cout << "Connection from " + << _host + << ":" + << address.sin_port + << " has closed its side." + << endl + << "Closing connection to " + << _host + << ":" + << ntohs(address.sin_port) + << " ... "; + + // Stop the transmit timer if running. + Gevent_loop->stopTimer("TRANSMIT_TIMER", *this); + + // When this timer expires, close this end of the connection, + // after waiting one millisecond. + Gevent_loop->startTimer("CLOSE_TIMER", 1, *this); + + return; +} // end of AppClient::halfClosed(TcpConnection&) + +//--------------------------------------------------------------- +// closed(const char*, TcpConnection&) (Public) +// This client connection is closed. +// +void AppClient::closed(const char*, TcpConnection&) +{ + void socketClosed(); + + cout << "closed." << endl; + + // Stop the transmit timer if running. + Gevent_loop->stopTimer("TRANSMIT_TIMER", *this); + + // If this is an accepted connection, tell the service owner + // that this connection is gone. + if (_owner != NULL) + { + _owner->clientClosed(*this); + } + else + { + // Tell the client application that this connection is + // closed. + socketClosed(); + } + + return; +} // end of AppClient::closed(const char*, TcpConnection&) + +//--------------------------------------------------------------- +// handleTimeout(const char*) (Public) +// Time to send another message. +// +void AppClient::handleTimeout(const char *name) +{ + if (strcmp(name, "TRANSMIT_TIMER") == 0) + { + char message[30]; + const sockaddr_in& address = _client_socket->getServerAddress(); + + (void) sprintf(message, + "This is message #%d.", + ++_messageCount); + + cout << "Transmitting to " + << _host + << ":" + << ntohs(address.sin_port) + << ": \"" + << message + << "\" ... "; + + _client_socket->transmit(message, 0, strlen(message)); + } + else if (strcmp(name, "CLOSE_TIMER") == 0) + { + _client_socket->doClose(); + } + + return; +} // end of AppClient::handleTimeout(const char*) + +//--------------------------------------------------------------- +// setTransmitTimer() (Private) +// Set the transmit timer to expire some random time in the +// future. +// +void AppClient::setTransmitTimer() +{ + long duration; + + // Initialize the random number generator, if necessary. + if (_initFlag == 0) + { + srand(time(NULL)); + _initFlag = 1; + } + + // Set the next tranmission to some random time. + duration = ((long) rand()) % MAX_SLEEP_TIME; + if (duration < MIN_SLEEP_TIME) + { + duration = MIN_SLEEP_TIME; + } + + Gevent_loop->startTimer("TRANSMIT_TIMER", duration, *this); + + return; +} // end of AppClient::setTransmitTimer() diff --git a/FSM/samples/TCP/AppClient.h b/FSM/samples/TCP/AppClient.h new file mode 100644 index 000000000..8188a3738 --- /dev/null +++ b/FSM/samples/TCP/AppClient.h @@ -0,0 +1,135 @@ +#ifndef _H_APPCLIENT +#define _H_APPCLIENT + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// AppClient.h +// +// Description +// Encapsulates a TcpClient object. +// +// RCS ID +// $Id: AppClient.h,v 1.6 2009/03/01 18:20:38 cwrapp Exp $ +// +// CHANGE LOG +// $Log: AppClient.h,v $ +// Revision 1.6 2009/03/01 18:20:38 cwrapp +// Preliminary v. 6.0.0 commit. +// +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:34:49 charlesr +// Initial revision +// + +#include "TcpClient.h" +#include "TcpServer.h" +#include "TcpConnectionListener.h" +#include + +// Foward declarations. +class AppServer; + +class AppClient : + /* implements */ public TcpConnectionListener, + /* implements */ public TimerListener +{ +// Member functions. +public: + + // Default constructor. + AppClient(); + + // Create a client around an accepted connection. + AppClient(const std::string& host, + TcpClient& client, + AppServer& owner); + + virtual ~AppClient(); + + const std::string& getHost() const; + + // Create a TCP client object and open a connection to the + // specified service. + void open(const std::string& host, + const sockaddr_in& address); + + // Close the TCP service. + void close(); + + // TCP connection listener callback methods. + void opened(TcpConnection& connection); + void openFailed(const char *reason, + TcpConnection& connection); + void transmitted(TcpConnection& connection); + void transmitFailed(const char *reason, + TcpConnection& connection); + void receive(const char *data, + int size, + TcpConnection& connection); + void halfClosed(TcpConnection& connection); + void closed(const char *reason, + TcpConnection& connection); + + // Clients never receive this event. + void accepted(TcpClient&, TcpServer&) {}; + + // Timer listener callback method. + void handleTimeout(const char *name); + +protected: +private: + + // Randomly set the transmit time. + void setTransmitTimer(); + +// Member data. +public: +protected: +private: + + // The TCP service itself. + TcpClient *_client_socket; + + // If this was an accepted client connection, _owner points + // to the parent TCP service. This will be NULL otherwise. + AppServer *_owner; + + // The host to which we are connected. + std::string _host; + + // Every time a message is sent, increment this counter. + int _messageCount; + + // Initialize the random number generator once per process. + static int _initFlag; + + // Class constants. Minimum and Maximum transmit timeout. + const static long MIN_SLEEP_TIME; + const static long MAX_SLEEP_TIME; +}; + +#endif diff --git a/FSM/samples/TCP/AppServer.cpp b/FSM/samples/TCP/AppServer.cpp new file mode 100644 index 000000000..92a3d1ec5 --- /dev/null +++ b/FSM/samples/TCP/AppServer.cpp @@ -0,0 +1,285 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// AppServer.cpp +// +// Description +// Encapsulates a TcpServer object. +// +// RCS ID +// $Id: AppServer.cpp,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: AppServer.cpp,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:35:08 charlesr +// Initial revision +// + +#include "AppServer.h" +#include "AppClient.h" +#include "Eventloop.h" +#if defined(WIN32) +#include +#else +#include +#endif +#include + +using namespace std; + +// Externally defined global variables. +extern Eventloop *Gevent_loop; + +// Constants. +const static char *DELETE_TIMER = "DeleteTimer"; + +//--------------------------------------------------------------- +// AppServer() (Public) +// Default constructor. +// +AppServer::AppServer() +: _server(NULL), + _clientList(NULL), + _deleteList(NULL) +{} + +//--------------------------------------------------------------- +// ~AppServer() (Public) +// Destructor. Close and delete all accepted client connections. +// +AppServer::~AppServer() +{ + ClientEntry *client, + *nextClient; + + // Close and delete the server if necessary. + if (_server != NULL) + { + _server->doClose(); + delete _server; + _server = NULL; + } + + for (client = _clientList; + client != NULL; + client = nextClient) + { + nextClient = client->getNext(); + (client->getClient())->close(); + delete client; + } + _clientList = NULL; + + for (client = _deleteList; + client != NULL; + client = nextClient) + { + nextClient = client->getNext(); + delete client; + } + _deleteList = NULL; + + return; +} // end of AppServer::~AppServer() + +//--------------------------------------------------------------- +// open(unsigned short) (Public) +// Create a TCP service object and have it start opening. +// +void AppServer::open(unsigned short port) +{ + if (_server == NULL) + { + _server = new TcpServer(*this); + _server->open(port); + } + + return; +} // end of AppServer::open(unsigned short) + +//--------------------------------------------------------------- +// close() (Public) +// Have the TCP service start the close process. +// +void AppServer::close() +{ + if (_server != NULL) + { + _server->doClose(); + } + + return; +} // end of AppServer::close() + +//--------------------------------------------------------------- +// clientClosed(const AppClient&) (Public) +// One of the accepted client connections is now closed. Remove +// it from the client list. +// +void AppServer::clientClosed(const AppClient& client) +{ + ClientEntry **entry, + *remove_entry; + + for (entry = &_clientList; + *entry != NULL; + entry = &((*entry)->_next)) + { + if ((*entry)->getClient() == &client) + { + remove_entry = *entry; + *entry = (*entry)->getNext(); + + // Now put the client on the delete list and + // start the delete timer. + remove_entry->setNext(_deleteList); + _deleteList = remove_entry; + + if (Gevent_loop->doesTimerExist(DELETE_TIMER) == true) + { + Gevent_loop->startTimer(DELETE_TIMER, 1, *this); + } + + break; + } + } + + return; +} // end of AppServer::clientClosed(const AppClient&) + +//--------------------------------------------------------------- +// opened(TcpConnection&) (Public) +// TCP service successfully opened. +// +void AppServer::opened(TcpConnection&) +{ + sockaddr_in address; + + address.sin_family = AF_INET; + address.sin_port = _server->getPort(); + address.sin_addr.s_addr = _server->getAddress(); + + cout << "Service opened on " + << inet_ntoa(address.sin_addr) + << ":" + << ntohs(address.sin_port) + << "." + << endl; + + return; +} // end of AppServer::opened(TcpConnection&) + +//--------------------------------------------------------------- +// openFailed(const char*, TcpConnection&) (Public) +// TCP service failed to open. +// +void AppServer::openFailed(const char *reason, TcpConnection&) +{ + void socketClosed(); + + cout << "Service failed to open on port " + << _server->getPort() + << ", reason: " + << reason + << endl; + + // Tell the application that the TCP service is closed. + socketClosed(); + + return; +} // end of AppServer::openFailed(const char*, TcpConnection&) + +//--------------------------------------------------------------- +// closed(const char*, TcpConnection&) (Public) +// TCP service is now closed. +// +void AppServer::closed(const char *reason, TcpConnection&) +{ + void socketClosed(); + + cout << "Service closed: " + << reason + << endl; + + // Tell the application that the TCP service is closed. + socketClosed(); + + return; +} // end of AppServer::closed(TcpConnection&) + +//--------------------------------------------------------------- +// accepteded(TcpClient&, TcpServer&) (Public) +// TCP service has accepted a new connection. +// +void AppServer::accepted(TcpClient& client, TcpServer&) +{ + AppClient *new_client; + ClientEntry *new_entry; + const sockaddr_in& address = client.getServerAddress(); + string host; + + host = inet_ntoa(address.sin_addr); + + cout << "Accepted new connection from " + << host + << ":" + << ntohs(address.sin_port) + << "." + << endl; + + // Create a new client handler and put in the client list. + new_client = new AppClient(host, client, *this); + new_entry = new ClientEntry(*new_client); + new_entry->setNext(_clientList); + _clientList = new_entry; + + return; +} // end of AppServer::accepted(TcpClient&, TcpServer&) + +//--------------------------------------------------------------- +// handleTimeout(const char*) (Public) +// Time to delete the zombie clients. +// +void AppServer::handleTimeout(const char *name) +{ + if (strcmp(name, DELETE_TIMER) == 0) + { + ClientEntry *it; + ClientEntry *next; + + for (it = _deleteList; it != NULL; it = next) + { + next = it->getNext(); + it->setNext(NULL); + delete it; + } + + _deleteList = NULL; + } + + return; +} // end of AppServer::handleTimeout(const char*) diff --git a/FSM/samples/TCP/AppServer.h b/FSM/samples/TCP/AppServer.h new file mode 100644 index 000000000..a2bea9658 --- /dev/null +++ b/FSM/samples/TCP/AppServer.h @@ -0,0 +1,147 @@ +#ifndef _H_APPSERVER +#define _H_APPSERVER + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2003 Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// AppServer.h +// +// Description +// Encapsulates a TcpServer object. +// +// RCS ID +// $Id: AppServer.h,v 1.6 2009/03/01 18:20:38 cwrapp Exp $ +// +// CHANGE LOG +// $Log: AppServer.h,v $ +// Revision 1.6 2009/03/01 18:20:38 cwrapp +// Preliminary v. 6.0.0 commit. +// +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:35:24 charlesr +// Initial revision +// + +#include "TcpServer.h" +#include "TcpClient.h" +#include "TcpConnectionListener.h" +#include "TimerListener.h" + +// Foward declarations. +class AppClient; + +class AppServer : + /* implements */ public TcpConnectionListener, + /* implements */ public TimerListener +{ +// Member functions. +public: + + // Default constructor. + AppServer(); + + // Destructor. + virtual ~AppServer(); + + // Create a TCP server object and open it. + void open(unsigned short port); + + // Close the TCP service. + void close(); + + // Accepted client socket closed. + void clientClosed(const AppClient& client); + + // TCP connection listener callback methods. + void opened(TcpConnection& connection); + void openFailed(const char *reason, + TcpConnection& connection); + inline void halfClosed(TcpConnection&) + {}; + void closed(const char *reason, + TcpConnection& connection); + void accepted(TcpClient& client, TcpServer& server); + + // These callbacks are never generated by a TCP server. + void transmitted(TcpConnection&) {}; + void transmitFailed(const char*, TcpConnection&) {}; + void receive(const char*, int, TcpConnection&) {}; + + // The "delete clients" timer has expired. + void handleTimeout(const char *name); + +protected: +private: + +// Nested classes. +public: +protected: +private: + + class ClientEntry + { + public: + ClientEntry(AppClient& client) + : _client(&client), + _next(NULL) + {}; + + ~ClientEntry() {}; + + AppClient* getClient() const + { return(_client);}; + + ClientEntry* getNext() const + { return(_next);}; + + void setNext(ClientEntry *entry) + { _next = entry; }; + + private: + AppClient *_client; + ClientEntry *_next; + + friend class AppServer; + }; + +// Member data. +public: +protected: +private: + + // The TCP service itself. + TcpServer *_server; + + // Keep track of all the accepted client connections. + // When this application terminates, they will all be + // closed and deleted. + ClientEntry *_clientList; + + // Delete these clients when the timer expires. + ClientEntry *_deleteList; +}; + +#endif diff --git a/FSM/samples/TCP/Eventloop.cpp b/FSM/samples/TCP/Eventloop.cpp new file mode 100644 index 000000000..05e511bb8 --- /dev/null +++ b/FSM/samples/TCP/Eventloop.cpp @@ -0,0 +1,621 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// Eventloop.h +// +// Description +// Encapsulates the select-based event loop and timer table. +// +// RCS ID +// $Id: Eventloop.cpp,v 1.6 2008/02/04 12:45:07 fperrad Exp $ +// +// CHANGE LOG +// $Log: Eventloop.cpp,v $ +// Revision 1.6 2008/02/04 12:45:07 fperrad +// fix build on linux (gcc 4.1.3) +// +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:35:40 charlesr +// Initial revision +// + +#include "Eventloop.h" +#include +#if !defined(WIN32) +#include +#include +#include +#include +#include +#endif + +const static long USECS_PER_SEC = 1000000; +const static long USECS_PER_MSEC = 1000; +const static int WIN32_MAX_SOCKET = 1024; + +//--------------------------------------------------------------- +// Eventloop() (Public) +// Default constructor. +// +Eventloop::Eventloop() +: _continueRunning(1), + _maxFD(-1), + _fdCount(0), + _timerTable(NULL) +{ +#if !defined(WIN32) + rlimit limit; +#endif + + FD_ZERO(&_fdSet); + + // Allocate the file descriptor callback table. First, find + // out the max file descriptor value. +#if defined(WIN32) + _fdTable = new InputListener*[WIN32_MAX_SOCKET]; + (void) memset(_fdTable, + 0, + (FD_SETSIZE * sizeof(InputListener*))); +#else + (void) getrlimit(RLIMIT_NOFILE, &limit); + _fdTable = new InputListener*[limit.rlim_cur]; + (void) memset(_fdTable, + 0, + (limit.rlim_cur * sizeof(InputListener*))); +#endif + + return; +} // end of Eventloop::Eventloop() + +//--------------------------------------------------------------- +// ~Eventloop() (Public) +// Destructor. +// +Eventloop::~Eventloop() +{ + Eventloop::Timer *timerIt, + *nextTimer; + + // Just in case the event loop is still running. + _continueRunning = 0; + + if (_fdTable != NULL) + { + delete[] _fdTable; + _fdTable = NULL; + } + + for (timerIt = _timerTable; + timerIt != NULL; + timerIt = nextTimer) + { + nextTimer = timerIt->getNext(); + timerIt->setNext(NULL); + delete timerIt; + } + + return; +} // end of Eventloop::~Eventloop() + +//--------------------------------------------------------------- +// start() (Public) +// Start the event loop running. +// +int Eventloop::start() +{ + timeval timeout, + currTime, + *timeoutPtr; + Timer *timer; + fd_set readSet; + int i, + fdCount, + retcode; + TimerListener *listener; + char *timerName; + + _continueRunning = 1; + retcode = 0; + while (_continueRunning == 1) + { + // Figure out how long to wait. If there are no timers, + // then set timeoutPtr to NULL and wait forever. + // Otherwise, put the timeout in the timeval struct and + // point timeoutPtr to it. + if (_timerTable == NULL) + { + timeoutPtr = NULL; + } + else + { + // Get the current time and figure out how long until + // the next timeout. + gettime(currTime); + + // If we have passed the current timeout value, then + // don't sleep at all. + if (*_timerTable < currTime) + { + timeout.tv_sec = 0; + timeout.tv_usec = 0; + } + else + { + timeout.tv_sec = + (_timerTable->getExpiration()).tv_sec - currTime.tv_sec; + timeout.tv_usec = + (_timerTable->getExpiration()).tv_usec - currTime.tv_usec; + + // If the microseconds are less than 0, then subtract + // a second and add 1,000,000 microseconds. + if (timeout.tv_usec < 0) + { + --(timeout.tv_sec); + timeout.tv_usec += USECS_PER_SEC; + } + } + + timeoutPtr = &timeout; + } + + // Since select modifies the FD sets, pass in a copy. + FD_ZERO(&readSet); + for (i = 0; i < _maxFD; ++i) + { + if (FD_ISSET(i, &_fdSet)) + { +#if defined(WIN32) + FD_SET((u_int) i, &readSet); +#else + FD_SET(i, &readSet); +#endif + } + } + + if ((fdCount = select(_maxFD, &readSet, NULL, NULL, timeoutPtr)) < 0) + { + // If select() was interrupted, ignore the error. + if (errno != EINTR) + { + _continueRunning = 0; + retcode = errno; + } + } + else + { + // Issue read events first. + for (i = 0; i < _maxFD && fdCount > 0; ++i) + { + if (FD_ISSET(i, &readSet)) + { + --fdCount; + + if (_fdTable[i] != NULL) + { + _fdTable[i]->handleReceive(i); + } + } + } + + // Issue timeouts. + gettime(currTime); + while (_timerTable != NULL && + *_timerTable <= currTime) + { + // Remove the timer from the timer table *before* + // issuing the callback 'cause the callback may + // set this same timer again before returning + // (and the set will fail if the timer is already + // in the table). + timer = _timerTable; + _timerTable = timer->getNext(); + timer->setNext(NULL); + + // Save away the necessary timer info. + listener = &(timer->getListener()); + timerName = new char[strlen(timer->getName()) + 1]; + strcpy(timerName, timer->getName()); + + // Now delete the defunct timer. + delete timer; + + listener->handleTimeout(timerName); + delete[] timerName; + } + } + } + + return(retcode); +} // end of Eventloop::start() + +//--------------------------------------------------------------- +// stop() (Public) +// Stop the event loop. +// +void Eventloop::stop() +{ + _continueRunning = 0; + return; +} // end of Eventloop::stop() + +//--------------------------------------------------------------- +// addFD(int, InputListener&) (Public) +// Start watching a file descriptor and route the callback to the +// given connection. +// +void Eventloop::addFD(int fd, InputListener& listener) +{ + if (!FD_ISSET(fd, &_fdSet)) + { +#if defined(WIN32) + FD_SET((u_int) fd, &_fdSet); +#else + FD_SET(fd, &_fdSet); +#endif + ++_fdCount; + } + + _fdTable[fd] = &listener; + + if (fd >= _maxFD) + { + _maxFD = fd + 1; + } + + return; +} // end of Eventloop::addFD(int, InputListener&) + +//--------------------------------------------------------------- +// removeFD(int) (Public) +// Stop watching a file descriptor. +// +void Eventloop::removeFD(int fd) +{ + int i; + +#if defined(WIN32) + FD_CLR((u_int) fd, &_fdSet); +#else + FD_CLR(fd, &_fdSet); +#endif + _fdTable[fd] = NULL; + --_fdCount; + + // Are we watching any file descriptors? + if (_fdCount == 0) + { + _maxFD = -1; + } + // Are we removing the max fd? + else if (fd == (_maxFD - 1)) + { + // Yes. Then look for the next max fd. + for (i = (fd -1); i >= 0; --i) + { + if (FD_ISSET(i, &_fdSet)) + { + _maxFD = i + 1; + break; + } + } + } + + return; +} // end of Eventloop::removeFD(int) + +//--------------------------------------------------------------- +// startTimer(const char*, unsigned long, TimerListener&) (Public) +// Start the named timer. +// +void Eventloop::startTimer(const char *name, + long duration, + TimerListener& listener) +{ + timeval expiration; + Eventloop::Timer *timer, + **timerIt; + + // Get the current time and add the duration to it. + gettime(expiration); + expiration.tv_usec += duration * USECS_PER_MSEC; + if (expiration.tv_usec >= USECS_PER_SEC) + { + expiration.tv_sec += (expiration.tv_usec / USECS_PER_SEC); + expiration.tv_usec = (expiration.tv_usec % USECS_PER_SEC); + } + + // Check if this timer already exists. If yes, then remove the + // timer from the list and update its duration and expiration. + timer = NULL; + for (timerIt = &_timerTable; + *timerIt != NULL; + timerIt = &((*timerIt)->_next)) + { + if (strcmp((*timerIt)->getName(), name) == 0 && + &((*timerIt)->getListener()) == &listener) + { + timer = *timerIt; + *timerIt = timer->getNext(); + timer->setNext(NULL); + + timer->setDuration(duration); + timer->setExpiration(expiration); + + break; + } + } + + if (timer == NULL) + { + timer = new Timer(name, duration, expiration, listener); + } + + // Find out where to put this timer in the list. + for (timerIt = &_timerTable; + *timerIt != NULL && **timerIt <= expiration; + timerIt = &((*timerIt)->_next)) + ; + + timer->setNext(*timerIt); + *timerIt = timer; + + return; +} // end of Eventloop::startTimer(const char*, long, TimerListener&) + +//--------------------------------------------------------------- +// stopTimer(const char*, const TimerListener&) (Public) +// Stop the named timer. +// +void Eventloop::stopTimer(const char *name, + const TimerListener& listener) +{ + Eventloop::Timer **timerIt, + *timer; + + for (timerIt = &_timerTable; + *timerIt != NULL; + timerIt = &((*timerIt)->_next)) + { + if (strcmp((*timerIt)->getName(), name) == 0 && + &((*timerIt)->getListener()) == &listener) + { + timer = *timerIt; + *timerIt = timer->getNext(); + timer->setNext(NULL); + delete timer; + + break; + } + } + + return; +} // end of Eventloop::stopTimer(const char*, const TimerListener&) + +//--------------------------------------------------------------- +// doesTimerExist(const char*) const (Public) +// Return true if the named timer exists. +// +bool Eventloop::doesTimerExist(const char *name) const +{ + Eventloop::Timer **timerIt; + bool retval; + + for (timerIt = const_cast(&_timerTable), + retval = false; + *timerIt != NULL && retval == false; + timerIt = &((*timerIt)->_next)) + { + if (strcmp((*timerIt)->getName(), name) == 0) + { + retval = true; + } + } + + return (retval); +} // end of Eventloop::doesTimerExist(const char*) const + +//--------------------------------------------------------------- +// Timer(const char*, long, const timeval&, TimerListener&) +// (Public) +// Constructor. +// +Eventloop::Timer::Timer(const char *name, + long duration, + const timeval& expiration, + TimerListener& listener) +: _name(NULL), + _duration(duration), + _listener(listener), + _next(NULL) +{ + _name = new char[strlen(name) + 1]; + (void) strcpy(_name, name); + (void) memcpy(&_expiration, &expiration, sizeof(_expiration)); +} // end of Eventloop::Timer::Timer(...) + +//--------------------------------------------------------------- +// ~Timer() (Public) +// Destructor. +// +Eventloop::Timer::~Timer() +{ + if (_name != NULL) + { + delete[] _name; + _name = NULL; + } + + return; +} // end of Eventloop::Timer::~Timer() + +//--------------------------------------------------------------- +// operator<(const timeval&) (Public) +// Is the expiration time less than the given time? +// +int Eventloop::Timer::operator<(const timeval& time) +{ + return(_expiration.tv_sec < time.tv_sec || + (_expiration.tv_sec == time.tv_sec && + _expiration.tv_usec < time.tv_usec)); +} // end of Eventloop::Timer::operator<(const timeval&) + +//--------------------------------------------------------------- +// operator<=(const timeval&) (Public) +// Is the expiration time less than or equal to the given time? +// +int Eventloop::Timer::operator<=(const timeval& time) +{ + return(_expiration.tv_sec < time.tv_sec || + (_expiration.tv_sec == time.tv_sec && + _expiration.tv_usec <= time.tv_usec)); +} // end of Eventloop::Timer::operator<=(const timeval&) + +//--------------------------------------------------------------- +// operator==(const timeval&) (Public) +// Is the expiration time equal to the given time? +// +int Eventloop::Timer::operator==(const timeval& time) +{ + return(_expiration.tv_sec == time.tv_sec && + _expiration.tv_usec == time.tv_usec); +} // end of Eventloop::Timer::operator==(const timeval&) + +//--------------------------------------------------------------- +// operator>=(const timeval&) (Public) +// Is the expiration time greater than or equal to the given +// time? +// +int Eventloop::Timer::operator>=(const timeval& time) +{ + return(_expiration.tv_sec > time.tv_sec || + (_expiration.tv_sec == time.tv_sec && + _expiration.tv_usec >= time.tv_usec)); +} // end of Eventloop::Timer::operator>=(const timeval&) + +//--------------------------------------------------------------- +// operator>(const timeval&) (Public) +// Is the expiration time greater than the given time? +// +int Eventloop::Timer::operator>(const timeval& time) +{ + return(_expiration.tv_sec > time.tv_sec || + (_expiration.tv_sec == time.tv_sec && + _expiration.tv_usec > time.tv_usec)); +} // end of Eventloop::Timer::operator>(const timeval&) + +//--------------------------------------------------------------- +// getName() const (Public) +// Return the timer's name. +// +const char* Eventloop::Timer::getName() const +{ + return(_name); +} // end of Eventloop::Timer::getName() const + +//--------------------------------------------------------------- +// getDuration() const (Public) +// Return the timer's duration in milliseconds. +// +long Eventloop::Timer::getDuration() const +{ + return(_duration); +} // end of Eventloop::Timer::getDuration() const + +//--------------------------------------------------------------- +// setDuration(long) (Public) +// Set the timer's duration. +// +void Eventloop::Timer::setDuration(long duration) +{ + _duration = duration; + return; +} // end of Eventloop::Timer::setDuration(long) + +//--------------------------------------------------------------- +// getExpiration() const (Public) +// Return the timer's expiration. +// +const timeval& Eventloop::Timer::getExpiration() const +{ + return(_expiration); +} // end of Eventloop::Timer::getExpiration() const + +//--------------------------------------------------------------- +// setExpiration(const timeval&) (Public) +// Set the timer's expiration. +// +void Eventloop::Timer::setExpiration(const timeval& expiration) +{ + (void) memcpy(&_expiration, &expiration, sizeof(_expiration)); + return; +} // end of Eventloop::Timer::setExpiration(const timeval&) + +//--------------------------------------------------------------- +// getListener() const (Public) +// Return timer's callback connection object. +// +TimerListener& Eventloop::Timer::getListener() const +{ + return(_listener); +} // end of Eventloop::Timer::getListener() const + +//--------------------------------------------------------------- +// getNext() const (Public) +// Return the next pointer. +// +Eventloop::Timer* Eventloop::Timer::getNext() const +{ + return(_next); +} // end of Eventloop::Timer::getNext() const + +//--------------------------------------------------------------- +// setNext(Timer*) (Public) +// Set the next pointer. +// +void Eventloop::Timer::setNext(Eventloop::Timer *timer) +{ + _next = timer; + return; +} // end of Eventloop::Timer::setNext(Eventloop::Timer*) + +//--------------------------------------------------------------- +// gettime(timeval&) const (Private) +// Get the current time. +// +void Eventloop::gettime(timeval& timeval) const +{ +#if defined(WIN32) + _timeb currTime; + + _ftime(&currTime); + timeval.tv_sec = currTime.time; + timeval.tv_usec = currTime.millitm * USECS_PER_MSEC; +#else + (void) gettimeofday(&timeval, NULL); +#endif + + return; +} // end of Eventloop::gettime(timeval&) const diff --git a/FSM/samples/TCP/Eventloop.h b/FSM/samples/TCP/Eventloop.h new file mode 100644 index 000000000..014c3ce14 --- /dev/null +++ b/FSM/samples/TCP/Eventloop.h @@ -0,0 +1,163 @@ +#ifndef _EVENTLOOP_H +#define _EVENTLOOP_H +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// Eventloop.h +// +// Description +// Encapsulates the select-based event loop and timer table. +// +// RCS ID +// $Id: Eventloop.h,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: Eventloop.h,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:35:56 charlesr +// Initial revision +// + +#include "InputListener.h" +#include "TimerListener.h" +#include +#if defined(WIN32) +#include +#include +#else +#include +#endif + +class Eventloop +{ +// Member functions. +public: + + Eventloop(); + ~Eventloop(); + + // Enter the event loop and continue running until told to + // stop. If the event loop terminated normally, 0 is + // returned; otherwise a return value greater than 0 is + // returned. + int start(); + + // Stop the event loop. + void stop(); + + // Methods for adding and removing file descriptors. + void addFD(int fd, InputListener& listener); + void removeFD(int fd); + + // Methods for starting and stopping timers. + void startTimer(const char *name, + long duration, + TimerListener& listener); + void stopTimer(const char *name, const TimerListener& listener); + bool doesTimerExist(const char *name) const; + +protected: +private: + + void gettime(timeval& timeval) const; + +// Inner classes. + + class Timer + { + // Member functions. + public: + + Timer(const char *name, + long duration, + const timeval& expiration, + TimerListener& listener); + + ~Timer(); + + int operator<(const timeval& time); + int operator<=(const timeval& time); + int operator==(const timeval& time); + int operator>=(const timeval& time); + int operator>(const timeval& time); + + const char* getName() const; + long getDuration() const; + void setDuration(long duration); + const timeval& getExpiration() const; + void setExpiration(const timeval& expiration); + TimerListener& getListener() const; + Timer* getNext() const; + void setNext(Timer *timer); + + // Member data. + private: + + char *_name; + + // Duration is in milliseconds. + long _duration; + + // When the timer is expected to expire. + timeval _expiration; + + // The TcpConnection receiving this callback. + TimerListener& _listener; + + Timer *_next; + + // Friends. + friend class Eventloop; + }; + +// Member data. +public: +protected: +private: + + // Set to true while event loop is running and false when + // event loop is to stop. + int _continueRunning; + + // The file descriptors to watch. + fd_set _fdSet; + + // Keep track of the maximum file descriptor. + int _maxFD; + + // Keep track of the number of file descriptors being + // watched. + int _fdCount; + + // The TCP connection associated with each file descriptor. + InputListener **_fdTable; + + // This table is sorted by expiration time - from earliest + // to latest. + Timer *_timerTable; +}; + +#endif diff --git a/FSM/samples/TCP/InputListener.h b/FSM/samples/TCP/InputListener.h new file mode 100644 index 000000000..42aefaffa --- /dev/null +++ b/FSM/samples/TCP/InputListener.h @@ -0,0 +1,68 @@ +#ifndef _H_INPUTLISTENER +#define _H_INPUTLISTENER + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// InputListener.h +// +// Description +// Input event handler. +// +// RCS ID +// $Id: InputListener.h,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: InputListener.h,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:38:51 charlesr +// Initial revision +// + +class InputListener +{ +// Member functions. +public: + + // Default constructor. + InputListener() {}; + + // Destructor. + virtual ~InputListener() {}; + + // Input callback method. + virtual void handleReceive(int fd)=0; + +protected: +private: + +// Member data. +public: +protected: +private: +}; + +#endif diff --git a/FSM/samples/TCP/TCP.sm b/FSM/samples/TCP/TCP.sm new file mode 100644 index 000000000..278ea858a --- /dev/null +++ b/FSM/samples/TCP/TCP.sm @@ -0,0 +1,630 @@ +// -*- tab-width: 4; -*- + +%{ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TCP.sm +// +// Description +// The TCP/IP state transition diagram. +// +%} + +%class TcpConnection +%header TcpConnection.h +%include "TcpSegment.h" +%start TCP::CLOSED + +%map TCP +%% +CLOSED +{ + PassiveOpen(port: unsigned short) ServiceOpening { openServerSocket(port); } + ActiveOpen(address: const sockaddr_in*) ClientOpening { openClientSocket(address); } + AcceptOpen(segment: const TcpSegment&) SYN_RCVD { sendSynAck(segment);setNearAddress(); } + // Ignore close requests when closed. + Close nil {} +} + +// Wait here until service open has either succeeded or failed. +ServiceOpening +{ + ServerOpened LISTEN { openSuccess(); } + OpenFailed(reason: const char*) CLOSED { closeSocket(); openFailed(reason); } +} + +// Wait here until client open has either succeeded or failed. +ClientOpening +{ + ClientOpened(address: const sockaddr_in*)SYN_SENT { sendOpenSyn(address); } + + OpenFailed(reason: const char*) CLOSED { closeSocket();openFailed(reason); } +} + +// Server sockets just sit here, creating new client sockets when +// a SYN is received. +LISTEN +{ + // Create a new client socket and send its port number in + // the SYN/ACK response. + SYN(segment: const TcpSegment&) nil { accept(segment);deleteSegment(segment); } + Close CLOSED { closeSocket();closed(""); } + + // But don't reset a reset message because there is no + // connection to reset. + RST(segment: const TcpSegment&) nil { deleteSegment(segment); } + + // Don't die on an undefined segment either. + UNDEF(segment: const TcpSegment&) nil { doSend(TcpSegment::RST, NULL, 0, 0, &segment);deleteSegment(segment); } +} + +// An "accepted" client socket starts life in this state. +SYN_RCVD +Entry +{ + startTimer("ACK_TIMER", TcpConnection::ACK_TIMEOUT); +} +Exit +{ + stopTimer("ACK_TIMER"); +} +{ + // The connection was reset before it was established. + // Close the datagram socket but don't tell anybody. + RST(segment: const TcpSegment&) CLOSED { closeSocket();clearListener(); deleteSegment(segment); } + + // The TCP state transition diagram shows the server socket + // taking an ACK transtion to the ESTABLISHED state but that + // is not quite true. The accepted client socket goes to + // the ESTABLISHED state while the server socket goes back to + // LISTEN. + ACK(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort() && + segment.getAcknowledgeNumber() == ctxt.getSequenceNumber()] + ESTABLISHED { accepted();deleteSegment(segment); } + Close FIN_WAIT_1 { doSend(TcpSegment::FIN, NULL, 0, 0, NULL); } + AckTimeout CLOSED { doSend(TcpSegment::RST, NULL, 0, 0, NULL);closeSocket(); } +} + +// A application-created client starts life in this state. +SYN_SENT +Entry +{ startTimer("CONN_ACK_TIMER", TcpConnection::ACK_TIMEOUT); } +Exit +{ stopTimer("CONN_ACK_TIMER"); } +{ + // When a TCP service accepts a new connection, it creates + // a new client to handle this connection. + SYN_ACK(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort() && + segment.getAcknowledgeNumber() == ctxt.getSequenceNumber()] + ESTABLISHED { setFarAddress(segment);sendSynAckAck(segment);openSuccess();deleteSegment(segment); } + + Close CLOSED { closeSocket();closed(""); } + ConnAckTimeout CLOSED { closeSocket();openFailed("acknowledge timeout"); } +} + +ESTABLISHED +{ + FIN(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort()] + CLOSE_WAIT { doSend(TcpSegment::ACK, NULL, 0, 0, &segment);halfClosed();deleteSegment(segment); } + + PSH(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort()] + nil { doSend(TcpSegment::ACK, NULL, 0, 0, &segment);receive(segment);deleteSegment(segment); } + + Transmit(data: const char*, offset: int, size: int) + Transmitting + { + doSend(TcpSegment::PSH, data, offset, size, NULL); + } + + Close + FIN_WAIT_1 + { + doSend(TcpSegment::FIN, NULL, 0, 0, NULL); } +} + +Transmitting +Entry +{ + startTimer("TRANS_ACK_TIMER", + TcpConnection::ACK_TIMEOUT); +} +Exit +{ + stopTimer("TRANS_ACK_TIMER"); +} +{ + ACK(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort() && + segment.getAcknowledgeNumber() == ctxt.getSequenceNumber()] + ESTABLISHED + { + transmitted(); + deleteSegment(segment); + } + + PSH_ACK(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort() && + segment.getAcknowledgeNumber() == ctxt.getSequenceNumber()] + ESTABLISHED + { + doSend(TcpSegment::ACK, NULL, 0, 0, &segment); + transmitted(); + receive(segment); + deleteSegment(segment); + } + + // If a push is received now, that means the far end sent + // data at exactly the same time as we sent it. Send an ack + // but don't go anywhere. + PSH(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort()] + nil + { + doSend(TcpSegment::ACK, NULL, 0, 0, &segment); + receive(segment); + deleteSegment(segment); + } + + FIN(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort()] + CLOSE_WAIT + { + doSend(TcpSegment::ACK, NULL, 0, 0, &segment); + halfClosed(); + deleteSegment(segment); + } + + Close + FIN_WAIT_1 + { + doSend(TcpSegment::FIN, NULL, 0, 0, NULL); + } + + TransAckTimeout + CLOSED + { + transmitFailed("peer did not acknowledge"); + closed("connection lost"); + } +} + +CLOSE_WAIT +{ + Close + LAST_ACK + { + doSend(TcpSegment::FIN, NULL, 0, 0, NULL); + } +} + +LAST_ACK +Entry +{ + startTimer("CLOSE_ACK_TIMER", TcpConnection::ACK_TIMEOUT); +} +Exit +{ + stopTimer("CLOSE_ACK_TIMER"); +} +{ + ACK(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort() && + segment.getAcknowledgeNumber() == ctxt.getSequenceNumber()] + CLOSED + { + doSend(TcpSegment::FIN, NULL, 0, 0, &segment); + closeSocket(); + closed(""); + deleteSegment(segment); + } + + CloseAckTimeout + CLOSED + { + closeSocket(); + closed(""); + } +} + +FIN_WAIT_1 +Entry +{ + startTimer("CLOSE_ACK_TIMER", TcpConnection::ACK_TIMEOUT); +} +Exit +{ + stopTimer("CLOSE_ACK_TIMER"); +} +{ + ACK(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort() && + segment.getAcknowledgeNumber() == ctxt.getSequenceNumber()] + FIN_WAIT_2 + { + deleteSegment(segment); + } + + FIN(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort()] + CLOSING + { + doSend(TcpSegment::ACK, NULL, 0, 0, &segment); + deleteSegment(segment); + } + + FIN_ACK(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort() && + segment.getAcknowledgeNumber() == ctxt.getSequenceNumber()] + TIME_WAIT + { + doSend(TcpSegment::ACK, NULL, 0, 0, &segment); + deleteSegment(segment); + } + + CloseAckTimeout + FIN_WAIT_2 + { + closeSocket(); + closed(""); + } +} + +FIN_WAIT_2 +Entry +{ + startTimer("CLOSE_ACK_TIMER", TcpConnection::ACK_TIMEOUT); +} +Exit +{ + stopTimer("CLOSE_ACK_TIMER"); +} +{ + FIN(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort()] + TIME_WAIT + { + doSend(TcpSegment::ACK, NULL, 0, 0, &segment); + deleteSegment(segment); + } + + CloseAckTimeout + CLOSED + { + closeSocket(); + } + + // Ignore undefined transitions. + UNDEF(segment: const TcpSegment&) + nil + { + deleteSegment(segment); + } +} + +CLOSING +Entry +{ + startTimer("CLOSE_ACK_TIMER", TcpConnection::ACK_TIMEOUT); +} +Exit +{ + stopTimer("CLOSE_ACK_TIMER"); +} +{ + ACK(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort() && + segment.getAcknowledgeNumber() == ctxt.getSequenceNumber()] + TIME_WAIT + { + deleteSegment(segment); + } + + CloseAckTimeout + TIME_WAIT + { + closeSocket(); + closed(""); + } + + // Ignore undefined transitions. + UNDEF(segment: const TcpSegment&) + nil + { + deleteSegment(segment); + } +} + +TIME_WAIT +Entry +{ + startTimer("CLOSE_TIMER", TcpConnection::CLOSE_TIMEOUT); +} +Exit +{ + stopTimer("CLOSE_TIMER"); +} +{ + FIN_ACK(segment: const TcpSegment&) + [segment.getSrcAddress() == ctxt.getFarAddress() && + segment.getSrcPort() == ctxt.getFarPort() && + segment.getAcknowledgeNumber() == ctxt.getSequenceNumber()] + CLOSED + { + closeSocket(); + deleteSegment(segment); + } + + CloseTimeout + CLOSED + { + closeSocket(); + closed(""); + } + + // Ignore undefined transitions. + UNDEF(segment: const TcpSegment&) + nil + { + deleteSegment(segment); + } +} + +Default +{ + PassiveOpen(port : unsigned short) + nil + { + openFailed("already open"); + } + + ActiveOpen(address: const sockaddr_in*) + nil + { + openFailed("already open"); + } + + Transmit(data: const char*, offset: int, size: int) + nil + { + transmitFailed("connection not established"); + } + + // The default action when an unknown client sends us a + // segment is to reset the unknown client but remain in + // the current state for a segment from the real client. + FIN(segment: const TcpSegment&) + [segment.getSrcAddress() != ctxt.getFarAddress() || + segment.getSrcPort() != ctxt.getFarPort()] + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + SYN(segment: const TcpSegment&) + [segment.getSrcAddress() != ctxt.getFarAddress() || + segment.getSrcPort() != ctxt.getFarPort()] + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + PSH(segment: const TcpSegment&) + [segment.getSrcAddress() != ctxt.getFarAddress() || + segment.getSrcPort() != ctxt.getFarPort()] + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + ACK(segment: const TcpSegment&) + [segment.getSrcAddress() != ctxt.getFarAddress() || + segment.getSrcPort() != ctxt.getFarPort()] + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + URG(segment: const TcpSegment&) + [segment.getSrcAddress() != ctxt.getFarAddress() || + segment.getSrcPort() != ctxt.getFarPort()] + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + FIN_ACK(segment: const TcpSegment&) + [segment.getSrcAddress() != ctxt.getFarAddress() || + segment.getSrcPort() != ctxt.getFarPort()] + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + SYN_ACK(segment: const TcpSegment&) + [segment.getSrcAddress() != ctxt.getFarAddress() || + segment.getSrcPort() != ctxt.getFarPort()] + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + PSH_ACK(segment: const TcpSegment&) + [segment.getSrcAddress() != ctxt.getFarAddress() || + segment.getSrcPort() != ctxt.getFarPort()] + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + UNDEF(segment: const TcpSegment&) + [segment.getSrcAddress() != ctxt.getFarAddress() || + segment.getSrcPort() != ctxt.getFarPort()] + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + // Do not reset a reset. Just go to closed. + RST(segment: const TcpSegment&) + CLOSED + { + closed("connection reset by peer"); + deleteSegment(segment); + } + + RST_ACK(segment: const TcpSegment&) + CLOSED + { + closed("connection reset by peer"); + deleteSegment(segment); + } + + // The remain transitions represent segments received + // when they were not expected from the peer. The + // connection is reset. + FIN(segment: const TcpSegment&) + CLOSED + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + SYN(segment: const TcpSegment&) + CLOSED + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + PSH(segment: const TcpSegment&) + CLOSED + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + ACK(segment: const TcpSegment&) + CLOSED + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + URG(segment: const TcpSegment&) + CLOSED + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + FIN_ACK(segment: const TcpSegment&) + CLOSED + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + SYN_ACK(segment: const TcpSegment&) + CLOSED + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + PSH_ACK(segment: const TcpSegment&) + CLOSED + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + UNDEF(segment: const TcpSegment&) + nil + { + doSend(TcpSegment::RST, NULL, 0, 0, &segment); + closed("connection reset"); + deleteSegment(segment); + } + + // Ignore timeouts which occur when not expected. + ConnAckTimeout + nil + {} + + TransAckTimeout + nil + {} + + CloseAckTimeout + nil + {} + + CloseTimeout + nil + {} +} + +%% diff --git a/FSM/samples/TCP/TCP_vs120.vcxproj b/FSM/samples/TCP/TCP_vs120.vcxproj new file mode 100644 index 000000000..a9e0d7a2d --- /dev/null +++ b/FSM/samples/TCP/TCP_vs120.vcxproj @@ -0,0 +1,127 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {11E01C5F-683C-4290-B520-D3D248327DE1} + Win32Proj + TrafficLight + TCP + + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + true + ClCompile + + + false + $(IncludePath) + ClCompile + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ..\..\..\FSM\include;..\..\..\Util\include;..\..\..\Foundation\include + + + Console + true + ..\..\..\lib + + + set PATH=..\..\..\bin;%PATH% && ..\..\bin\fsmc TCP.sm + SpotLight_sm.h;SpotLight_sm.cpp + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ..\..\..\FSM\include;..\..\..\Util\include;..\..\..\Foundation\include + + + Console + true + true + true + ..\..\..\lib + + + set PATH=..\..\..\bin;%PATH% && ..\..\bin\fsmc TCP.sm + SpotLight_sm.h;SpotLight_sm.cpp + + + + + + \ No newline at end of file diff --git a/FSM/samples/TCP/TcpClient.cpp b/FSM/samples/TCP/TcpClient.cpp new file mode 100644 index 000000000..c320d03a3 --- /dev/null +++ b/FSM/samples/TCP/TcpClient.cpp @@ -0,0 +1,157 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2003 Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TcpClient.cpp +// +// Description +// TCP client connection class implementation. +// +// RCS ID +// $Id: TcpClient.cpp,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TcpClient.cpp,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:39:43 charlesr +// Initial revision +// + +#include "TcpClient.h" +#if defined (WIN32) +#include +#else +# if defined(__sun) +#include +# else +#include +# endif +#include +#endif + +// Const declarations. +const static long MAX_HOSTNAME_LEN = 257; + +//--------------------------------------------------------------- +// TcpClient(TcpConnectionListener&) (Public) +// Create an unconnected TCP client. +// +TcpClient::TcpClient(TcpConnectionListener& listener) +: TcpConnection(listener) +{} + +//--------------------------------------------------------------- +// ~TcpClient() (Public) +// Destructor. +// +TcpClient::~TcpClient() +{} + +//--------------------------------------------------------------- +// getServerAddress() const (Public) +// This client is connected to this TCP service. +// +const sockaddr_in& TcpClient::getServerAddress() const +{ + return(_farAddress); +} // end of TcpClient::getServerAddress() const + +//--------------------------------------------------------------- +// getClientPort() const (Public) +// This client's TCP port. +// +unsigned short TcpClient::getClientPort() const +{ + return(_nearAddress.sin_port); +} // end of TcpClient::getClientPort() const + +//--------------------------------------------------------------- +// open(unsigned short) (Public) +// Open a client connection to a local TCP service. +// +void TcpClient::open(unsigned short port) +{ + sockaddr_in address; + char hostname[MAX_HOSTNAME_LEN]; + hostent *hostentry; + + // Get the local address. +#if defined(__sun) + (void) sysinfo(SI_HOSTNAME, hostname, MAX_HOSTNAME_LEN); +#else + (void) gethostname(hostname, MAX_HOSTNAME_LEN); +#endif + hostentry = gethostbyname(hostname); + + // Fill in the destination address. + address.sin_port = port; + (void) memcpy(&(address.sin_addr.s_addr), + hostentry->h_addr_list[0], + 4); + + activeOpen(address); + + return; +} // end of TcpClient::open(unsigned short) + +//--------------------------------------------------------------- +// open(const sockaddr_in&) (Public) +// Open a client connection to a remove TCP service. +// +void TcpClient::open(const sockaddr_in& address) +{ + activeOpen(address); + return; +} // end of TcpClient::open(const sockaddr_in&) + +//--------------------------------------------------------------- +// TcpClient(const sockaddr_in&, ...) (Private) +// Create an "accepted" client connection. +// +TcpClient::TcpClient(const sockaddr_in& far_address, + const sockaddr_in& near_address, +#if defined(WIN32) + unsigned short actual_port, + SOCKET udp_socket, + HANDLE udp_handle, +#else + int udp_socket, +#endif + unsigned long sequence_number, + TcpServer& server, + TcpConnectionListener& listener) +: TcpConnection(far_address, + near_address, +#if defined(WIN32) + actual_port, + udp_socket, + udp_handle, +#else + udp_socket, +#endif + sequence_number, + server, + listener) +{} diff --git a/FSM/samples/TCP/TcpClient.h b/FSM/samples/TCP/TcpClient.h new file mode 100644 index 000000000..df00679b3 --- /dev/null +++ b/FSM/samples/TCP/TcpClient.h @@ -0,0 +1,104 @@ +#ifndef _H_TCPCLIENT +#define _H_TCPCLIENT + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TcpClient.h +// +// Description +// TCP client connection class header. +// +// RCS ID +// $Id: TcpClient.h,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TcpClient.h,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:40:04 charlesr +// Initial revision +// + +#include "TcpConnection.h" + +// Forward declarations. +class TcpServer; + +class TcpClient: public TcpConnection +{ +// Member functions. +public: + + // Create an unconnected client. + TcpClient(TcpConnectionListener& listener); + + // Destructor. + ~TcpClient(); + + // This client is connected to this TCP service. + const sockaddr_in& getServerAddress() const; + + // This client's TCP port. + unsigned short getClientPort() const; + + // Open a client connection to a local TCP service. + void open(unsigned short port); + + // Open a client connection to a remote TCP service. + void open(const sockaddr_in& address); + +protected: +private: + + // Create an "accepted" client connection. This constructor + // may only be called by TcpConnection. + TcpClient(const sockaddr_in& far_address, + const sockaddr_in& near_address, +#if defined(WIN32) + unsigned short actual_port, + SOCKET udp_socket, + HANDLE udp_handle, +#else + int udp_socket, +#endif + unsigned long sequence_number, + TcpServer& server, + TcpConnectionListener& listener); + + // Don't allow default or copy constructors. + TcpClient(); + TcpClient(const TcpClient&); + +// Member data. +public: +protected: +private: + +// Friends. + friend class TcpConnection; +}; + +#endif diff --git a/FSM/samples/TCP/TcpConnection.cpp b/FSM/samples/TCP/TcpConnection.cpp new file mode 100644 index 000000000..bf17956c8 --- /dev/null +++ b/FSM/samples/TCP/TcpConnection.cpp @@ -0,0 +1,1428 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TcpConnection.cpp +// +// Description +// TCP connection class implementation. +// +// RCS ID +// $Id: TcpConnection.cpp,v 1.9 2015/08/02 19:44:35 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TcpConnection.cpp,v $ +// Revision 1.9 2015/08/02 19:44:35 cwrapp +// Release 6.6.0 commit. +// +// Revision 1.8 2014/09/06 09:04:29 fperrad +// pragma only for MS compiler +// +// Revision 1.7 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.6 2005/06/08 11:09:12 cwrapp +// + Updated Python code generator to place "pass" in methods with empty +// bodies. +// + Corrected FSM errors in Python example 7. +// + Removed unnecessary includes from C++ examples. +// + Corrected errors in top-level makefile's distribution build. +// +// Revision 1.5 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:40:23 charlesr +// Initial revision +// + +#ifdef _MSC_VER +#pragma warning(disable: 4355) +#endif + +#include "TcpConnection.h" +#include "TcpSegment.h" +#include "TcpClient.h" +#include "TcpServer.h" +#include "Eventloop.h" +#include +#include +#include +#include +#if !defined(WIN32) +#include +#include +# if defined(__sun) +#include +# endif +#endif + +#ifdef _MSC_VER +// Get rid of an annoying build warning. +#pragma warning(disable: 4355) +#endif + +using namespace std; + +#if defined(WIN32) +typedef int socklen_t; +#endif + +// External variable declarations. +extern Eventloop *Gevent_loop; + +// Const member declarations. +const unsigned long TcpConnection::ISN = 1415531521; +const int TcpConnection::MIN_TIMEOUT = 1; +const int TcpConnection::ACK_TIMEOUT = 2000; +const int TcpConnection::CLOSE_TIMEOUT = 5000; +const int TcpConnection::BUFFER_BLOCK_SIZE = 4096; + +// Const declarations. +const static int MSG_READ = 0; +const static int NO_SEND_FLAGS = 0; +const static long MAX_HOSTNAME_LEN = 257; +const static unsigned long LOCAL_HOST_ADDRESS = 0x7f000001; +#if defined(WIN32) +const static unsigned short MIN_PORT = 1024; +const static unsigned short MAX_PORT = 5000; +#endif + +// External routine declarations. +char* winsock_strerror(int); + +//--------------------------------------------------------------- +// getFarAddress() const (Public) +// Return the far-end's 4-byte IP address. +// +unsigned long TcpConnection::getFarAddress() const +{ + return (_farAddress.sin_addr.s_addr); +} // end of TcpConnection::getFarAddress() const + +//--------------------------------------------------------------- +// getFarPort() const (Public) +// Return the far-end's TCP port. +// +unsigned short TcpConnection::getFarPort() const +{ + return (_farAddress.sin_port); +} // end of TcpConnection::getFarPort() const + +//--------------------------------------------------------------- +// getSequenceNumber() const (Public) +// Return the current sequence number. +// +unsigned long TcpConnection::getSequenceNumber() const +{ + return (_sequence_number); +} // end of TcpConnection::getSequenceNumber() const + +//--------------------------------------------------------------- +// transmit(const unsigned char*, int, int) (Public) +// Transmit data to the far side. +// +void TcpConnection::transmit(const char *data, + int offset, + int size) +{ +#ifdef CRTP + Transmit(data, offset, size); +#else + _fsm.Transmit(data, offset, size); +#endif + return; +} // end of TcpConnection::transmit(const unsigned char*, int, int) + +//--------------------------------------------------------------- +// doClose() (Public) +// Start closing this connection. +// +void TcpConnection::doClose() +{ +#ifdef CRTP + Close(); +#else + _fsm.Close(); +#endif + return; +} // end of TcpConnection::doClose() + +//--------------------------------------------------------------- +// setListener(TcpConnectionListener&) (Public) +// Set the connection's listener to a new object. +// +void TcpConnection::setListener(TcpConnectionListener& listener) +{ + _listener = &listener; + return; +} // end of TcpConnection::setListener(TcpConnectionListener&) + +//--------------------------------------------------------------- +// handleReceive(int) (Public) +// Process incoming data. +// +void TcpConnection::handleReceive(int) +{ + sockaddr sourceAddress; + TcpSegment *segment; + socklen_t addressSize; + int flags, + done, + errorFlag, + bytesRead, + totalBytesRead; + + // Read in the segment. Since the data may exceed the buffer + // size, keep expanding the buffer until all the data is + // read. + for (done = 0, bytesRead = 0, totalBytesRead = 0, errorFlag = 0; + done == 0; + totalBytesRead += bytesRead) + { + // Be certain to offset properly into the input buffer. + addressSize = sizeof(sourceAddress); + bytesRead = recvfrom(_udp_socket, + (_buffer + totalBytesRead), + _bufferSize, + MSG_READ, + &sourceAddress, + &addressSize); + +#if defined(WIN32) + if (bytesRead == SOCKET_ERROR) +#else + if (bytesRead < 0) +#endif + { + done = 1; + + if (errno != EAGAIN) + { + cerr << "Receive failure - " + << strerror(errno) + << "." + << endl; + + errorFlag = 1; + } + else + { + bytesRead = 0; + } + } + else if (bytesRead >= 0 && bytesRead < _bufferSize) + { + done = 1; + } + else + { + // The entire buffer was filled with the data. + // Expand the buffer and read some more. + expandBuffer(); + } + } + + if (errorFlag == 0 && bytesRead > 0) + { + segment = new TcpSegment(reinterpret_cast(sourceAddress), + _nearAddress, + _buffer, + totalBytesRead); + +#if defined(FSM_DEBUG) + cout << "**** Received segment:" + << endl + << *segment + << endl; +#endif + + // Generate the appropriate transition based on the header + // flags. + flags = segment->getFlags(); + switch(flags) + { + case TcpSegment::FIN: +#ifdef CRTP + FIN(*segment); +#else + _fsm.FIN(*segment); +#endif + break; + + case TcpSegment::SYN: +#ifdef CRTP + SYN(*segment); +#else + _fsm.SYN(*segment); +#endif + break; + + case TcpSegment::RST: +#ifdef CRTP + RST(*segment); +#else + _fsm.RST(*segment); +#endif + break; + + case TcpSegment::PSH: +#ifdef CRTP + PSH(*segment); +#else + _fsm.PSH(*segment); +#endif + break; + + case TcpSegment::ACK: +#ifdef CRTP + ACK(*segment); +#else + _fsm.ACK(*segment); +#endif + break; + + case TcpSegment::URG: +#ifdef CRTP + URG(*segment); +#else + _fsm.URG(*segment); +#endif + break; + + case TcpSegment::FIN_ACK: +#ifdef CRTP + FIN_ACK(*segment); +#else + _fsm.FIN_ACK(*segment); +#endif + break; + + case TcpSegment::SYN_ACK: +#ifdef CRTP + SYN_ACK(*segment); +#else + _fsm.SYN_ACK(*segment); +#endif + break; + + case TcpSegment::RST_ACK: +#ifdef CRTP + RST_ACK(*segment); +#else + _fsm.RST_ACK(*segment); +#endif + break; + + case TcpSegment::PSH_ACK: +#ifdef CRTP + PSH_ACK(*segment); +#else + _fsm.PSH_ACK(*segment); +#endif + break; + + default: +#ifdef CRTP + UNDEF(*segment); +#else + _fsm.UNDEF(*segment); +#endif + break; + } + } + + return; +} // end of TcpConnection::handleReceive(int) + +//--------------------------------------------------------------- +// handleTimeout(const char*) (Public) +// Generate the appropriate transition based on the timer's name. +// +void TcpConnection::handleTimeout(const char *name) +{ +#if defined(FSM_DEBUG) + cout << "**** Timer " << name << " has expired." << endl; +#endif + + if (strcmp(name, "ACK_TIMER") == 0) + { +#ifdef CRTP + AckTimeout(); +#else + _fsm.AckTimeout(); +#endif + } + else if (strcmp(name, "CONN_ACK_TIMER") == 0) + { +#ifdef CRTP + ConnAckTimeout(); +#else + _fsm.ConnAckTimeout(); +#endif + } + else if (strcmp(name, "TRANS_ACK_TIMER") == 0) + { +#ifdef CRTP + TransAckTimeout(); +#else + _fsm.TransAckTimeout(); +#endif + } + else if (strcmp(name, "CLOSE_ACK_TIMER") == 0) + { +#ifdef CRTP + CloseAckTimeout(); +#else + _fsm.CloseAckTimeout(); +#endif + } + else if (strcmp(name, "CLOSE_TIMER") == 0) + { +#ifdef CRTP + CloseTimeout(); +#else + _fsm.CloseTimeout(); +#endif + } + else if (strcmp(name, "SERVER_OPENED") == 0) + { +#ifdef CRTP + ServerOpened(); +#else + _fsm.ServerOpened(); +#endif + } + else if (strcmp(name, "CLIENT_OPENED") == 0) + { +#ifdef CRTP + ClientOpened(&_farAddress); +#else + _fsm.ClientOpened(&_farAddress); +#endif + } + else if (strcmp(name, "OPEN_FAILED") == 0) + { +#ifdef CRTP + OpenFailed(_errorMessage); +#else + _fsm.OpenFailed(_errorMessage); +#endif + if (_errorMessage != NULL) + { + delete[] _errorMessage; + _errorMessage = NULL; + } + } + + return; +} // end of TcpConnection::handleTimeout(const char*) + +//--------------------------------------------------------------- +// openServerSocket(unsigned short) (Public) +// Open a server socket on the specified port. +// +void TcpConnection::openServerSocket(unsigned short port) +{ +#if defined(WIN32) + unsigned long blockingFlag = 1; + HANDLE newHandle; +#endif + + // Set up this server's address. + (void) memset(&_nearAddress, 0, sizeof(_nearAddress)); + _nearAddress.sin_family = AF_INET; + _nearAddress.sin_port = port; + _nearAddress.sin_addr.s_addr = INADDR_ANY; + + // Tell the UDP socket to route data bound for port to this + // object. +#if defined(WIN32) + if ((_udp_win_socket = socket(AF_INET, SOCK_DGRAM, 0)) + == INVALID_SOCKET || + DuplicateHandle(GetCurrentProcess(), + (HANDLE) _udp_win_socket, + GetCurrentProcess(), + &newHandle, + 0, + FALSE, + DUPLICATE_SAME_ACCESS) == FALSE || + bind((unsigned int) newHandle, + reinterpret_cast(&_nearAddress), + sizeof(_nearAddress)) + == SOCKET_ERROR) +#else + if ((_udp_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0 || + bind(_udp_socket, + reinterpret_cast(&_nearAddress), + sizeof(_nearAddress)) + < 0) +#endif + { + char *error; + + // Use timer to report this event asynchronously. + // Store away error message. + if (_errorMessage != NULL) + { + delete[] _errorMessage; + _errorMessage = NULL; + } +#if defined(WIN32) + error = winsock_strerror(WSAGetLastError()); +#else + error = strerror(errno); +#endif + _errorMessage = new char[strlen(error) + 1]; + (void) strcpy(_errorMessage, error); + Gevent_loop->startTimer("OPEN_FAILED", + MIN_TIMEOUT, + *this); + } + else + { + // Get the UDP socket's address. + _nearAddress.sin_family = AF_INET; + _nearAddress.sin_addr.s_addr = getLocalAddress(); + + // Set the socket to non-blocking and register it with + // the event loop. +#if defined(WIN32) + _udp_socket = (unsigned int) newHandle; + (void) ioctlsocket(_udp_socket, FIONBIO, &blockingFlag); +#else + (void) fcntl(_udp_socket, F_SETFL, O_NDELAY); +#endif + Gevent_loop->addFD(_udp_socket, *this); + + Gevent_loop->startTimer("SERVER_OPENED", + MIN_TIMEOUT, + *this); + } + + return; +} // end of TcpConnection::openServerSocket(int) + +//--------------------------------------------------------------- +// openClientSocket(const sockaddr_in*) (Public) +// Connect to the specified address. +// +void TcpConnection::openClientSocket(const sockaddr_in *address) +{ +#if defined(WIN32) + unsigned long blockingFlag = 1; + HANDLE newHandle; + int new_port; +#endif + + // Set up this client's address. + (void) memset(&_nearAddress, 0, sizeof(_nearAddress)); + _nearAddress.sin_family = AF_INET; + _nearAddress.sin_port = 0; + _nearAddress.sin_addr.s_addr = INADDR_ANY; + +#if defined(WIN32) + if ((_udp_win_socket = socket(AF_INET, SOCK_DGRAM, 0)) + == INVALID_SOCKET || + DuplicateHandle(GetCurrentProcess(), + (HANDLE) _udp_win_socket, + GetCurrentProcess(), + &newHandle, + 0, + FALSE, + DUPLICATE_SAME_ACCESS) == FALSE || + (new_port = doBind((int) newHandle)) < 0) +#else + if ((_udp_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0 || + bind(_udp_socket, + reinterpret_cast(&_nearAddress), + sizeof(_nearAddress)) + < 0) +#endif + { + char *error; + + // Use timer to report this event asynchronously. + // Store away error message. + if (_errorMessage != NULL) + { + delete[] _errorMessage; + _errorMessage = NULL; + } +#if defined(WIN32) + error = winsock_strerror(WSAGetLastError()); +#else + error = strerror(errno); +#endif + _errorMessage = new char[strlen(error) + 1]; + (void) strcpy(_errorMessage, error); + Gevent_loop->startTimer("OPEN_FAILED", + MIN_TIMEOUT, + *this); + } + else + { + // Get the UDP socket's address. + _nearAddress.sin_family = AF_INET; +#if defined(WIN32) + _nearAddress.sin_port = (unsigned short) new_port; +#else + _nearAddress.sin_port = getLocalPort(_udp_socket); +#endif + _nearAddress.sin_addr.s_addr = getLocalAddress(); + + // Set the socket to non-blocking and register it with + // the event loop. +#if defined(WIN32) + _udp_socket = (unsigned int) newHandle; + (void) ioctlsocket(_udp_socket, FIONBIO, &blockingFlag); +#else + (void) fcntl(_udp_socket, F_SETFL, O_NDELAY); +#endif + Gevent_loop->addFD(_udp_socket, *this); + + // Save the far-end address for later use. + (void) memcpy(&_farAddress, address, sizeof(_farAddress)); + + _sequence_number = ISN; + + Gevent_loop->startTimer("CLIENT_OPENED", + MIN_TIMEOUT, + *this); + } + + return; +} // end of TcpConnection::openClientSocket(const sockaddr_in*) + +//--------------------------------------------------------------- +// openSuccess() (Public) +// The socket has been successfully opened. +// +void TcpConnection::openSuccess() +{ + _listener->opened(*this); + return; +} // end of TcpConnection::openSuccess() + +//--------------------------------------------------------------- +// openFailed(const char*) (Public) +// The socket could not be opened. +// +void TcpConnection::openFailed(const char *reason) +{ + _listener->openFailed(reason, *this); + return; +} // end of TcpConnection::openFailed(const char*) + +//--------------------------------------------------------------- +// closeSocket() (Public) +// Finish closing the socket. +// +void TcpConnection::closeSocket() +{ + if (_udp_socket >= 0) + { + // Remove this UDP socket from the event loop. + Gevent_loop->removeFD(_udp_socket); + + // Now close the UDP socket. +#if defined(WIN32) + CloseHandle((HANDLE) _udp_socket); + closesocket(_udp_win_socket); + _udp_win_socket = NULL; +#else + close(_udp_socket); +#endif + _udp_socket = -1; + } + + return; +} // end of TcpConnection::closeSocket() + +//--------------------------------------------------------------- +// halfClosed() (Public) +// The far end client socket has closed its half of the +// connection. +// +void TcpConnection::halfClosed() +{ + _listener->halfClosed(*this); + return; +} // end of TcpConnection::halfClosed() + +//--------------------------------------------------------------- +// closed(const char*) (Public) +// The connection is completely closed. +// +void TcpConnection::closed(const char *reason) +{ + TcpConnectionListener *listener; + + if (_listener != NULL) + { + listener = _listener; + _listener = NULL; + listener->closed(reason, *this); + } + + return; +} // end of TcpConnection::closed(const char*) + +//--------------------------------------------------------------- +// clearListener() (Public) +// Clear this connection's current listener. +// +void TcpConnection::clearListener() +{ + _listener = NULL; + return; +} // end of TcpConnection::clearListener() + +//--------------------------------------------------------------- +// transmitted() (Public) +// Data transmission successfully completed. +// +void TcpConnection::transmitted() +{ + _listener->transmitted(*this); + return; +} // end of TcpConnection::transmitted() + +//--------------------------------------------------------------- +// transmitFailed(const char*) (Public) +// Data transmission failed. +// +void TcpConnection::transmitFailed(const char *reason) +{ + _listener->transmitFailed(reason, *this); + return; +} // end of TcpConnection::transmitFailed(const char*) + +//--------------------------------------------------------------- +// receive(const TcpSegment&) (Public) +// Send received data to the listener. +// +void TcpConnection::receive(const TcpSegment& segment) +{ + if (_listener != NULL) + { + _listener->receive(segment.getData(), + segment.getDataSize(), + *this); + } + + return; +} // end of TcpConnection::receive(const TcpSegment&) + +//--------------------------------------------------------------- +// sendOpenSyn(const sockaddr_in*) (Public) +// Send the opening SYN message which requests connection to a +// service. +// +void TcpConnection::sendOpenSyn(const sockaddr_in *address) +{ + TcpSegment segment(*address, + _nearAddress, + 0, + 0, + TcpSegment::SYN, + NULL, + 0, + 0); + + doSend(TcpSegment::SYN, NULL, 0, 0, &segment); + return; +} // end of TcpConnection::sendOpenSyn(const sockaddr_in*) + +//--------------------------------------------------------------- +// accept(const TcpSegment&) (Public) +// Create a client socket to handle the new connection. +// +void TcpConnection::accept(const TcpSegment& segment) +{ + TcpClient *accept_client; + int new_socket; +#if defined(WIN32) + unsigned long blockingFlag = 1; + HANDLE newHandle; + int new_port; +#else + sockaddr_in clientAddress; +#endif + + // Create a new UDP socket to handle this connection. + // Let it be assigned a random UDP port. +#if defined(WIN32) + newHandle = NULL; + if ((new_socket = socket(AF_INET, SOCK_DGRAM, 0)) + == INVALID_SOCKET || + DuplicateHandle(GetCurrentProcess(), + (HANDLE) new_socket, + GetCurrentProcess(), + &newHandle, + 0, + FALSE, + DUPLICATE_SAME_ACCESS) == FALSE || + (new_port = doBind((int) newHandle)) < 0) + { + // If an error occurs now, ignore it. + if (new_socket != INVALID_SOCKET) + { + closesocket(new_socket); + } + if (newHandle != NULL) + { + CloseHandle((HANDLE) newHandle); + } + } + else + { + // Set the socket to non-blocking. + (void) ioctlsocket( + (unsigned int) newHandle, FIONBIO, &blockingFlag); + + // Have the new client socket use this server + // socket's near address for now. + accept_client = new TcpClient(segment.getSource(), + _nearAddress, + (unsigned short) new_port, + new_socket, + newHandle, + _sequence_number, + (TcpServer&) *this, + *_listener); +#else + // Set up this client's address. + (void) memset(&clientAddress, 0, sizeof(clientAddress)); + clientAddress.sin_family = AF_INET; + clientAddress.sin_port = 0; + clientAddress.sin_addr.s_addr = INADDR_ANY; + + if ((new_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0 || + bind(new_socket, + reinterpret_cast(&clientAddress), + sizeof(clientAddress)) + < 0) + { + // If an error occurs now, ignore it. + if (new_socket >= 0) + { + close(new_socket); + } + } + else + { + // Set the socket to non-blocking. + (void) fcntl(new_socket, F_SETFL, O_NDELAY); + + // Have the new client socket use this server + // socket's near address for now. + accept_client = new TcpClient(segment.getSource(), + _nearAddress, + new_socket, + _sequence_number, + (TcpServer&) *this, + *_listener); + +#endif + + accept_client->acceptOpen(segment); + } + + return; +} // end of TcpConnection::accept(const TcpSegment&) + +//--------------------------------------------------------------- +// accepted() (Public) +// Connection completely accepted. +// +void TcpConnection::accepted() +{ + TcpServer *server = _server; + TcpConnectionListener *listener = _listener; + + // Tell the server listener that a new connection has + // been accepted. Then clear the server listener because + // this socket is now truly a client socket. Clear the + // listener member data now because the callback method + // will be resetting it and the reset will fail if we + // don't do it. + _server = NULL; + _listener = NULL; + listener->accepted((TcpClient&) *this, *server); + + return; +} // end of TcpConnection::accepted() + +//--------------------------------------------------------------- +// sendSynAck(const TcpSegment&) (Public) +// Acknowledge a SYN message. +// +void TcpConnection::sendSynAck(const TcpSegment& segment) +{ + unsigned short port; + char port_bytes[2]; + + // Tell the far end client socket with what port it should + // now communicate. +#if defined(WIN32) + port = _actualPort; +#else + port = getLocalPort(_udp_socket); +#endif + + port_bytes[0] = (char) (port & 0x00ff); + port_bytes[1] = (char) ((port & 0xff00) >> 8); + + doSend(TcpSegment::SYN_ACK, port_bytes, 0, 2, &segment); + + return; +} // end of TcpConnection::sendSynAck(const TcpSegment&) + +//--------------------------------------------------------------- +// sendSynAckAck(const TcpSegment&) (Public) +// Acknowledge the service's acknowledge. Need to do this so +// doSend() will use the correct address. +// +void TcpConnection::sendSynAckAck(const TcpSegment& segment) +{ + TcpSegment faux_segment(_farAddress, + _nearAddress, + segment.getSequenceNumber(), + segment.getAcknowledgeNumber(), + segment.getFlags(), + NULL, + 0, + 0); + + doSend(TcpSegment::ACK, NULL, 0, 0, &faux_segment); + return; +} // end of TcpConnection::sendSynAckAck(const TcpSegment&) + +//--------------------------------------------------------------- +// doSend(...) (Public) +// Send data to the specified address. +// +void TcpConnection::doSend(unsigned short flags, + const char *data, + int offset, + int size, + const TcpSegment *recv_segment) +{ + sockaddr_in to_address; + unsigned long ack_number; + TcpSegment *send_segment; + char *packet; + int packet_size; + + (void) memset(&to_address, 0, sizeof(to_address)); + + // First, use the received segment. + // Else, use the connection's far end. + if (recv_segment != NULL) + { + (void) memcpy(&to_address, + &(recv_segment->getSource()), + sizeof(to_address)); + } + // If the address was not specified, then send this segment + // to whatever client socket we are currently speaking. + else + { + (void) memcpy(&to_address, &_farAddress, sizeof(to_address)); + } + + // Send the ack number only if the ack flag is set. + if ((flags & TcpSegment::ACK) == 0 || recv_segment == NULL) + { + ack_number = 0; + } + else + { + // Figure out the ack number based on the received + // segment's sequence number and data size. + ack_number = getAck(*recv_segment); + } + + send_segment = + new TcpSegment(_nearAddress, + to_address, + _sequence_number, + ack_number, + flags, + data, + offset, + size); + + // Advance the sequence number depending on the message sent. + // Don't do this if the message came from an interloper. + if (recv_segment == NULL || + ((recv_segment->getSource()).sin_port == _farAddress.sin_port && + (recv_segment->getSource()).sin_addr.s_addr == _farAddress.sin_addr.s_addr)) + { + _sequence_number = getAck(*send_segment); + } + + // Now send the data. First convert the TCP segment into a + // sequence of raw bytes. + send_segment->packetize(packet, packet_size); + + if (packet != NULL && packet_size > 0) + { +#if defined(FSM_DEBUG) + cout << "**** Transmit segment:\n" << *send_segment << endl; +#endif + +#if defined(WIN32) + if (sendto(_udp_socket, + packet, + packet_size, + NO_SEND_FLAGS, + reinterpret_cast(&to_address), + sizeof(to_address)) == SOCKET_ERROR) +#else + if (sendto(_udp_socket, + packet, + packet_size, + NO_SEND_FLAGS, + reinterpret_cast(&to_address), + sizeof(to_address)) < 0) +#endif + { + cerr << "Transmit failed - " + << strerror(errno) + << "." + << endl; + } + + // Free up the allocated packet. + delete[] packet; + } + + delete send_segment; + + return; +} // end of TcpConnection::doSend(...) + +//--------------------------------------------------------------- +// startTimer(const char*, long) (Public) +// Start the named timer running. +// +void TcpConnection::startTimer(const char *name, long duration) +{ +#if defined(FSM_DEBUG) + cout << "**** Starting timer " + << name + << ", duration: " + << duration + << " milliseconds." + << endl; +#endif + + Gevent_loop->startTimer(name, duration, *this); + return; +} // end of TcpConnection::startTimer(const char*, long) + +//--------------------------------------------------------------- +// stopTimer(const char*) (Public) +// Stop the named timer. +// +void TcpConnection::stopTimer(const char* name) +{ +#if defined(FSM_DEBUG) + cout << "**** Stopping timer " << name << "." << endl; +#endif + + Gevent_loop->stopTimer(name, *this); + return; +} // end of TcpConnection::stopTimer(const char*) + +//--------------------------------------------------------------- +// setNearAddress() (Public) +// Figure out this socket's port and address based on the socket. +// +void TcpConnection::setNearAddress() +{ + // Get the UDP socket's address. + _nearAddress.sin_port = AF_INET; +#if defined(WIN32) + _nearAddress.sin_port = _actualPort; +#else + _nearAddress.sin_port = getLocalPort(_udp_socket); +#endif + _nearAddress.sin_addr.s_addr = getLocalAddress(); + + return; +} // end of TcpConnection::setNearAddress() + +//--------------------------------------------------------------- +// setFarAddress(const TcpSegment&) (Public) +// Send data to a new client port instead of the server port. +// +void TcpConnection::setFarAddress(const TcpSegment& segment) +{ + const char *data = segment.getData(); + unsigned short port; + + _farAddress.sin_family = AF_INET; + port = ((((unsigned short) data[0]) & 0x00ff) | + ((((unsigned short) data[1]) & 0x00ff) << 8)); + _farAddress.sin_port = port; + _farAddress.sin_addr.s_addr = + segment.getSource().sin_addr.s_addr; + + return; +} // end of TcpConnection::setFarAddress(const TcpSegment&) + +//--------------------------------------------------------------- +// deleteSegment(const TcpSegment&) (Public) +// Delete a segment object. +// +void TcpConnection::deleteSegment(const TcpSegment& segment) +{ + delete const_cast(&segment); + return; +} // end of TcpConnection::deleteSegment(const TcpSegment&) + +//--------------------------------------------------------------- +// TcpConnection(TcpConnectionListener&) (Protected) +// Create a server socket. +// +TcpConnection::TcpConnection(TcpConnectionListener& listener) +: _listener(&listener), +#if defined(WIN32) + _actualPort(0), + _udp_win_socket(NULL), +#endif + _udp_socket(-1), + _sequence_number(ISN), + _buffer(NULL), + _bufferSize(0), + _server(NULL), + _errorMessage(NULL) +#ifdef CRTP +#else + , _fsm(*this) +#endif +{ + (void) memset(&_nearAddress, 0, sizeof(_nearAddress)); + (void) memset(&_farAddress, 0, sizeof(_farAddress)); + expandBuffer(); + +#if defined(FSM_DEBUG) + // Turn on state map debug printout. +#ifdef CRTP + setDebugFlag(true); +#else + _fsm.setDebugFlag(true); +#endif +#endif + + return; +} // end of TcpConnection::TcpConnection(TcpConnectionListener&) + +//--------------------------------------------------------------- +// TcpConnection(const sockaddr_in&, ...) (Protected) +// "Accepted" client connection. +// +TcpConnection::TcpConnection(const sockaddr_in& far_address, + const sockaddr_in& near_address, +#if defined(WIN32) + unsigned short actual_port, + SOCKET udp_socket, + HANDLE udp_handle, +#else + int udp_socket, +#endif + int sequence_number, + TcpServer& server, + TcpConnectionListener& listener) +: _listener(&listener), +#if defined(WIN32) + _actualPort(actual_port), + _udp_win_socket(udp_socket), + _udp_socket((unsigned int) udp_handle), +#else + _udp_socket(udp_socket), +#endif + _sequence_number(sequence_number), + _buffer(NULL), + _bufferSize(0), + _server(&server), + _errorMessage(NULL) +#ifdef CRTP +#else + , _fsm(*this) +#endif +{ + // Register the UDP socket with the event loop. + Gevent_loop->addFD(_udp_socket, *this); + + (void) memcpy(&_nearAddress, &near_address, sizeof(_nearAddress)); + (void) memcpy(&_farAddress, &far_address, sizeof(_farAddress)); + + // Set up the input buffer. + expandBuffer(); + +#if defined(FSM_DEBUG) + // Turn on state map debug printout. +#ifdef CRTP + setDebugFlag(true); +#else + _fsm.setDebugFlag(true); +#endif +#endif + + return; +} // end of TcpConnection::TcpConnection(...) + +//--------------------------------------------------------------- +// ~TcpConnection() (Protected) +// Destructor. +// +TcpConnection::~TcpConnection() +{ + if (_buffer != NULL) + { + delete[] _buffer; + _buffer = NULL; + _bufferSize = 0; + } + + if (_errorMessage != NULL) + { + delete[] _errorMessage; + _errorMessage = NULL; + } + + // Just in case ... + closeSocket(); + + return; +} // end of TcpConnection::~TcpConnection() + +//--------------------------------------------------------------- +// passiveOpen(unsigned short) (Protected) +// Open a server socket. +// +void TcpConnection::passiveOpen(unsigned short port) +{ +#ifdef CRTP + PassiveOpen(port); +#else + _fsm.PassiveOpen(port); +#endif + return; +} // end of TcpConnection::passiveOpen(unsigned short) + +//--------------------------------------------------------------- +// activeOpen(const sockaddr_in&) (Protected) +// Open a client socket. +// +void TcpConnection::activeOpen(const sockaddr_in& address) +{ +#ifdef CRTP + ActiveOpen(&address); +#else + _fsm.ActiveOpen(&address); +#endif + return; +} // end of TcpConnection::activeOpen(const sockaddr_in&) + +//--------------------------------------------------------------- +// acceptOpen(const TcpSegment&) (Protected) +// "Open" an accepted client connection. +// +void TcpConnection::acceptOpen(const TcpSegment& segment) +{ +#ifdef CRTP + AcceptOpen(segment); +#else + _fsm.AcceptOpen(segment); +#endif + return; +} // end of TcpConnection::acceptOpen(const TcpSegment&) + +//--------------------------------------------------------------- +// expandBuffer() (Private) +// Expand the buffer's current size by one block. +// +void TcpConnection::expandBuffer() +{ + char *newBuffer; + int newSize, + currBlocks; + + currBlocks = _bufferSize / BUFFER_BLOCK_SIZE; + newSize = (currBlocks + 1) * BUFFER_BLOCK_SIZE; + newBuffer = new char[newSize]; + + // If the current buffer has data in it, copy it over to the + // new buffer before deleting the current buffer. + if (_buffer != NULL) + { + (void) memcpy(newBuffer, _buffer, _bufferSize); + delete[] _buffer; + } + + _buffer = newBuffer; + _bufferSize = newSize; + + return; +} // end of TcpConnection::expandBuffer() + +#if defined(WIN32) +//--------------------------------------------------------------- +// doBind(int) const (Private) +// Bind this UDP socket to a random, available port number. +// +int TcpConnection::doBind(int handle) const +{ + sockaddr_in address; + unsigned short portIt; + int socket_error, + retval; + + // Set up this client's address. + (void) memset(&address, 0, sizeof(address)); + address.sin_family = AF_INET; + address.sin_port = 0; + address.sin_addr.s_addr = INADDR_ANY; + + // Start at the largest number and work down. + for (portIt = MIN_PORT; portIt <= MAX_PORT; ++portIt) + { + address.sin_port = htons(portIt); + if (bind(handle, (sockaddr *) &address, sizeof(sockaddr_in)) + == SOCKET_ERROR) + { + socket_error = WSAGetLastError(); + if (socket_error != WSAEADDRINUSE && + socket_error != WSAEADDRNOTAVAIL) + { + retval = -1; + break; + } + } + else + { + // The bind worked. Return the port number. + retval = address.sin_port; + break; + } + } + + return(retval); +} // end of TcpConnection::doBind(int) const +#else +//--------------------------------------------------------------- +// getLocalPort(int) const (Private) +// Figure out the UDP socket's port number. +// +unsigned short TcpConnection::getLocalPort(int fd) const +{ + socklen_t size; + sockaddr_in address; + unsigned short retval; + + size = sizeof(address); + if (getsockname(fd, + reinterpret_cast(&address), + &size) < 0) + { + retval = 0xffff; + } + else + { + retval = address.sin_port; + } + + return(retval); +} // end of TcpConnection::getLocalPort(int) const +#endif + +//--------------------------------------------------------------- +// getLocalAddress() const (Private) +// Return this machine's local internet address. Do this by +// first retrieving the hostname and then doing gethostbyname() +// on itself. +// +unsigned long TcpConnection::getLocalAddress() const +{ + char hostname[MAX_HOSTNAME_LEN]; + hostent *hostEntry; + unsigned long retval; + + // 1. Get this machine's network host name. +#if defined(__sun) + (void) sysinfo(SI_HOSTNAME, hostname, MAX_HOSTNAME_LEN); +#else + (void) gethostname(hostname, MAX_HOSTNAME_LEN); +#endif + + // 2. Get this host name's address. + if ((hostEntry = gethostbyname(hostname)) != NULL) + { + (void) memcpy(&retval, + hostEntry->h_addr, + hostEntry->h_length); + } + else + { + // If there is no known address for this host name, + // default to 127.0.0.1. + retval = LOCAL_HOST_ADDRESS; + } + + return(retval); +} // end of TcpConnection::getLocalAddress() const + +//--------------------------------------------------------------- +// getAck(const TcpSegment&) (Private) +// Figure out what the acknowledgement number should be based on +// the TCP segment's type and size. +// +int TcpConnection::getAck(const TcpSegment& segment) +{ + int retval; + + // The ack # depends on the segment's flags. + switch (segment.getFlags()) + { + case TcpSegment::FIN: + case TcpSegment::SYN: + case TcpSegment::FIN_ACK: + case TcpSegment::SYN_ACK: + retval = segment.getSequenceNumber() + 1; + break; + + case TcpSegment::PSH: + case TcpSegment::PSH_ACK: + retval = segment.getSequenceNumber() + + segment.getDataSize(); + break; + + case TcpSegment::ACK: + default: + retval = segment.getSequenceNumber(); + break; + } + + return(retval); +} // end of TcpConnection::getAck(const TcpSegment&) diff --git a/FSM/samples/TCP/TcpConnection.h b/FSM/samples/TCP/TcpConnection.h new file mode 100644 index 000000000..a375c127c --- /dev/null +++ b/FSM/samples/TCP/TcpConnection.h @@ -0,0 +1,237 @@ +#ifndef _H_TCPCONNECTION +#define _H_TCPCONNECTION + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TcpConnection.h +// +// Description +// TCP connection class header. +// +// RCS ID +// $Id: TcpConnection.h,v 1.6 2015/08/02 19:44:35 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TcpConnection.h,v $ +// Revision 1.6 2015/08/02 19:44:35 cwrapp +// Release 6.6.0 commit. +// +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:40:45 charlesr +// Initial revision +// + +#include +#if defined(WIN32) +#include +#else +#include +#endif +#include "TcpSegment.h" +#include "TcpConnection_sm.h" +#include "TcpConnectionListener.h" +#include "InputListener.h" +#include "TimerListener.h" + +class TcpConnection : + /* implements */ public InputListener, + /* implements */ public TimerListener +#ifdef CRTP + /* extends */ , public TcpConnectionContext +#endif +{ +// Member functions. + public: + + virtual ~TcpConnection(); + + // Return the far-end's 4-byte IP address. + unsigned long getFarAddress() const; + + // Return the far-end's TCP port. + unsigned short getFarPort() const; + + // Return the current sequence number. + unsigned long getSequenceNumber() const; + + // Send the raw bytes to the far end client socket. + void transmit(const char *data, + int offset, + int size); + + // Start closing this connection. + void doClose(); + + // Set an accepted client socket's listener. + void setListener(TcpConnectionListener& listener); + + // Socket event handling methods. + void handleReceive(int fd); + void handleTimeout(const char *name); + + //----------------------------------------------------------- + // State Machine Actions + // + void openServerSocket(unsigned short port); + void openClientSocket(const sockaddr_in *address); + void openSuccess(); + void openFailed(const char *reason); + void closeSocket(); + void halfClosed(); + void closed(const char *reason); + void clearListener(); + void transmitted(); + void transmitFailed(const char *reason); + void receive(const TcpSegment& segment); + void sendOpenSyn(const sockaddr_in *address); + void accept(const TcpSegment& segment); + void accepted(); + void sendSynAck(const TcpSegment& segment); + void sendSynAckAck(const TcpSegment& segment); + void doSend(unsigned short flags, + const char *data, + int offset, + int size, + const TcpSegment *recv_segment); + void startTimer(const char *name, time_t time); + void stopTimer(const char *name); + void setNearAddress(); + void setFarAddress(const TcpSegment& segment); + void deleteSegment(const TcpSegment& segment); + + protected: + + // Server and active client socket constructor. + TcpConnection(TcpConnectionListener& listener); + + // "Accepted" socket constructor. + TcpConnection(const sockaddr_in& near_address, + const sockaddr_in& far_address, +#if defined(WIN32) + unsigned short actual_port, + SOCKET udp_socket, + HANDLE udp_handle, +#else + int udp_socket, +#endif + int sequence_number, + TcpServer& server, + TcpConnectionListener& listener); + + // Open a server socket. + void passiveOpen(unsigned short port); + + // Open a client socket. + void activeOpen(const sockaddr_in& address); + + // An accepted client socket. + void acceptOpen(const TcpSegment& segment); + + private: + + // Copy construction and assignment not allowed. + TcpConnection(const TcpConnection&); + const TcpConnection& operator=(const TcpConnection&); + + // Increase the buffer's size. + void expandBuffer(); + +#if defined(WIN32) + // Windows doesn't bind UDP sockets to random ports + // correctly. So this app has to do it itself. + int doBind(int handle) const; +#else + // Return the UDP socket's port. + unsigned short getLocalPort(int fd) const; +#endif + + // Return this machine's address. + unsigned long getLocalAddress() const; + + // Return the expected ack number for the given segment. + int getAck(const TcpSegment& segment); + +// Member data. + public: + + // Constants. + // Initial Sequence Number. + const static unsigned long ISN; + + // Minimum timeout is 1 millisecond. + const static int MIN_TIMEOUT; + + // Wait only so long for an ACK (in milliseconds). + const static int ACK_TIMEOUT; + + // Wait a while before reusing this port (in milliseconds). + const static int CLOSE_TIMEOUT; + + // Allocate the input buffer using this block size. + const static int BUFFER_BLOCK_SIZE; + + protected: + + // Send TCP events to this listener. + TcpConnectionListener *_listener; + + // Connected to this address. + sockaddr_in _farAddress; + + // This socket's address. + sockaddr_in _nearAddress; + +#if defined(WIN32) + // This socket's actual port number. + unsigned short _actualPort; +#endif + + private: + +#if defined(WIN32) + SOCKET _udp_win_socket; +#endif + int _udp_socket; + unsigned long _sequence_number; + + // Read data into the following buffer. + char *_buffer; + int _bufferSize; + + // The server which accepted this connection. Will only be + // set if this is an "accepted" client connection. + TcpServer *_server; + + // Store failure messages here. + char *_errorMessage; + +#ifndef CRTP + TcpConnectionContext _fsm; +#endif +}; + +#endif diff --git a/FSM/samples/TCP/TcpConnectionListener.h b/FSM/samples/TCP/TcpConnectionListener.h new file mode 100644 index 000000000..e77f0a39b --- /dev/null +++ b/FSM/samples/TCP/TcpConnectionListener.h @@ -0,0 +1,81 @@ +#ifndef _H_TCPCONNECTIONLISTENER +#define _H_TCPCONNECTIONLISTENER + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TcpConnectionListener.h +// +// Description +// TCP connection connection callback handler. +// +// RCS ID +// $Id: TcpConnectionListener.h,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TcpConnectionListener.h,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:41:24 charlesr +// Initial revision +// + +// Forward declarations. +class TcpConnection; +class TcpClient; +class TcpServer; + +class TcpConnectionListener +{ +// Member functions. +public: + + virtual ~TcpConnectionListener() + {}; + + virtual void opened(TcpConnection& connection)=0; + virtual void openFailed(const char *reason, + TcpConnection& connection)=0; + virtual void halfClosed(TcpConnection& connection)=0; + virtual void closed(const char *reason, + TcpConnection& connection)=0; + virtual void transmitted(TcpConnection& connection)=0; + virtual void transmitFailed(const char *reason, + TcpConnection& connection)=0; + virtual void receive(const char *data, + int size, + TcpConnection& connection)=0; + virtual void accepted(TcpClient& client, TcpServer& server)=0; + +protected: +private: + +// Member data. +public: +protected: +private: +}; + +#endif diff --git a/FSM/samples/TCP/TcpSegment.cpp b/FSM/samples/TCP/TcpSegment.cpp new file mode 100644 index 000000000..50d194006 --- /dev/null +++ b/FSM/samples/TCP/TcpSegment.cpp @@ -0,0 +1,471 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TcpSegment.cpp +// +// Description +// Converts between raw bytes and segment objects. +// +// RCS ID +// $Id: TcpSegment.cpp,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TcpSegment.cpp,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:41:38 charlesr +// Initial revision +// + +#include "TcpSegment.h" +#include +#include +#include +#if !defined(WIN32) +#include +#include +#endif + +using namespace std; + +// Static member data declarations. +const int TcpSegment::TCP_HEADER_SIZE = 16; + +//--------------------------------------------------------------- +// TcpSegment(const sockaddr_in&, ...) (Public) +// Create an outbound segment. +// +TcpSegment::TcpSegment(const sockaddr_in& source_address, + const sockaddr_in& destination_address, + unsigned long sequence_number, + unsigned long ack_number, + unsigned short flags, + const char *data, + int offset, + int size) +{ + (void) memcpy(&_src_address, + &source_address, + sizeof(source_address)); + (void) memcpy(&_dest_address, + &destination_address, + sizeof(destination_address)); + _sequence_number = sequence_number; + _ack_number = ack_number; + _flags = flags; + + // Copy the data. + _data = new char[size]; + _data_size = size; + (void) memcpy(_data, (data + offset), size); + + return; +} // end of TcpSegment::TcpSegment(const sockaddr_in&, ...) + +//--------------------------------------------------------------- +// TcpSegment(const sockaddr_in&, ...) (Public) +// Create an inbound segment. +// +TcpSegment::TcpSegment(const sockaddr_in& source_address, + const sockaddr_in& dest_address, + const char *data, + int) +{ + unsigned short srcPort; + unsigned short destPort; + unsigned long sequence; + unsigned long ack; + unsigned short flags; + unsigned short data_size; + + srcPort = ((((unsigned short) data[ 0]) & 0x00ff) << 8) | + (((unsigned short) data[ 1]) & 0x00ff); + destPort = ((((unsigned short) data[ 2]) & 0x00ff) << 8) | + (((unsigned short) data[ 3]) & 0x00ff); + sequence = ((((unsigned long) data[ 4]) & 0x000000ff) << 24) | + ((((unsigned long) data[ 5]) & 0x000000ff) << 16) | + ((((unsigned long) data[ 6]) & 0x000000ff) << 8) | + (((unsigned long) data[ 7]) & 0x000000ff); + ack = ((((unsigned long) data[ 8]) & 0x000000ff) << 24) | + ((((unsigned long) data[ 9]) & 0x000000ff) << 16) | + ((((unsigned long) data[10]) & 0x000000ff) << 8) | + (((unsigned long) data[11]) & 0x000000ff); + flags = ((((unsigned short) data[12]) & 0x00ff) << 8) | + (((unsigned short) data[13]) & 0x00ff); + data_size = ((((unsigned short) data[14]) & 0x00ff) << 8) | + (((unsigned short) data[15]) & 0x00ff); + + // Set the source address. + _src_address.sin_family = AF_INET; + _src_address.sin_port = ntohs(srcPort); + _src_address.sin_addr.s_addr = source_address.sin_addr.s_addr; + + // Set the destination address. + _dest_address.sin_family = AF_INET; + _dest_address.sin_port = ntohs(destPort); + _dest_address.sin_addr.s_addr = dest_address.sin_addr.s_addr; + + _sequence_number = sequence; + _ack_number = ack; + _flags = flags; + _data_size = data_size; + + + if (_data_size == 0) + { + _data = NULL; + } + else + { + _data = new char[_data_size]; + (void) memcpy(_data, + &(data[TCP_HEADER_SIZE]), + _data_size); + } + + return; +} // end of TcpSegment::TcpSegment(const char*, int) + +//--------------------------------------------------------------- +// ~TcpSegment() (Public) +// Destructor. +// +TcpSegment::~TcpSegment() +{ + if (_data != NULL) + { + delete[] _data; + _data = NULL; + _data_size = 0; + } +} // end of TcpSegment::~TcpSegment() + +//--------------------------------------------------------------- +// getSource() const (Public) +// Return segment's source address. +// +const sockaddr_in& TcpSegment::getSource() const +{ + return(_src_address); +} // end of TcpSegment::getSource() const + +//--------------------------------------------------------------- +// getDestination() const (Public) +// Return segment's destination address. +// +const sockaddr_in& TcpSegment::getDestination() const +{ + return(_dest_address); +} // end of TcpSegment::getDestination() const + +//--------------------------------------------------------------- +// getSrcAddress() const (Public) +// Return the segment's source address. +// +unsigned long TcpSegment::getSrcAddress() const +{ + return (_src_address.sin_addr.s_addr); +} // end of TcpSegment::getSrcAddress() const + +//--------------------------------------------------------------- +// getSrcPort() const (Public) +// Return the segment's source port. +// +unsigned short TcpSegment::getSrcPort() const +{ + return (_src_address.sin_port); +} // end of TcpSegment::getSrcPort() const + +//--------------------------------------------------------------- +// getDestAddress() const (Public) +// Return the segment's destination address. +// +unsigned long TcpSegment::getDestAddress() const +{ + return (_dest_address.sin_addr.s_addr); +} // end of TcpSegment::getDestAddress() const + +//--------------------------------------------------------------- +// getDestPort() const (Public) +// Return the segment's destination port. +// +unsigned short TcpSegment::getDestPort() const +{ + return (_dest_address.sin_port); +} // end of TcpSegment::getDestPort() const + +//--------------------------------------------------------------- +// getSequenceNumber() const (Public) +// Return segment's sequence number. +// +unsigned long TcpSegment::getSequenceNumber() const +{ + return(_sequence_number); +} // end of TcpSegment::getSequenceNumber() const + +//--------------------------------------------------------------- +// getAcknowledgeNumber() const (Public) +// Return segment's acknowledge number. +// +unsigned long TcpSegment::getAcknowledgeNumber() const +{ + return(_ack_number); +} // end of TcpSegment::getAcknowledgeNumber() const + +//--------------------------------------------------------------- +// getFlags() const (Public) +// Return segment's flags. +// +unsigned short TcpSegment::getFlags() const +{ + return(_flags); +} // end of TcpSegment::getFlags() const + +//--------------------------------------------------------------- +// getDataSize() const (Public) +// Return segment's data size. +// +int TcpSegment::getDataSize() const +{ + return(_data_size); +} // end of TcpSegment::getDataSize() const + +//--------------------------------------------------------------- +// getData() const (Public) +// Return segment's data. +// +const char* TcpSegment::getData() const +{ + return(_data); +} // end of TcpSegment::getData() const + +//--------------------------------------------------------------- +// packetize(char*&, int&) (Public) +// Convert this TCP segment into raw bytes. +// +void TcpSegment::packetize(char*& data, int& size) +{ + unsigned short srcPort; + unsigned short destPort; + unsigned long sequence; + unsigned long ack; + unsigned short flags; + unsigned short data_size; + + // The segment's size is the TCP header size + data size. + // (TCP options are *not* supported). + size = TCP_HEADER_SIZE + _data_size; + + data = new char[size]; + + // Get data in network byte order. + srcPort = htons(_src_address.sin_port); + destPort = htons(_dest_address.sin_port); + sequence = _sequence_number; + ack = _ack_number; + flags = _flags; + data_size = _data_size; + + // Fill in the TCP header. + data[ 0] = (char) (( srcPort & 0xff00) >> 8); + data[ 1] = (char) ( srcPort & 0x00ff); + data[ 2] = (char) (( destPort & 0xff00) >> 8); + data[ 3] = (char) ( destPort & 0x00ff); + data[ 4] = (char) (( sequence & 0xff000000) >> 24); + data[ 5] = (char) (( sequence & 0x00ff0000) >> 16); + data[ 6] = (char) (( sequence & 0x0000ff00) >> 8); + data[ 7] = (char) ( sequence & 0x000000ff); + data[ 8] = (char) (( ack & 0xff000000) >> 24); + data[ 9] = (char) (( ack & 0x00ff0000) >> 16); + data[10] = (char) (( ack & 0x0000ff00) >> 8); + data[11] = (char) ( ack & 0x000000ff); + data[12] = (char) (( flags & 0xff00) >> 8); + data[13] = (char) ( flags & 0x00ff); + data[14] = (char) ((data_size & 0xff00) >> 8); + data[15] = (char) (data_size & 0x00ff); + + // Copy in the data. + if (_data_size > 0) + { + (void) memcpy((data + TCP_HEADER_SIZE), + _data, + _data_size); + } + + return; +} // end of TcpSegment::packetize(char&*, int&) + +//--------------------------------------------------------------- +// flagsToString(unsigned short) (Static Private) +// Make a string representation of the TCP header flags. +// +char* TcpSegment::flagsToString(unsigned short flags) +{ + char separator[3] = "{"; + char *retval; + char *cptr; + + (void) strcpy(separator, "{"); + retval = new char[31]; + (void) memset(retval, 0, 31); + cptr = retval; + if ((flags & FIN) == FIN) + { + (void) strcpy(cptr, separator); + cptr += strlen(separator); + (void) strcpy(cptr, "FIN"); + cptr += 3; + (void) strcpy(separator, ", "); + } + + if ((flags & SYN) == SYN) + { + (void) strcpy(cptr, separator); + cptr += strlen(separator); + (void) strcpy(cptr, "SYN"); + cptr += 3; + (void) strcpy(separator, ", "); + } + + if ((flags & RST) == RST) + { + (void) strcpy(cptr, separator); + cptr += strlen(separator); + (void) strcpy(cptr, "RST"); + cptr += 3; + (void) strcpy(separator, ", "); + } + + if ((flags & PSH) == PSH) + { + (void) strcpy(cptr, separator); + cptr += strlen(separator); + (void) strcpy(cptr, "PSH"); + cptr += 3; + (void) strcpy(separator, ", "); + } + + if ((flags & ACK) == ACK) + { + (void) strcpy(cptr, separator); + cptr += strlen(separator); + (void) strcpy(cptr, "ACK"); + cptr += 3; + (void) strcpy(separator, ", "); + } + + if ((flags & URG) == URG) + { + (void) strcpy(cptr, separator); + cptr += strlen(separator); + (void) strcpy(cptr, "URG"); + cptr += 3; + } + + if ((flags & FLAG_MASK) == 0) + { + (void) strcpy(cptr, separator); + cptr += strlen(separator); + (void) strcpy(cptr, "UNK"); + cptr += 3; + } + + *cptr = '}'; + + return(retval); +} // end of TcpSegment::flagsToString(unsigned short) + +//--------------------------------------------------------------- +// addressToString(const sockaddr_in&) (Static Private) +// Generate a string representation of an IP address. +// +char* TcpSegment::addressToString(const sockaddr_in& address) +{ + struct hostent *hostEntry; + char *dotted_addr; + char port[6]; + char *retval; + char *cptr; + unsigned short udp_port; + + retval = new char[512]; + (void) memset(retval, 0, 512); + cptr = retval; + hostEntry = gethostbyaddr((char *) &(address.sin_addr), + sizeof(address.sin_addr), + AF_INET); + (void) strcpy(cptr, + (hostEntry == NULL ? + "" : + hostEntry->h_name)); + cptr += strlen(cptr); + *cptr++ = '('; + dotted_addr = inet_ntoa(address.sin_addr); + (void) strcpy(cptr, dotted_addr); + cptr += strlen(dotted_addr); + (void) strcpy(cptr, "):"); + cptr += 2; + udp_port = ntohs(address.sin_port); + sprintf(port, "%d", udp_port); + (void) strcpy(cptr, port); + + return(retval); +} // end of TcpSegment::addressToString(const sockaddr_in&) + +//--------------------------------------------------------------- +// operator<<(ostream&, const TcpSegment&) (Routine) +// Print this segment out to the stream. +// +ostream& operator<<(ostream& stream, const TcpSegment& segment) +{ + char *srcAddrStr, + *destAddrStr, + *flagStr; + + srcAddrStr = TcpSegment::addressToString(segment._src_address); + destAddrStr = TcpSegment::addressToString(segment._dest_address); + flagStr = TcpSegment::flagsToString(segment._flags); + + stream << "\t Source: " + << srcAddrStr + << "\n\t Destination: " + << destAddrStr + << "\n\t Sequence #: " + << segment._sequence_number + << "\n\tAcknowledge #: " + << segment._ack_number + << "\n\t Flags: " + << flagStr + << " (0x" + << ios::hex << segment._flags << ios::dec << ")" + << "\n\t Data size: " + << segment._data_size; + + delete[] srcAddrStr; + delete[] destAddrStr; + delete[] flagStr; + + return(stream); +} // end of operator<<(ostream&, const TcpSegment&) diff --git a/FSM/samples/TCP/TcpSegment.h b/FSM/samples/TCP/TcpSegment.h new file mode 100644 index 000000000..d7a4829d8 --- /dev/null +++ b/FSM/samples/TCP/TcpSegment.h @@ -0,0 +1,145 @@ +#ifndef _H_TCPSEGMENT +#define _H_TCPSEGMENT + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TcpSegment.h +// +// Description +// All TCP transmissions are put into a segment. +// +// RCS ID +// $Id: TcpSegment.h,v 1.6 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TcpSegment.h,v $ +// Revision 1.6 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.5 2005/06/08 11:09:12 cwrapp +// + Updated Python code generator to place "pass" in methods with empty +// bodies. +// + Corrected FSM errors in Python example 7. +// + Removed unnecessary includes from C++ examples. +// + Corrected errors in top-level makefile's distribution build. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:41:54 charlesr +// Initial revision +// + +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#include +#include +#include +#elif defined(WIN32) +#include +#include +#else +#include +#include +#include +#endif + +class TcpSegment +{ +// Member functions. +public: + + TcpSegment(const sockaddr_in& source_address, + const sockaddr_in& destination_address, + unsigned long sequence_number, + unsigned long ack_number, + unsigned short flags, + const char *data, + int offset, + int size); + + // Convert the raw bytes into a segment. + TcpSegment(const sockaddr_in& source_address, + const sockaddr_in& dest_address, + const char *data, + int size); + + // Destructor. + ~TcpSegment(); + + const sockaddr_in& getSource() const; + const sockaddr_in& getDestination() const; + unsigned long getSrcAddress() const; + unsigned short getSrcPort() const; + unsigned long getDestAddress() const; + unsigned short getDestPort() const; + unsigned long getSequenceNumber() const; + unsigned long getAcknowledgeNumber() const; + unsigned short getFlags() const; + int getDataSize() const; + const char* getData() const; + + // Convert this segment into raw bytes. + void packetize(char*& data, int& size); + + friend std::ostream& operator<<(std::ostream& stream, + const TcpSegment& segment); + + protected: + private: + + static char* flagsToString(unsigned short flags); + static char* addressToString(const sockaddr_in& address); + +// Member data. + public: + + enum TcpHeaderFlags + { + NONE= 0x00, + FIN = 0x01, + SYN = 0x02, + RST = 0x04, + PSH = 0x08, + ACK = 0x10, + URG = 0x20, + FIN_ACK = 0x11, + SYN_ACK = 0x12, + RST_ACK = 0x14, + PSH_ACK = 0x18, + FLAG_MASK = 0x3f + }; + + static const int TCP_HEADER_SIZE; + + protected: + private: + + sockaddr_in _src_address; + sockaddr_in _dest_address; + unsigned long _sequence_number; + unsigned long _ack_number; + unsigned short _flags; + char *_data; + int _data_size; +}; + +#endif diff --git a/FSM/samples/TCP/TcpServer.cpp b/FSM/samples/TCP/TcpServer.cpp new file mode 100644 index 000000000..61f3384ac --- /dev/null +++ b/FSM/samples/TCP/TcpServer.cpp @@ -0,0 +1,85 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TcpServer.cpp +// +// Description +// TCP server connection class implementation. +// +// RCS ID +// $Id: TcpServer.cpp,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TcpServer.cpp,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:43:00 charlesr +// Initial revision +// + +#include "TcpServer.h" + +//--------------------------------------------------------------- +// TcpServer(TcpConnectionListener&) (Public) +// Create a TCP service object. +// +TcpServer::TcpServer(TcpConnectionListener& listener) +: TcpConnection(listener) +{} + +//--------------------------------------------------------------- +// ~TcpServer() (Public) +// Destructor. +// +TcpServer::~TcpServer() +{} + +//--------------------------------------------------------------- +// getPort() const (Public) +// Return this service's TCP port. +// +unsigned short TcpServer::getPort() const +{ + return(_nearAddress.sin_port); +} // end of TcpServer::getPort() const + +//--------------------------------------------------------------- +// getAddress() const (Public) +// Return this service's IP address. +// +unsigned long TcpServer::getAddress() const +{ + return(_nearAddress.sin_addr.s_addr); +} // end of TcpServer::getAddress() const + +//--------------------------------------------------------------- +// open(unsigned short) (Public) +// Open this TCP service. +// +void TcpServer::open(unsigned short port) +{ + passiveOpen(port); + return; +} // end of TcpServer::open(unsigned short) diff --git a/FSM/samples/TCP/TcpServer.h b/FSM/samples/TCP/TcpServer.h new file mode 100644 index 000000000..878d20f05 --- /dev/null +++ b/FSM/samples/TCP/TcpServer.h @@ -0,0 +1,77 @@ +#ifndef _H_TCPSERVER +#define _H_TCPSERVER + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TcpServer.h +// +// Description +// TCP server connection class header. +// +// RCS ID +// $Id: TcpServer.h,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TcpServer.h,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:43:20 charlesr +// Initial revision +// + +#include "TcpConnection.h" + +class TcpServer: public TcpConnection +{ +// Member functions. +public: + + // Create a TCP service. + TcpServer(TcpConnectionListener& listener); + + // Destructor. + ~TcpServer(); + + // Return the TCP service's port. + unsigned short getPort() const; + + // Return the TCP service's address. + unsigned long getAddress() const; + + // Open the TCP service. + void open(unsigned short port); + +protected: +private: + +// Member data. +public: +protected: +private: + +}; + +#endif diff --git a/FSM/samples/TCP/TimerListener.h b/FSM/samples/TCP/TimerListener.h new file mode 100644 index 000000000..19d4922dd --- /dev/null +++ b/FSM/samples/TCP/TimerListener.h @@ -0,0 +1,68 @@ +#ifndef _H_TIMERLISTENER +#define _H_TIMERLISTENER + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TimerListener.h +// +// Description +// Timer event handler. +// +// RCS ID +// $Id: TimerListener.h,v 1.5 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: TimerListener.h,v $ +// Revision 1.5 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:43:36 charlesr +// Initial revision +// + +class TimerListener +{ +// Member functions. +public: + + // Default constructor. + TimerListener() {}; + + // Destructor. + virtual ~TimerListener() {}; + + // Input callback method. + virtual void handleTimeout(const char *name)=0; + +protected: +private: + +// Member data. +public: +protected: +private: +}; + +#endif diff --git a/FSM/samples/TCP/client.cpp b/FSM/samples/TCP/client.cpp new file mode 100644 index 000000000..7a33db575 --- /dev/null +++ b/FSM/samples/TCP/client.cpp @@ -0,0 +1,277 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// File +// client.cpp +// +// Description +// Encapsulates "TCP" client connection. +// +// RCS ID +// $Id: client.cpp,v 1.6 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: client.cpp,v $ +// Revision 1.6 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.5 2005/06/08 11:09:12 cwrapp +// + Updated Python code generator to place "pass" in methods with empty +// bodies. +// + Corrected FSM errors in Python example 7. +// + Removed unnecessary includes from C++ examples. +// + Corrected errors in top-level makefile's distribution build. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:43:52 charlesr +// Initial revision +// + +#include "Eventloop.h" +#include "AppClient.h" +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#include +#include +#include +#elif defined(WIN32) +#include +#else +#include +#include +#include +#endif +#include +#include + +using namespace std; + +#ifndef WIN32 +#ifndef SA_NOMASK +#define SA_NOMASK 0 +#endif +#endif + +// Global variable declarations. +Eventloop *Gevent_loop; + +// Static variable declarations. +static AppClient *Sclient_socket; + +// Constant declarations. +const static int STDIN_FD = 0; +#ifndef INADDR_NONE +const static unsigned long INADDR_NONE = 0xffffffff; +#endif + +#if defined(WIN32) +char* winsock_strerror(int); +#endif + +//--------------------------------------------------------------- +// main(int, char**) (Routine) +// Process the command line arguments, open the TCP service and +// then sit in the event loop. Stop running when the Enter key +// is hit. +// +int main(int argc, char *argv[]) +{ + int longPort; + unsigned long ip_address = INADDR_ANY; + sockaddr_in address; + int retcode; +#if defined(WIN32) + WORD winsockVersion; + WSADATA winsockData; + int errorCode; +#else + struct sigaction signalAction; +#endif + + // External routine declarations. + unsigned long getIPAddress(const char*); + void sigintHandler(int); +#if defined(WIN32) + char* winsock_strerror(int); +#endif + +#ifdef WIN32 + // Windows kinda supports signals. + (void) signal(SIGINT, sigintHandler); +#else + // Set up the SIGINT handler. + signalAction.sa_handler = sigintHandler; +#if defined(__hpux) || defined (__linux__) + sigemptyset(&signalAction.sa_mask); +#if defined(__linux__) + signalAction.sa_restorer = NULL; +#endif +#endif + signalAction.sa_flags = SA_NOMASK; + if (sigaction(SIGINT, + &signalAction, + (struct sigaction *) NULL) != 0) + { + cerr << "Unable to set SIGINT handling function." << endl; + exit(1); + } +#endif + +#if defined(WIN32) + // Initialize winsock. + winsockVersion = MAKEWORD(2, 0); + if ((errorCode = WSAStartup(winsockVersion, &winsockData)) != 0) + { + cout << "Unable to initialize Win32 sockets - " + << winsock_strerror(errorCode) + << "." + << endl; + exit(2); + } +#endif + + if (argc != 3) + { + cerr << argv[0] + << ": Wrong number of arguments." + << endl; + cerr << "usage: client {hostname | IP address} port" << endl; + retcode = 1; + } + // Check the port's validity. + else if (sscanf(argv[2], "%d", &longPort) != 1 || + longPort < 0 || + longPort > 65535) + { + cerr << "Invalid port number - \"" + << argv[2] + << "\"." + << endl; + retcode = 2; + } + // Check the address' validity. + else if ((ip_address = getIPAddress(argv[1])) == INADDR_NONE) + { + cerr << "Invalid host - \"" + << argv[1] + << "\"." + << endl; + retcode = 3; + } + else + { + string host(argv[1]); + unsigned short port; + + // Set up the service address. + (void) memset(&address, 0, sizeof(address)); + address.sin_family = AF_INET; + port = static_cast(longPort); + address.sin_port = htons(port); + address.sin_addr.s_addr = ip_address; + + cout << "(Starting execution. Hit \"Cntl-c\" to stop.)" << endl; + + // 1. Create the event loop object. + Gevent_loop = new Eventloop(); + + // 2. Open server port. + Sclient_socket = new AppClient(); + Sclient_socket->open(host, address); + + // 3. Start connection process. + Gevent_loop->start(); + + cout << "(Stopping execution.)" << endl; + + // 4. Close connection. + delete Sclient_socket; + Sclient_socket = NULL; + + // Delete the event loop. + delete Gevent_loop; + Gevent_loop = NULL; + +#if defined(WIN32) + WSACleanup(); +#endif + + retcode = 0; + } + + return(retcode); +} // end of main(int, char**) + +//--------------------------------------------------------------- +// socketClosed() (Routine) +// The server socket is closed. Stop the application. +// +void socketClosed() +{ + Gevent_loop->stop(); + return; +} // end of socketClosed() + +//--------------------------------------------------------------- +// getIPAddress(const char*) (Routine) +// Convert a host name or dotted-decimal notation address into +// an IP address. +// +unsigned long getIPAddress(const char *host) +{ + hostent *host_entry = NULL; + unsigned long retcode; + + // First try to convert host name as a dotted-decimal + // notation. If that fails, try gethostbyname(). + if ((retcode = inet_addr(host)) == INADDR_NONE && + (host_entry = gethostbyname(host)) == NULL) + { + // Failed to convert host name into IP address. + retcode = INADDR_NONE; + } + else if (host_entry != NULL) + { + (void) memcpy(&retcode, + host_entry->h_addr, + host_entry->h_length); + } + + return(retcode); +} // end of getIPAddress(const char*) + +//--------------------------------------------------------------- +// sigintHandler(int) (Routine) +// When an interrupt is detected, start shutting down the +// connection. +// +void sigintHandler(int) +{ + Sclient_socket->close(); + +#ifdef WIN32 + // Windows removes the SIGINT callback. So put + // the callback back in place. + (void) signal(SIGINT, sigintHandler); +#endif + + return; +} // end of sigintHandler(int) diff --git a/FSM/samples/TCP/server.cpp b/FSM/samples/TCP/server.cpp new file mode 100644 index 000000000..5bfb375f5 --- /dev/null +++ b/FSM/samples/TCP/server.cpp @@ -0,0 +1,209 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2007. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Function +// Main +// +// Description +// Encapsulates "TCP" server connection, accepting new client connections. +// +// RCS ID +// $Id: server.cpp,v 1.6 2007/12/28 12:34:40 cwrapp Exp $ +// +// CHANGE LOG +// $Log: server.cpp,v $ +// Revision 1.6 2007/12/28 12:34:40 cwrapp +// Version 5.0.1 check-in. +// +// Revision 1.5 2005/06/08 11:09:12 cwrapp +// + Updated Python code generator to place "pass" in methods with empty +// bodies. +// + Corrected FSM errors in Python example 7. +// + Removed unnecessary includes from C++ examples. +// + Corrected errors in top-level makefile's distribution build. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:44:25 charlesr +// Initial revision +// + +#include "Eventloop.h" +#include "AppServer.h" +#include + +using namespace std; + +#ifndef WIN32 +#if !defined(SA_NOMASK) +#define SA_NOMASK 0 +#endif +#endif + +// Global variable declarations. +Eventloop *Gevent_loop; + +// Static variable declarations. +static AppServer *Sserver_socket; + +// Constant declarations. +const static int STDIN_FD = 0; + +//--------------------------------------------------------------- +// main(int, char**) (Routine) +// Process the command line arguments, open the TCP service and +// then sit in the event loop. Stop running when the Enter key +// is hit. +// +int main(int argc, char *argv[]) +{ + int longPort; + int retcode; +#if defined(WIN32) + WORD winsockVersion; + WSADATA winsockData; + int errorCode; +#else + struct sigaction signalAction; +#endif + + // External routine declarations. + void sigintHandler(int); +#if defined(WIN32) + char* winsock_strerror(int); +#endif + +#ifdef WIN32 + // Windows kinda supports signals. + (void) signal(SIGINT, sigintHandler); +#else + // Set up the SIGINT handler. + signalAction.sa_handler = sigintHandler; +#if defined(__hpux) || defined (__linux__) + sigemptyset(&signalAction.sa_mask); +#if defined(__linux__) + signalAction.sa_restorer = NULL; +#endif +#endif + signalAction.sa_flags = SA_NOMASK; + if (sigaction(SIGINT, + &signalAction, + (struct sigaction *) NULL) != 0) + { + cerr << "Unable to set SIGINT handling function." << endl; + exit(1); + } +#endif + +#if defined(WIN32) + // Initialize winsock. + winsockVersion = MAKEWORD(2, 0); + if ((errorCode = WSAStartup(winsockVersion, &winsockData)) != 0) + { + cout << "Unable to initialize Win32 sockets - " + << winsock_strerror(errorCode) + << "." + << endl; + exit(2); + } +#endif + + if (argc != 2) + { + cerr << argv[0] + << ": Wrong number of arguments." + << endl; + cerr << "usage: server port" << endl; + retcode = 1; + } + else if (sscanf(argv[1], "%d", &longPort) != 1 || + longPort < 0 || + longPort > 65535) + { + cerr << "Invalid port number - \"" + << argv[1] + << "\"." + << endl; + retcode = 2; + } + else + { + unsigned short port; + + cout << "(Starting execution. Hit \"Cntl-c\" to stop.)" << endl; + + // 1. Create the event loop object. + Gevent_loop = new Eventloop(); + + // 2. Open server port. + Sserver_socket = new AppServer(); + port = static_cast(longPort); + Sserver_socket->open(htons(port)); + + // 3. Wait for accept messages. + Gevent_loop->start(); + + cout << "(Stopping execution.)" << endl; + + // 4. Delete the TCP service. + delete Sserver_socket; + Sserver_socket = NULL; + + // 5. Delete the event loop. + delete Gevent_loop; + Gevent_loop = NULL; + +#if defined(WIN32) + WSACleanup(); +#endif + + retcode = 0; + } + + return(retcode); +} // end of main(int, char**) + +//--------------------------------------------------------------- +// socketClosed() (Routine) +// The server socket is closed. Stop the application. +// +void socketClosed() +{ + Gevent_loop->stop(); + return; +} // end of socketClosed() + +//--------------------------------------------------------------- +// sigintHandler(int) (Routine) +// When an interrupt is detected, stop execution. +// +void sigintHandler(int) +{ + Sserver_socket->close(); + +#ifdef WIN32 + // Windows removes the SIGINT callback. So put + // the callback back in place. + (void) signal(SIGINT, sigintHandler); +#endif + + return; +} // end of sigintHandler(int) diff --git a/FSM/samples/TCP/stdafx.cpp b/FSM/samples/TCP/stdafx.cpp new file mode 100644 index 000000000..cc787bcba --- /dev/null +++ b/FSM/samples/TCP/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : fichier source incluant simplement les fichiers Include standard +// TCP.pch représente l'en-tête précompilé +// stdafx.obj contient les informations de type précompilées + +#include "stdafx.h" + +// TODO: faites référence aux en-têtes supplémentaires nécessaires dans STDAFX.H +// absents de ce fichier diff --git a/FSM/samples/TCP/stdafx.h b/FSM/samples/TCP/stdafx.h new file mode 100644 index 000000000..16ac0befb --- /dev/null +++ b/FSM/samples/TCP/stdafx.h @@ -0,0 +1,15 @@ +// stdafx.h : fichier Include pour les fichiers Include système standard, +// ou les fichiers Include spécifiques aux projets qui sont utilisés fréquemment, +// et sont rarement modifiés +// + +#pragma once + +#include "targetver.h" + +#include +#include + + + +// TODO: faites référence ici aux en-têtes supplémentaires nécessaires au programme diff --git a/FSM/samples/TCP/targetver.h b/FSM/samples/TCP/targetver.h new file mode 100644 index 000000000..c8351ffde --- /dev/null +++ b/FSM/samples/TCP/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Si vous incluez SDKDDKVer.h, cela définit la dernière plateforme Windows disponible. + +// Si vous souhaitez générer votre application pour une plateforme Windows précédente, incluez WinSDKVer.h et +// définissez la macro _WIN32_WINNT à la plateforme que vous souhaitez prendre en charge avant d'inclure SDKDDKVer.h. + +#include diff --git a/FSM/samples/TCP/winsock_strerror.cpp b/FSM/samples/TCP/winsock_strerror.cpp new file mode 100644 index 000000000..ef5102860 --- /dev/null +++ b/FSM/samples/TCP/winsock_strerror.cpp @@ -0,0 +1,199 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2003 Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Function +// Main +// +// Description +// Encapsulates "TCP" server connection, accepting new client connections. +// +// RCS ID +// $Id: winsock_strerror.cpp,v 1.5 2009/03/01 18:20:38 cwrapp Exp $ +// +// CHANGE LOG +// $Log: winsock_strerror.cpp,v $ +// Revision 1.5 2009/03/01 18:20:38 cwrapp +// Preliminary v. 6.0.0 commit. +// +// Revision 1.4 2005/05/28 13:31:18 cwrapp +// Updated C++ examples. +// +// Revision 1.0 2003/12/14 19:44:45 charlesr +// Initial revision +// + +#if defined(WIN32) +#include + +//--------------------------------------------------------------- +// winsock_strerror(int) (Routine) +// Return a string equivalent for a winsock error. +// +char* winsock_strerror(int error) +{ + char *retval; + + switch (error) + { + case WSANOTINITIALISED: + retval = "winsock library not initialized"; + break; + + case WSAENETDOWN: + retval = "network down"; + break; + + case WSAEAFNOSUPPORT: + retval = "address family not supported"; + break; + + case WSAEINPROGRESS: + retval = "blocking call in progress"; + break; + + case WSAEMFILE: + retval = "no more socket descriptors available"; + break; + + case WSAENOBUFS: + retval = "buffer space exhausted"; + break; + + case WSAEPROTONOSUPPORT: + retval = "specified protocol not supported"; + break; + + case WSAEPROTOTYPE: + retval = "specified protocol incorrect type for socket"; + break; + + case WSAESOCKTNOSUPPORT: + retval = "socket family and type combination not supported"; + break; + + case WSAEADDRINUSE: + retval = "address in use"; + break; + + case WSAEADDRNOTAVAIL: + retval = "address not available"; + break; + + case WSAEFAULT: + retval = "invalid address"; + break; + + case WSAEINVAL: + retval = "invalid request"; + break; + + case WSAENOTSOCK: + retval = "invalid socket specified"; + break; + + case WSAEISCONN: + retval = "socket is connected"; + break; + + case WSAENETRESET: + retval = "network reset"; + break; + + case WSAEOPNOTSUPP: + retval = "operation not supported"; + break; + + case WSAESHUTDOWN: + retval = "socket was shutdown"; + break; + + case WSAEWOULDBLOCK: + retval = "socket would block"; + break; + + case WSAEMSGSIZE: + retval = "message too large"; + break; + + case WSAETIMEDOUT: + retval = "timed out"; + break; + + case WSAECONNRESET: + retval = "connection reset"; + break; + + case WSAEINTR: + retval = "call interrupted"; + break; + + case WSAEHOSTUNREACH: + retval = "host unreachable"; + break; + + case WSAECONNABORTED: + retval = "connection aborted"; + break; + + case WSAEDESTADDRREQ: + retval = "destination address required"; + break; + + case WSAENETUNREACH: + retval = "network unreachable"; + break; + + case WSASYSNOTREADY: + retval = "network subsystem not ready"; + break; + + case WSAVERNOTSUPPORTED: + retval = "version not supported"; + break; + + case WSAEPROCLIM: + retval = "process limit reached"; + break; + + case WSAHOST_NOT_FOUND: + retval = "host not found"; + break; + + case WSATRY_AGAIN: + retval = "try again"; + break; + + case WSANO_RECOVERY: + retval = "no recovery"; + break; + + case WSANO_DATA: + retval = "no data"; + break; + + default: + retval = "unknown error code"; + break; + } + + return(retval); +} // end of TcpConnection::winsock_strerror(int) + +#endif diff --git a/FSM/samples/TrafficLight/Makefile b/FSM/samples/TrafficLight/Makefile new file mode 100644 index 000000000..98399affb --- /dev/null +++ b/FSM/samples/TrafficLight/Makefile @@ -0,0 +1,36 @@ +# +# Makefile +# +# $Id: //poco/1.4/FSM/samples/TrafficLight/Makefile#1 $ +# +# Makefile for Poco FSM TrafficLight +# + +include $(POCO_BASE)/build/rules/global +INCLUDE += -I$(POCO_BASE)/FSM/include +CXXFLAGS += -std=c++11 -fno-operator-names + +# Cygwin Poco*.dll should be on PATH +ifeq ($(OSNAME), Cygwin) + PATH :=$(LIBPATH):$(PATH) +endif + +# Where to find the Finite State Machine Compiler executable +FSMc = $(POCO_BUILD)/FSM/bin/$(OSNAME)/$(OSARCH)/FSMc + +objects = stoplight Stoplight_sm TrafficLight + +target = TrafficLight +target_version = 1 +target_libs = PocoUtil PocoJSON PocoNet PocoXML PocoFoundation + +include $(POCO_BASE)/build/rules/exec + +ifdef POCO_UNBUNDLED + SYSLIBS += -lz -lpcre -lexpat +endif + +# Rule for runnning Finite State Machine Compiler +src/%.cpp: src/%.sm + @echo "** Compiling FSM " $< + $(SET_LD_LIBRARY_PATH) $(FSMc) $< diff --git a/FSM/samples/TrafficLight/Stoplight_sm.cpp b/FSM/samples/TrafficLight/Stoplight_sm.cpp new file mode 100644 index 000000000..2edfb2efb --- /dev/null +++ b/FSM/samples/TrafficLight/Stoplight_sm.cpp @@ -0,0 +1,84 @@ +#include "stoplightdefs.h" +#include "stoplight.h" +#include "Stoplight_sm.h" +using namespace statemap; +namespace cpp_ex4 { + // FSM Map constructor. + StopMap::StopMap() : + EastWestGreen("EastWestGreen", 0), + EastWestYellow("EastWestYellow", 1), + NorthSouthGreen("NorthSouthGreen", 2), + NorthSouthYellow("NorthSouthYellow", 3) + {} + + // Class state ----------------------------------- + void StoplightState::Timeout(StoplightContext& context) { + Default(context); + } + void StoplightState::Default(StoplightContext& context) { + throw TransitionUndefinedException(context.getState().getName(), context.getTransition()); + return; + } + void StopMap_EastWestGreen::Entry(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + ctxt.TurnLight(NSLIGHT, RED); + ctxt.TurnLight(EWLIGHT, GREEN); + } + + // ---------------------------------------------------- + void StopMap_EastWestGreen::Timeout(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + + (context.getState()).Exit(context); + context.setState(context.EastWestYellow); + (context.getState()).Entry(context); + ctxt.setTimer(Stoplight::YellowTimer); + return; + }; + void StopMap_EastWestYellow::Entry(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + ctxt.TurnLight(EWLIGHT, YELLOW); + } + + // ---------------------------------------------------- + void StopMap_EastWestYellow::Timeout(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + + (context.getState()).Exit(context); + context.setState(context.NorthSouthGreen); + (context.getState()).Entry(context); + ctxt.setTimer(Stoplight::NSGreenTimer); + return; + }; + void StopMap_NorthSouthGreen::Entry(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + ctxt.TurnLight(EWLIGHT, RED); + ctxt.TurnLight(NSLIGHT, GREEN); + } + + // ---------------------------------------------------- + void StopMap_NorthSouthGreen::Timeout(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + + (context.getState()).Exit(context); + context.setState(context.NorthSouthYellow); + (context.getState()).Entry(context); + ctxt.setTimer(Stoplight::YellowTimer); + return; + }; + void StopMap_NorthSouthYellow::Entry(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + ctxt.TurnLight(NSLIGHT, YELLOW); + } + + // ---------------------------------------------------- + void StopMap_NorthSouthYellow::Timeout(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + + (context.getState()).Exit(context); + context.setState(context.EastWestGreen); + (context.getState()).Entry(context); + ctxt.setTimer(Stoplight::EWGreenTimer); + return; + }; +} diff --git a/FSM/samples/TrafficLight/Stoplight_sm.h b/FSM/samples/TrafficLight/Stoplight_sm.h new file mode 100644 index 000000000..8a2d7fe96 --- /dev/null +++ b/FSM/samples/TrafficLight/Stoplight_sm.h @@ -0,0 +1,126 @@ +#ifndef cpp_ex4_Stoplight_sm_H +#define cpp_ex4_Stoplight_sm_H +#include "Poco/FSM/statemap.h" +namespace cpp_ex4 { + // Forward declarations.-------------------------- + class StopMap; + class StopMap_EastWestGreen; + class StopMap_EastWestYellow; + class StopMap_NorthSouthGreen; + class StopMap_NorthSouthYellow; + class StopMap_Default; + class StoplightState; + template class StoplightContext; + class Stoplight; + + + // Class State.----------------------------------- + class StoplightState : public statemap::State { + public: + StoplightState(const char *name, int no) : statemap::State(name, no) {}; + + virtual void Entry(StoplightContext&) {}; + virtual void Exit(StoplightContext&) {}; + + virtual void Timeout(StoplightContext& context); + protected: + virtual void Default(StoplightContext& context); + }; + + // FSM map default state class.------------------- + class StopMap_Default : public StoplightState { + public: + StopMap_Default (const char *name, int stateId) : StoplightState(name, stateId) {} + }; + + // FSM map states class.-------------------------- + // -------------------------------------------------- + class StopMap_EastWestGreen: public StopMap_Default { + public: + StopMap_EastWestGreen(const char* name, int no) : StopMap_Default(name, no) {} + + void Entry(StoplightContext& context); + + void Timeout(StoplightContext& context); + }; + + // -------------------------------------------------- + class StopMap_EastWestYellow: public StopMap_Default { + public: + StopMap_EastWestYellow(const char* name, int no) : StopMap_Default(name, no) {} + + void Entry(StoplightContext& context); + + void Timeout(StoplightContext& context); + }; + + // -------------------------------------------------- + class StopMap_NorthSouthGreen: public StopMap_Default { + public: + StopMap_NorthSouthGreen(const char* name, int no) : StopMap_Default(name, no) {} + + void Entry(StoplightContext& context); + + void Timeout(StoplightContext& context); + }; + + // -------------------------------------------------- + class StopMap_NorthSouthYellow: public StopMap_Default { + public: + StopMap_NorthSouthYellow(const char* name, int no) : StopMap_Default(name, no) {} + + void Entry(StoplightContext& context); + + void Timeout(StoplightContext& context); + }; + + // FSM map class.--------------------------------- + class StopMap { + public: + StopMap(); + StopMap_EastWestGreen EastWestGreen; + StopMap_EastWestYellow EastWestYellow; + StopMap_NorthSouthGreen NorthSouthGreen; + StopMap_NorthSouthYellow NorthSouthYellow; + }; + + // FSM context class ----------------------------- + template + class StoplightContext : public statemap::FSMContext, public StopMap { + public: + explicit + StoplightContext(statemap::Notifier& notifier) : FSMContext(notifier, StopMap::NorthSouthGreen) {}; + StoplightContext(statemap::Notifier& notifier, const statemap::State& state) : FSMContext(notifier, state) {}; + + void setStartState(const statemap::State& state) { + setState(state); + } + + virtual void enterStartState() { + getState().Entry(*this); + return; + } + + Derived& getOwner() { + return (*static_cast(this)); + }; + + const Derived& getOwner() const { + return (*static_cast(this)); + }; + + StoplightState& getState() const { + if (_state == nullptr) { + throw statemap::StateUndefinedException(); + } + return (dynamic_cast(*_state)); + }; + + void Timeout() { + setTransition("Timeout"); + getState().Timeout(*this); + setTransition(nullptr); + }; + }; +} +#endif diff --git a/FSM/samples/TrafficLight/TrafficLight.sm b/FSM/samples/TrafficLight/TrafficLight.sm new file mode 100644 index 000000000..7d5810662 --- /dev/null +++ b/FSM/samples/TrafficLight/TrafficLight.sm @@ -0,0 +1,63 @@ +// -*- tab-width: 4; -*- + +%{ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of +// the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an "AS +// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2003 Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// State Machine +// Stoplight +// +// Description +// This state machine implements a US traffic light. +// +%} +%start StopMap::NorthSouthGreen +%class Stoplight +%fsmclass StoplightContext +%include "stoplightdefs.h" +%header stoplight.h +%package cpp_ex4 + +%map StopMap +%% +EastWestGreen + Entry { TurnLight(NSLIGHT, RED); TurnLight(EWLIGHT, GREEN); } +{ + Timeout EastWestYellow { setTimer(Stoplight::YellowTimer); } +} + +EastWestYellow + Entry { TurnLight(EWLIGHT, YELLOW); } +{ + Timeout NorthSouthGreen { setTimer(Stoplight::NSGreenTimer); } +} + +NorthSouthGreen + Entry { TurnLight(EWLIGHT, RED); TurnLight(NSLIGHT, GREEN); } +{ + Timeout NorthSouthYellow { setTimer(Stoplight::YellowTimer); } +} + +NorthSouthYellow + Entry { TurnLight(NSLIGHT, YELLOW); } +{ + Timeout EastWestGreen { setTimer(Stoplight::EWGreenTimer); } +} +%% diff --git a/FSM/samples/TrafficLight/TrafficLight_vs120.vcxproj b/FSM/samples/TrafficLight/TrafficLight_vs120.vcxproj new file mode 100644 index 000000000..ca523b230 --- /dev/null +++ b/FSM/samples/TrafficLight/TrafficLight_vs120.vcxproj @@ -0,0 +1,114 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {E3EE4584-8403-494A-B982-EFC4E5B04690} + Win32Proj + TrafficLight + TrafficLight + + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + true + ClCompile + + + false + $(IncludePath) + ClCompile + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ..\..\..\FSM\include;..\..\..\Util\include;..\..\..\Foundation\include + + + Console + true + ..\..\..\lib + + + set PATH=..\..\..\bin;%PATH% && ..\..\bin\fsmc TrafficLight.sm + SpotLight_sm.h;SpotLight_sm.cpp + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ..\..\..\FSM\include;..\..\..\Util\include;..\..\..\Foundation\include + + + Console + true + true + true + ..\..\..\lib + + + set PATH=..\..\..\bin;%PATH% && ..\..\bin\fsmc TrafficLight.sm + SpotLight_sm.h;SpotLight_sm.cpp + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FSM/samples/TrafficLight/TrafficLight_vs120.vcxproj.filters b/FSM/samples/TrafficLight/TrafficLight_vs120.vcxproj.filters new file mode 100644 index 000000000..bcd69e9c0 --- /dev/null +++ b/FSM/samples/TrafficLight/TrafficLight_vs120.vcxproj.filters @@ -0,0 +1,52 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + + Fichiers sources + + + Fichiers sources + + + Fichiers sources + + + Fichiers sources + + + + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + + + \ No newline at end of file diff --git a/FSM/samples/TrafficLight/src/Stoplight_sm.cpp b/FSM/samples/TrafficLight/src/Stoplight_sm.cpp new file mode 100644 index 000000000..2edfb2efb --- /dev/null +++ b/FSM/samples/TrafficLight/src/Stoplight_sm.cpp @@ -0,0 +1,84 @@ +#include "stoplightdefs.h" +#include "stoplight.h" +#include "Stoplight_sm.h" +using namespace statemap; +namespace cpp_ex4 { + // FSM Map constructor. + StopMap::StopMap() : + EastWestGreen("EastWestGreen", 0), + EastWestYellow("EastWestYellow", 1), + NorthSouthGreen("NorthSouthGreen", 2), + NorthSouthYellow("NorthSouthYellow", 3) + {} + + // Class state ----------------------------------- + void StoplightState::Timeout(StoplightContext& context) { + Default(context); + } + void StoplightState::Default(StoplightContext& context) { + throw TransitionUndefinedException(context.getState().getName(), context.getTransition()); + return; + } + void StopMap_EastWestGreen::Entry(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + ctxt.TurnLight(NSLIGHT, RED); + ctxt.TurnLight(EWLIGHT, GREEN); + } + + // ---------------------------------------------------- + void StopMap_EastWestGreen::Timeout(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + + (context.getState()).Exit(context); + context.setState(context.EastWestYellow); + (context.getState()).Entry(context); + ctxt.setTimer(Stoplight::YellowTimer); + return; + }; + void StopMap_EastWestYellow::Entry(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + ctxt.TurnLight(EWLIGHT, YELLOW); + } + + // ---------------------------------------------------- + void StopMap_EastWestYellow::Timeout(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + + (context.getState()).Exit(context); + context.setState(context.NorthSouthGreen); + (context.getState()).Entry(context); + ctxt.setTimer(Stoplight::NSGreenTimer); + return; + }; + void StopMap_NorthSouthGreen::Entry(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + ctxt.TurnLight(EWLIGHT, RED); + ctxt.TurnLight(NSLIGHT, GREEN); + } + + // ---------------------------------------------------- + void StopMap_NorthSouthGreen::Timeout(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + + (context.getState()).Exit(context); + context.setState(context.NorthSouthYellow); + (context.getState()).Entry(context); + ctxt.setTimer(Stoplight::YellowTimer); + return; + }; + void StopMap_NorthSouthYellow::Entry(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + ctxt.TurnLight(NSLIGHT, YELLOW); + } + + // ---------------------------------------------------- + void StopMap_NorthSouthYellow::Timeout(StoplightContext& context) { + Stoplight& ctxt = context.getOwner(); + + (context.getState()).Exit(context); + context.setState(context.EastWestGreen); + (context.getState()).Entry(context); + ctxt.setTimer(Stoplight::EWGreenTimer); + return; + }; +} diff --git a/FSM/samples/TrafficLight/src/TrafficLight.cpp b/FSM/samples/TrafficLight/src/TrafficLight.cpp new file mode 100644 index 000000000..d809f8252 --- /dev/null +++ b/FSM/samples/TrafficLight/src/TrafficLight.cpp @@ -0,0 +1,94 @@ +#include +#include +#include +#include "Poco/DateTime.h" +#include "Poco/DateTimeFormatter.h" +#include "Poco/Util/LoggingConfigurator.h" +#include "Poco/Util/PropertyFileConfiguration.h" +#include "Poco/Exception.h" +#include "Poco/Util/Option.h" +#include "Poco/Util/OptionSet.h" +#include "Poco/Util/HelpFormatter.h" +#include "Poco/Util/Application.h" +#include "Poco/Timer.h" +#include "Poco/Thread.h" +#include "Poco/Stopwatch.h" + +using Poco::Util::Application; +using Poco::Util::Option; +using Poco::Util::OptionSet; +using Poco::Util::HelpFormatter; +using Poco::Util::LoggingConfigurator; +using Poco::Util::PropertyFileConfiguration; +using Poco::AutoPtr; +using Poco::TimerCallback; +using Poco::Stopwatch; +using Poco::Thread; + +using namespace std; + +#include "stoplight.h" +using namespace cpp_ex4; + + +class TrafficLight : public Application { + /// The main application class. + /// + /// This class handles command-line arguments and configuration files. + /// Start the TrafficLight executable with the help + /// option (/help on Windows, --help on Unix) for + /// the available command line options. + /// + protected: + void initialize(Application& self) { + loadConfiguration(); // load default configuration files, if present + Application::initialize(self); + } + + void uninitialize() { + Application::uninitialize(); + } + + void defineOptions(OptionSet& options) { + Application::defineOptions(options); + + options.addOption( + Option("help", "h", "display help information on command line arguments") + .required(false) + .repeatable(false)); + } + + void handleOption(const std::string& name, const std::string& value) { + Application::handleOption(name, value); + + if (name == "help") + help = true; + } + + void displayHelp() { + HelpFormatter helpFormatter(options()); + helpFormatter.setCommand(commandName()); + helpFormatter.setUsage("OPTIONS"); + helpFormatter.setHeader("A US TrafficLight as a FSM."); + helpFormatter.format(std::cout); + } + + int main(const std::vector& args) { + if (help) { + displayHelp(); + } else { + Stoplight stoplight(NORTH_SOUTH, NSGreenTimer, EWGreenTimer); + stoplight.start(YellowTimer); + } + return Application::EXIT_OK; + } + private: + int KeepGoing = 1; + + int YellowTimer = 2; // Yellow lights last 2 seconds. + int NSGreenTimer = 8; // North-south green lasts 8 seconds. + int EWGreenTimer = 5; // East-west green lasts 5 seconds. + bool help = false; +}; + +POCO_APP_MAIN(TrafficLight) diff --git a/FSM/samples/TrafficLight/src/stdafx.cpp b/FSM/samples/TrafficLight/src/stdafx.cpp new file mode 100644 index 000000000..c494ab227 --- /dev/null +++ b/FSM/samples/TrafficLight/src/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : fichier source incluant simplement les fichiers Include standard +// TrafficLight.pch représente l'en-tête précompilé +// stdafx.obj contient les informations de type précompilées + +#include "stdafx.h" + +// TODO: faites référence aux en-têtes supplémentaires nécessaires dans STDAFX.H +// absents de ce fichier diff --git a/FSM/samples/TrafficLight/src/stdafx.h b/FSM/samples/TrafficLight/src/stdafx.h new file mode 100644 index 000000000..16ac0befb --- /dev/null +++ b/FSM/samples/TrafficLight/src/stdafx.h @@ -0,0 +1,15 @@ +// stdafx.h : fichier Include pour les fichiers Include système standard, +// ou les fichiers Include spécifiques aux projets qui sont utilisés fréquemment, +// et sont rarement modifiés +// + +#pragma once + +#include "targetver.h" + +#include +#include + + + +// TODO: faites référence ici aux en-têtes supplémentaires nécessaires au programme diff --git a/FSM/samples/TrafficLight/src/stoplight.cpp b/FSM/samples/TrafficLight/src/stoplight.cpp new file mode 100644 index 000000000..790c021a8 --- /dev/null +++ b/FSM/samples/TrafficLight/src/stoplight.cpp @@ -0,0 +1,154 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2009. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Class +// Stoplight +// +// Member Functions +// Stoplight() - Default constructor. +// Stoplight(Directions) - Set initial direction. +// TurnLight(StopLights, LightColors) - Change directions. +// SetTimer(int) - Start a timer. +// Initialize(Directions) - Set start state and timer. +// + +#include +#include "Poco/Thread.h" +#include "Poco/Stopwatch.h" +#include "stoplight.h" + +static const char tab = '\t'; + +using namespace std; +using Poco::TimerCallback; +using Poco::Stopwatch; +using Poco::Thread; + +namespace cpp_ex4 { + +int Stoplight::YellowTimer; +int Stoplight::NSGreenTimer; +int Stoplight::EWGreenTimer; + +const char* literal(const statemap::Event & event) { + switch (event) { + case statemap::Event::Enter: return "Enter "; + case statemap::Event::Leave: return "Leave "; + case statemap::Event::Switch: return "Switch "; + case statemap::Event::Transition: return "Transition"; + case statemap::Event::Push: return "Push "; + case statemap::Event::Pop: return "Pop "; + } +} +class Print : public statemap::Notifier { +public: + void operator ()(const statemap::Event & event, const char * message) { + clog << tab << tab << literal(event) << ": " << message << endl; + } + void operator ()(const statemap::Event & event, const statemap::State * state) { +// clog << tab << tab << literal(event) << ": " << state->getName() << endl; + } + void operator ()(const statemap::Event & event, const statemap::State * fromState, const statemap::State *toState) { + clog << tab << tab << literal(event) << ": " << fromState->getName() << " => " << toState->getName() << endl << endl; + } +}; +static Print print; + + Stoplight::Stoplight(Directions direction, int NSGreenTimer, int EWGreenTimer) : + StoplightContext(print), + callback(*this, &Stoplight::onTimer) { + +#define FSM_DEBUG +#ifdef FSM_DEBUG + setDebugFlag(true); +#endif + switch(direction) { + case NORTH_SOUTH: + cout << "Turning the north-south lights green." << endl; + setStartState(NorthSouthGreen); + timer.setStartInterval(NSGreenTimer * 1000); + break; + + case EAST_WEST: + cout << "Turning the east-west lights green." << endl; + setStartState(EastWestGreen); + timer.setStartInterval(EWGreenTimer * 1000); + break; + } + this->NSGreenTimer = NSGreenTimer; + this->EWGreenTimer = EWGreenTimer; +} + +void Stoplight::start(int YellowTimer) { + this->YellowTimer = YellowTimer; + enterStartState(); + timer.start(callback); + + Stopwatch sw; + sw.start(); + _event.wait(); + sw.stop(); + return; +} + +void Stoplight::TurnLight(StopLights light, LightColors color) { + cout << "Turning the "; + + switch(light) { + case EWLIGHT: + cout << "east-west lights "; + break; + + case NSLIGHT: + cout << "north-south lights "; + break; + } + + switch(color) { + case GREEN: + cout << "green." << endl; + break; + + case YELLOW: + cout << "yellow." << endl; + break; + + case RED: + cout << "red." << endl; + break; + } + + return; +} + +void Stoplight::onTimer(Timer& t) { +// clog << ">>> onTimer: " << endl; + Timeout(); +// clog << "<<< onTimer: " << endl; +} + +void Stoplight::setTimer(int seconds) { +// clog << ">>> setTimer: " << seconds << endl; + timer.setPeriodicInterval(seconds * 1000); + timer.restart(); +// clog << "<<< setTimer: " << seconds << endl; +} + +} diff --git a/FSM/samples/TrafficLight/src/stoplight.h b/FSM/samples/TrafficLight/src/stoplight.h new file mode 100644 index 000000000..fa84cbdfd --- /dev/null +++ b/FSM/samples/TrafficLight/src/stoplight.h @@ -0,0 +1,80 @@ +#ifndef _H_STOPLIGHT +#define _H_STOPLIGHT + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2009. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TheContext +// +// Description +// When a state map executes an action, it is really calling a +// member function in the context class. +// + +#include "Poco/Timer.h" +#include "Poco/Event.h" +using Poco::Timer; +using Poco::Event; +using Poco::TimerCallback; + +#include "stoplightdefs.h" +#include "stoplight_sm.h" + +namespace cpp_ex4 { + class Stoplight : protected StoplightContext { + // Member data. + public: + static int YellowTimer; + static int NSGreenTimer; + static int EWGreenTimer; + +protected: + void onTimer(Timer& t); + +private: + Event _event; + Timer timer; + TimerCallback callback; + + // Member functions. +public: + // Specify the initial direction with the green light. + Stoplight(Directions direction, int NSGreenTimer, int EWGreenTimer); + + // Destructor. + virtual ~Stoplight() {}; + + void start(int YellowTimer); + + // Change a stoplight's color. + void TurnLight(StopLights light, LightColors color); + + // Set a timer for the specified number of seconds. + void setTimer(int time); + + + // Sets the initial state of the state map and the initial timer. + //static Stoplight* Initialize(Directions direction); + + + }; +} +#endif diff --git a/FSM/samples/TrafficLight/src/stoplight_sm.h b/FSM/samples/TrafficLight/src/stoplight_sm.h new file mode 100644 index 000000000..8a2d7fe96 --- /dev/null +++ b/FSM/samples/TrafficLight/src/stoplight_sm.h @@ -0,0 +1,126 @@ +#ifndef cpp_ex4_Stoplight_sm_H +#define cpp_ex4_Stoplight_sm_H +#include "Poco/FSM/statemap.h" +namespace cpp_ex4 { + // Forward declarations.-------------------------- + class StopMap; + class StopMap_EastWestGreen; + class StopMap_EastWestYellow; + class StopMap_NorthSouthGreen; + class StopMap_NorthSouthYellow; + class StopMap_Default; + class StoplightState; + template class StoplightContext; + class Stoplight; + + + // Class State.----------------------------------- + class StoplightState : public statemap::State { + public: + StoplightState(const char *name, int no) : statemap::State(name, no) {}; + + virtual void Entry(StoplightContext&) {}; + virtual void Exit(StoplightContext&) {}; + + virtual void Timeout(StoplightContext& context); + protected: + virtual void Default(StoplightContext& context); + }; + + // FSM map default state class.------------------- + class StopMap_Default : public StoplightState { + public: + StopMap_Default (const char *name, int stateId) : StoplightState(name, stateId) {} + }; + + // FSM map states class.-------------------------- + // -------------------------------------------------- + class StopMap_EastWestGreen: public StopMap_Default { + public: + StopMap_EastWestGreen(const char* name, int no) : StopMap_Default(name, no) {} + + void Entry(StoplightContext& context); + + void Timeout(StoplightContext& context); + }; + + // -------------------------------------------------- + class StopMap_EastWestYellow: public StopMap_Default { + public: + StopMap_EastWestYellow(const char* name, int no) : StopMap_Default(name, no) {} + + void Entry(StoplightContext& context); + + void Timeout(StoplightContext& context); + }; + + // -------------------------------------------------- + class StopMap_NorthSouthGreen: public StopMap_Default { + public: + StopMap_NorthSouthGreen(const char* name, int no) : StopMap_Default(name, no) {} + + void Entry(StoplightContext& context); + + void Timeout(StoplightContext& context); + }; + + // -------------------------------------------------- + class StopMap_NorthSouthYellow: public StopMap_Default { + public: + StopMap_NorthSouthYellow(const char* name, int no) : StopMap_Default(name, no) {} + + void Entry(StoplightContext& context); + + void Timeout(StoplightContext& context); + }; + + // FSM map class.--------------------------------- + class StopMap { + public: + StopMap(); + StopMap_EastWestGreen EastWestGreen; + StopMap_EastWestYellow EastWestYellow; + StopMap_NorthSouthGreen NorthSouthGreen; + StopMap_NorthSouthYellow NorthSouthYellow; + }; + + // FSM context class ----------------------------- + template + class StoplightContext : public statemap::FSMContext, public StopMap { + public: + explicit + StoplightContext(statemap::Notifier& notifier) : FSMContext(notifier, StopMap::NorthSouthGreen) {}; + StoplightContext(statemap::Notifier& notifier, const statemap::State& state) : FSMContext(notifier, state) {}; + + void setStartState(const statemap::State& state) { + setState(state); + } + + virtual void enterStartState() { + getState().Entry(*this); + return; + } + + Derived& getOwner() { + return (*static_cast(this)); + }; + + const Derived& getOwner() const { + return (*static_cast(this)); + }; + + StoplightState& getState() const { + if (_state == nullptr) { + throw statemap::StateUndefinedException(); + } + return (dynamic_cast(*_state)); + }; + + void Timeout() { + setTransition("Timeout"); + getState().Timeout(*this); + setTransition(nullptr); + }; + }; +} +#endif diff --git a/FSM/samples/TrafficLight/src/stoplightdefs.h b/FSM/samples/TrafficLight/src/stoplightdefs.h new file mode 100644 index 000000000..fa8f3a9ea --- /dev/null +++ b/FSM/samples/TrafficLight/src/stoplightdefs.h @@ -0,0 +1,55 @@ +#ifndef _H_STOPLIGHTDEFS +#define _H_STOPLIGHTDEFS + +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of +// the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an "AS +// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (SMC). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2000 - 2003 Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// +// Name +// TheContext +// +// Description +// When a state machine executes an action, it is really calling a +// member function in the context class. +// + +#ifdef WIN32 +// Use this value when setting the stoplight timer. +#define STOPLIGHT_TIMER 1 +#endif + +namespace cpp_ex4 { +enum LightColors { + GREEN = 0, + YELLOW, + RED +}; + +enum StopLights { + EWLIGHT = 1, + NSLIGHT +}; + +enum Directions { + NORTH_SOUTH, + EAST_WEST +}; +} + +#endif diff --git a/FSM/samples/TrafficLight/src/targetver.h b/FSM/samples/TrafficLight/src/targetver.h new file mode 100644 index 000000000..c8351ffde --- /dev/null +++ b/FSM/samples/TrafficLight/src/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Si vous incluez SDKDDKVer.h, cela définit la dernière plateforme Windows disponible. + +// Si vous souhaitez générer votre application pour une plateforme Windows précédente, incluez WinSDKVer.h et +// définissez la macro _WIN32_WINNT à la plateforme que vous souhaitez prendre en charge avant d'inclure SDKDDKVer.h. + +#include diff --git a/FSM/samples/samples_vs120.sln b/FSM/samples/samples_vs120.sln new file mode 100644 index 000000000..771f00ea2 --- /dev/null +++ b/FSM/samples/samples_vs120.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2013 for Windows Desktop +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrafficLight", "TrafficLight\TrafficLight_vs120.vcxproj", "{E3EE4584-8403-494A-B982-EFC4E5B04690}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TCP", "TCP\TCP_vs120.vcxproj", "{11E01C5F-683C-4290-B520-D3D248327DE1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E3EE4584-8403-494A-B982-EFC4E5B04690}.Debug|Win32.ActiveCfg = Debug|Win32 + {E3EE4584-8403-494A-B982-EFC4E5B04690}.Debug|Win32.Build.0 = Debug|Win32 + {E3EE4584-8403-494A-B982-EFC4E5B04690}.Release|Win32.ActiveCfg = Release|Win32 + {E3EE4584-8403-494A-B982-EFC4E5B04690}.Release|Win32.Build.0 = Release|Win32 + {11E01C5F-683C-4290-B520-D3D248327DE1}.Debug|Win32.ActiveCfg = Debug|Win32 + {11E01C5F-683C-4290-B520-D3D248327DE1}.Debug|Win32.Build.0 = Debug|Win32 + {11E01C5F-683C-4290-B520-D3D248327DE1}.Release|Win32.ActiveCfg = Release|Win32 + {11E01C5F-683C-4290-B520-D3D248327DE1}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/FSM/src/Action.cpp b/FSM/src/Action.cpp new file mode 100644 index 000000000..4e647cbb6 --- /dev/null +++ b/FSM/src/Action.cpp @@ -0,0 +1,44 @@ +/* + * Action.cpp + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Action.h" +#include "model/Argument.h" +#include "model/Print.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string Action::display() const +{ + if (oneline.empty()) + { + oneline += name(); + oneline += '('; + string arguments; + + for (int no = 0; no < _arguments.size(); ++no) + { + arguments += _arguments[no]->name(); + if (no + 1 < _arguments.size()) + arguments += ", "; + } + oneline += arguments; + oneline += ')'; + oneline += ';'; + } + return oneline; +} +void Action::print(Print& print) const +{ + print(display()); +} +} +} +} diff --git a/FSM/src/ActionForCpp.cpp b/FSM/src/ActionForCpp.cpp new file mode 100644 index 000000000..9925b4a2b --- /dev/null +++ b/FSM/src/ActionForCpp.cpp @@ -0,0 +1,36 @@ +/* + * ActionForCpp.cpp + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#include +using std::replace; + +#include "cpp/ActionForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +const string ActionForCpp::name() const +{ + string cppname = Element::name(); + replace(cppname.begin(), cppname.end(), '-', '_'); + return cppname; +} +void ActionForCpp::generateInclude(ostream& inc, bool debug) const +{ +} +void ActionForCpp::generateCode(ostream& cpp, bool debug) const +{ +} +} +} +} +} diff --git a/FSM/src/Actions.cpp b/FSM/src/Actions.cpp new file mode 100644 index 000000000..d47348be2 --- /dev/null +++ b/FSM/src/Actions.cpp @@ -0,0 +1,19 @@ +/* + * Actions.cpp + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Actions.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ + +} +} +} diff --git a/FSM/src/Argument.cpp b/FSM/src/Argument.cpp new file mode 100644 index 000000000..70aea07f2 --- /dev/null +++ b/FSM/src/Argument.cpp @@ -0,0 +1,27 @@ +/* + * Argument.cpp + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Argument.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string Argument::display() const +{ + if (oneline.empty()) + { + oneline += name(); + } + return oneline; +} + +} +} +} diff --git a/FSM/src/ArgumentForCpp.cpp b/FSM/src/ArgumentForCpp.cpp new file mode 100644 index 000000000..00afc51b3 --- /dev/null +++ b/FSM/src/ArgumentForCpp.cpp @@ -0,0 +1,28 @@ +/* + * ArgumentForCpp.cpp + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/ArgumentForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +void ArgumentForCpp::generateInclude(ostream& inc, bool debug) const +{ +} +void ArgumentForCpp::generateCode(ostream& cpp, bool debug) const +{ +} + +} +} +} +} diff --git a/FSM/src/BinaryOperation.cpp b/FSM/src/BinaryOperation.cpp new file mode 100644 index 000000000..597073e2a --- /dev/null +++ b/FSM/src/BinaryOperation.cpp @@ -0,0 +1,48 @@ +/* + * BinaryOperation.cpp + * + * Created on: 20 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/BinaryOperation.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string BinaryOperation::display() const +{ + if (_asstring.empty()) + { + _asstring += _left->display(); + switch (_operator) + { + case Operator::equal: + _asstring += "=="; + break; + case Operator::notequal: + _asstring += "!="; + break; + case Operator::and: + _asstring += "&&"; + break; + case Operator::or: + _asstring += "||"; + break; + case Operator::xor: + _asstring += '^'; + break; + default: + _asstring += "???"; + break; + } + _asstring += _right->display(); + } + return _asstring; +} +} +} +} \ No newline at end of file diff --git a/FSM/src/BinaryOperationForCpp.cpp b/FSM/src/BinaryOperationForCpp.cpp new file mode 100644 index 000000000..e90f6a864 --- /dev/null +++ b/FSM/src/BinaryOperationForCpp.cpp @@ -0,0 +1,50 @@ +/* + * BinaryOperationForCpp.cpp + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/BinaryOperationForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +const string BinaryOperationForCpp::display(const string& prefix) const +{ + string value; + value += dynamic_cast(left())->display(prefix); + switch (_operator) + { + case Poco::FSM::MODEL::Operator::equal: + value += "=="; + break; + case Poco::FSM::MODEL::Operator::notequal: + value += "!="; + break; + case Poco::FSM::MODEL::Operator::and: + value += "&&"; + break; + case Poco::FSM::MODEL::Operator::or: + value += "||"; + break; + case Poco::FSM::MODEL::Operator::xor: + value += '^'; + break; + default: + value += "???"; + break; + } + value += dynamic_cast(right())->display(prefix); + return value; +} + +} +} +} +} diff --git a/FSM/src/Character.cpp b/FSM/src/Character.cpp new file mode 100644 index 000000000..6e5e4ab0d --- /dev/null +++ b/FSM/src/Character.cpp @@ -0,0 +1,89 @@ +/* + * Character.cpp + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#include "Poco/StreamTokenizer.h" +#include "Poco/Exception.h" +#include "Poco/Ascii.h" +#include "parser/Character.h" + +using Poco::StreamTokenizer; +using Poco::SyntaxException; +using Poco::Token; +using Poco::InvalidToken; +using Poco::EOFToken; +using Poco::WhitespaceToken; +using Poco::Ascii; + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ + +Character::Character() +{ +} + + +Character::~Character() +{ +} + + +Token::Class Character::tokenClass() const +{ + return Token::CHAR_LITERAL_TOKEN; +} + + +bool Character::start(char c, std::istream& istr) +{ + _value = c; + return c == '\''; +} + + +void Character::finish(std::istream& istr) +{ + int next = istr.peek(); + while (next != -1 && next != '\'' && next != '\n' && next != '\r') + { + if (next == '\\') _value += (char) istr.get(); + _value += (char) istr.get(); + next = istr.peek(); + } + if (next == '\'') + { + next = istr.get(); + _value += (char) next; + } + else throw SyntaxException("Unterminated character literal"); +} + + +char Character::asChar() const +{ + char result('\0'); + std::string::const_iterator it = _value.begin(); + std::string::const_iterator end = _value.end(); + if (it != end) + { + if (*it == '\'') ++it; + while (it != end && *it != '\'') + { + if (*it == '\\') ++it; + if (it != end) result = *it++; + } + } + return result; +} + + +} +} +} diff --git a/FSM/src/Comment.cpp b/FSM/src/Comment.cpp new file mode 100644 index 000000000..ec03ec5ee --- /dev/null +++ b/FSM/src/Comment.cpp @@ -0,0 +1,89 @@ +/* + * Comment.cpp + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#include "Poco/Ascii.h" +#include "Poco/StreamTokenizer.h" +using Poco::StreamTokenizer; +using Poco::Token; +using Poco::InvalidToken; +using Poco::EOFToken; +using Poco::WhitespaceToken; +using Poco::Ascii; +#include "parser/Comment.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ + +Comment::Comment() +{ +} + + +Comment::~Comment() +{ +} + + +Token::Class Comment::tokenClass() const +{ + return (_value.length() > 2 && _value[2] == '/') ? Token::SPECIAL_COMMENT_TOKEN : Token::COMMENT_TOKEN; +} + + +bool Comment::start(char c, std::istream& istr) +{ + _value = c; + int next = istr.peek(); + return c == '/' && (next == '*' || next == '/'); +} + + +void Comment::finish(std::istream& istr) +{ + int next = istr.peek(); + if (next == '/') + { + while (next != -1 && next != '\r' && next != '\n') + { + _value += (char) istr.get(); + next = istr.peek(); + } + } + else + { + _value += (char) istr.get(); // * + next = istr.peek(); + while (next != -1) + { + next = istr.get(); + _value += (char) next; + if (next == '*' && istr.peek() == '/') + { + _value += (char) istr.get(); + break; + } + } + } +} + + +std::string Comment::asString() const +{ + if (_value.length() > 2 && _value[2] == '/') + return _value.substr(3); + else + return _value.substr(2); +} + + +} +} +} diff --git a/FSM/src/CompilableForCpp.cpp b/FSM/src/CompilableForCpp.cpp new file mode 100644 index 000000000..9bd9ebc99 --- /dev/null +++ b/FSM/src/CompilableForCpp.cpp @@ -0,0 +1,22 @@ +/* + * CompilableForCpp.cpp + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/CompilableForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ + +} +} +} +} diff --git a/FSM/src/Dumper.cpp b/FSM/src/Dumper.cpp new file mode 100644 index 000000000..0ab483eb4 --- /dev/null +++ b/FSM/src/Dumper.cpp @@ -0,0 +1,19 @@ +/* + * Dumper.cpp + * + * Created on: 8 févr. 2016 + * Author: FrancisANDRE + */ + +#include "model/Dumper.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ + +} +} +} diff --git a/FSM/src/Element.cpp b/FSM/src/Element.cpp new file mode 100644 index 000000000..d81a0203d --- /dev/null +++ b/FSM/src/Element.cpp @@ -0,0 +1,19 @@ +/* + * Element.cpp + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Element.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ + +} +} +} \ No newline at end of file diff --git a/FSM/src/ElementForCpp.cpp b/FSM/src/ElementForCpp.cpp new file mode 100644 index 000000000..1996cd284 --- /dev/null +++ b/FSM/src/ElementForCpp.cpp @@ -0,0 +1,22 @@ +/* + * ElementForCpp.cpp + * + * Created on: 2 févr. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/ElementForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ + +} +} +} +} diff --git a/FSM/src/Entry.cpp b/FSM/src/Entry.cpp new file mode 100644 index 000000000..a3c31f082 --- /dev/null +++ b/FSM/src/Entry.cpp @@ -0,0 +1,39 @@ +/* + * Entry.cpp + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Print.h" +#include "model/Entry.h" +#include "model/Action.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string Entry::display() const +{ + if (oneline.empty()) + { + oneline += Element::name(); + } + return oneline; +} +void Entry::print(Print& print) const +{ + string line; + line += "Entry\t{"; + + for (const auto& action : actions()) + line += action->display(); + + line += '}'; + print(line); +} +} +} +} diff --git a/FSM/src/EntryForCpp.cpp b/FSM/src/EntryForCpp.cpp new file mode 100644 index 000000000..2c2b175a7 --- /dev/null +++ b/FSM/src/EntryForCpp.cpp @@ -0,0 +1,27 @@ +/* + * EntryForCpp.cpp + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/EntryForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +void EntryForCpp::generateInclude(ostream& inc, bool debug) const +{ +} +void EntryForCpp::generateCode(ostream& cpp, bool debug) const +{ +} +} +} +} +} diff --git a/FSM/src/Exit.cpp b/FSM/src/Exit.cpp new file mode 100644 index 000000000..7b82f4bf8 --- /dev/null +++ b/FSM/src/Exit.cpp @@ -0,0 +1,38 @@ +/* + * Exit.cpp + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Exit.h" +#include "model/Action.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string Exit::display() const +{ + if (oneline.empty()) + { + oneline += name(); + } + return oneline; +} +void Exit::print(Print& print) const +{ + string line; + line += "Exit\t{"; + + for (const auto& action : actions()) + line += action->display(); + + line += '}'; + print(line); +} +} +} +} diff --git a/FSM/src/ExitForCpp.cpp b/FSM/src/ExitForCpp.cpp new file mode 100644 index 000000000..3425e41ee --- /dev/null +++ b/FSM/src/ExitForCpp.cpp @@ -0,0 +1,27 @@ +/* + * ExitForCpp.cpp + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/ExitForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +void ExitForCpp::generateInclude(ostream& inc, bool debug) const +{ +} +void ExitForCpp::generateCode(ostream& cpp, bool debug) const +{ +} +} +} +} +} diff --git a/FSM/src/Expression.cpp b/FSM/src/Expression.cpp new file mode 100644 index 000000000..46aa0755a --- /dev/null +++ b/FSM/src/Expression.cpp @@ -0,0 +1,19 @@ +/* + * Expression.cpp + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Expression.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ + +} +} +} \ No newline at end of file diff --git a/FSM/src/ExpressionForCpp.cpp b/FSM/src/ExpressionForCpp.cpp new file mode 100644 index 000000000..8cd05594b --- /dev/null +++ b/FSM/src/ExpressionForCpp.cpp @@ -0,0 +1,22 @@ +/* + * ExpressionForCpp.cpp + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/ExpressionForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ + +} +} +} +} diff --git a/FSM/src/FSM.cpp b/FSM/src/FSM.cpp new file mode 100644 index 000000000..edcd3fff1 --- /dev/null +++ b/FSM/src/FSM.cpp @@ -0,0 +1,62 @@ +/* + * FSM.cpp + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#include "Poco/Format.h" +using Poco::format; + +#include "parser/Keyword.h" +#include "model/FSM.h" +#include "model/Map.h" +using Poco::FSM::PARSER::Keyword; + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +void FSM::add(MapPtr map) +{ + _maps.push_back(map); + map->fsm() = this; +} +void FSM::addPackage(const string& package) +{ + _packages.push_back(package); +} +void FSM::addImport(const string& import) +{ + _imports.push_back(import); +} +void FSM::addInclude(const string& inc) +{ + _includes.push_back(inc); +} +void FSM::addDeclare(const string& declare) +{ + _declares.push_back(declare); +} +void FSM::print(Print& print) const +{ + print(format("%s\t%s", string(Keyword::asString(Keyword::START)), startState())); + print(format("%s\t%s", string(Keyword::asString(Keyword::FSMFILE)), fsmfile())); + print(format("%s\t%s", string(Keyword::asString(Keyword::FFSMLASS)), fsmclass())); + print(format("%s\t%s", string(Keyword::asString(Keyword::CLASS)), klass())); +// print(format("%s\t%s", string(Keyword::asString(Keyword::DECLARE)), declare())); +// print(format("%s\t%s", string(Keyword::asString(Keyword::ACCESS)), access())); + print(format("%s\t%s", string(Keyword::asString(Keyword::HEADER)), header())); + print(format("%s\t%s", string(Keyword::asString(Keyword::PACKAGE)), packages()[0])); + + for (const auto& map : maps()) + { + print(format("%s\t%s", string(Keyword::asString(Keyword::MAP)), map->Element::name())); + map->print(print); + } +} +} +} +} diff --git a/FSM/src/FSMForCpp.cpp b/FSM/src/FSMForCpp.cpp new file mode 100644 index 000000000..e97ea58b5 --- /dev/null +++ b/FSM/src/FSMForCpp.cpp @@ -0,0 +1,112 @@ +/* + * FSMForCpp.cpp + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#include +#include "Poco/Timestamp.h" +#include "Poco/File.h" +#include "Poco/FileStream.h" +using Poco::FileInputStream; +using Poco::FileOutputStream; +using Poco::File; +using Poco::Timestamp; + +#include "cpp/FSMForCpp.h" +#include "cpp/MapForCpp.h" +#include "parser/Parser.h" + +using namespace std; + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +void FSMForCpp::openNamespaces(IndentStream& os) const +{ + for (const auto& package : packages()) + if (!package.empty()) + os << "namespace " << package << " {" << endl << tab; +} +void FSMForCpp::closeNamespaces(IndentStream& os) const +{ + for (const auto& package : packages()) + if (!package.empty()) + os << back << '}' << endl; +} +void FSMForCpp::generate(const Path& out, bool debug) const +{ + { + Path incPath(out, fsmfile() + ".h"); + FileOutputStream incfos(incPath.toString()); + IndentStream inc(incfos); + string define; + for (const auto& ns : packages()) + { + define += ns; + define += "_"; + } + define += fsmfile(); + inc << "#ifndef " << define << "_H" << endl; + inc << "#define " << define << "_H" << endl; + + inc << "#include \"Poco/FSM/statemap.h\"" << endl; + + openNamespaces(inc); + + for (auto map : _maps) + { + dynamic_cast(map)->generateInclude(inc, debug); + } + closeNamespaces(inc); + inc << "#endif" << endl; + } + { + Path cppPath(out, fsmfile() + ".cpp"); + FileOutputStream cppfos(cppPath.toString()); + IndentStream cpp(cppfos); + + for (const auto& include : includes()) + if (!include.empty()) + cpp << "#include \"" << include << "\"" << endl; + + if (!header().empty()) + cpp << "#include \"" << header() << "\"" << endl; + + cpp << "#include \"" << fsmfile() << ".h\"" << endl; + + cpp << "using namespace statemap;" << endl; + + openNamespaces(cpp); + for (const auto& map : _maps) + { + dynamic_cast(map)->generateCode(cpp, debug); + } + closeNamespaces(cpp); + } +} +bool FSMForCpp::updated(const Path& out) +{ + Path incPath(out, fsmfile() + ".h"); + File incFile(incPath); + if (incFile.exists()) + { + Timestamp incFilets = incFile.getLastModified(); + Timestamp fsmfilets = parser()->file().getLastModified(); + if (incFilets > fsmfilets) + return true; + } + + return false; +} + +} +} +} +} diff --git a/FSM/src/FactoryForCpp.cpp b/FSM/src/FactoryForCpp.cpp new file mode 100644 index 000000000..46d9fb9ac --- /dev/null +++ b/FSM/src/FactoryForCpp.cpp @@ -0,0 +1,111 @@ +/* + * FactoryForCpp.cpp + * + * Created on: 20 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/FactoryForCpp.h" +#include "cpp/ActionForCpp.h" +#include "cpp/FSMForCpp.h" +#include "cpp/GuardForCpp.h" +#include "cpp/MapForCpp.h" +#include "cpp/ParameterForCpp.h" +#include "cpp/StateForCpp.h" +#include "cpp/EntryForCpp.h" +#include "cpp/ExitForCpp.h" +#include "cpp/TransitionForCpp.h" +#include "cpp/ReferenceForCpp.h" +#include "cpp/VariableForCpp.h" +#include "cpp/FunctionForCpp.h" +#include "cpp/LiteralForCpp.h" +#include "cpp/ArgumentForCpp.h" +#include "cpp/UnaryOperationForCpp.h" +#include "cpp/BinaryOperationForCpp.h" + + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +ActionPtr FactoryForCpp::newAction(const string& name, int lineno) const +{ + return new ActionForCpp(name, lineno); +} +FSMPtr FactoryForCpp::newFSM(Parser* parser) const +{ + return new FSMForCpp(parser); +} +GuardPtr FactoryForCpp::newGuard(const string& name, int lineno) const +{ + return new GuardForCpp(name, lineno); +} +MapPtr FactoryForCpp::newMap(const string& name, int lineno) const +{ + return new MapForCpp(name, lineno); +} +ParameterPtr FactoryForCpp::newParameter(const string& name, int lineno) const +{ + return new ParameterForCpp(name, lineno); +} +StatePtr FactoryForCpp::newState(const string& name, int lineno) const +{ + return new StateForCpp(name, lineno); +} +EntryPtr FactoryForCpp::newEntry(const string& name, int lineno) const +{ + return new EntryForCpp(name, lineno); +} +ExitPtr FactoryForCpp::newExit(const string& name, int lineno) const +{ + return new ExitForCpp(name, lineno); +} +TransitionPtr FactoryForCpp::newTransition(const string& name, int lineno) const +{ + return new TransitionForCpp(name, lineno); +} +ReferencePtr FactoryForCpp::newReference(const VariablePtr variable, int lineno) const +{ + return new ReferenceForCpp(variable, lineno); +} +ReferencePtr FactoryForCpp::newReference(const FunctionPtr function, int lineno) const +{ + return new ReferenceForCpp(function, lineno); +} +ReferencePtr FactoryForCpp::newReference(const LiteralPtr literal, int lineno) const +{ + return new ReferenceForCpp(literal, lineno); +} +VariablePtr FactoryForCpp::newVariable(const string& name, int lineno) const +{ + return new VariableForCpp(name, lineno); +} +FunctionPtr FactoryForCpp::newFunction(const string& name, int lineno) const +{ + return new FunctionForCpp(name, lineno); +} +LiteralPtr FactoryForCpp::newLiteral(const string& name, int lineno) const +{ + return new LiteralForCpp(name, lineno); +} +ArgumentPtr FactoryForCpp::newArgument(const string& name, int lineno) const +{ + return new ArgumentForCpp(name, lineno); +} +UnaryOperationPtr FactoryForCpp::newUnaryOperation(Poco::FSM::MODEL::Operator op) const +{ + return new UnaryOperationForCpp(op); +} +BinaryOperationPtr FactoryForCpp::newBinaryOperation(Poco::FSM::MODEL::Operator op) const +{ + return new BinaryOperationForCpp(op); +} + +} +} +} +} \ No newline at end of file diff --git a/FSM/src/Function.cpp b/FSM/src/Function.cpp new file mode 100644 index 000000000..62d35ca4f --- /dev/null +++ b/FSM/src/Function.cpp @@ -0,0 +1,39 @@ +/* + * Function.cpp + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Function.h" +#include "model/Argument.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string Function::display() const +{ + if (oneline.empty()) + { + oneline += name(); + oneline += '('; + string arguments; + + for (int no = 0; no < _arguments.size(); ++no) + { + arguments += _arguments[no]->name(); + if (no + 1 < _arguments.size()) + arguments += ", "; + } + oneline += arguments; + oneline += ')'; + } + return oneline; +} + +} +} +} \ No newline at end of file diff --git a/FSM/src/FunctionForCpp.cpp b/FSM/src/FunctionForCpp.cpp new file mode 100644 index 000000000..aeaf79003 --- /dev/null +++ b/FSM/src/FunctionForCpp.cpp @@ -0,0 +1,25 @@ +/* + * FunctionForCpp.cpp + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/FunctionForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +const string FunctionForCpp::display(const string& prefix) const +{ + return prefix + Function::display(); +} +} +} +} +} diff --git a/FSM/src/Guard.cpp b/FSM/src/Guard.cpp new file mode 100644 index 000000000..41360e7ec --- /dev/null +++ b/FSM/src/Guard.cpp @@ -0,0 +1,57 @@ +/* + * Guard.cpp + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ +#include +using std::max; + + +#include "model/Guard.h" +#include "model/Action.h" +#include "model/State.h" +#include "model/Expression.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string Guard::display() const +{ + if (oneline.empty()) + { + string guards; + if (_condition != nullptr) + { + guards += '['; + guards += _condition->display(); + guards += ']'; + } + guards.resize(max(guards.size(), (size_t)40), ' '); + oneline += guards; + + string end = "nil"; + if (endstate()) + end = endstate()->name(); + end.resize(max(end.size(), (size_t)10), ' '); + + oneline += end; + + string actions; + actions += '{'; + for (auto action : _actions) + { + actions += action->display(); + } + actions += '}'; + + oneline += actions; + } + return oneline; +} +} +} +} \ No newline at end of file diff --git a/FSM/src/GuardForCpp.cpp b/FSM/src/GuardForCpp.cpp new file mode 100644 index 000000000..26bd758dc --- /dev/null +++ b/FSM/src/GuardForCpp.cpp @@ -0,0 +1,27 @@ +/* + * GuardForCpp.cpp + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/GuardForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +void GuardForCpp::generateInclude(ostream& inc, bool debug) const +{ +} +void GuardForCpp::generateCode(ostream& cpp, bool debug) const +{ +} +} +} +} +} \ No newline at end of file diff --git a/FSM/src/Identifier.cpp b/FSM/src/Identifier.cpp new file mode 100644 index 000000000..8377aac85 --- /dev/null +++ b/FSM/src/Identifier.cpp @@ -0,0 +1,55 @@ +/* + * Identifier.cpp + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#include "Poco/Ascii.h" +#include "Poco/StreamTokenizer.h" +using Poco::StreamTokenizer; +using Poco::Token; +using Poco::InvalidToken; +using Poco::EOFToken; +using Poco::WhitespaceToken; +using Poco::Ascii; +#include "parser/Identifier.h" + + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +Token::Class +Identifier::tokenClass() const +{ + return Token::IDENTIFIER_TOKEN; +} +bool +Identifier::start(char c, std::istream& istr) +{ + if (c != -1 && Ascii::isAlpha(c)) + { + _value = c; + return true; + } + else + return false; +} +void +Identifier::finish(std::istream& istr) +{ + int c = istr.peek(); + while (c != -1 && (Ascii::isAlphaNumeric(c) || Ascii::isDigit(c) || c == '_') || c == '-') + { + istr.get(); + _value += c; + c = istr.peek(); + } +} + +} +} +} diff --git a/FSM/src/IndentStream.cpp b/FSM/src/IndentStream.cpp new file mode 100644 index 000000000..5cfc2ad09 --- /dev/null +++ b/FSM/src/IndentStream.cpp @@ -0,0 +1,22 @@ +#include "parser/IndentStream.h" + +std::ostream& tab(std::ostream& stream) +{ + IndentStream* pIndentStream = dynamic_cast(&stream); + if (pIndentStream != nullptr) + { + pIndentStream->ib.tab(); + } + return stream; +} + +std::ostream& back(std::ostream& stream) +{ + IndentStream* pIndentStream = dynamic_cast(&stream); + if (pIndentStream != nullptr) + { + pIndentStream->ib.back(); + } + return stream; +} + diff --git a/FSM/src/Keyword.cpp b/FSM/src/Keyword.cpp new file mode 100644 index 000000000..7988459c0 --- /dev/null +++ b/FSM/src/Keyword.cpp @@ -0,0 +1,111 @@ +/* + * Keyword.cpp + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#include "Poco/Token.h" +#include "Poco/Ascii.h" +using Poco::InvalidToken; +using Poco::EOFToken; +using Poco::WhitespaceToken; +using Poco::Ascii; + +#include "parser/Keyword.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +Keyword::Keyword() +{ + _opMap["%start"] = START; // %start + _opMap["%class"] = CLASS; // %class + _opMap["%fsmclass"] = FFSMLASS, // %fsmclass + _opMap["%fsmfile"] = FSMFILE, // %fsmfile + _opMap["%header"] = HEADER; // %header + _opMap["%include"] = INCLUDE; // %include + _opMap["%package"] = PACKAGE; // %package + _opMap["%import"] = IMPORT; // %import + _opMap["%declare"] = DECLARE; // %declare + _opMap["%access"] = ACCESS; // %access + _opMap["%map"] = MAP; // %map + _opMap["%return"] = RETURN; // %return +} +Keyword::~Keyword() +{ + +} + +Token::Class Keyword::tokenClass() const +{ + return Token::KEYWORD_TOKEN; +} +bool Keyword::start(char c, std::istream& istr) +{ + if (c != -1 && c == '%') + { + char next = istr.peek(); + if (islower(next)) + { + _value = c; + return true; + } + } + return false; +} +void Keyword::finish(std::istream& istr) +{ + int c = istr.peek(); + while (c != -1 && (Ascii::isLower(c))) + { + istr.get(); + _value += c; + c = istr.peek(); + } +} +int Keyword::asInteger() const +{ + OpMap::const_iterator it = _opMap.find(_value); + if (it != _opMap.end()) + return it->second; + else + return 0; +} +const char* Keyword::asString(int kwno) +{ + switch (kwno) + { + case START: + return "%start"; + case CLASS: + return "%class"; + case FSMFILE: + return "%fsmfile"; + case FFSMLASS: + return "%fsmclass"; + case HEADER: + return "%header"; + case INCLUDE: + return "%include"; + case PACKAGE: + return "%package"; + case IMPORT: + return "%import"; + case DECLARE: + return "%declare"; + case ACCESS: + return "%access"; + case MAP: + return "%map"; + default: + return "???"; + } +} + +} +} +} diff --git a/FSM/src/Literal.cpp b/FSM/src/Literal.cpp new file mode 100644 index 000000000..1bc22ec77 --- /dev/null +++ b/FSM/src/Literal.cpp @@ -0,0 +1,26 @@ +/* + * Literal.cpp + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Literal.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string Literal::display() const +{ + return name(); +} +const string Literal::display(const string& prefix) const +{ + return display(); +} +} +} +} diff --git a/FSM/src/LiteralForCpp.cpp b/FSM/src/LiteralForCpp.cpp new file mode 100644 index 000000000..b8288502c --- /dev/null +++ b/FSM/src/LiteralForCpp.cpp @@ -0,0 +1,21 @@ +/* + * LiteralForCpp.cpp + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/LiteralForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +} +} +} +} diff --git a/FSM/src/Map.cpp b/FSM/src/Map.cpp new file mode 100644 index 000000000..e1e53f225 --- /dev/null +++ b/FSM/src/Map.cpp @@ -0,0 +1,58 @@ +/* + * Map.cpp + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Map.h" +#include "model/Transition.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +void Map::add(TransitionPtr transition) +{ + if (transition->name() != "Default") + _transitions[transition->signature()] = transition; +} + +void Map::add(StatePtr state) +{ + _states[state->name()] = state; + state->map() = this; +} + +StatePtr Map::lookfor(const string& state) const +{ + StatePtr result = nullptr; + try + { + result = _states.at(state); + } + catch (const std::out_of_range&) + { + } + return result; +} +void Map::print(Print& print) const +{ + for (const auto& state : states()) + { + state.second->print(print); + } +} +const string Map::display() const +{ + if (oneline.empty()) + { + + } + return oneline; +} +} +} +} \ No newline at end of file diff --git a/FSM/src/MapForCpp.cpp b/FSM/src/MapForCpp.cpp new file mode 100644 index 000000000..fb43f6018 --- /dev/null +++ b/FSM/src/MapForCpp.cpp @@ -0,0 +1,252 @@ +/* + * MapForCpp.cpp + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#include +#include "parser/IndentStream.h" +#include "model/Parameter.h" +#include "cpp/MapForCpp.h" +#include "cpp/StateForCpp.h" +#include "cpp/FSMForCpp.h" +#include "cpp/TransitionForCpp.h" + +using Poco::FSM::MODEL::Parameter; +using Poco::FSM::MODEL::StatePtr; + +using namespace std; + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ + +string MapForCpp::defaultStateName() const +{ + return name() + '_' + defaultState()->name(); +} + +string MapForCpp::startStateName() const +{ + return fsm()->startState(); +} + +static const int LL = 50; + +void MapForCpp::generateInclude(ostream& inc, bool debug) const +{ + string comment; + { + comment = "// Forward declarations."; + comment.resize(LL, '-'); + inc << comment << endl; + inc << "class " << name() << ";" << endl; + + for (const auto& state : states()) + { + dynamic_cast(state.second)->generateForwarDeclaration(inc, debug); + } + + inc << "class " << defaultStateName() << ";" << endl; + inc << "class " << fsm()->klass() << "State;" << endl; + inc << "template class " << fsm()->fsmclass() << ";" << endl; + inc << "class " << fsm()->klass() << ";" << endl; + inc << endl; + inc << endl; + } + + { + comment = "// Class State."; + comment.resize(LL, '-'); + inc << comment << endl; + inc << "class " << fsm()->klass() << "State : public statemap::State {" << endl; + inc << "public:" << endl << tab; + + inc << fsm()->klass() << "State(const char *name, int no) : statemap::State(name, no) {};" << endl; + inc << endl; + inc << "virtual void Entry(" << fsm()->context() << "&) {};" << endl; + inc << "virtual void Exit(" << fsm()->context() << "&) {};" << endl; + inc << endl; + +#if 0 + for (const auto& state : states()) + { + StateForCpp* sfc = dynamic_cast(state.second); + sfc->generateVirtualTransitions(inc); + } +#else + for (const auto& transition : transitions()) + if (transition.second) + { + Parameter context("context"); + context.type() = fsm()->context() + '&'; + TransitionForCpp* tfc = static_cast(transition.second); + inc << "virtual void " << tfc->declaration(&context) << ";" << endl; + } + +#endif + inc << back << "protected:" << endl << tab; + inc << "virtual void Default(" << fsm()->context() << "& context);" << endl << back; + inc << "};" << endl; + inc << endl; + } + + { + comment = "// FSM map default state class."; + comment.resize(LL, '-'); + inc << comment << endl; + inc << "class " << defaultStateName() << " : public " << fsm()->klass() << "State {" << endl; + inc << "public:" << endl << tab; + inc << defaultStateName() << " (const char *name, int stateId) : " << fsm()->klass() << "State(name, stateId) {}" << endl; + inc << back << "};"; + inc << endl; + inc << endl; + + comment = "// FSM map states class."; + comment.resize(LL, '-'); + inc << comment << endl; + for (const auto& state : states()) + { + StateForCpp* sfc = dynamic_cast(state.second); + sfc->generateDefinition(inc, debug); + } + } + + + { + comment = "// FSM map class."; + comment.resize(LL, '-'); + inc << comment << endl; + inc << "class " << name() << " {" << endl; + inc << "public:" << endl << tab; + inc << name() << "();" << endl; + for (const auto& state : states()) + { + const StatePtr sp = state.second; + inc << name() + '_' + sp->name() << ' ' << sp->name() << ";" << endl; + } + inc << back << "};" << endl; + inc << endl; + } + + { + comment = "// FSM context class "; + comment.resize(LL, '-'); + inc << comment << endl; + + inc << "template" << endl; + inc << "class " << fsm()->fsmclass() << " : public statemap::FSMContext, public " << name() << " {" << endl; + inc << "public:" << endl << tab; + + inc << "explicit " << endl; + inc << fsm()->fsmclass() << "(statemap::Notifier& notifier) : FSMContext(notifier, " << startStateName() << ") {};" << endl; + inc << fsm()->fsmclass() << "(statemap::Notifier& notifier, const statemap::State& state) : FSMContext(notifier, state) {};" << endl; + inc << endl; + + inc << "void setStartState(const statemap::State& state) {" << endl; + inc << " setState(state);" << endl; + inc << "}" << endl; + inc << endl; + + inc << "virtual void enterStartState() {" << endl; + inc << " getState().Entry(*this);" << endl; + inc << " return;" << endl; + inc << "}" << endl; + inc << endl; + + inc << "Derived& getOwner() {" << endl; + inc << " return (*static_cast(this));" << endl; + inc << "};" << endl; + inc << endl; + + inc << "const Derived& getOwner() const {" << endl; + inc << " return (*static_cast(this));" << endl; + inc << "};" << endl; + inc << endl; + + inc << fsm()->klass() << "State& getState() const {" << endl; + inc << " if (_state == nullptr) {" << endl; + inc << " throw statemap::StateUndefinedException();" << endl; + inc << " }" << endl; + inc << " return (dynamic_cast<" << fsm()->klass() << "State&>(*_state));" << endl; + inc << "};" << endl; + inc << endl; + + for (const auto& transition : transitions()) + if (transition.second) + { + TransitionForCpp* tfc = static_cast(transition.second); + if (fsm()->returnt().empty()) + inc << "void "; + else + inc << fsm()->returnt() + " "; + + inc << tfc->declaration() << " {" << endl; + inc << " setTransition(\"" << tfc->Transition::name() << "\");" << endl; + inc << " getState()." << tfc->call("*this") << ";" << endl; + inc << " setTransition(nullptr);" << endl; + inc << "};" << endl; + } + inc << back; + inc << "};" << endl; + + } +} +void MapForCpp::generateCode(ostream& cpp, bool debug) const +{ + string comment; + cpp << "// FSM Map constructor." << endl; + cpp << name() << "::" << name() << "() :" << endl << tab; + int no = 0; + for (const auto& state : states()) + { + StateForCpp* sfc = dynamic_cast(state.second); + sfc->generateDeclaration(cpp, no++); + if (no < states().size()) + cpp << ","; + cpp << endl; + } + cpp << back << "{}" << endl; + + cpp << endl; + comment = "// Class state "; + comment.resize(LL, '-'); + cpp << comment << endl; + for (const auto& transition : transitions()) + if (transition.second) + { + Parameter context("context"); + context.type() = fsm()->context() + '&'; + TransitionForCpp* tfc = static_cast(transition.second); + if (fsm()->returnt().empty()) + cpp << "void "; + else + cpp << fsm()->returnt() + " "; + + cpp << fsm()->klass() << "State::" << tfc->declaration(&context) << " {" << endl; + cpp << " Default(context);" << endl; + cpp << "}" << endl; + } + + cpp << "void " << fsm()->klass() << "State::Default(" << fsm()->context() << "& context) {" << endl; + cpp << " throw TransitionUndefinedException(context.getState().getName(), context.getTransition());" << endl; + cpp << " return;" << endl; + cpp << "}" << endl; + + + for (const auto& state : states()) + { + StateForCpp* sfc = dynamic_cast(state.second); + sfc->generateCode(cpp, debug); + } +} +} +} +} +} \ No newline at end of file diff --git a/FSM/src/Number.cpp b/FSM/src/Number.cpp new file mode 100644 index 000000000..532b211e6 --- /dev/null +++ b/FSM/src/Number.cpp @@ -0,0 +1,49 @@ +/* + * Number.cpp + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#include "Poco/Token.h" +#include "Poco/Ascii.h" +using Poco::InvalidToken; +using Poco::EOFToken; +using Poco::WhitespaceToken; +using Poco::Ascii; +#include "parser/Number.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +Token::Class Number::tokenClass() const +{ + return Token::INTEGER_LITERAL_TOKEN; +} +bool Number::start(char c, std::istream& istr) +{ + if (c != -1 && Ascii::isDigit(c)) + { + _value = c; + return true; + } + else + return false; +} +void Number::finish(std::istream& istr) +{ + int c = istr.peek(); + while (c != -1 && Ascii::isDigit(c)) + { + istr.get(); + _value += c; + c = istr.peek(); + } +} + +} +} +} diff --git a/FSM/src/Operation.cpp b/FSM/src/Operation.cpp new file mode 100644 index 000000000..dfdfee883 --- /dev/null +++ b/FSM/src/Operation.cpp @@ -0,0 +1,32 @@ +/* + * Operation.cpp + * + * Created on: 20 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Operation.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ + +Operation::Operation(Operator op) :_operator(op) +{ +} +Operation:: ~Operation() +{ +} +void Operation::setNoContextuel() +{ + if (_operator == Operator::equal || _operator == Operator::notequal) + { + _contextuel = false; + } +} +} +} +} \ No newline at end of file diff --git a/FSM/src/Operator.cpp b/FSM/src/Operator.cpp new file mode 100644 index 000000000..ea2e7e8be --- /dev/null +++ b/FSM/src/Operator.cpp @@ -0,0 +1,212 @@ +/* + * Operator.cpp + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#include "Poco/Ascii.h" + +#include "Poco/StreamTokenizer.h" +using Poco::StreamTokenizer; +using Poco::Token; +using Poco::InvalidToken; +using Poco::EOFToken; +using Poco::WhitespaceToken; +using Poco::Ascii; + +#include "parser/Operator.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +Operator::Operator() +{ + _opMap["["] = OP::OPENBRACKET; + _opMap["]"] = OP::CLOSBRACKET; + _opMap["("] = OP::OPENPARENT; + _opMap[")"] = OP::CLOSPARENT; + _opMap["{"] = OP::OPENBRACE; + _opMap["}"] = OP::CLOSBRACE; + _opMap["<"] = OP::LT; + _opMap["<="] = OP::LE; + _opMap["<<"] = OP::SHL; + _opMap["<<="] = OP::SHL_ASSIGN; + _opMap[">"] = OP::GT; + _opMap[">="] = OP::GE; + _opMap[">>"] = OP::SHR; + _opMap[">>="] = OP::SHR_ASSIGN; + _opMap["="] = OP::ASSIGN; + _opMap["=="] = OP::EQ; + _opMap["!"] = OP::NOT; + _opMap["!="] = OP::NE; + _opMap["&"] = OP::BITAND; + _opMap["&="] = OP::BITAND_ASSIGN; + _opMap["&&"] = OP::AND; + _opMap["|"] = OP::BITOR; + _opMap["|="] = OP::BITOR_ASSIGN; + _opMap["||"] = OP::OR; + _opMap["^"] = OP::XOR; + _opMap["^="] = OP::XOR_ASSIGN; + _opMap["~"] = OP::COMPL; + _opMap["*"] = OP::STAR; + _opMap["*="] = OP::STAR_ASSIGN; + _opMap["/"] = OP::SLASH; + _opMap["/="] = OP::SLASH_ASSIGN; + _opMap["+"] = OP::PLUS; + _opMap["+="] = OP::PLUS_ASSIGN; + _opMap["++"] = OP::INCR; + _opMap["-"] = OP::MINUS; + _opMap["-="] = OP::MINUS_ASSIGN; + _opMap["--"] = OP::DECR; + _opMap["->"] = OP::ARROW; + _opMap["%"] = OP::MOD; + _opMap["%="] = OP::MOD_ASSIGN; + _opMap[","] = OP::COMMA; + _opMap["."] = OP::PERIOD; + _opMap["..."] = OP::ELLIPSIS; + _opMap[":"] = OP::COLON; + _opMap["::"] = OP::DBL_COLON; + _opMap[";"] = OP::SEMICOLON; + _opMap["?"] = OP::QUESTION; + _opMap["%{"] = OP::OPENCODE; + _opMap["%}"] = OP::CLOSCODE; + _opMap["%%"] = OP::FSM; +} + + +Operator::~Operator() +{ +} + + +Token::Class Operator::tokenClass() const +{ + return Token::OPERATOR_TOKEN; +} + + +bool Operator::start(char c, std::istream& istr) +{ + _value = c; + char next = (char) istr.peek(); + switch (_value[0]) + { + case '[': + case ']': + case '(': + case ')': + case '{': + case '}': + case '<': + case '>': + case '=': + case '!': + case '&': + case '|': + case '*': + case '+': + case '-': + case '^': + case '~': + case ',': + case ':': + case ';': + case '%': + case '?': + return true; + case '.': + return !(next >= '0' && next <= '9'); + case '/': + return !(next == '/' || next == '*'); + default: + return false; + } +} + + +void Operator::finish(std::istream& istr) +{ + int next = (char) istr.peek(); + switch (_value[0]) + { + case '(': + case ')': + case '{': + case '}': + case '[': + case ']': + case ';': + case '?': + case '~': + case ',': + break; + case '.': + if (next == '.') + { + _value += (char) istr.get(); + if (istr.peek() != '.') syntaxError(".", std::string(1, (char)istr.peek())); + _value += (char) istr.get(); + } + break; + case ':': + if (next == ':') _value += (char) istr.get(); + break; + case '<': + if (next == '<') + { + _value += (char) istr.get(); + next = (char) istr.peek(); + } + if (next == '=') _value += (char) istr.get(); + break; + case '>': + if (next == '>') + { + _value += (char) istr.get(); + next = (char) istr.peek(); + } + if (next == '=') _value += (char) istr.get(); + break; + case '&': + if (next == '&' || next == '=') _value += (char) istr.get(); + break; + case '|': + if (next == '|' || next == '=') _value += (char) istr.get(); + break; + case '+': + if (next == '+' || next == '=') _value += (char) istr.get(); + break; + case '-': + if (next == '-' || next == '=' || next == '>') _value += (char) istr.get(); + break; + case '=': + case '!': + case '*': + case '/': + case '^': + case '%': + if (next == '=' || next == '{' || next == '}' || next == '%') _value += (char) istr.get(); + break; + default: + poco_bugcheck(); + } +} + + +int Operator::asInteger() const +{ + OpMap::const_iterator it = _opMap.find(_value); + if (it != _opMap.end()) + return it->second; + else + return 0; +} + + +} +} +} diff --git a/FSM/src/Parameter.cpp b/FSM/src/Parameter.cpp new file mode 100644 index 000000000..4c8c9b483 --- /dev/null +++ b/FSM/src/Parameter.cpp @@ -0,0 +1,28 @@ +/* + * Parameter.cpp + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Parameter.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string Parameter::display() const +{ + if (oneline.empty()) + { + oneline += name(); + oneline += ':'; + oneline += _type; + } + return oneline; +} +} +} +} \ No newline at end of file diff --git a/FSM/src/ParameterForCpp.cpp b/FSM/src/ParameterForCpp.cpp new file mode 100644 index 000000000..a29a0d65d --- /dev/null +++ b/FSM/src/ParameterForCpp.cpp @@ -0,0 +1,31 @@ +/* + * ParameterForCpp.cpp + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#include +#include "cpp/ParameterForCpp.h" +using namespace std; + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +void ParameterForCpp::generateInclude(ostream& inc, bool debug) const +{ + inc << type() << ' ' << name(); +} +void ParameterForCpp::generateCode(ostream& cpp, bool debug) const +{ + cpp << type() << ' ' << name(); +} +} +} +} +} \ No newline at end of file diff --git a/FSM/src/Parser.cpp b/FSM/src/Parser.cpp new file mode 100644 index 000000000..bcc6c39c8 --- /dev/null +++ b/FSM/src/Parser.cpp @@ -0,0 +1,1021 @@ +/* + * Parser.cpp + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ +#include +#include +#include +#include +#include + +#include "Poco/Bugcheck.h" +#include "Poco/NumberFormatter.h" +#include "Poco/StreamTokenizer.h" +#include "Poco/Path.h" +#include "Poco/File.h" +#include "Poco/Ascii.h" + +#include "Poco/String.h" + +using Poco::Bugcheck; +using Poco::NumberFormatter; +using Poco::StreamTokenizer; +using Poco::SyntaxException; +using Poco::InvalidToken; +using Poco::EOFToken; +using Poco::WhitespaceToken; +using Poco::Path; +using Poco::File; +using Poco::Ascii; + +#include "parser/Parser.h" +#include "parser/Identifier.h" +#include "parser/Number.h" +#include "parser/Keyword.h" +#include "parser/Comment.h" +#include "parser/Character.h" +#include "parser/Operator.h" +#include "parser/String.h" + +#include "model/Action.h" +#include "model/FSM.h" +#include "model/Guard.h" +#include "model/Map.h" +#include "model/Parameter.h" +#include "model/State.h" +#include "model/Entry.h" +#include "model/Exit.h" +#include "model/Transition.h" +#include "model/Expression.h" +#include "model/Transition.h" +#include "model/Reference.h" +#include "model/Variable.h" +#include "model/Function.h" +#include "model/Literal.h" +#include "model/Reference.h" +#include "model/Argument.h" +#include "model/UnaryOperation.h" +#include "model/BinaryOperation.h" + +#include "model/Factory.h" +#include "cpp/FactoryForCpp.h" + +using namespace std; + +using Poco::FSM::MODEL::Action; +using Poco::FSM::MODEL::FSM; +using Poco::FSM::MODEL::Guard; +using Poco::FSM::MODEL::Map; +using Poco::FSM::MODEL::Parameter; +using Poco::FSM::MODEL::State; +using Poco::FSM::MODEL::Transition; +using Poco::FSM::MODEL::ActionPtr; +using Poco::FSM::MODEL::FSMPtr; +using Poco::FSM::MODEL::GuardPtr; +using Poco::FSM::MODEL::MapPtr; +using Poco::FSM::MODEL::ParameterPtr; +using Poco::FSM::MODEL::StatePtr; +using Poco::FSM::MODEL::TransitionPtr; +using Poco::FSM::MODEL::FunctionPtr; +using Poco::FSM::MODEL::VariablePtr; +using Poco::FSM::MODEL::LiteralPtr; +using Poco::FSM::MODEL::ExpressionPtr; +using Poco::FSM::MODEL::ArgumentPtr; +using Poco::FSM::MODEL::UnaryOperation; +using Poco::FSM::MODEL::BinaryOperation; + +static const char TAB = '\t'; + +static const Poco::FSM::MODEL::Factory& factory = Poco::FSM::PARSER::CPP::FactoryForCpp(); + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ + +Parser::Parser(Logger& logger, const File& file, istream& istr) : + _logger(logger), + _istr(istr), + _tokenizer(_istr), + _file(file) +{ +} +Parser:: ~Parser() +{ +} + +FSMPtr Parser::parse(const Path& out) +{ + try + { + fsm = factory.newFSM(this); + const Poco::Token* next = nextToken(); + next = parseFile(next, out); + if (next && !isEOF(next)) + syntaxError("Additional tokens behind supposed EOF"); + } + catch (SyntaxException& exc) + { + string m(exc.message()); + string where(_currentPath); + where.append("("); + where.append(NumberFormatter::format(_istr.getCurrentLineNumber())); + where.append(")"); + throw SyntaxException(m, where); + } + return fsm; +} +inline bool Parser::isString(const Poco::Token* token) +{ + return token->is(Token::STRING_LITERAL_TOKEN); +} +inline bool Parser::isCharacter(const Poco::Token* token) +{ + return token->is(Token::CHAR_LITERAL_TOKEN); +} +inline bool Parser::isNumber(const Poco::Token* token) +{ + return token->is(Token::INTEGER_LITERAL_TOKEN) || token->is(Token::LONG_INTEGER_LITERAL_TOKEN); +} + +inline bool Parser::isIdentifier(const Poco::Token* token) +{ + return token->is(Token::IDENTIFIER_TOKEN) || isOperator(token, Operator::DBL_COLON); +} + + +inline bool Parser::isOperator(const Poco::Token* token) +{ + return token->is(Token::OPERATOR_TOKEN); +} + +inline bool Parser::isOperator(const Poco::Token* token, int kind) +{ + return token->is(Token::OPERATOR_TOKEN) && token->asInteger() == kind; +} + + +inline bool Parser::isKeyword(const Poco::Token* token, int kind) +{ + return token->is(Token::KEYWORD_TOKEN) && token->asInteger() == kind; +} + + +inline bool Parser::isEOF(const Poco::Token* token) +{ + return token->is(Token::EOF_TOKEN); +} +const char* classToString(Token::Class klass) +{ + switch (klass) + { + case Token::IDENTIFIER_TOKEN: + return "IDENTIFIER"; + case Token::KEYWORD_TOKEN: + return "KEYWORD"; + case Token::SEPARATOR_TOKEN: + return "SEPARATOR"; + case Token::OPERATOR_TOKEN: + return "OPERATOR"; + case Token::STRING_LITERAL_TOKEN: + return "STRING_LITERAL"; + case Token::CHAR_LITERAL_TOKEN: + return "CHAR_LITERAL"; + case Token::INTEGER_LITERAL_TOKEN: + return "INTEGER_LITERAL"; + case Token::LONG_INTEGER_LITERAL_TOKEN: + return "LONG_INTEGER_LITERAL"; + case Token::FLOAT_LITERAL_TOKEN: + return "FLOAT_LITERAL"; + case Token::DOUBLE_LITERAL_TOKEN: + return "DOUBLE_LITERAL"; + case Token::COMMENT_TOKEN: + return "COMMENT"; + case Token::SPECIAL_COMMENT_TOKEN: + return "SPECIAL_COMMENT"; + case Token::PREPROCESSOR_TOKEN: + return "PREPROCESSOR"; + case Token::WHITESPACE_TOKEN: + return "WHITESPACE"; + case Token::EOF_TOKEN: + return "EOF"; + case Token::INVALID_TOKEN: + return "INVALID"; + case Token::USER_TOKEN: + return "USER"; + } + return "???"; +} + +const Poco::Token* Parser::parseFile(const Poco::Token* next, const Path& out) +{ + while (next->is(Token::KEYWORD_TOKEN) || next->is(Token::OPERATOR_TOKEN)) + { + if (next->is(Token::KEYWORD_TOKEN)) + switch (next->asInteger()) + { + case Keyword::START: // %start + next = parseStart(next); + break; + case Keyword::CLASS: // %class + next = parseClass(next); + break; + case Keyword::FSMFILE: // %fsmfile + next = parseFSMFile(next); + break; + case Keyword::FFSMLASS: // %fsmclass + next = parseFFSMlass(next); + break; + case Keyword::HEADER: // %header + next = parseHeader(next); + break; + case Keyword::INCLUDE: // %include + next = parseIncludes(next); + break; + case Keyword::PACKAGE: // %package + next = parsePackage(next); + break; + case Keyword::IMPORT: // %import + next = parseImport(next); + break; + case Keyword::DECLARE: // %declare + next = parseDeclare(next); + break; + case Keyword::ACCESS: // %access + next = parseAccess(next); + break; + case Keyword::MAP: // %map + if (fsm->fsmfile().empty()) + fsm->fsmfile() = fsm->klass() + "_sm"; + fsm->setcontext(); + + if (fsm->updated(out)) + { + fsm->updated() = true; + return nullptr; + } + + next = parseMap(next); + break; + case Keyword::RETURN: // %return + next = parseReturn(next); + break; + default: + poco_bugcheck(); + break; + } + else if (next->is(Token::OPERATOR_TOKEN)) + switch (next->asInteger()) + { + case Operator::OPENCODE: // %{ + next = parseRawCode(next); + break; + default: + poco_bugcheck(); + } + } + return next; +} +const Poco::Token* Parser::parseSource(const Poco::Token* next) +{ + return next; +} +const Poco::Token* Parser::parseReturn(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::RETURN)); + const string rcclass = next->tokenString(); + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + string klass = next->tokenString(); + fsm->returnt() = klass; + next = nextToken(); + } + return next; +} +const Poco::Token* Parser::parseStart(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::START)); + const string keyword = next->tokenString(); + + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + string startstate = next->tokenString(); + next = nextToken(); + if (isOperator(next, Operator::DBL_COLON)) + { + startstate += next->tokenString(); + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + startstate += next->tokenString(); + next = nextToken(); + } + } + fsm->startState() = startstate; + + } + return next; +} +const Poco::Token* Parser::parseClass(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::CLASS)); + const string pcclass = next->tokenString(); + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + string klass = next->tokenString(); + fsm->klass() = klass; + next = nextToken(); + } + return next; +} +const Poco::Token* Parser::parseFSMFile(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::FSMFILE)); + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + string fsmfile = next->tokenString(); + fsm->fsmfile() = fsmfile; + next = nextToken(); + } + return next; +} +const Poco::Token* Parser::parseFFSMlass(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::FFSMLASS)); + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + string fsmclass = next->tokenString(); + fsm->fsmclass() = fsmclass; + next = nextToken(); + } + return next; +} +const Poco::Token* Parser::parseHeader(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::HEADER)); + const string pcheader = next->tokenString(); + next = nextToken(); + string file; + do + { + file += next->tokenString(); + next = nextToken(); + } + while (!next->is(Token::KEYWORD_TOKEN)); + fsm->header() = file; + return next; +} +const Poco::Token* Parser::parseIncludes(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::INCLUDE)); + next = nextToken(); + for (;;) + { + next = parseInclude(next); + if (isOperator(next, Operator::COMMA)) + next = nextToken(); + else + break; + } + return next; +} +const Poco::Token* Parser::parseInclude(const Poco::Token* next) +{ + if (next->is(Token::STRING_LITERAL_TOKEN)) + { + string file = next->tokenString().substr(1); // remove begin " + file = file.substr(0, file.size() - 1); // remove ending " + fsm->includes().push_back(file); + next = nextToken(); + } + else if (next->is(Token::IDENTIFIER_TOKEN)) + { + string file = next->tokenString(); + next = nextToken(); + if (isOperator(next, Operator::PERIOD)) + { + file += '.'; + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + file += next->tokenString(); + fsm->includes().push_back(file); + next = nextToken(); + } + } + } + return next; +} +const Poco::Token* Parser::parsePackage(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::PACKAGE)); + const string pcpackage = next->tokenString(); + next = nextToken(); + string packages; + do + { + if (next->is(Token::IDENTIFIER_TOKEN)) + { + string package = next->tokenString(); + fsm->addPackage(package); + packages += package; + next = nextToken(); + if (isOperator(next, Operator::DBL_COLON)) + { + packages += next->tokenString(); + next = nextToken(); + } + } + } + while (!next->is(Token::KEYWORD_TOKEN)); + return next; +} +const Poco::Token* Parser::parseImport(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::IMPORT)); + const string pcimport = next->tokenString(); + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + string import = next->tokenString(); + next = nextToken(); + } + return next; +} +const Poco::Token* Parser::parseDeclare(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::DECLARE)); + const string pcdeclare = next->tokenString(); + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + string declare = next->tokenString(); + next = nextToken(); + } + return next; +} +const Poco::Token* Parser::parseAccess(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::ACCESS)); + const Poco::Token* token = next; + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + string access = next->tokenString(); + next = nextToken(); + } + return next; +} +const Poco::Token* Parser::parseMap(const Poco::Token* next) +{ + poco_assert(isKeyword(next, Keyword::MAP)); + next = nextToken(); + if (next->is(Token::IDENTIFIER_TOKEN)) + { + map = factory.newMap(next->tokenString()); + fsm->add(map); + next = nextToken(); + next = parseStates(next); + if (map->defaultState() == nullptr) + map->defaultState() = factory.newState("Default"); + } + return next; +} +const Poco::Token* Parser::parseStates(const Poco::Token* next) +{ + poco_assert(isOperator(next, Operator::FSM)); + const Poco::Token* token = next; +// OPEN { // Transport connection is open +// WAIT CLOSING {} +// TDISreq(tsdu: TPDU::DR&) [P7()] CLOSING {DR(tsdu);} +// } + next = nextToken(); + do + { + next = parseState(next); + } + while (!isOperator(next, Operator::FSM)); + next = nextToken(); + return next; +} +const Poco::Token* Parser::parseState(const Poco::Token* next) +{ + poco_assert(isIdentifier(next)); + state = map->lookfor(next->tokenString()); + if (state == nullptr) + { + state = factory.newState(next->tokenString()); + map->add(state); + } + map->add(state); + next = nextToken(); + next = parseEntry(next); + state->entry() = entry; + next = parseExit(next); + state->exit() = exit; + next = parseTransitions(next); + next = nextToken(); + return next; +} +const Poco::Token* Parser::parseEntry(const Poco::Token* next) +{ + entry = nullptr; + if (isOperator(next, Operator::OPENBRACE)) + return next; + poco_assert(next->tokenString() == "Entry"); + entry = factory.newEntry("Entry"); + next = nextToken(); + next = parseActions(next, entry->actions()); + return next; +} +const Poco::Token* Parser::parseExit(const Poco::Token* next) +{ + exit = nullptr; + if (isOperator(next, Operator::OPENBRACE)) + return next; + poco_assert(next->tokenString() == "Exit"); + exit = factory.newExit("Exit"); + next = nextToken(); + next = parseActions(next, exit->actions()); + return next; +} +const Poco::Token* Parser::parseTransitions(const Poco::Token* next) +{ + poco_assert(isOperator(next, Operator::OPENBRACE)); + next = nextToken(); + while (!isOperator(next, Operator::CLOSBRACE)) + { + next = parseTransition(next); + } + return next; +} +const Poco::Token* Parser::parseTransition(const Poco::Token* next) +{ + poco_assert(isIdentifier(next)); + string name = next->tokenString(); + next = nextToken(); + next = parseParameters(next); + transition = state->get(name, parameters); + if (transition == nullptr) + { + transition = factory.newTransition(name); + for (auto parameter : parameters) + if (parameter != nullptr) + transition->add(parameter); + state->add(transition); + map->add(transition); + } + guard = nullptr; + next = parseGuard(next); + transition->add(guard); + next = parseNext(next); + next = parseActions(next, guard->actions()); +// _dump(transition, guard); + return next; +} +const Poco::Token* Parser::parseTransitionArgs(const Poco::Token* next) +{ + next = nextToken(); + return next; +} +const Poco::Token* Parser::parseGuard(const Poco::Token* next) +{ + guard = factory.newGuard(""); + if (isOperator(next, Operator::OPENBRACKET)) + { + do + { + next = nextToken(); + next = parseExpression(next, guard->condition()); + } + while (!isOperator(next, Operator::CLOSBRACKET)); + guard->condition()->guard() = guard; + next = nextToken(); + } + return next; +} +const Poco::Token* Parser::parseTerminal(const Poco::Token* next, ReferencePtr& reference) +{ + poco_assert(isIdentifier(next)); + if (isIdentifier(next)) + { + const Poco::Token* identifier = next; // true/false not supported + next = nextToken(); + if (isOperator(next, Operator::OPENPARENT)) + { + FunctionPtr function = factory.newFunction(identifier->tokenString()); + next = parseArguments(next, function->arguments()); + reference = factory.newReference(function); + } + else + { + VariablePtr variable = factory.newVariable(identifier->tokenString()); + reference = factory.newReference(variable); + } + reference->guard() = guard; + } + return next; +} +void Parser::reduce() +{ + ExpressionPtr top; + ExpressionPtr right; + BinaryOperationPtr binop; + ExpressionPtr left; + ReferencePtr ref; + + right = _stack.top(); + _stack.pop(); + poco_check_ptr(right); + top = _stack.top(); + if (top == nullptr) + { + _stack.pop(); + _stack.push(right); + } + else + { + binop = dynamic_cast(top); + _stack.pop(); + left = _stack.top(); + _stack.pop(); + poco_check_ptr(left); + binop->left() = left; + left->operation() = binop; + binop->right() = right; + right->operation() = binop; + if (_stack.size() > 1) + if (_stack.top() == nullptr) + _stack.pop(); + + _stack.push(binop); + } +} +const Poco::Token* Parser::parseExpression(const Poco::Token* next, ExpressionPtr& expression) +{ + poco_assert(isIdentifier(next) || isOperator(next, Operator::NOT) || isOperator(next, Operator::OPENPARENT)); + poco_assert(_stack.size() == 0); + + for (;;) + { + if (isOperator(next, Operator::CLOSBRACKET)) + break; + + if (isIdentifier(next)) + { + ReferencePtr reference; + next = parseTerminal(next, reference); + expression = reference; + if (_stack.size() > 0) + { + ExpressionPtr top = _stack.top(); + if (top != nullptr) + { + // + // TODO: to be improved using true operator's precedence. + /* + 1 () [] -> . :: Function call, scope, array/member access + 2 ! ~ - + * & sizeof type cast ++ -- (most) unary operators, sizeof and type casts (right to left) + 3 * / % MOD Multiplication, division, modulo + 4 + - Addition and subtraction + 5 << >> Bitwise shift left and right + 6 < <= > >= Comparisons: less-than, ... + 7 == != Comparisons: equal and not equal + 8 & Bitwise AND + 9 ^ Bitwise exclusive OR (XOR) + 10 | Bitwise inclusive (normal) OR + 11 && Logical AND + 12 || Logical OR + 13 ? : Conditional expression (ternary) + 14 = += -= *= /= %= &= |= ^= <<= >>= Assignment operators (right to left) + 15 , Comma operator + */ + // + UnaryOperation* monop = dynamic_cast(top); + BinaryOperation* binop = dynamic_cast(top); + if (monop) + { + monop->operand() = reference; + reference->operation() = monop; + expression = monop; + _stack.pop(); + } + else if (binop && (binop->op() == FSM::MODEL::Operator::equal || binop->op() == FSM::MODEL::Operator::notequal)) + { + _stack.pop(); + binop->right() = reference; + reference->operation() = binop; + binop->left() = _stack.top(); + _stack.top()->operation() = binop; + expression = binop; + _stack.pop(); + } + } + } + _stack.push(expression); + } + else if (isOperator(next, Operator::OPENPARENT)) + { + _stack.push(nullptr); + next = nextToken(); + } + else if (isOperator(next, Operator::CLOSPARENT)) + { + reduce(); + next = nextToken(); + } + else if (isOperator(next)) + { + switch (next->asInteger()) + { + case Operator::NE: + case Operator::EQ: + case Operator::AND: + case Operator::OR: + case Operator::XOR: + { + FSM::MODEL::Operator op = FSM::MODEL::Operator::none; + switch (next->asInteger()) + { + case Operator::NE: + op = FSM::MODEL::Operator::notequal; + break; + case Operator::EQ: + op = FSM::MODEL::Operator::equal; + break; + case Operator::AND: + op = FSM::MODEL::Operator::and; + break; + case Operator::OR: + op = FSM::MODEL::Operator::or; + break; + case Operator::XOR: + op = FSM::MODEL::Operator::xor; + break; + default: + poco_assert(false); + } + BinaryOperation* binop = factory.newBinaryOperation(op); + _stack.push(binop); + next = nextToken(); + } + break; + case Operator::NOT: + { + UnaryOperation* not = factory.newUnaryOperation(FSM::MODEL::Operator::not); + _stack.push(not); + next = nextToken(); + } + break; + default: + poco_assert(false); + break; + } + } + } + while (_stack.size() > 1) + reduce(); + expression = _stack.top(); + _stack.pop(); + return next; +} +const Poco::Token* Parser::parseNext(const Poco::Token* next) +{ + poco_assert(isIdentifier(next)); + + StatePtr endstate = map->lookfor(next->tokenString()); + if (endstate == nullptr && next->tokenString() != "nil") + { + endstate = factory.newState(next->tokenString()); + map->add(endstate); + } + guard->endstate() = endstate; + next = nextToken(); + return next; +} +const Poco::Token* Parser::parseParameters(const Poco::Token* next) +{ + parameters.clear(); + if (isOperator(next, Operator::OPENPARENT)) + { + do + { + next = nextToken(); + next = parseParameter(next); + parameters.push_back(parameter); + } + while (!isOperator(next, Operator::CLOSPARENT)); + next = nextToken(); + } + return next; +} +const Poco::Token* Parser::parseParameter(const Poco::Token* next) +{ + poco_assert(isIdentifier(next)); + parameter = factory.newParameter(next->tokenString()); + do + { + next = nextToken(); + poco_assert(isOperator(next, Operator::COLON)); + string type; + for (;;) + { + next = nextToken(); + if (isOperator(next, Operator::CLOSPARENT) || isOperator(next, Operator::COMMA)) + break; + string token = next->tokenString(); + if (token == "const") + token += ' '; + type += token; + } + parameter->type()= type; + } + while (!(isOperator(next, Operator::CLOSPARENT) || isOperator(next, Operator::COMMA))); + return next; +} +const Poco::Token* Parser::parsePushTransition(const Poco::Token* next) +{ + next = nextToken(); + return next; +} +const Poco::Token* Parser::parsePopTransition(const Poco::Token* next) +{ + next = nextToken(); + return next; +} +const Poco::Token* Parser::parsePopArguments(const Poco::Token* next) +{ + next = nextToken(); + return next; +} +const Poco::Token* Parser::parseActions(const Poco::Token* next, List& actions) +{ + poco_assert(isOperator(next, Operator::OPENBRACE)); + const Poco::Token* token = next; + next = nextToken(); + for (;;) + { + if (isOperator(next, Operator::CLOSBRACE)) + break; + action = nullptr; + next = parseAction(next); + actions.push_back(action); + } + next = nextToken(); + return next; +} +const Poco::Token* Parser::parseAction(const Poco::Token* next) +{ + poco_assert(isIdentifier(next)); + action = factory.newAction(next->tokenString()); + next = nextToken(); + next = parseArguments(next, action->arguments()); + poco_assert(isOperator(next, Operator::SEMICOLON)); + next = nextToken(); + return next; +} +const Poco::Token* Parser::parseArguments(const Poco::Token* next, List& arguments) +{ + poco_assert(isOperator(next, Operator::OPENPARENT)); + next = nextToken(); + for (;;) + { + if (isOperator(next, Operator::CLOSPARENT)) + break; + if (isOperator(next, Operator::COMMA)) + next = nextToken(); + next = parseArgument(next, arguments); + } + poco_assert(isOperator(next, Operator::CLOSPARENT)); + next = nextToken(); + return next; +} +const Poco::Token* Parser::parseArgument(const Poco::Token* next, List& arguments) +{ + poco_assert(isIdentifier(next) || isNumber(next) || isString(next) || isCharacter(next)); + string code; + int count = 0; + for (;;) + { + if (isOperator(next, Operator::COMMA)) + break; + if (isOperator(next, Operator::CLOSPARENT) && count-- == 0) + { + break; + } + if (isOperator(next, Operator::OPENPARENT)) + count += 1; + code += next->tokenString(); + next = nextToken(); + } + ArgumentPtr argument = factory.newArgument(code); + arguments.push_back(argument); + return next; +} +const Poco::Token* Parser::parseRawCode(const Poco::Token* next) +{ + do + { + next = nextToken(); + } + while (!isOperator(next, Operator::CLOSCODE)); + next = nextToken(); + return next; +} +const Poco::Token* Parser::nextToken() +{ + const Poco::Token* next = nextPreprocessed(); + while (!_inFile && !isEOF(next)) + next = nextPreprocessed(); + return next; +} +const Poco::Token* Parser::nextPreprocessed() +{ + const Poco::Token* next = nextParserToken(); + while (next->is(Token::PREPROCESSOR_TOKEN)) + { + istringstream pps(next->tokenString()); + pps.get(); + Tokenizer ppt(pps); + const Poco::Token* pPPT = ppt.nextToken(); + if (pPPT->tokenString() == "line" || pPPT->is(Token::INTEGER_LITERAL_TOKEN)) + { + if (!pPPT->is(Token::INTEGER_LITERAL_TOKEN)) + pPPT = ppt.nextToken(); + int line = pPPT->asInteger(); + _istr.setCurrentLineNumber(line); + pPPT = ppt.nextToken(); + if (pPPT->is(Token::STRING_LITERAL_TOKEN)) + { + string path = pPPT->asString(); + Path p(path); + p.makeAbsolute(); + _currentPath = p.toString(); + _inFile = (Poco::icompare(_path.toString(), _currentPath) == 0); + } + } + next = nextParserToken(); + } + return next; +} + + +const Poco::Token* Parser::nextParserToken() +{ + const Poco::Token* next = _tokenizer.nextToken(); + while (next->is(Token::COMMENT_TOKEN) || next->is(Token::SPECIAL_COMMENT_TOKEN)) + { + if (next->is(Token::SPECIAL_COMMENT_TOKEN)) + { +#if 0 + if (_pCurrentSymbol) + { + _pCurrentSymbol->addDocumentation(next->asString()); + _doc.clear(); + } + else +#endif + if (_inFile) + { + if (!_doc.empty()) _doc += "\n"; + _doc += next->asString(); + } + } + else if (next->is(Token::COMMENT_TOKEN) && _inFile) + { + const string& comment = next->tokenString(); + if (comment.compare(0, 3, "//@") == 0) + { + _attrs.append(comment.substr(3)); + } + else if (comment.compare(0, 11, "// Package:") == 0) + { + _package = comment.substr(11); + Poco::trimInPlace(_package); + } + else if (comment.compare(0, 11, "// Library:") == 0) + { + _library = comment.substr(11); + Poco::trimInPlace(_library); + } + } + next = _tokenizer.nextToken(); + } + return next; +} +void Parser::syntaxError(const string& msg) +{ + throw SyntaxException("Expected", msg); +} +} +} +} diff --git a/FSM/src/Print.cpp b/FSM/src/Print.cpp new file mode 100644 index 000000000..7b2daff20 --- /dev/null +++ b/FSM/src/Print.cpp @@ -0,0 +1,57 @@ +/* + * Print.cpp + * + * Created on: 22 janv. 2016 + * Author: FrancisANDRE + */ + +#include +using std::max; + +#include "Poco/Logger.h" +using Poco::Logger; + +#include "model/Parameter.h" +#include "model/Guard.h" +#include "model/Transition.h" +#include "model/Print.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +void Print::operator()(const char* message) +{ + logger.information(message); +} +void Print::operator()(const string& message) +{ + logger.information(message); +} +void Print::operator()(const TransitionPtr transition, const GuardPtr guard) +{ + string line = transition->name(); + + string parameters; + if (!transition->parameters().empty()) + parameters += '('; + for (auto parameter : transition->parameters()) + { + parameters += parameter->display(); + } + if (!transition->parameters().empty()) + parameters += ')'; + + line += parameters; + line.resize(max(line.size(), (size_t)34), ' '); + + string guards = guard->display(); + logger.information("\t%s%s", line, guards); + +} + +} +} +} diff --git a/FSM/src/Reference.cpp b/FSM/src/Reference.cpp new file mode 100644 index 000000000..4391ee050 --- /dev/null +++ b/FSM/src/Reference.cpp @@ -0,0 +1,33 @@ +/* + * Reference.cpp + * + * Created on: 1 févr. 2016 + * Author: FrancisANDRE + */ + +#include "model/Reference.h" +#include "model/Guard.h" +#include "model/Transition.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +bool Reference::isParameter() const +{ + GuardPtr g = guard(); + TransitionPtr transition = guard()->transition(); + if (transition->hasParameter(reference()->Element::name())) + return true; + else + return false; +} +const string Reference::display() const +{ + return reference()->display(); +} +} +} +} diff --git a/FSM/src/ReferenceForCpp.cpp b/FSM/src/ReferenceForCpp.cpp new file mode 100644 index 000000000..16bbcb5fb --- /dev/null +++ b/FSM/src/ReferenceForCpp.cpp @@ -0,0 +1,58 @@ +/* + * ReferenceForCpp.cpp + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/ReferenceForCpp.h" +#include "cpp/VariableForCpp.h" +#include "cpp/FunctionForCpp.h" + +using namespace Poco::FSM::MODEL; + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +void ReferenceForCpp::generateInclude(ostream& inc, bool debug) const +{ +} +void ReferenceForCpp::generateCode(ostream& cpp, bool debug) const +{ +} +const string ReferenceForCpp::display(const string& prefix) const +{ + VariableForCpp* vfc; + FunctionForCpp* ffc; + vfc = dynamic_cast(reference()); + ffc = dynamic_cast(reference()); + if (isParameter() || (operation() && !operation()->contextuel())) + { + if (operation()) + operation()->setNoContextuel(); + if (vfc) + return vfc->Variable::display(); + else if (ffc) + return ffc->Function::display(); + else + poco_assert(false); + } + else + { + if (vfc) + return vfc->display(prefix); + else if (ffc) + return ffc->display(prefix); + else + poco_assert(false); + } +} +} +} +} +} diff --git a/FSM/src/State.cpp b/FSM/src/State.cpp new file mode 100644 index 000000000..409c2abc2 --- /dev/null +++ b/FSM/src/State.cpp @@ -0,0 +1,67 @@ +/* + * State.cpp + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ +#include +#include "Poco/Format.h" +using Poco::format; + + +#include "model/State.h" +#include "model/Entry.h" +#include "model/Exit.h" +#include "model/Transition.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +TransitionPtr State::get(const string& name, const List& parameters) const +{ + TransitionPtr transition = nullptr; + string signature = Transition::signature(name, parameters); + try + { + transition = maps.at(signature); + } + catch (std::out_of_range e) + { + } + return transition; +} +TransitionPtr State::add(TransitionPtr transition) +{ + transition->begstate() = this; + _transitions.push_back(transition); + maps[transition->signature()] = transition; + return transition; +} +void State::print(Print& print) const +{ + print(Element::name()); + if (entry()) + entry()->print(print); + if (exit()) + exit()->print(print); + print("{"); + for (const auto& transition : transitions()) + { + transition->print(print); + } + print("}"); +} +const string State::display() const +{ + if (oneline.empty()) + { + oneline = name(); + } + return oneline; +} +} +} +} \ No newline at end of file diff --git a/FSM/src/StateForCpp.cpp b/FSM/src/StateForCpp.cpp new file mode 100644 index 000000000..a5453429a --- /dev/null +++ b/FSM/src/StateForCpp.cpp @@ -0,0 +1,118 @@ +/* + * StateForCpp.cpp + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#include +#include "cpp/MapForCpp.h" +#include "cpp/StateForCpp.h" +#include "cpp/EntryForCpp.h" +#include "cpp/ExitForCpp.h" +#include "cpp/ActionForCpp.h" +#include "cpp/TransitionForCpp.h" +#include "parser/IndentStream.h" +#include "model/FSM.h" + +using namespace std; + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +string StateForCpp::statename() const +{ + return map()->name() + '_' + name(); +} +void StateForCpp::generateForwarDeclaration(ostream& inc, bool debug) const +{ + inc << "class " << statename() << ';' << endl; +} +void StateForCpp::generateVirtualTransitions(ostream& inc, bool debug) const +{ + for (const auto& transition : _transitions) + { + TransitionForCpp* tfc = dynamic_cast(transition); + if (tfc) + tfc->generateVirtualTransitions(inc, debug); + } +} +void StateForCpp::generateDefinition(ostream& inc, bool debug) const +{ + inc << "// --------------------------------------------------" << endl; + inc << "class " << statename() << ": public " << map()->name() <<"_Default { " << endl; + inc << "public:" << endl << tab; + inc << statename() << "(const char* name, int no) : " << map()->name() << "_Default(name, no) {}" << endl; + + inc << endl; + if (entry()) + { + inc << "void " << "Entry" << "(" << map()->fsm()->context() << "& context);" << endl; + } + if (exit()) + { + inc << "void " << "Exit" << "(" << map()->fsm()->context() << "& context);" << endl; + } + inc << endl; + + for (auto transition : _transitions) + { + TransitionForCpp* tfc = dynamic_cast(transition); + if (tfc) + tfc->generateDefinition(inc, debug); + } + inc << back << "};" << endl; + inc << endl; +} + + +void StateForCpp::generateInclude(ostream& inc, bool debug) const +{ +} +void StateForCpp::generateDeclaration(ostream& cpp, int no) const +{ +// cpp << name() << "\t\t" << map()->name() << "::" << State::name(); + cpp << State::name() << '(' << '"' << State::name() << '"' << ", " << no << ")"; +} +void StateForCpp::generateCode(ostream& cpp, bool debug) const +{ + if (entry()) + { + cpp << "void " << statename() << "::Entry" << "(" << map()->fsm()->context() << "& context) {" << endl; + cpp << " " << map()->fsm()->klass() << "& ctxt = context.getOwner();" << endl; + for (const auto& action : entry()->actions()) + if (action) + { + ActionForCpp* afc = static_cast(action); + cpp << tab << "ctxt." << afc->display() << endl << back; + } + cpp << "}" << endl; + } + if (exit()) + { + cpp << "void " << statename() << "::Exit" << "(" << map()->fsm()->context() << "& context) {" << endl; + cpp << " " << map()->fsm()->klass() << "& ctxt = context.getOwner();" << endl; + for (const auto& action : exit()->actions()) + if (action) + { + ActionForCpp* afc = static_cast(action); + cpp << tab << "ctxt." << afc->display() << endl << back; + } + cpp << "}" << endl; + } + for (const auto& transition : _transitions) + { + TransitionForCpp* tfc = dynamic_cast(transition); + if (tfc) + tfc->generateCode(cpp, debug); + } +} +} +} +} +} \ No newline at end of file diff --git a/FSM/src/String.cpp b/FSM/src/String.cpp new file mode 100644 index 000000000..671ced50d --- /dev/null +++ b/FSM/src/String.cpp @@ -0,0 +1,90 @@ +/* + * String.cpp + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#include "Poco/Ascii.h" +#include "Poco/StreamTokenizer.h" +#include "Poco/Exception.h" + +using Poco::StreamTokenizer; +using Poco::SyntaxException; +using Poco::Token; +using Poco::InvalidToken; +using Poco::EOFToken; +using Poco::WhitespaceToken; +using Poco::Ascii; + +#include "parser/String.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ + +String::String() +{ +} + + +String::~String() +{ +} + + +Token::Class String::tokenClass() const +{ + return Token::STRING_LITERAL_TOKEN; +} + + +bool String::start(char c, std::istream& istr) +{ + _value = c; + return c == '"'; +} + + +void String::finish(std::istream& istr) +{ + int next = istr.peek(); + while (next != -1 && next != '"' && next != '\n' && next != '\r') + { + if (next == '\\') _value += (char) istr.get(); + _value += (char) istr.get(); + next = istr.peek(); + } + if (next == '"') + { + next = istr.get(); + _value += (char) next; + } + else throw SyntaxException("Unterminated string literal"); +} + + +std::string String::asString() const +{ + std::string result; + std::string::const_iterator it = _value.begin(); + std::string::const_iterator end = _value.end(); + if (it != end) + { + if (*it == '"') ++it; + while (it != end && *it != '"') + { + if (*it == '\\') ++it; + if (it != end) result += *it++; + } + } + return result; +} + + +} +} +} diff --git a/FSM/src/Token.cpp b/FSM/src/Token.cpp new file mode 100644 index 000000000..7751171e2 --- /dev/null +++ b/FSM/src/Token.cpp @@ -0,0 +1,50 @@ +/* + * Token.cpp + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#include "Poco/Ascii.h" +#include "Poco/StreamTokenizer.h" +#include "Poco/Token.h" +#include "Poco/Exception.h" +using Poco::StreamTokenizer; +using Poco::Token; +using Poco::InvalidToken; +using Poco::EOFToken; +using Poco::WhitespaceToken; +using Poco::Ascii; +using Poco::SyntaxException; + +#include "parser/Token.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ + +Token::Token() +{ +} + + +Token::~Token() +{ +} + + +void Token::syntaxError(const std::string& expected, const std::string& actual) +{ + std::string msg("expected: "); + msg.append(expected); + msg.append(", got: "); + msg.append(actual); + throw SyntaxException(msg); +} + +} +} +} diff --git a/FSM/src/Tokenizer.cpp b/FSM/src/Tokenizer.cpp new file mode 100644 index 000000000..fa674d805 --- /dev/null +++ b/FSM/src/Tokenizer.cpp @@ -0,0 +1,47 @@ +/* + * Tokenizer.cpp + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#include "Poco/Token.h" +using Poco::WhitespaceToken; +#include "parser/Tokenizer.h" +#include "parser/Identifier.h" +#include "parser/Number.h" +#include "parser/Keyword.h" +#include "parser/Comment.h" +#include "parser/Character.h" +#include "parser/Operator.h" +#include "parser/String.h" + + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +Tokenizer::Tokenizer(std::istream& istr): + StreamTokenizer(istr) +{ + addToken(new WhitespaceToken()); + addToken(new Comment()); + addToken(new Identifier()); + addToken(new Number()); + addToken(new Keyword()); + addToken(new Operator()); + addToken(new Character()); + addToken(new String()); + +} + + +Tokenizer::~Tokenizer() +{ +} + +} +} +} diff --git a/FSM/src/Transition.cpp b/FSM/src/Transition.cpp new file mode 100644 index 000000000..f9f4e4faa --- /dev/null +++ b/FSM/src/Transition.cpp @@ -0,0 +1,155 @@ +/* + * Transition.cpp + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#include +using std::max; +using std::binary_search; + +#include "Poco/Format.h" +using Poco::format; + +#include "model/Transition.h" +#include "model/Parameter.h" +#include "model/Guard.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +Transition::Transition(const string& name, int lineno) : Element(name, lineno) +{ +} +Transition::~Transition() +{ +} + +bool parameterEqual(const Parameter* left, const Parameter* right) +{ + return left->Element::name() < right->Element::name(); +} +bool Transition::hasParameter(const string& name) const +{ + for (const auto& parameter : _parameters) + { + if (parameter->Element::name() == name) + return true; + } + return false; +} +string Transition::declaration(const Parameter* added) const +{ + string declaration(name()); + declaration += '('; + if (added != nullptr) + { + declaration += added->type(); + declaration += ' '; + declaration += added->name(); + if (!parameters().empty()) + declaration += ", "; + } + if (!parameters().empty()) + { + for (int no = 0; no < parameters().size(); ++no) + { + declaration += parameters()[no]->type(); + declaration += ' '; + declaration += parameters()[no]->name(); + if (no + 1 < parameters().size()) + declaration += ", "; + } + } + declaration += ')'; + return declaration; +} +string Transition::call(const char* c) const +{ + string embed(name()); + embed += '('; + if (c != nullptr) + { + embed += c; + if (!parameters().empty()) + { + embed += ", "; + } + } + if (!parameters().empty()) + { + for (int no = 0; no < parameters().size(); ++no) + { + embed += parameters()[no]->name(); + if (no + 1 < parameters().size()) + embed += ", "; + } + } + embed += ')'; + return embed; +} +string Transition::signature(const string& name, const List& parameters) +{ + string signature(name); + signature += '('; + if (!parameters.empty()) + { + for (int no = 0; no < parameters.size(); ++no) + { + signature += parameters[no]->type(); + if (no + 1 < parameters.size()) + signature += ", "; + } + } + signature += ')'; + return signature; +} +const string& Transition::signature() const +{ + if (_signature.empty()) + { + _signature = signature(Element::name(), _parameters); + } + return _signature; +} +const string Transition::display() const +{ + if (oneline.empty()) + { + string transition = name(); + + string parameters; + if (!_parameters.empty()) + parameters += '('; + for (auto parameter : _parameters) + { + parameters += parameter->display(); + } + if (!_parameters.empty()) + parameters += ')'; + + transition += parameters; + transition.resize(max(transition.size(), (size_t)30), ' '); + + string guards = _guards.at(0)->display(); + + oneline = format("\t%s%s", transition, guards); + } + return oneline; +} +void Transition::print(Print& print) const +{ + for (auto guard : guards()) + { + const TransitionPtr transitionptr = const_cast(this); + const GuardPtr guardptr = guard; + print(transitionptr, guardptr); + } +} +} +} +} \ No newline at end of file diff --git a/FSM/src/TransitionForCpp.cpp b/FSM/src/TransitionForCpp.cpp new file mode 100644 index 000000000..2a5ec1590 --- /dev/null +++ b/FSM/src/TransitionForCpp.cpp @@ -0,0 +1,175 @@ +/* + * TransitionForCpp.cpp + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ +#include +#include +#include "cpp/TransitionForCpp.h" +#include "cpp/ParameterForCpp.h" +#include "cpp/FSMForCpp.h" +#include "cpp/MapForCpp.h" +#include "cpp/StateForCpp.h" +#include "cpp/GuardForCpp.h" +#include "cpp/ActionForCpp.h" +#include "cpp/ExpressionForCpp.h" +#include "parser/IndentStream.h" +#include "model/Parameter.h" + +using Poco::FSM::MODEL::Parameter; +using namespace std; + +static const bool RAPP = false; + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ + +const string TransitionForCpp::name() const +{ + string cppname = Element::name(); + replace(cppname.begin(), cppname.end(), '-', '_'); + return cppname; +} +void TransitionForCpp::generateVirtualTransitions(ostream& inc, bool debug) const +{ + if (begstate()->entry()) + { + inc << "virtual void " << "Entry" << "(" << begstate()->map()->fsm()->context() << "& context);"; + } + if (begstate()->exit()) + { + inc << "virtual void " << "Exit" << "(" << begstate()->map()->fsm()->context() << "& context);"; + } + inc << "virtual void " << name() << "(" << begstate()->map()->fsm()->context() << "& context"; + if (!_parameters.empty()) + { + inc << ", "; + for (int no = 0; no < _parameters.size(); ++no) + { + dynamic_cast(_parameters[no])->generateInclude(inc, debug); + if (no + 1 < _parameters.size()) + inc << ", "; + } + } + inc << ");" << endl; +} +void TransitionForCpp::generateDefinition(ostream& inc, bool debug) const +{ + inc << "void " << name() << "(" << begstate()->map()->fsm()->context() << "& context"; + if (!_parameters.empty()) + { + inc << ", "; + for (int no = 0; no < _parameters.size(); ++no) + { + dynamic_cast(_parameters[no])->generateInclude(inc, debug); + if (no + 1 < _parameters.size()) + inc << ", "; + } + } + inc << ");" << endl; +} +void TransitionForCpp::generateInclude(ostream& inc, bool debug) const +{ +} +void TransitionForCpp::generateCode(ostream& cpp, bool debug) const +{ + cpp << endl; + cpp << "// ----------------------------------------------------" << endl; + cpp << "void " << _begstate->map()->name() << '_' << _begstate->name() << "::"; + Parameter context("context"); + context.type() = begstate()->map()->fsm()->context() + '&'; + cpp << declaration(&context) << " {"<< endl; +// cpp << "(" << begstate()->map()->fsm()->context() << "&context) {" << endl ; + cpp << tab; + + cpp << _begstate->map()->fsm()->klass() << "& ctxt = context.getOwner();" << endl; + cpp << endl; + + + for (auto guard : _guards) + { + if (guard != nullptr) + { + if (guard->endstate() == nullptr) + { + for (auto action : guard->actions()) + if (action != nullptr) + { + ActionForCpp* afc = static_cast(action); + cpp << "ctxt." << action->display() << endl; + } + continue; + } + + if (guard->condition()) + { + ExpressionForCpp* efc = dynamic_cast(guard->condition()); + cpp << "if (" << efc->display("ctxt.") << ") {" << endl << tab; + } + cpp << "(context.getState()).Exit(context);" << endl; + + if (guard->actions().size() > 0) + { + if (RAPP) + { + cpp << "context.clearState();" << endl; + } + if (RAPP) + { + cpp << "try {" << endl << tab; + } + } + + cpp << "context.setState(context." << guard->endstate()->name() << ");" << endl; + if (!RAPP) + { + cpp << "(context.getState()).Entry(context);" << endl; + } + + for (auto action : guard->actions()) + if (action != nullptr) + { + ActionForCpp* afc = static_cast(action); + cpp << "ctxt." << action->display() << endl; + } + + if (guard->actions().size() > 0) + { + if (RAPP) + { + cpp << back << "} catch (...) {" << endl << tab; + cpp << "context.setState(context." << guard->endstate()->name() << ");" << endl; + cpp << "throw;" << endl << back; + cpp << "}" << endl; + } + } + if (RAPP) + { + cpp << "(context.getState()).Entry(context);" << endl; + } + if (guard->condition()) + cpp << back << "} else " << endl; + } + } + if (_guards[0]->condition()) + { + Parameter context("context"); + cpp << "{" << endl; + MapForCpp* mfcpp = dynamic_cast(_begstate->map()); + cpp << " " << mfcpp->defaultStateName() << "::" << call("context") << ";" << endl; + cpp << "}" << endl; + } + cpp << "return;" << back << endl; + cpp << "};" << endl; +} +} +} +} +} diff --git a/FSM/src/UnaryOperation.cpp b/FSM/src/UnaryOperation.cpp new file mode 100644 index 000000000..6779c15de --- /dev/null +++ b/FSM/src/UnaryOperation.cpp @@ -0,0 +1,31 @@ +/* + * UnaryOperation.cpp + * + * Created on: 20 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/UnaryOperation.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string UnaryOperation::display() const +{ + if (_asstring.empty()) + { + switch (_operator) + { + case Operator::not: + _asstring += '!'; + } + _asstring += _operand->display(); + } + return _asstring; +} +} +} +} \ No newline at end of file diff --git a/FSM/src/UnaryOperationForCpp.cpp b/FSM/src/UnaryOperationForCpp.cpp new file mode 100644 index 000000000..47a7a8c42 --- /dev/null +++ b/FSM/src/UnaryOperationForCpp.cpp @@ -0,0 +1,36 @@ +/* + * UnaryOperationForCpp.cpp + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/UnaryOperationForCpp.h" + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +const string UnaryOperationForCpp::display(const string& prefix) const +{ + string value; + switch (_operator) + { + case Poco::FSM::MODEL::Operator::not: + value += "!"; + break; + default: + value += "???"; + break; + } + value += dynamic_cast(operand())->display(prefix); + return value; +} +} +} +} +} diff --git a/FSM/src/Variable.cpp b/FSM/src/Variable.cpp new file mode 100644 index 000000000..ca72992fe --- /dev/null +++ b/FSM/src/Variable.cpp @@ -0,0 +1,22 @@ +/* + * Variable.cpp + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#include "model/Variable.h" + +namespace Poco +{ +namespace FSM +{ +namespace MODEL +{ +const string Variable::display() const +{ + return name(); +} +} +} +} \ No newline at end of file diff --git a/FSM/src/VariableForCpp.cpp b/FSM/src/VariableForCpp.cpp new file mode 100644 index 000000000..2c1273766 --- /dev/null +++ b/FSM/src/VariableForCpp.cpp @@ -0,0 +1,27 @@ +/* + * VariableForCpp.cpp + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#include "cpp/VariableForCpp.h" + +using namespace Poco::FSM::MODEL; + +namespace Poco +{ +namespace FSM +{ +namespace PARSER +{ +namespace CPP +{ +const string VariableForCpp::display(const string& prefix) const +{ + return prefix + name(); +} +} +} +} +} diff --git a/FSM/src/cpp/ActionForCpp.h b/FSM/src/cpp/ActionForCpp.h new file mode 100644 index 000000000..cd92979fc --- /dev/null +++ b/FSM/src/cpp/ActionForCpp.h @@ -0,0 +1,35 @@ +/* + * ActionForCpp.h + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_CPP_ACTION_H_ +#define POCO_FSM_CPP_ACTION_H_ + +#include "model/Action.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class ActionForCpp : public CompilableForCpp, public FSM::MODEL::Action { + public: + ActionForCpp(const string& name, int lineno = 0) : + FSM::MODEL::Action(name, lineno) { + } + virtual ~ActionForCpp() { + } + virtual const string name() const; + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + }; + + } + } + } +} +#endif diff --git a/FSM/src/cpp/ArgumentForCpp.h b/FSM/src/cpp/ArgumentForCpp.h new file mode 100644 index 000000000..6046a34d2 --- /dev/null +++ b/FSM/src/cpp/ArgumentForCpp.h @@ -0,0 +1,34 @@ +/* + * ArgumentForCpp.h + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef ARGUMENTFORCPP_H_ +#define ARGUMENTFORCPP_H_ + +#include "model/Argument.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + class ArgumentForCpp : public CompilableForCpp, public FSM::MODEL::Argument { + public: + ArgumentForCpp(const string& name, int lineno = 0) : + FSM::MODEL::Argument(name, lineno) { + } + virtual ~ArgumentForCpp() { + } + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + }; + + } + } + } +} + +#endif diff --git a/FSM/src/cpp/BinaryOperationForCpp.h b/FSM/src/cpp/BinaryOperationForCpp.h new file mode 100644 index 000000000..92d917d5e --- /dev/null +++ b/FSM/src/cpp/BinaryOperationForCpp.h @@ -0,0 +1,34 @@ +/* + * BinaryOperationForCpp.h + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef BINARYOPERATIONFORCPP_H_ +#define BINARYOPERATIONFORCPP_H_ + +#include "model/BinaryOperation.h" +#include "ExpressionForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class BinaryOperationForCpp : public ExpressionForCpp, public FSM::MODEL::BinaryOperation { + + public: + BinaryOperationForCpp(Poco::FSM::MODEL::Operator op) : + FSM::MODEL::BinaryOperation(op) { + } + virtual ~BinaryOperationForCpp() { + } + const string display(const string& prefix) const; + }; + } + } + } +} + +#endif diff --git a/FSM/src/cpp/CompilableForCpp.h b/FSM/src/cpp/CompilableForCpp.h new file mode 100644 index 000000000..f01303203 --- /dev/null +++ b/FSM/src/cpp/CompilableForCpp.h @@ -0,0 +1,38 @@ +/* + * CompilableForCpp.h + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef COMPILABLEFORCPP_H_ +#define COMPILABLEFORCPP_H_ + +#include +using std::ostream; + +#include "model/Compilable.h" +using Poco::FSM::MODEL::FSMPtr; + +namespace Poco { +namespace FSM { +namespace PARSER { +namespace CPP { + +class CompilableForCpp : public Poco::FSM::MODEL::Compilable { +public: + CompilableForCpp() : Poco::FSM::MODEL::Compilable() { + } + virtual ~CompilableForCpp() { + } + virtual void generate(const Path& path, bool debug) const {} + virtual void generateInclude(ostream& inc, bool debug) const = 0; + virtual void generateCode(ostream& cpp, bool debug) const = 0; +}; + +} +} +} +} + +#endif diff --git a/FSM/src/cpp/ElementForCpp.h b/FSM/src/cpp/ElementForCpp.h new file mode 100644 index 000000000..0da2b804a --- /dev/null +++ b/FSM/src/cpp/ElementForCpp.h @@ -0,0 +1,42 @@ +/* + * ElementForCpp.h + * + * Created on: 2 févr. 2016 + * Author: FrancisANDRE + */ + +#ifndef ELEMENTFORCPP_H_ +#define ELEMENTFORCPP_H_ + +#include +using std::replace; + +#include "model/Element.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class ElementForCpp : public virtual MODEL::Element { + private: + string _cppname; + + public: + ElementForCpp(const string& name, int lineno = 0) : + MODEL::Element(name, lineno) { + _cppname = name; + replace(_cppname.begin(), _cppname.end(), '-', '_'); + } + virtual ~ElementForCpp() { + } + protected: + const string& cppname() const { return _cppname; } + }; + + } + } + } +} + +#endif diff --git a/FSM/src/cpp/EntryForCpp.h b/FSM/src/cpp/EntryForCpp.h new file mode 100644 index 000000000..d0cdb356e --- /dev/null +++ b/FSM/src/cpp/EntryForCpp.h @@ -0,0 +1,35 @@ +/* + * EntryForCpp.h + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef ENTRYFORCPP_H_ +#define ENTRYFORCPP_H_ + +#include "model/Entry.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class EntryForCpp : public CompilableForCpp, public FSM::MODEL::Entry { + public: + EntryForCpp(const string& name, int lineno = 0) : + FSM::MODEL::Entry(name, lineno) { + } + virtual ~EntryForCpp() { + } + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + }; + + } + } + } +} + +#endif diff --git a/FSM/src/cpp/ExitForCpp.h b/FSM/src/cpp/ExitForCpp.h new file mode 100644 index 000000000..30dabea90 --- /dev/null +++ b/FSM/src/cpp/ExitForCpp.h @@ -0,0 +1,35 @@ +/* + * ExitForCpp.h + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef EXITFORCPP_H_ +#define EXITFORCPP_H_ + +#include "model/Exit.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class ExitForCpp : public CompilableForCpp, public FSM::MODEL::Exit { + public: + ExitForCpp(const string& name, int lineno = 0) : + FSM::MODEL::Exit(name, lineno) { + } + virtual ~ExitForCpp() { + } + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + }; + + } + } + } +} + +#endif diff --git a/FSM/src/cpp/ExpressionForCpp.h b/FSM/src/cpp/ExpressionForCpp.h new file mode 100644 index 000000000..db7304bd9 --- /dev/null +++ b/FSM/src/cpp/ExpressionForCpp.h @@ -0,0 +1,32 @@ +/* + * ExpressionForCpp.h + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef EXPRESSIONFORCPP_H_ +#define EXPRESSIONFORCPP_H_ + +#include "model/Expression.h" + +namespace Poco { +namespace FSM { +namespace PARSER { +namespace CPP { + +class ExpressionForCpp : public virtual Poco::FSM::MODEL::Expression { +public: + ExpressionForCpp() { + } + virtual ~ExpressionForCpp() { + } + virtual const string display(const string& prefix) const = 0; +}; + +} +} +} +} + +#endif diff --git a/FSM/src/cpp/FSMForCpp.h b/FSM/src/cpp/FSMForCpp.h new file mode 100644 index 000000000..ff26b0f5d --- /dev/null +++ b/FSM/src/cpp/FSMForCpp.h @@ -0,0 +1,40 @@ +/* + * FSMForCpp.h + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_CPP_FSM_H_ +#define POCO_FSM_CPP_FSM_H_ + + +#include "model/FSM.h" +#include "CompilableForCpp.h" +#include "parser/IndentStream.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class FSMForCpp : public Poco::FSM::MODEL::FSM { + public: + FSMForCpp(Parser* parser) : + Poco::FSM::MODEL::FSM(parser) { + } + virtual ~FSMForCpp() { + } + void generate(const Path& out, bool debug) const; + virtual bool updated(const Path& out); + + private: + void openNamespaces(IndentStream& os) const; + void closeNamespaces(IndentStream& os) const; + }; + + } + } + } +} +#endif diff --git a/FSM/src/cpp/FactoryForCpp.h b/FSM/src/cpp/FactoryForCpp.h new file mode 100644 index 000000000..d212c7e47 --- /dev/null +++ b/FSM/src/cpp/FactoryForCpp.h @@ -0,0 +1,52 @@ +/* + * FactoryForCpp.h + * + * Created on: 20 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_CPP_FACTORY_H_ +#define POCO_FSM_PARSER_CPP_FACTORY_H_ +#include +using std::string; + + +#include "model/SMC.h" +#include "model/Operation.h" +#include "model/Factory.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class FactoryForCpp : public Poco::FSM::MODEL::Factory { + public: + FactoryForCpp() { + } + virtual ~FactoryForCpp() { + } + FSMPtr newFSM(Parser* parser) const; + ActionPtr newAction(const string& name, int lineno = 0) const; + GuardPtr newGuard(const string& name, int lineno = 0) const; + MapPtr newMap(const string& name, int lineno = 0) const; + ParameterPtr newParameter(const string& name, int lineno = 0) const; + StatePtr newState(const string& name, int lineno = 0) const; + EntryPtr newEntry(const string& name, int lineno = 0) const; + ExitPtr newExit(const string& name, int lineno = 0) const; + TransitionPtr newTransition(const string& name, int lineno = 0) const; + VariablePtr newVariable(const string& name, int lineno = 0) const; + FunctionPtr newFunction(const string& name, int lineno = 0) const; + LiteralPtr newLiteral(const string& name, int lineno = 0) const; + ReferencePtr newReference(const VariablePtr variable, int lineno = 0) const; + ReferencePtr newReference(const LiteralPtr literal, int lineno = 0) const; + ReferencePtr newReference(const FunctionPtr function, int lineno = 0) const; + ArgumentPtr newArgument(const string& name, int lineno = 0) const; + UnaryOperationPtr newUnaryOperation(Poco::FSM::MODEL::Operator op) const; + BinaryOperationPtr newBinaryOperation(Poco::FSM::MODEL::Operator op) const; + }; + } + } + } +} +#endif diff --git a/FSM/src/cpp/FunctionForCpp.h b/FSM/src/cpp/FunctionForCpp.h new file mode 100644 index 000000000..9640b1c6b --- /dev/null +++ b/FSM/src/cpp/FunctionForCpp.h @@ -0,0 +1,35 @@ +/* + * FunctionForCpp.h + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef FUNCTIONFORCPP_H_ +#define FUNCTIONFORCPP_H_ + +#include "model/Function.h" +#include "CompilableForCpp.h" +#include "ReferenceForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class FunctionForCpp : public FSM::MODEL::Function { + public: + FunctionForCpp(const string& name, int lineno = 0) : + FSM::MODEL::Function(name, lineno) { + } + virtual ~FunctionForCpp() { + } + const string display(const string& prefix) const; + }; + + } + } + } +} + +#endif diff --git a/FSM/src/cpp/GuardForCpp.h b/FSM/src/cpp/GuardForCpp.h new file mode 100644 index 000000000..edd255776 --- /dev/null +++ b/FSM/src/cpp/GuardForCpp.h @@ -0,0 +1,36 @@ +/* + * GuardForCpp.h + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_CPP_GUARD_H_ +#define POCO_FSM_CPP_GUARD_H_ + +#include "model/Guard.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class GuardForCpp : public CompilableForCpp, public FSM::MODEL::Guard { + public: + GuardForCpp(const string& name, int lineno = 0) : + + FSM::MODEL::Guard(name, lineno) { + } + virtual ~GuardForCpp() { + } + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + }; + + } + } + } +} + +#endif diff --git a/FSM/src/cpp/LiteralForCpp.h b/FSM/src/cpp/LiteralForCpp.h new file mode 100644 index 000000000..9dbd320c9 --- /dev/null +++ b/FSM/src/cpp/LiteralForCpp.h @@ -0,0 +1,33 @@ +/* + * LiteralForCpp.h + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef LITERALFORCPP_H_ +#define LITERALFORCPP_H_ + +#include "model/Literal.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class LiteralForCpp : public FSM::MODEL::Literal { + public: + LiteralForCpp(const string& name, int lineno = 0) : + FSM::MODEL::Literal(name, lineno) { + } + virtual ~LiteralForCpp() { + } + }; + + } + } + } +} + +#endif diff --git a/FSM/src/cpp/MapForCpp.h b/FSM/src/cpp/MapForCpp.h new file mode 100644 index 000000000..7e07683a7 --- /dev/null +++ b/FSM/src/cpp/MapForCpp.h @@ -0,0 +1,38 @@ +/* + * MapForCpp.h + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_CPP_MAP_H_ +#define POCO_FSM_CPP_MAP_H_ + +#include "model/Map.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class MapForCpp : public CompilableForCpp, public FSM::MODEL::Map { + public: + MapForCpp(const string& name, int lineno = 0) : + + FSM::MODEL::Map(name, lineno) { + } + virtual ~MapForCpp() { + } + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + + string defaultStateName() const; + string startStateName() const; + }; + + } + } + } +} +#endif diff --git a/FSM/src/cpp/ParameterForCpp.h b/FSM/src/cpp/ParameterForCpp.h new file mode 100644 index 000000000..50a4927cb --- /dev/null +++ b/FSM/src/cpp/ParameterForCpp.h @@ -0,0 +1,34 @@ +/* + * ParameterForCpp.h + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_CPP_PARAMETER_H_ +#define POCO_FSM_CPP_PARAMETER_H_ + +#include "model/Parameter.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class ParameterForCpp : public CompilableForCpp, public FSM::MODEL::Parameter { + public: + ParameterForCpp(const string& name, int lineno = 0) : + FSM::MODEL::Parameter(name, lineno) { + } + virtual ~ParameterForCpp() { + } + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + }; + + } + } + } +} +#endif diff --git a/FSM/src/cpp/ReferenceForCpp.h b/FSM/src/cpp/ReferenceForCpp.h new file mode 100644 index 000000000..6b7e814be --- /dev/null +++ b/FSM/src/cpp/ReferenceForCpp.h @@ -0,0 +1,54 @@ +/* + * ReferenceForCpp.h + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef REFERENCEFOCCPP_H_ +#define REFERENCEFOCCPP_H_ + +#include "model/Reference.h" +#include "ExpressionForCpp.h" +#include "ReferenceForCpp.h" +#include "CompilableForCpp.h" +#include +using std::string; + +using Poco::FSM::MODEL::VariablePtr; +using Poco::FSM::MODEL::FunctionPtr; +using Poco::FSM::MODEL::LiteralPtr; +using Poco::FSM::MODEL::OperationPtr; + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class ReferenceForCpp : + public ExpressionForCpp, + public CompilableForCpp, + public Poco::FSM::MODEL::Reference { + public: + ReferenceForCpp(const VariablePtr variable, int lineno = 0): + Reference(variable, lineno) { + } + ReferenceForCpp(const FunctionPtr function, int lineno = 0): + Reference(function, lineno) { + } + ReferenceForCpp(const LiteralPtr literal, int lineno = 0): + Reference(literal, lineno) { + } + virtual ~ReferenceForCpp() { + } + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + const string display(const string& prefix) const; + }; + + } + } + } +} + +#endif diff --git a/FSM/src/cpp/StateForCpp.h b/FSM/src/cpp/StateForCpp.h new file mode 100644 index 000000000..2bf0f7ab9 --- /dev/null +++ b/FSM/src/cpp/StateForCpp.h @@ -0,0 +1,43 @@ +/* + * StateForCpp.h + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_CPP_STATE_H_ +#define POCO_FSM_CPP_STATE_H_ + +#include "model/State.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class StateForCpp : public CompilableForCpp, public FSM::MODEL::State { + public: + StateForCpp(const string& name, int lineno = 0) : + FSM::MODEL::State(name, lineno) { + } + virtual ~StateForCpp() { + } + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + + void generateForwarDeclaration(ostream& inc, bool debug) const; + void generateVirtualTransitions(ostream& inc, bool debug) const; + void generateDefinition(ostream& inc, bool debug) const; + void generateDeclaration(ostream& cpp, int no) const; + + private: + string statename() const; + + }; + + } + } + } +} +#endif diff --git a/FSM/src/cpp/TransitionForCpp.h b/FSM/src/cpp/TransitionForCpp.h new file mode 100644 index 000000000..06725d2fb --- /dev/null +++ b/FSM/src/cpp/TransitionForCpp.h @@ -0,0 +1,37 @@ +/* + * TransitionForCpp.h + * + * Created on: 19 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_CPP_TRANSITION_H_ +#define POCO_FSM_CPP_TRANSITION_H_ + +#include "model/Transition.h" +#include "CompilableForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class TransitionForCpp : public CompilableForCpp, public FSM::MODEL::Transition { + public: + TransitionForCpp(const string& name, int lineno = 0) : + FSM::MODEL::Transition(name, lineno) { + } + virtual ~TransitionForCpp() { + } + virtual const string name() const; + virtual void generateInclude(ostream& inc, bool debug) const; + virtual void generateCode(ostream& cpp, bool debug) const; + void generateVirtualTransitions(ostream& inc, bool debug) const; + void generateDefinition(ostream& inc, bool debug) const; + }; + + } + } + } +} +#endif diff --git a/FSM/src/cpp/UnaryOperationForCpp.h b/FSM/src/cpp/UnaryOperationForCpp.h new file mode 100644 index 000000000..308e23a05 --- /dev/null +++ b/FSM/src/cpp/UnaryOperationForCpp.h @@ -0,0 +1,34 @@ +/* + * UnaryOperationForCpp.h + * + * Created on: 24 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef UNARYOPERATIONFORCPP_H_ +#define UNARYOPERATIONFORCPP_H_ + +#include "model/UnaryOperation.h" +#include "ExpressionForCpp.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class UnaryOperationForCpp : public ExpressionForCpp, public FSM::MODEL::UnaryOperation { + public: + UnaryOperationForCpp(Poco::FSM::MODEL::Operator op) : + FSM::MODEL::UnaryOperation(op) { + } + virtual ~UnaryOperationForCpp() { + } + const string display(const string& prefix) const; + }; + + } + } + } +} + +#endif diff --git a/FSM/src/cpp/VariableForCpp.h b/FSM/src/cpp/VariableForCpp.h new file mode 100644 index 000000000..1c92247b8 --- /dev/null +++ b/FSM/src/cpp/VariableForCpp.h @@ -0,0 +1,33 @@ +/* + * VariableForCpp.h + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef VARIABLEFORCPP_H_ +#define VARIABLEFORCPP_H_ + +#include "model/Variable.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + namespace CPP { + + class VariableForCpp : public FSM::MODEL::Variable { + public: + VariableForCpp(const string& name, int lineno = 0) : + FSM::MODEL::Variable(name, lineno) { + } + virtual ~VariableForCpp() { + } + const string display(const string& prefix) const; + }; + + } + } + } +} + +#endif diff --git a/FSM/src/fsmc.cpp b/FSM/src/fsmc.cpp new file mode 100644 index 000000000..f4ddf0518 --- /dev/null +++ b/FSM/src/fsmc.cpp @@ -0,0 +1,191 @@ +#include +#include +#include + +using std::cout; +using std::cerr; +using std::clog; +using std::hex; +using std::endl; + +#include "Poco/DateTime.h" +#include "Poco/DateTimeFormatter.h" +#include "Poco/Util/LoggingConfigurator.h" +#include "Poco/Util/PropertyFileConfiguration.h" +#include "Poco/Exception.h" +#include "Poco/Thread.h" +#include "Poco/Util/Application.h" +#include "Poco/Util/Option.h" +#include "Poco/Util/OptionSet.h" +#include "Poco/Util/OptionCallback.h" +#include "Poco/Util/HelpFormatter.h" +#include "Poco/Path.h" +#include "Poco/File.h" +#include "Poco/FileStream.h" +#include "model/SMC.h" +#include "model/FSM.h" +#include "model/Print.h" +#include "parser/Parser.h" + +using Poco::Thread; +using Poco::Util::Application; +using Poco::Util::Option; +using Poco::Util::OptionSet; +using Poco::Util::OptionCallback; +using Poco::Util::HelpFormatter; +using Poco::Util::LoggingConfigurator; +using Poco::Util::PropertyFileConfiguration; +using Poco::Path; +using Poco::File; +using Poco::FileStream; +using Poco::FileInputStream; +using Poco::FileOutputStream; + +using Poco::FSM::PARSER::Parser; +using Poco::FSM::MODEL::Print; + +const static string NL = "\n"; + +class FFSMompiler: public Application +{ +public: + FFSMompiler() + { + + } +protected: + void initialize(Application& self) + { + loadConfiguration(); // load default configuration files, if present + Application::initialize(self); + } + + void uninitialize() + { + Application::uninitialize(); + } + + void reinitialize(Application& self) + { + Application::reinitialize(self); + } + void defineOptions(OptionSet& options) + { + Application::defineOptions(options); + + options.addOption( + Option("help", "h", "display help information on command line arguments") + .required(false) + .repeatable(false) + .callback(OptionCallback(this, &FFSMompiler::handleHelp))); + + options.addOption( + Option("out", "o", "the out directory where to generate the c++ code, defaulted to the fsm file directory") + .required(false) + .repeatable(false) + .argument("file") + .callback(OptionCallback(this, &FFSMompiler::handleOutdir))); + + options.addOption( + Option("verbose", "v", "output the parsed FSM file on the console") + .required(false) + .repeatable(false) + .callback(OptionCallback(this, &FFSMompiler::handleVerbose))); + + options.addOption( + Option("debug", "d", "generate debug log") + .required(false) + .repeatable(false) + .callback(OptionCallback(this, &FFSMompiler::handleDebug))); + + } + + void handleHelp(const std::string& name, const std::string& value) + { + help = true; + displayHelp(); + stopOptionsProcessing(); + } + + void handleOutdir(const std::string& name, const std::string& value) + { + out = Path(value); + } + void handleVerbose(const std::string& name, const std::string& value) + { + verbose = true; + } + + void handleDebug(const std::string& name, const std::string& value) + { + debug = true; + } + + void displayHelp() + { + HelpFormatter helpFormatter(options()); + helpFormatter.setCommand(commandName()); + helpFormatter.setUsage(" .sm"); + helpFormatter.setHeader("A FiniteStateMachine compiler for the ISODE++ stack."); + helpFormatter.format(std::cout); + } + + int main(const std::vector& args) + { + Logger& logger = Application::instance().logger(); + if (!help) + { + if (args.size() == 0) + { + logger.error("Missing .sm file"); + return Application::EXIT_NOINPUT; + } + smPath = args[0]; + if (!smPath.isFile()) + { + logger.error("file %s is not a file", smPath.toString()); + return Application::EXIT_USAGE; + } + if (smPath.getExtension() != "sm") + { + logger.error("file %s is not a FSM file", smPath.toString()); + return Application::EXIT_USAGE; + } + if (!out.isDirectory()) + { + logger.error("%s is not a directory", out.toString()); + return Application::EXIT_USAGE; + } + if (out.depth() <= 0) + { + out = smPath; + out = out.makeParent(); + } + smFile = File(smPath.makeAbsolute()); + logger.information("fsmc %s", smPath.toString()); + + FileInputStream fis(smPath.toString()); + Parser parser(logger, smFile, fis); + FSMPtr fsm; + + fsm = parser.parse(out); + if (fsm && !fsm->updated()) + { + Print print(logger); + if (verbose) + fsm->print(print); + fsm->generate(out, debug); + } + } + return Application::EXIT_OK; + } + +private: + bool help = false; + bool verbose = false; + bool debug = false; + Path out; + Path smPath; + File smFile; +}; +POCO_APP_MAIN(FFSMompiler) diff --git a/FSM/src/model/Action.h b/FSM/src/model/Action.h new file mode 100644 index 000000000..721209990 --- /dev/null +++ b/FSM/src/model/Action.h @@ -0,0 +1,39 @@ +/* + * Action.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_ACTION_H_ +#define POCO_FSM_MODEL_ACTION_H_ + +#include "SMC.h" +#include "Argument.h" +#include "Element.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Action : public Element { + private: + List _arguments; + + public: + Action(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Action() { + } + List& arguments() { return _arguments; } + const List& arguments() const { return _arguments; } + + void add(const ArgumentPtr argument) { _arguments.push_back(argument); } + virtual const string display() const; + void print(Print& print) const; + }; + + } + } +} +#endif diff --git a/FSM/src/model/Actions.h b/FSM/src/model/Actions.h new file mode 100644 index 000000000..b980cbcda --- /dev/null +++ b/FSM/src/model/Actions.h @@ -0,0 +1,36 @@ +/* + * Actions.h + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_ACTIONS_H_ +#define POCO_FSM_MODEL_ACTIONS_H_ + +#include "Element.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Actions { + protected: + List _actions; + public: + Actions() { + } + virtual ~Actions() { + } + + List& actions() { return _actions; } + const List& actions() const { return _actions; } + + void add(ActionPtr action) { _actions.push_back(action); } + }; + + } + } +} + +#endif diff --git a/FSM/src/model/Argument.h b/FSM/src/model/Argument.h new file mode 100644 index 000000000..6dedbbb7c --- /dev/null +++ b/FSM/src/model/Argument.h @@ -0,0 +1,30 @@ +/* + * Argument.h + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_ARGUMENT_H_ +#define POCO_FSM_MODEL_ARGUMENT_H_ + +#include "Element.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Argument : public Element { + public: + Argument(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Argument() { + } + virtual const string display() const; + }; + + } + } +} + +#endif diff --git a/FSM/src/model/BinaryOperation.h b/FSM/src/model/BinaryOperation.h new file mode 100644 index 000000000..0da131faf --- /dev/null +++ b/FSM/src/model/BinaryOperation.h @@ -0,0 +1,104 @@ +/* + * BinaryOperation.h + * + * Created on: 20 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_BINARY_OPERATION_H_ +#define POCO_FSM_MODEL_BINARY_OPERATION_H_ + +#include "Expression.h" +#include "Operation.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class BinaryOperation : public Operation { + private: + ExpressionPtr _left; + ExpressionPtr _right; + + public: + BinaryOperation(Operator op) : Operation(op) { + } + virtual ~BinaryOperation() { + } + ExpressionPtr& left() { return _left; } + ExpressionPtr& right() { return _right; } + const ExpressionPtr left() const { return _left; } + const ExpressionPtr right()const { return _right; } + virtual const string display() const; + }; + + } + } +} + +#endif + +#if 0 +conditional-expression: + logical-or-expression + logical-or-expression ? expression : conditional-expression +logical-or-expression: + logical-and-expression + logical-or-expression || logical-and-expression +logical-and-expression: + inclusive-or-expression + logical-and-expression && inclusive-or-expression +inclusive-or-expression: + exclusive-or-expression + inclusive-or-expression | exclusive-or-expression +exclusive-or-expression: + and-expression + exclusive-or-expression ^ and-expression +and-expression: + equality-expression + and-expression & equality-expression +equality-expression: + relational-expression + equality-expression == relational-expression + equality-expression != relational-expression +relational-expression: + shift-expression + relational-expression < shift-expression + relational-expression > shift-expression + relational-expression <= shift-expression + relational-expression => shift-expression +shift-expression: + additive-expression + shift-expression << additive-expression + shift-expression >> additive-expression +additive-expression: + multiplicative-expression + additive-expression + multiplicative-expression + additive-expression – multiplicative-expression +multiplicative-expression: + segment-expression + multiplicative-expression * segment-expression + multiplicative-expression / segment-expression + multiplicative-expression % segment-expression +segment-expression: + pm-expression + segment-expression :> pm-expression +pm-expression: + cast-expression + pm-expression .* cast-expression + pm-expression –>* cast-expression +cast-expression: + unary-expression + ( type-name ) cast-expression +unary-expression: + postfix-expression + ++ unary-expression + –– unary-expression + unary-operator cast-expression + sizeof unary-expression + sizeof ( type-name ) + allocation-expression + deallocation-expression +unary-operator: one of + * & + – ! ~ +#endif diff --git a/FSM/src/model/Compilable.h b/FSM/src/model/Compilable.h new file mode 100644 index 000000000..24ba0819f --- /dev/null +++ b/FSM/src/model/Compilable.h @@ -0,0 +1,31 @@ +/* + * Compilable.h + * + * Created on: 22 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_COMPILABLE_H_ +#define POCO_FSM_MODEL_COMPILABLE_H_ + +#include "Poco/Path.h" +using Poco::Path; + + +#include "SMC.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Compilable { + + public: + virtual void generate(const Path& out, bool debug) const = 0; + }; + + } + } +} + +#endif diff --git a/FSM/src/model/Dumper.h b/FSM/src/model/Dumper.h new file mode 100644 index 000000000..e84fb8fe0 --- /dev/null +++ b/FSM/src/model/Dumper.h @@ -0,0 +1,33 @@ +/* + * Dumper.h + * + * Created on: 8 févr. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_DUMPER_H_ +#define POCO_FSM_MODEL_DUMPER_H_ + +#include +using std::string; + +#include "FSM.h" +using Poco::FSM::MODEL::TransitionPtr; +using Poco::FSM::MODEL::GuardPtr; + +namespace Poco { +namespace FSM { +namespace MODEL { + +class Dumper { +public: + virtual void operator()(const char* message) = 0; + virtual void operator()(const string& message) = 0; + virtual void operator()(const TransitionPtr transition, const GuardPtr guard) = 0; +}; + +} +} +} + +#endif diff --git a/FSM/src/model/Element.h b/FSM/src/model/Element.h new file mode 100644 index 000000000..fe5c77ab4 --- /dev/null +++ b/FSM/src/model/Element.h @@ -0,0 +1,42 @@ +/* + * Element.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_ELEMENT_H_ +#define POCO_FSM_MODEL_ELEMENT_H_ + +#include "SMC.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Element { + private: + string _name; // An element has a unique name. + int _lineno; + + protected: + mutable string oneline; + + public: + Element(int lineno = 0) : _lineno(lineno) { + } + Element(const string& name, int lineno = 0) : _name(name), _lineno(lineno) { + } + virtual ~Element() { + } + + virtual const string name() const { return _name; } + const int lineno() const { return _lineno; } + + virtual const string display() const = 0; + }; + + } + } +} +#endif diff --git a/FSM/src/model/Entry.h b/FSM/src/model/Entry.h new file mode 100644 index 000000000..99458d161 --- /dev/null +++ b/FSM/src/model/Entry.h @@ -0,0 +1,30 @@ +/* + * Entry.h + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_ENTRY_H_ +#define POCO_FSM_MODEL_ENTRY_H_ + +#include "Element.h" +#include "Actions.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Entry : public Actions, public Element { + public: + Entry(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Entry() { + } + virtual const string display() const; + void print(Print& print) const; + }; + } + } +} +#endif diff --git a/FSM/src/model/Exit.h b/FSM/src/model/Exit.h new file mode 100644 index 000000000..0568c4e39 --- /dev/null +++ b/FSM/src/model/Exit.h @@ -0,0 +1,33 @@ +/* + * Exit.h + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_EXIT_H_ +#define POCO_FSM_MODEL_EXIT_H_ + +#include "Print.h" +#include "Element.h" +#include "Actions.h" + +namespace Poco { +namespace FSM { +namespace MODEL { + + class Exit : public Actions, public Element { + public: + Exit(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Exit() { + } + virtual const string display() const; + void print(Print& print) const; + }; + +} +} +} + +#endif diff --git a/FSM/src/model/Expression.h b/FSM/src/model/Expression.h new file mode 100644 index 000000000..d71800fd5 --- /dev/null +++ b/FSM/src/model/Expression.h @@ -0,0 +1,39 @@ +/* + * Expression.h + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_EXPRESSION_H_ +#define POCO_FSM_MODEL_EXPRESSION_H_ + +#include "SMC.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Expression { + protected: + OperationPtr _operation = NULL; + mutable string _asstring; + GuardPtr _guard = NULL; + + public: + Expression() { + } + virtual ~Expression() { + } + GuardPtr& guard() { return _guard; } + const GuardPtr guard() const { return _guard; } + + virtual const string display() const = 0; + OperationPtr& operation() { return _operation; } + const OperationPtr& operation() const { return _operation; } + }; + + } + } +} +#endif diff --git a/FSM/src/model/FSM.h b/FSM/src/model/FSM.h new file mode 100644 index 000000000..21f87fd29 --- /dev/null +++ b/FSM/src/model/FSM.h @@ -0,0 +1,132 @@ +/* + * FSM.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_FSM_H_ +#define POCO_FSM_MODEL_FSM_H_ +#include "Poco/FileStream.h" +#include "Poco/Path.h" +using Poco::Path; + +#include "SMC.h" +#include "Compilable.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + class Parser; + } + } +} +using Poco::FSM::PARSER::Parser; + +namespace Poco { + namespace FSM { + namespace MODEL { + + class FSM : public Compilable { + public: + FSM(PARSER::Parser* parser) : Compilable(), _parser(parser) { + } + virtual ~FSM() { + } + + + void setcontext() { _context = _fsmClass + "<" + _klass + ">"; } + string& startState() { return _startState; } + string& source() { return _source; } +// string& context() { return _fsmClass; } + string& fsmfile() { return _fsmFile; } + string& fsmclass() { return _fsmClass; } + string& klass() { return _klass; } + string& header() { return _header; } + string& returnt() { return _return; } + List& packages() { return _packages; } + List& includes() { return _includes; } + List& imports() { return _imports; } + List& declares() { return _declares; } + bool& updated() { return _updated; } + Parser* parser() const { return _parser; } + + const string& startState() const { return _startState; } + const string& context()const { return _context; } + const string& fsmfile()const { return _fsmFile; } + const string& fsmclass()const { return _fsmClass; } + const string& klass()const { return _klass; } + const string& header()const { return _header; } + const List& packages()const { return _packages; } + const List& includes()const { return _includes; } + const List& imports()const { return _imports; } + const List& declares()const { return _declares; } + const List& maps()const { return _maps; } + bool updated() const { return _updated; } + + void add(MapPtr map); + void addPackage(const string& package); + void addImport(const string& import); + void addInclude(const string& inc); + void addDeclare(const string& declare); + void print(Print& print) const; + + virtual bool updated(const Path& out) = 0; + + protected: + Parser* _parser = nullptr; + + // The state map's initial state. + string _startState; + + // Raw source code appearing at the beginning of the state + // map source file. + string _source; + + // This state map is associated with this class. + string _context; + string _fsmClass; + + // generated finite state machine class file name. + string _fsmFile; + + // This map is implemented in the class with given name + string _klass; + + // Where the associated class is defined. + string _header; + + // For C++ only. List of include files. Will be output to + // the .cpp file in the same order as they appear in the + // .sm file. + List _includes; + + // This code is placed in this package/namespace. + List _packages; + + // Place names of imports in this list. + List _imports; + + // Place forward declarations in this list. + List _declares; + + // The context class access level. Empty string by default. + string _accessLevel; + + // The line where %start, etc. should appear. + // Used in error messages. + int _headerLine; + + // The state maps. + List _maps; + + string _return; + + bool _updated = false; + + }; + + } + } +} +#endif diff --git a/FSM/src/model/Factory.h b/FSM/src/model/Factory.h new file mode 100644 index 000000000..ecb39d7e5 --- /dev/null +++ b/FSM/src/model/Factory.h @@ -0,0 +1,66 @@ +/* + * Factory.h + * + * Created on: 26 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_FACTORY_H_ +#define POCO_FSM_MODEL_FACTORY_H_ + +#include "SMC.h" +#include "Operation.h" + +using Poco::FSM::MODEL::ActionPtr; +using Poco::FSM::MODEL::FSMPtr; +using Poco::FSM::MODEL::GuardPtr; +using Poco::FSM::MODEL::MapPtr; +using Poco::FSM::MODEL::ParameterPtr; +using Poco::FSM::MODEL::StatePtr; +using Poco::FSM::MODEL::EntryPtr; +using Poco::FSM::MODEL::ExitPtr; +using Poco::FSM::MODEL::TransitionPtr; +using Poco::FSM::MODEL::ExpressionPtr; +using Poco::FSM::MODEL::ReferencePtr; +using Poco::FSM::MODEL::VariablePtr; +using Poco::FSM::MODEL::FunctionPtr; +using Poco::FSM::MODEL::LiteralPtr; +using Poco::FSM::MODEL::ArgumentPtr; +using Poco::FSM::MODEL::OperationPtr; +using Poco::FSM::MODEL::UnaryOperationPtr; +using Poco::FSM::MODEL::BinaryOperationPtr; + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Factory { + public: + Factory() { + } + virtual ~Factory() { + } + virtual FSMPtr newFSM(Parser* parser) const = 0; + virtual ActionPtr newAction(const string& name, int lineno = 0) const = 0; + virtual GuardPtr newGuard(const string& name, int lineno = 0) const = 0; + virtual MapPtr newMap(const string& name, int lineno = 0) const = 0; + virtual ParameterPtr newParameter(const string& name, int lineno = 0) const = 0; + virtual StatePtr newState(const string& name, int lineno = 0) const = 0; + virtual EntryPtr newEntry(const string& name, int lineno = 0) const = 0; + virtual ExitPtr newExit(const string& name, int lineno = 0) const = 0; + virtual TransitionPtr newTransition(const string& name, int lineno = 0) const = 0; + virtual VariablePtr newVariable(const string& name, int lineno = 0) const = 0; + virtual FunctionPtr newFunction(const string& name, int lineno = 0) const = 0; + virtual LiteralPtr newLiteral(const string& name, int lineno = 0) const = 0; + virtual ReferencePtr newReference(const VariablePtr variable, int lineno = 0) const = 0; + virtual ReferencePtr newReference(const LiteralPtr literal, int lineno = 0) const = 0; + virtual ReferencePtr newReference(const FunctionPtr function, int lineno = 0) const = 0; + virtual ArgumentPtr newArgument(const string& name, int lineno = 0) const = 0; + virtual UnaryOperationPtr newUnaryOperation(Operator op) const = 0; + virtual BinaryOperationPtr newBinaryOperation(Operator op) const = 0; + }; + } + } +} + +#endif diff --git a/FSM/src/model/Function.h b/FSM/src/model/Function.h new file mode 100644 index 000000000..432783f6d --- /dev/null +++ b/FSM/src/model/Function.h @@ -0,0 +1,38 @@ +/* + * Function.h + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_FUNCTION_H_ +#define POCO_FSM_MODEL_FUNCTION_H_ + +#include "SMC.h" +#include "Expression.h" +#include "Element.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Function : public Element { + private: + List _arguments; + + public: + Function(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Function() { + } + List& arguments() { return _arguments; } + const List& arguments() const { return _arguments; } + + void add(const ArgumentPtr argument) { _arguments.push_back(argument); } + virtual const string display() const; + }; + + } + } +} +#endif diff --git a/FSM/src/model/Guard.h b/FSM/src/model/Guard.h new file mode 100644 index 000000000..0022a296b --- /dev/null +++ b/FSM/src/model/Guard.h @@ -0,0 +1,87 @@ +/* + * Guard.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_GUARD_H_ +#define POCO_FSM_MODEL_GUARD_H_ + +#include "SMC.h" +#include "Element.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + enum TransType + { + /** + * Transitions may be instantiated before all information + * is gathered. This is the default transition type. + */ + TRANS_NOT_SET, + + /** + * A standard transition which goes from one state to the + * next. + */ + TRANS_SET, + + /** + * This transition pushes the current state on top of the + * state stack before setting the next state. The previous + * state may be restored using a pop transition. A push + * transtion may be used in conjunction with a set + * transition. In that case the specified next state is + * pushed on top of the state stack and not the current + * state. + */ + TRANS_PUSH, + + /** + * Pop the state off the state stack and make it the next + * state. + */ + TRANS_POP + }; // end of enum TransType + + class Guard : public Element { + private: + TransitionPtr _transition = nullptr; + ExpressionPtr _condition = nullptr; + TransType _transType; + StatePtr _endstate = nullptr; + StatePtr _pushState = nullptr; + StatePtr _popArgs = nullptr; + List _actions; + + public: + Guard(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Guard() { + } + + TransitionPtr& transition() { return _transition; } + ExpressionPtr& condition() { return _condition; } + StatePtr& endstate() { return _endstate; } + StatePtr& pushState() { return _pushState; } + StatePtr& popArgs() { return _popArgs; } + List& actions() { return _actions; } + + const TransitionPtr& transition()const { return _transition; } + const ExpressionPtr& condition()const { return _condition; } + const StatePtr& endstate()const { return _endstate; } + const StatePtr& pushState()const { return _pushState; } + const StatePtr& popArgs()const { return _popArgs; } + const List& actions() const { return _actions; } + + void add(ActionPtr action) { _actions.push_back(action); } + + virtual const string display() const; + }; + + } + } +} +#endif diff --git a/FSM/src/model/Literal.h b/FSM/src/model/Literal.h new file mode 100644 index 000000000..15983818b --- /dev/null +++ b/FSM/src/model/Literal.h @@ -0,0 +1,32 @@ +/* + * Literal.h + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_LITERAL_H_ +#define POCO_FSM_MODEL_LITERAL_H_ + +#include "SMC.h" +#include "Expression.h" +#include "Element.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Literal : public Element { + public: + Literal(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Literal() { + } + virtual const string display() const; + virtual const string display(const string& prefix) const; + }; + + } + } +} +#endif diff --git a/FSM/src/model/Map.h b/FSM/src/model/Map.h new file mode 100644 index 000000000..4dfe164e0 --- /dev/null +++ b/FSM/src/model/Map.h @@ -0,0 +1,56 @@ +/* + * Map.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_MAP_H_ +#define POCO_FSM_MODEL_MAP_H_ + +#include +using std::map; + +#include "SMC.h" +#include "Element.h" +#include "State.h" +#include "Print.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Map : public Element { + public: + Map(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Map() { + } + + StatePtr& defaultState() { return _defaultState; } + const StatePtr defaultState() const { return _defaultState; } + FSMPtr& fsm() { return _fsm; } + const FSMPtr fsm() const { return _fsm; } + + const map& states() const { return _states; } + const map& transitions() const { return _transitions; } + + + void add(TransitionPtr transition); + void add(StatePtr state); + StatePtr lookfor(const string& state) const; + virtual const string display() const; + void print(Print& print) const; + + protected: + FSMPtr _fsm = nullptr; + StatePtr _defaultState = nullptr; + map _states; + map _transitions; + + }; + + } + } +} +#endif diff --git a/FSM/src/model/Operation.h b/FSM/src/model/Operation.h new file mode 100644 index 000000000..717db74a5 --- /dev/null +++ b/FSM/src/model/Operation.h @@ -0,0 +1,45 @@ +/* + * Operation.h + * + * Created on: 20 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_OPERATION_H_ +#define POCO_FSM_MODEL_OPERATION_H_ + +#include "Expression.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + enum class Operator { + none, + and, + or, + xor, + not, + equal, + notequal + }; + class Operation : public virtual Expression { + protected: + bool _contextuel = true; + + protected: + Operator _operator; + + public: + Operation(Operator op); + virtual ~Operation(); + + const bool& contextuel() const { return _contextuel; } + const Operator& op() const { return _operator; } + + void setNoContextuel(); + }; + + } + } +} +#endif diff --git a/FSM/src/model/Parameter.h b/FSM/src/model/Parameter.h new file mode 100644 index 000000000..d2265c6f9 --- /dev/null +++ b/FSM/src/model/Parameter.h @@ -0,0 +1,38 @@ +/* + * Parameter.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_PARAMETER_H_ +#define POCO_FSM_MODEL_PARAMETER_H_ + + +#include "SMC.h" +#include "Element.h" +#include "Reference.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Parameter : public Element { + private: + string _type; + + public: + Parameter(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Parameter() { + } + + string& type() { return _type; } + const string& type() const { return _type; } + virtual const string display() const; + }; + + } + } +} +#endif diff --git a/FSM/src/model/Print.h b/FSM/src/model/Print.h new file mode 100644 index 000000000..c77cd9930 --- /dev/null +++ b/FSM/src/model/Print.h @@ -0,0 +1,41 @@ +/* + * Print.h + * + * Created on: 22 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_PRINT_H_ +#define POCO_FSM_MODEL_PRINT_H_ + +namespace Poco { + class Logger; +} +using Poco::Logger; + +#include "Dumper.h" + +namespace Poco { +namespace FSM { +namespace MODEL { + +class Print : public Dumper { +public: + Print(Logger& logger) : logger(logger) { + } + virtual ~Print() { + } + virtual void operator()(const char* message); + virtual void operator()(const string& message); + virtual void operator()(const TransitionPtr transition, const GuardPtr guard); + +private: + Logger& logger; + +}; + +} +} +} + +#endif diff --git a/FSM/src/model/Reference.h b/FSM/src/model/Reference.h new file mode 100644 index 000000000..4601f6b3d --- /dev/null +++ b/FSM/src/model/Reference.h @@ -0,0 +1,57 @@ +/* + * Reference.h + * + * Created on: 1 févr. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_REFERENCE_H_ +#define POCO_FSM_MODEL_REFERENCE_H_ + +#include "SMC.h" +#include "Expression.h" +#include "Element.h" +#include "Variable.h" +#include "Literal.h" +#include "Function.h" +#include "Operation.h" + +namespace Poco { +namespace FSM { +namespace MODEL { + +class Reference : public virtual Expression, public Element { +private: + + union { + VariablePtr _variable; + LiteralPtr _literal; + FunctionPtr _function; + }; + +public: + Reference(const VariablePtr variable, int lineno = 0) : + Element(lineno), + _variable(variable) { + } + Reference(const FunctionPtr function, int lineno = 0) : + Element(lineno), + _function(function) { + } + Reference(const LiteralPtr literal, int lineno = 0) : + Element(lineno), + _literal(literal) { + } + virtual ~Reference() { + } + virtual const string display() const; + ElementPtr reference() { return _variable; } + const ElementPtr reference() const { return _variable; } + bool isParameter() const; +}; + +} +} +} + +#endif diff --git a/FSM/src/model/SMC.h b/FSM/src/model/SMC.h new file mode 100644 index 000000000..5e2545494 --- /dev/null +++ b/FSM/src/model/SMC.h @@ -0,0 +1,75 @@ +/* + * fSMC.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_SMC_H_ +#define POCO_FSM_MODEL_SMC_H_ + +#include +#include +using std::string; +using std::vector; + +template +using List = vector; + +namespace Poco { + namespace FSM { + namespace PARSER { + class Parser; + } + } +} +using Poco::FSM::PARSER::Parser; + +namespace Poco { + namespace FSM { + namespace MODEL { + class Action; + class Element; + class FSM; + class Guard; + class Map; + class Parameter; + class State; + class Entry; + class Exit; + class Transition; + class Expression; + class Variable; + class Reference; + class Function; + class Literal; + class Argument; + class Operation; + class UnaryOperation; + class BinaryOperation; + class Print; + class Dumper; + + typedef Action* ActionPtr; + typedef Element* ElementPtr; + typedef FSM* FSMPtr; + typedef Guard* GuardPtr; + typedef Map* MapPtr; + typedef Parameter* ParameterPtr; + typedef State* StatePtr; + typedef Entry* EntryPtr; + typedef Exit* ExitPtr; + typedef Transition* TransitionPtr; + typedef Expression* ExpressionPtr; + typedef Variable* VariablePtr; + typedef Reference* ReferencePtr; + typedef Function* FunctionPtr; + typedef Literal* LiteralPtr; + typedef Argument* ArgumentPtr; + typedef Operation* OperationPtr; + typedef UnaryOperation* UnaryOperationPtr; + typedef BinaryOperation* BinaryOperationPtr; + } + } +} +#endif diff --git a/FSM/src/model/State.h b/FSM/src/model/State.h new file mode 100644 index 000000000..ecd3081cc --- /dev/null +++ b/FSM/src/model/State.h @@ -0,0 +1,60 @@ +/* + * State.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_STATE_H_ +#define POCO_FSM_MODEL_STATE_H_ + +#include +#include +using std::string; + +#include "SMC.h" +#include "Element.h" + +using Poco::FSM::MODEL::TransitionPtr; + +namespace Poco { + namespace FSM { + namespace MODEL { + + class State : public Element { + public: + State(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~State() { + } + MapPtr& map() { return _map; } + EntryPtr& entry() { return _entry; } + ExitPtr& exit() { return _exit; } + const MapPtr& map() const { return _map; } + const EntryPtr& entry() const { return _entry; } + const ExitPtr& exit() const { return _exit; } + const List& transitions() const { return _transitions; } + + TransitionPtr add(TransitionPtr transition); + TransitionPtr get(const string& transition, const List& parameters) const; + + virtual const string display() const; + void print(Print& print) const; + + protected: + MapPtr _map = nullptr; + string _className; + string _instanceName; + EntryPtr _entry = nullptr; + ExitPtr _exit = nullptr; + List _transitions; + + private: + std::map maps; + + }; + + } + } +} +#endif diff --git a/FSM/src/model/Transition.h b/FSM/src/model/Transition.h new file mode 100644 index 000000000..f27ce73e1 --- /dev/null +++ b/FSM/src/model/Transition.h @@ -0,0 +1,61 @@ +/* + * Transition.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_TRANSITION_H_ +#define POCO_FSM_MODEL_TRANSITION_H_ + +#include "SMC.h" +#include "State.h" +#include "Element.h" +#include "Guard.h" +#include "Parameter.h" +#include "Print.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Transition : public Element { + protected: + StatePtr _begstate = nullptr; + List _parameters; + List _guards; + mutable string _signature; + + public: + Transition() = delete; + Transition(const Transition&) = delete; + Transition(const string& name, int lineno = 0); + virtual ~Transition(); + + StatePtr& begstate() { return _begstate; } + List& parameters() { return _parameters; } + List& guards() { return _guards; } + const StatePtr& begstate() const { return _begstate; } + const List& parameters() const { return _parameters; } + const List& guards() const{ return _guards; } + + virtual const string display() const; + void print(Print& print) const; + + void add(ParameterPtr parameter) { _parameters.push_back(parameter); } + void add(GuardPtr guard) { _guards.push_back(guard); guard->transition() = this; } + + + string declaration(const Parameter* added = nullptr) const; + string call(const char* embed) const; + + const string& signature() const; + static string signature(const string& name, const List& parameters); + + bool hasParameter(const string& name) const; + }; + + } + } +} +#endif diff --git a/FSM/src/model/UnaryOperation.h b/FSM/src/model/UnaryOperation.h new file mode 100644 index 000000000..102748455 --- /dev/null +++ b/FSM/src/model/UnaryOperation.h @@ -0,0 +1,36 @@ +/* + * UnaryOperation.h + * + * Created on: 20 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_UNARY_OPERATION_H_ +#define POCO_FSM_MODEL_UNARY_OPERATION_H_ + +#include "Operation.h" +#include "Expression.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class UnaryOperation : public Operation { + private: + ExpressionPtr _operand; + + public: + UnaryOperation(Operator op) : Operation(op) { + } + virtual ~UnaryOperation() { + } + + ExpressionPtr& operand() { return _operand; } + const ExpressionPtr operand() const { return _operand; } + virtual const string display() const; + }; + + } + } +} +#endif diff --git a/FSM/src/model/Variable.h b/FSM/src/model/Variable.h new file mode 100644 index 000000000..c097c443b --- /dev/null +++ b/FSM/src/model/Variable.h @@ -0,0 +1,31 @@ +/* + * Variable.h + * + * Created on: 21 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_MODEL_VARIABLE_H_ +#define POCO_FSM_MODEL_VARIABLE_H_ + +#include "SMC.h" +#include "Expression.h" +#include "Element.h" + +namespace Poco { + namespace FSM { + namespace MODEL { + + class Variable : public Element { + public: + Variable(const string& name, int lineno = 0) : Element(name, lineno) { + } + virtual ~Variable() { + } + virtual const string display() const; + }; + + } + } +} +#endif diff --git a/FSM/src/parser/BNF.txt b/FSM/src/parser/BNF.txt new file mode 100644 index 000000000..8a9a718f9 --- /dev/null +++ b/FSM/src/parser/BNF.txt @@ -0,0 +1,127 @@ +// +// The contents of this file are subject to the Mozilla Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy +// of the License at http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an +// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is State Machine Compiler (FSM). +// +// The Initial Developer of the Original Code is Charles W. Rapp. +// Portions created by Charles W. Rapp are +// Copyright (C) 2006. Charles W. Rapp. +// All Rights Reserved. +// +// Contributor(s): +// Eitan Suez contributed examples/Ant. +// (Name withheld) contributed the C# code generation and +// examples/C#. +// Francois Perrad contributed the Python code generation and +// examples/Python. +// Chris Liscio contributed the Objective-C code generation +// and examples/ObjC. +// +// RCS ID +// $Id: SmcEBNF.txt,v 1.1 2009/03/01 18:20:42 cwrapp Exp $ +// +// CHANGE LOG +// (See bottom of file.) +// + +FSM := source? start_state class_name header_file? include_file* +package_name* import* declare* access* map+ + +source := '%{' raw_code '%}' + +start_state := '%start' word + +class_name := '%class' word + +header_file := '%header' raw_code_line + +include_file := '%include' raw_code_line + +package_name := '%package' word + +import := '%import' raw_code_line + +declare := '%declare' raw_code_line + +access := '%access' raw_code_line + +map := '%map' word '%%' states '%%' + +states := word entry? exit? '{' transitions* '}' + +entry := 'Entry {' actions* '}' + +exit := 'Exit {' actions '}' + +transitions := word transition_args? guard? next_state '{' actions '}' + +transition_args := '(' parameters ')' + +parameters := parameter | + parameter ',' parameters + +parameter := word ':' raw_code + +guard := '[' raw_code ']' + +next_state := word | + 'nil' | + push_transition | + pop_transition + +push_transition := word '/' 'push(' word ')' | + 'nil/push(' word ')' | + 'push(' word ')' + +pop_transition := 'pop' | + 'pop(' word? ')' | + 'pop(' word ',' pop_arguments* ')' + +pop_arguments := raw_code | + raw_code ',' pop_arguments + +actions := dotnet_assignment | + action | + action actions + +dotnet_assignment := word '=' raw_code ';' + +action := word '(' arguments* ');' + +arguments := raw_code | + raw_code ',' arguments + +word := [A-Za-z][A-Za-z0-9_.]* | + _[A-Za-z][A-Za-z0-9_.]* + +// Reads in code verbatim until end-of-line is reached. +raw_code_line := .* '\n\r\f' + +// Read in code verbatim. +raw_code := .* + +// Both the // and /* */ comment types are supported. +// Note: FSM honors nested /* */ comments. +comment1 := '//' .* '\n\r\f' +comment2 := '/*' .* '*/' + +// +// CHANGE LOG +// $Log: SmcEBNF.txt,v $ +// Revision 1.1 2009/03/01 18:20:42 cwrapp +// Preliminary v. 6.0.0 commit. +// +// Revision 1.2 2007/01/15 00:23:51 cwrapp +// Release 4.4.0 initial commit. +// +// Revision 1.1 2006/09/17 16:26:06 cwrapp +// Initial v. 4.3.3 check-in. +// diff --git a/FSM/src/parser/Character.h b/FSM/src/parser/Character.h new file mode 100644 index 000000000..c047f303e --- /dev/null +++ b/FSM/src/parser/Character.h @@ -0,0 +1,30 @@ +/* + * Character.h + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_CHARACTER_H_ +#define POCO_FSM_PARSER_CHARACTER_H_ + +#include "Token.h" + +namespace Poco { namespace FSM { +namespace PARSER { + +class Character : public Token { +public: + Character(); + ~Character(); + Poco::Token::Class tokenClass() const; + bool start(char c, std::istream& istr); + void finish(std::istream& istr); + char asChar() const; +}; + +} +} +} + +#endif diff --git a/FSM/src/parser/Comment.h b/FSM/src/parser/Comment.h new file mode 100644 index 000000000..66e161f7c --- /dev/null +++ b/FSM/src/parser/Comment.h @@ -0,0 +1,31 @@ +/* + * Comment.h + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_COMMENT_H_ +#define POCO_FSM_PARSER_COMMENT_H_ + +#include "Token.h" + + +namespace Poco { namespace FSM { +namespace PARSER { + +class Comment : public Token { +public: + Comment(); + ~Comment(); + Poco::Token::Class tokenClass() const; + bool start(char c, std::istream& istr); + void finish(std::istream& istr); + std::string asString() const; +}; + +} +} +} + +#endif diff --git a/FSM/src/parser/Identifier.h b/FSM/src/parser/Identifier.h new file mode 100644 index 000000000..e5bc92b67 --- /dev/null +++ b/FSM/src/parser/Identifier.h @@ -0,0 +1,30 @@ +/* + * Identifier.h + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_IDENTIFIER_H_ +#define POCO_FSM_PARSER_IDENTIFIER_H_ + +#include "Token.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + + class Identifier : public Token { + public: + Identifier() {} + ~Identifier() {} + Class tokenClass() const; + bool start(char c, std::istream& istr); + void finish(std::istream& istr); + }; + + } + } +} + +#endif diff --git a/FSM/src/parser/IndentStream.h b/FSM/src/parser/IndentStream.h new file mode 100644 index 000000000..7d5b52974 --- /dev/null +++ b/FSM/src/parser/IndentStream.h @@ -0,0 +1,69 @@ +#ifndef POCO_CMP_INDENTSTREAM_H_ +#define POCO_CMP_INDENTSTREAM_H_ + +#include +#include +#include +#include + +using std::streambuf; +using std::fill_n; +using std::ostream; +using std::ostreambuf_iterator; + + +class IndentBuffer : public streambuf { + public: + + IndentBuffer(streambuf* sbuf) : _sbuf(sbuf), _tab(0), _need(true) {} + + int tab() const { + return _tab; + } + void tab() { + _tab += 1; + } + void back() { + if (_tab >= 0) _tab -= 1; + } + + protected: + virtual int_type overflow(int_type c) { + + if (traits_type::eq_int_type(c, traits_type::eof())) + return _sbuf->sputc(c); + + if (_need) { + fill_n(std::ostreambuf_iterator(_sbuf), _tab, '\t'); + _need = false; + } + + if (traits_type::eq_int_type(_sbuf->sputc(c), traits_type::eof())) + return traits_type::eof(); + + if (traits_type::eq_int_type(c, traits_type::to_char_type('\n'))) + _need = true; + + return traits_type::not_eof(c); + } + + streambuf* _sbuf; + int _tab; + bool _need; +}; + +std::ostream& tab(std::ostream& stream); +std::ostream& back(std::ostream& stream); + +class IndentStream : public std::ostream { + public: + IndentStream(std::ostream &os) : ib(os.rdbuf()), std::ostream(&ib) {}; + + friend std::ostream& tab(std::ostream& stream); + + friend std::ostream& back(std::ostream& stream); + + private: + IndentBuffer ib; +}; +#endif \ No newline at end of file diff --git a/FSM/src/parser/Keyword.h b/FSM/src/parser/Keyword.h new file mode 100644 index 000000000..eab187a5b --- /dev/null +++ b/FSM/src/parser/Keyword.h @@ -0,0 +1,53 @@ +/* + * Keyword.h + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_PERCENT_H_ +#define POCO_FSM_PARSER_PERCENT_H_ + +#include +using std::map; +#include "Token.h" + +namespace Poco { namespace FSM { +namespace PARSER { + +class Keyword: public Token { +public: + enum KW { + START = 1, // %start + CLASS, // %class + FSMFILE, // %fsmfile + FFSMLASS, // %fsmclass + HEADER, // %header + INCLUDE, // %include + PACKAGE, // %package + IMPORT, // %import + DECLARE, // %declare + ACCESS, // %access + MAP, // %map + RETURN // %return + }; + Keyword(); + ~Keyword(); + + Class tokenClass() const ; + bool start(char c, std::istream& istr); + void finish(std::istream& istr); + int asInteger() const; + static const char* asString(int kwno); + +private: + typedef map OpMap; + + OpMap _opMap; +}; + +} +} +} + +#endif diff --git a/FSM/src/parser/Number.h b/FSM/src/parser/Number.h new file mode 100644 index 000000000..f2c4d0ce9 --- /dev/null +++ b/FSM/src/parser/Number.h @@ -0,0 +1,30 @@ +/* + * Number.h + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_NUMBER_H_ +#define POCO_FSM_PARSER_NUMBER_H_ + +#include "Token.h" + +namespace Poco { namespace FSM { +namespace PARSER { + +class Number: public Token { +public: + Number() {} + ~Number() {} + + Class tokenClass() const ; + bool start(char c, std::istream& istr); + void finish(std::istream& istr); +}; + +} +} +} + +#endif diff --git a/FSM/src/parser/Operator.h b/FSM/src/parser/Operator.h new file mode 100644 index 000000000..ecf0ac86e --- /dev/null +++ b/FSM/src/parser/Operator.h @@ -0,0 +1,90 @@ +/* + * Operator.h + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_OPERATOR_H_ +#define POCO_FSM_PARSER_OPERATOR_H_ + +#include +using std::map; +#include "Token.h" + +namespace Poco { + namespace FSM { + namespace PARSER { + + class Operator : public Token { + public: + enum OP { + OPENBRACKET = 1,// [ + CLOSBRACKET, // ] + OPENPARENT, // ( + CLOSPARENT, // ) + OPENBRACE, // { + CLOSBRACE, // } + LT, // < + LE, // <= + SHL, // << + SHL_ASSIGN, // <<= + GT, // > + GE, // >= + SHR, // >> + SHR_ASSIGN, // >>= + ASSIGN, // = + EQ, // == + NOT, // ! + NE, // != + BITAND, // & + BITAND_ASSIGN, // &= + AND, // && + BITOR, // | + BITOR_ASSIGN, // |= + OR, // || + XOR, // ^ + XOR_ASSIGN, // ^= + COMPL, // ~ + STAR, // * + STAR_ASSIGN, // *= + SLASH, // / + SLASH_ASSIGN, // /= + PLUS, // + + PLUS_ASSIGN, // += + INCR, // ++ + MINUS, // - + MINUS_ASSIGN, // -= + DECR, // -- + ARROW, // -> + MOD, // % + MOD_ASSIGN, // %= + COMMA, // , + PERIOD, // . + ELLIPSIS, // ... + COLON, // : + DBL_COLON, // :: + SEMICOLON, // ; + QUESTION, // ? + OPENCODE, // %{ + CLOSCODE, // %} + FSM // %% + }; + + Operator(); + ~Operator(); + Poco::Token::Class tokenClass() const; + bool start(char c, std::istream& istr); + void finish(std::istream& istr); + int asInteger() const; + + private: + typedef map OpMap; + + OpMap _opMap; + }; + + } + } +} +#endif diff --git a/FSM/src/parser/Parser.h b/FSM/src/parser/Parser.h new file mode 100644 index 000000000..44c80bb67 --- /dev/null +++ b/FSM/src/parser/Parser.h @@ -0,0 +1,141 @@ +/* + * Parser.h + * + * Created on: 16 janv. 2016 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_H_ +#define POCO_FSM_PARSER_H_ + +#include +using std::stack; + +#include "Poco/Path.h" +#include "Poco/File.h" +#include "Poco/Logger.h" +#include "Poco/Token.h" +#include "Poco/CountingStream.h" +using Poco::Logger; +using Poco::Token; +using Poco::Path; +using Poco::File; +using Poco::CountingInputStream; + +#include "Tokenizer.h" +#include "model/SMC.h" + +using Poco::FSM::MODEL::StatePtr; +using Poco::FSM::MODEL::EntryPtr; +using Poco::FSM::MODEL::ExitPtr; +using Poco::FSM::MODEL::GuardPtr; +using Poco::FSM::MODEL::MapPtr; +using Poco::FSM::MODEL::ActionPtr; +using Poco::FSM::MODEL::TransitionPtr; +using Poco::FSM::MODEL::ParameterPtr; +using Poco::FSM::MODEL::FSMPtr; +using Poco::FSM::MODEL::ExpressionPtr; +using Poco::FSM::MODEL::ArgumentPtr; +using Poco::FSM::MODEL::ReferencePtr; + +namespace Poco { + namespace FSM { + namespace PARSER { + + class Parser { + public: + Parser(Logger& logger, const File& smfile, std::istream& istr); + virtual ~Parser(); + FSMPtr parse(const Path& out); + + protected: + const Poco::Token* parseAccess(const Poco::Token* next); + const Poco::Token* parseAction(const Poco::Token* next); + const Poco::Token* parseActions(const Poco::Token* next, List& actions); + const Poco::Token* parseArgument(const Poco::Token* next, List& list); + const Poco::Token* parseArguments(const Poco::Token* next, List& list); + const Poco::Token* parseClass(const Poco::Token* next); + const Poco::Token* parseDeclare(const Poco::Token* next); + const Poco::Token* parseEntry(const Poco::Token* next); + const Poco::Token* parseExit(const Poco::Token* next); + const Poco::Token* parseExpression(const Poco::Token* next, ExpressionPtr& expression); + const Poco::Token* parseFSM(const Poco::Token* next); + const Poco::Token* parseFFSMlass(const Poco::Token* next); + const Poco::Token* parseFSMFile(const Poco::Token* next); + const Poco::Token* parseFile(const Poco::Token* next, const Path& out); + const Poco::Token* parseGuard(const Poco::Token* next); + const Poco::Token* parseHeader(const Poco::Token* next); + const Poco::Token* parseImport(const Poco::Token* next); + const Poco::Token* parseInclude(const Poco::Token* next); + const Poco::Token* parseIncludes(const Poco::Token* next); + const Poco::Token* parseMap(const Poco::Token* next); + const Poco::Token* parseNext(const Poco::Token* next); + const Poco::Token* parsePackage(const Poco::Token* next); + const Poco::Token* parseParameter(const Poco::Token* next); + const Poco::Token* parseParameters(const Poco::Token* next); + const Poco::Token* parsePopArguments(const Poco::Token* next); + const Poco::Token* parsePopTransition(const Poco::Token* next); + const Poco::Token* parsePushTransition(const Poco::Token* next); + const Poco::Token* parseRawCode(const Poco::Token* next); + const Poco::Token* parseReturn(const Poco::Token* next); + const Poco::Token* parseSource(const Poco::Token* next); + const Poco::Token* parseStart(const Poco::Token* next); + const Poco::Token* parseState(const Poco::Token* next); + const Poco::Token* parseStates(const Poco::Token* next); + const Poco::Token* parseTransition(const Poco::Token* next); + const Poco::Token* parseTransitionArgs(const Poco::Token* next); + const Poco::Token* parseTransitions(const Poco::Token* next); + const Poco::Token* parseTerminal(const Poco::Token* next, ReferencePtr& reference); + + static bool isString(const Poco::Token* token); + static bool isCharacter(const Poco::Token* token); + static bool isNumber(const Poco::Token* token); + static bool isIdentifier(const Poco::Token* token); + static bool isOperator(const Poco::Token* token); + static bool isOperator(const Poco::Token* token, int kind); + static bool isKeyword(const Poco::Token* token, int kind); + static bool isEOF(const Poco::Token* token); + static void expectOperator(const Poco::Token* token, int kind, const string& msg); + static void syntaxError(const string& msg); + static void append(string& decl, const string& token); + static void append(string& decl, const Poco::Token* token); + + const Poco::Token* nextToken(); + const Poco::Token* nextPreprocessed(); + const Poco::Token* nextParserToken(); + void reduce(); + + public: + const File& file() const { return _file; } + + private: + CountingInputStream _istr; + Tokenizer _tokenizer; + File _file; + Path _path; + string _currentPath; + bool _inFile; + string _package; + string _library; + string _doc; + string _attrs; + + FSMPtr fsm = nullptr; + StatePtr state= nullptr; + GuardPtr guard= nullptr; + MapPtr map= nullptr; + ActionPtr action= nullptr; + TransitionPtr transition= nullptr; + ParameterPtr parameter= nullptr; + List parameters; + EntryPtr entry = nullptr; + ExitPtr exit = nullptr; + + Logger& _logger; + stack _stack; + }; + + } + } +} +#endif diff --git a/FSM/src/parser/String.h b/FSM/src/parser/String.h new file mode 100644 index 000000000..731c7fff4 --- /dev/null +++ b/FSM/src/parser/String.h @@ -0,0 +1,31 @@ +/* + * String.h + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_STRING_H_ +#define POCO_FSM_PARSER_STRING_H_ + +#include "Token.h" + + +namespace Poco { namespace FSM { +namespace PARSER { + +class String : public Token { +public: + String(); + ~String(); + Poco::Token::Class tokenClass() const; + bool start(char c, std::istream& istr); + void finish(std::istream& istr); + std::string asString() const; +}; + +} +} +} + +#endif diff --git a/FSM/src/parser/Token.h b/FSM/src/parser/Token.h new file mode 100644 index 000000000..583e068ea --- /dev/null +++ b/FSM/src/parser/Token.h @@ -0,0 +1,31 @@ +/* + * Token.h + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_TOKEN_H_ +#define POCO_FSM_PARSER_TOKEN_H_ + +#include "Poco/Token.h" +#include +#include + + +namespace Poco { + namespace FSM { + namespace PARSER { + class Token : public Poco::Token { + public: + Token(); + ~Token(); + + protected: + void syntaxError(const std::string& expected, const std::string& actual); + }; + + } + } +} +#endif diff --git a/FSM/src/parser/Tokenizer.h b/FSM/src/parser/Tokenizer.h new file mode 100644 index 000000000..5138ed998 --- /dev/null +++ b/FSM/src/parser/Tokenizer.h @@ -0,0 +1,31 @@ +/* + * SourceDelimiterToken.h + * + * Created on: 3 août 2014 + * Author: FrancisANDRE + */ + +#ifndef POCO_FSM_PARSER_TOKENIZER_H_ +#define POCO_FSM_PARSER_TOKENIZER_H_ +#include "Poco/StreamTokenizer.h" +using Poco::StreamTokenizer; + + +namespace Poco { +namespace FSM { +namespace PARSER { + +class Tokenizer : public StreamTokenizer { + public: + Tokenizer(std::istream& istr); + ~Tokenizer(); + const Poco::Token* nextToken() { + return StreamTokenizer::next(); + } +}; + +} +} +} + +#endif