inkcpp_rb 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +1 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +84 -0
- data/LICENSE +7 -0
- data/README.md +3 -0
- data/Rakefile +16 -0
- data/bin/console +15 -0
- data/bin/setup +10 -0
- data/bin/tapioca +29 -0
- data/ext/inkcpp_rb/extconf.rb +19 -0
- data/ext/inkcpp_rb/inkcpp/.clang-format +99 -0
- data/ext/inkcpp_rb/inkcpp/.github/FUNDING.yml +1 -0
- data/ext/inkcpp_rb/inkcpp/.github/workflows/build.yml +344 -0
- data/ext/inkcpp_rb/inkcpp/.github/workflows/release.yml +49 -0
- data/ext/inkcpp_rb/inkcpp/.gitignore +25 -0
- data/ext/inkcpp_rb/inkcpp/.gitmodules +9 -0
- data/ext/inkcpp_rb/inkcpp/CMakeLists.txt +170 -0
- data/ext/inkcpp_rb/inkcpp/CODE_OF_CONDUCT.md +76 -0
- data/ext/inkcpp_rb/inkcpp/CONTRIBUTING.md +55 -0
- data/ext/inkcpp_rb/inkcpp/Config.cmake.in +2 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/CMakeLists.txt +13 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/main.c +38 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/main.cpp +40 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/test.ink +8 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example/test.ink.json +1 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/cmake_example.zip +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/InkCPP_DEMO.zip +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/CreateThread.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/HandleChoice.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/ListElementOf.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/MinimalRuntime.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/MinimalThread.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/ObseverChange.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/TagListGetValue.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Documentation/unreal/imgs/YieldResume.png +0 -0
- data/ext/inkcpp_rb/inkcpp/Doxyfile +2825 -0
- data/ext/inkcpp_rb/inkcpp/LICENSE.txt +22 -0
- data/ext/inkcpp_rb/inkcpp/Minimal.runsettings +8 -0
- data/ext/inkcpp_rb/inkcpp/README.md +192 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/CMakeLists.txt +67 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/array.h +481 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/avl_array.h +833 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/casting.h +93 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/choice.cpp +54 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/collections/restorable.cpp +124 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/collections/restorable.h +406 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/container_operations.cpp +52 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/container_operations.h +34 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/executioner.h +179 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/functional.cpp +86 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/functions.cpp +54 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/functions.h +40 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/globals_impl.cpp +289 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/globals_impl.h +149 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/header.cpp +44 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/choice.h +106 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/functional.h +327 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/globals.h +196 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/list.h +187 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/runner.h +291 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/snapshot.h +61 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/story.h +219 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/story_ptr.h +233 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/traits.h +270 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/include/types.h +169 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_impl.cpp +79 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_impl.h +39 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_operations.cpp +276 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_operations.h +356 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_table.cpp +841 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/list_table.h +450 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/numeric_operations.cpp +40 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/numeric_operations.h +529 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/operation_bases.h +164 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/operations.h +100 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/output.cpp +528 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/output.h +153 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/platform.h +22 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/random.h +38 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/runner_impl.cpp +1396 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/runner_impl.h +336 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/simple_restorable_stack.h +335 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/snapshot_impl.cpp +182 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/snapshot_impl.h +91 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/snapshot_interface.h +57 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/stack.cpp +618 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/stack.h +243 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/story_impl.cpp +361 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/story_impl.h +92 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/story_ptr.cpp +75 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_operations.cpp +125 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_operations.h +67 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_table.cpp +149 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_table.h +47 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/string_utils.h +207 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/system.cpp +39 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/tuple.hpp +151 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/value.cpp +279 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp/value.h +666 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/CMakeLists.txt +62 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/include/inkcpp.h +393 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/inkcpp.cpp +344 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/inkcpp_c.pc.in +10 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/ExternalFunction.c +56 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Globals.c +98 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Lists.c +73 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Observer.c +36 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_c/tests/Snapshot.c +65 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_cl/CMakeLists.txt +49 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_cl/inkcpp_cl.cpp +215 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_cl/test.cpp +209 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_cl/test.h +8 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/CMakeLists.txt +37 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_emitter.cpp +446 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_emitter.h +70 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_stream.cpp +166 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/binary_stream.h +79 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/command.cpp +107 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/compiler.cpp +96 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/emitter.cpp +62 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/emitter.h +104 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/include/compilation_results.h +22 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/include/compiler.h +44 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/json.hpp +24596 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/json_compiler.cpp +411 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/json_compiler.h +62 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/list_data.cpp +47 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/list_data.h +70 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/reporter.cpp +107 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_compiler/reporter.h +55 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/CMakeLists.txt +19 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/example.py +78 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/src/module.cpp +317 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/conftest.py +53 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_ExternalFunctions.py +35 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Globals.py +40 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Lists.py +43 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Observer.py +27 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/tests/test_Snapshot.py +57 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_py/unreal_example.ink +71 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Array.cpp +115 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/CMakeLists.txt +117 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Callstack.cpp +392 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/EmptyStringForDivert.cpp +36 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ExternalFunctionsExecuteProperly.cpp +34 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/FallbackFunction.cpp +77 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Globals.cpp +73 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/InkyJson.cpp +34 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/LabelCondition.cpp +60 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Lists.cpp +144 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/LookaheadSafe.cpp +46 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Main.cpp +7 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/MoveTo.cpp +95 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/NewLines.cpp +76 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/NoEarlyTags.cpp +33 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Observer.cpp +245 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Pointer.cpp +191 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Restorable.cpp +294 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/SpaceAfterBracketChoice.cpp +45 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Stack.cpp +224 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Tags.cpp +131 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ThirdTierChoiceAfterBrackets.cpp +38 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/UTF8.cpp +56 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/Value.cpp +210 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/catch.hpp +17970 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/AHF.ink +7 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ChoiceBracketStory.ink +7 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/EmptyStringForDivert.ink +13 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ExternalFunctionsExecuteProperly.ink +11 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/FallBack.ink +15 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/GlobalStory.ink +9 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/LabelConditionStory.ink +5 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/LinesStory.ink +42 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ListLogicStory.ink +40 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ListStory.ink +8 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/LookaheadSafe.ink +14 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/MoveTo.ink +36 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/NoEarlyTags.ink +19 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ObserverStory.ink +8 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/SimpleStoryFlow.ink +65 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/TagsStory.ink +22 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/TheIntercept.ink +1686 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/ThirdTierChoiceAfterBracketsStory.ink +13 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/UTF-8-demo.txt +212 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/UTF8Story.ink +218 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/simple-1.1.1-inklecate.json +154 -0
- data/ext/inkcpp_rb/inkcpp/inkcpp_test/ink/simple-1.1.1-inky.json +160 -0
- data/ext/inkcpp_rb/inkcpp/notes/ArchitectureNotes.md +54 -0
- data/ext/inkcpp_rb/inkcpp/notes/ListNotes.md +69 -0
- data/ext/inkcpp_rb/inkcpp/notes/OperationNotes.md +35 -0
- data/ext/inkcpp_rb/inkcpp/notes/TagsNotes.md +24 -0
- data/ext/inkcpp_rb/inkcpp/notes/WhitespaceNotes.md +28 -0
- data/ext/inkcpp_rb/inkcpp/proofing/README.md +3 -0
- data/ext/inkcpp_rb/inkcpp/proofing/inkcpp_runtime_driver +12 -0
- data/ext/inkcpp_rb/inkcpp/pyproject.toml +63 -0
- data/ext/inkcpp_rb/inkcpp/setup.py +166 -0
- data/ext/inkcpp_rb/inkcpp/shared/CMakeLists.txt +14 -0
- data/ext/inkcpp_rb/inkcpp/shared/private/command.h +172 -0
- data/ext/inkcpp_rb/inkcpp/shared/private/header.h +46 -0
- data/ext/inkcpp_rb/inkcpp/shared/public/config.h +53 -0
- data/ext/inkcpp_rb/inkcpp/shared/public/system.h +307 -0
- data/ext/inkcpp_rb/inkcpp/shared/public/version.h +14 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestAllSequenceTypes.ink +59 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestArithmetic.ink +17 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestBasicStringLiterals.ink +8 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestBasicTunnel.ink +10 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestBlanksInInlineSequences.ink +51 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestCallStackEvaluation.ink +15 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestChoiceCount.ink +15 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestChoiceDivertsToDone.ink +6 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestChoiceWithBracketsOnly.ink +9 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestCompareDivertTargets.ink +26 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestComplexTunnels.ink +22 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestConditionalChoiceInWeave.ink +19 -0
- data/ext/inkcpp_rb/inkcpp/tests/TestTunnelOnwardsAfterTunnel.ink +17 -0
- data/ext/inkcpp_rb/inkcpp/unreal/CMakeLists.txt +51 -0
- data/ext/inkcpp_rb/inkcpp/unreal/UE_example.ink +92 -0
- data/ext/inkcpp_rb/inkcpp/unreal/blueprint_filter.js +377 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Resources/Icon128.png +0 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkAsset.cpp +47 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkChoice.cpp +40 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkList.cpp +86 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkRuntime.cpp +265 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkThread.cpp +239 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/InkVar.cpp +143 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/TagList.cpp +95 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Private/inkcpp.cpp +13 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkAsset.h +50 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkChoice.h +58 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkDelegates.h +139 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkList.h +102 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkRuntime.h +177 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkSnapshot.h +30 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkThread.h +215 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/InkVar.h +245 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/TagList.h +77 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/Public/inkcpp.h +217 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp/inkcpp.Build.cs +62 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/InkAssetFactory.cpp +237 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/InkAssetFactory.h +43 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/inkcpp_editor.cpp +13 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Private/inklecate_cmd.cpp.in +24 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/Public/inkcpp_editor.h +9 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/Source/inkcpp_editor/inkcpp_editor.Build.cs +61 -0
- data/ext/inkcpp_rb/inkcpp/unreal/inkcpp/inkcpp.uplugin +44 -0
- data/ext/inkcpp_rb/inkcpp/unreal/render.css +1 -0
- data/ext/inkcpp_rb/inkcpp_rb.cpp +321 -0
- data/inkcpp_rb.gemspec +54 -0
- data/rbi/inkcpp_rb.rbi +211 -0
- data/sorbet/config +4 -0
- data/sorbet/rbi/annotations/.gitattributes +1 -0
- data/sorbet/rbi/annotations/minitest.rbi +119 -0
- data/sorbet/rbi/gems/.gitattributes +1 -0
- data/sorbet/rbi/gems/benchmark@0.4.0.rbi +618 -0
- data/sorbet/rbi/gems/erubi@1.13.1.rbi +155 -0
- data/sorbet/rbi/gems/minitest@5.25.4.rbi +1547 -0
- data/sorbet/rbi/gems/netrc@0.11.0.rbi +159 -0
- data/sorbet/rbi/gems/parallel@1.26.3.rbi +291 -0
- data/sorbet/rbi/gems/prism@1.3.0.rbi +40040 -0
- data/sorbet/rbi/gems/rake-compiler@1.2.8.rbi +9 -0
- data/sorbet/rbi/gems/rake@13.2.1.rbi +3033 -0
- data/sorbet/rbi/gems/rbi@0.2.2.rbi +4527 -0
- data/sorbet/rbi/gems/rice@4.3.3.rbi +44 -0
- data/sorbet/rbi/gems/spoom@1.5.0.rbi +4932 -0
- data/sorbet/rbi/gems/tapioca@0.16.7.rbi +3611 -0
- data/sorbet/rbi/gems/thor@1.3.2.rbi +4378 -0
- data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +435 -0
- data/sorbet/rbi/gems/yard@0.9.37.rbi +18379 -0
- data/sorbet/tapioca/config.yml +13 -0
- data/sorbet/tapioca/require.rb +4 -0
- metadata +400 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/* Copyright (c) 2024 Julian Benda
|
|
2
|
+
*
|
|
3
|
+
* This file is part of inkCPP which is released under MIT license.
|
|
4
|
+
* See file LICENSE.txt or go to
|
|
5
|
+
* https://github.com/JBenda/inkcpp for full license details.
|
|
6
|
+
*/
|
|
7
|
+
#include "json_compiler.h"
|
|
8
|
+
|
|
9
|
+
#include "command.h"
|
|
10
|
+
#include "list_data.h"
|
|
11
|
+
#include "system.h"
|
|
12
|
+
#include "version.h"
|
|
13
|
+
|
|
14
|
+
#include <string_view>
|
|
15
|
+
|
|
16
|
+
namespace ink::compiler::internal
|
|
17
|
+
{
|
|
18
|
+
using nlohmann::json;
|
|
19
|
+
using std::vector;
|
|
20
|
+
|
|
21
|
+
typedef std::tuple<json, std::string> defer_entry;
|
|
22
|
+
|
|
23
|
+
json_compiler::json_compiler()
|
|
24
|
+
: _emitter(nullptr)
|
|
25
|
+
, _next_container_index(0)
|
|
26
|
+
{
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
void json_compiler::compile(
|
|
30
|
+
const nlohmann::json& input, emitter* output, compilation_results* results
|
|
31
|
+
)
|
|
32
|
+
{
|
|
33
|
+
// Get the runtime version
|
|
34
|
+
_ink_version = input["inkVersion"];
|
|
35
|
+
|
|
36
|
+
// Start the output
|
|
37
|
+
set_results(results);
|
|
38
|
+
_emitter = output;
|
|
39
|
+
|
|
40
|
+
// Initialize emitter
|
|
41
|
+
_emitter->start(_ink_version, results);
|
|
42
|
+
|
|
43
|
+
if (auto itr = input.find("listDefs"); itr != input.end()) {
|
|
44
|
+
compile_lists_definition(*itr);
|
|
45
|
+
_emitter->set_list_meta(_list_meta);
|
|
46
|
+
}
|
|
47
|
+
// Compile the root container
|
|
48
|
+
compile_container(input["root"], 0);
|
|
49
|
+
|
|
50
|
+
// finalize
|
|
51
|
+
_emitter->finish(_next_container_index);
|
|
52
|
+
|
|
53
|
+
// Clear
|
|
54
|
+
_emitter = nullptr;
|
|
55
|
+
_next_container_index = 0;
|
|
56
|
+
clear_results();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
struct container_meta {
|
|
60
|
+
std::string name;
|
|
61
|
+
container_t indexToReturn = ~0;
|
|
62
|
+
bool recordInContainerMap = false;
|
|
63
|
+
vector<defer_entry> deferred;
|
|
64
|
+
CommandFlag cmd_flags = CommandFlag::NO_FLAGS;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
void json_compiler::handle_container_metadata(const json& meta, container_meta& data)
|
|
68
|
+
{
|
|
69
|
+
if (meta.is_object()) {
|
|
70
|
+
for (auto& meta_iter : meta.items()) {
|
|
71
|
+
// Name
|
|
72
|
+
if (meta_iter.key() == "#n") {
|
|
73
|
+
data.name = meta_iter.value().get<std::string>();
|
|
74
|
+
}
|
|
75
|
+
// Flags
|
|
76
|
+
else if (meta_iter.key() == "#f") {
|
|
77
|
+
int flags = meta_iter.value().get<int>();
|
|
78
|
+
|
|
79
|
+
bool visits = false, turns = false, onlyFirst = false;
|
|
80
|
+
|
|
81
|
+
if ((flags & 0x1) > 0) // Should record visit counts
|
|
82
|
+
{
|
|
83
|
+
visits = true;
|
|
84
|
+
}
|
|
85
|
+
if ((flags & 0x2) > 0) // Should record turn counts
|
|
86
|
+
{
|
|
87
|
+
turns = true;
|
|
88
|
+
}
|
|
89
|
+
if ((flags & 0x4) > 0) // Only count when you enter the first subelement
|
|
90
|
+
{
|
|
91
|
+
onlyFirst = true;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (visits || turns) {
|
|
95
|
+
container_t myIndex = _next_container_index++;
|
|
96
|
+
|
|
97
|
+
// Make appropriate flags
|
|
98
|
+
data.cmd_flags = CommandFlag::NO_FLAGS;
|
|
99
|
+
if (visits)
|
|
100
|
+
data.cmd_flags |= CommandFlag::CONTAINER_MARKER_TRACK_VISITS;
|
|
101
|
+
if (turns)
|
|
102
|
+
data.cmd_flags |= CommandFlag::CONTAINER_MARKER_TRACK_TURNS;
|
|
103
|
+
if (onlyFirst)
|
|
104
|
+
data.cmd_flags |= CommandFlag::CONTAINER_MARKER_ONLY_FIRST;
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
data.indexToReturn = myIndex;
|
|
108
|
+
|
|
109
|
+
// if (!onlyFirst) // ????
|
|
110
|
+
{
|
|
111
|
+
data.recordInContainerMap = true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Child container
|
|
116
|
+
else {
|
|
117
|
+
// Add to deferred compilation list
|
|
118
|
+
data.deferred.push_back(std::make_tuple(meta_iter.value(), meta_iter.key()));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
void json_compiler::compile_container(
|
|
125
|
+
const nlohmann::json& container, int index_in_parent, const std::string& name_override
|
|
126
|
+
)
|
|
127
|
+
{
|
|
128
|
+
// Grab metadata from the last object in this container
|
|
129
|
+
container_meta meta;
|
|
130
|
+
handle_container_metadata(*container.rbegin(), meta);
|
|
131
|
+
|
|
132
|
+
// tell the emitter we're beginning a new container
|
|
133
|
+
uint32_t position = _emitter->start_container(
|
|
134
|
+
index_in_parent, name_override.empty() ? meta.name : name_override
|
|
135
|
+
);
|
|
136
|
+
// Write command out at this position
|
|
137
|
+
if (meta.cmd_flags != CommandFlag::NO_FLAGS) {
|
|
138
|
+
_emitter->write(Command::START_CONTAINER_MARKER, meta.indexToReturn, meta.cmd_flags);
|
|
139
|
+
}
|
|
140
|
+
if (meta.recordInContainerMap) {
|
|
141
|
+
_emitter->add_start_to_container_map(position, meta.indexToReturn);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Now, we want to iterate children of this container, save the last
|
|
145
|
+
// The last is the settings object handled above
|
|
146
|
+
int index = -1;
|
|
147
|
+
auto end = container.end() - 1;
|
|
148
|
+
for (auto iter = container.begin(); iter != end; ++iter) {
|
|
149
|
+
// Increment index
|
|
150
|
+
index++;
|
|
151
|
+
|
|
152
|
+
// Arrays are child containers. Recurse.
|
|
153
|
+
if (iter->is_array())
|
|
154
|
+
compile_container(*iter, index);
|
|
155
|
+
|
|
156
|
+
// Strings are either commands, nops, or raw strings
|
|
157
|
+
else if (iter->is_string()) {
|
|
158
|
+
// Get the string
|
|
159
|
+
std::string string = iter->get<std::string>();
|
|
160
|
+
|
|
161
|
+
if (string[0] == '^')
|
|
162
|
+
_emitter->write_string(Command::STR, CommandFlag::NO_FLAGS, string);
|
|
163
|
+
else if (string == "nop")
|
|
164
|
+
_emitter->handle_nop(index);
|
|
165
|
+
else
|
|
166
|
+
compile_command(string);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Numbers (floats and integers)
|
|
170
|
+
else if (iter->is_number()) {
|
|
171
|
+
if (iter->is_number_float()) {
|
|
172
|
+
float value = iter->get<float>();
|
|
173
|
+
_emitter->write(Command::FLOAT, value);
|
|
174
|
+
} else {
|
|
175
|
+
int value = iter->get<int>();
|
|
176
|
+
_emitter->write(Command::INT, value);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Booleans
|
|
181
|
+
else if (iter->is_boolean()) {
|
|
182
|
+
int value = iter->get<bool>() ? 1 : 0;
|
|
183
|
+
_emitter->write(Command::BOOL, value);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Complex commands
|
|
187
|
+
else if (iter->is_object()) {
|
|
188
|
+
compile_complex_command(*iter);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
else {
|
|
192
|
+
throw ink_exception("Failed to container member!");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (meta.deferred.size() > 0) {
|
|
197
|
+
std::vector<size_t> divert_positions;
|
|
198
|
+
|
|
199
|
+
// Write empty divert to be patched later
|
|
200
|
+
uint32_t divert_position = _emitter->fallthrough_divert();
|
|
201
|
+
divert_positions.push_back(divert_position);
|
|
202
|
+
|
|
203
|
+
// (2) Write deffered containers
|
|
204
|
+
for (auto& t : meta.deferred) {
|
|
205
|
+
using std::get;
|
|
206
|
+
|
|
207
|
+
// Add to named child list
|
|
208
|
+
compile_container(get<0>(t), -1, get<1>(t));
|
|
209
|
+
|
|
210
|
+
// Need a divert here
|
|
211
|
+
uint32_t pos = _emitter->fallthrough_divert();
|
|
212
|
+
divert_positions.push_back(pos);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// (3) Set divert positions
|
|
216
|
+
for (size_t offset : divert_positions)
|
|
217
|
+
_emitter->patch_fallthroughs(offset);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// End container
|
|
221
|
+
uint32_t end_position = _emitter->end_container();
|
|
222
|
+
|
|
223
|
+
// Write end container marker, End pointer should point to End command (form symetry with START
|
|
224
|
+
// command)
|
|
225
|
+
if (meta.indexToReturn != ~0)
|
|
226
|
+
_emitter->write(Command::END_CONTAINER_MARKER, meta.indexToReturn, meta.cmd_flags);
|
|
227
|
+
|
|
228
|
+
// Record end position in map
|
|
229
|
+
if (meta.recordInContainerMap)
|
|
230
|
+
_emitter->add_end_to_container_map(end_position, meta.indexToReturn);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
void json_compiler::compile_command(const std::string& command)
|
|
234
|
+
{
|
|
235
|
+
// Find command
|
|
236
|
+
for (int i = 0; i < ( int ) Command::NUM_COMMANDS; i++) {
|
|
237
|
+
if (CommandStrings[i] != nullptr && command == CommandStrings[i]) {
|
|
238
|
+
_emitter->write_raw(( Command ) i, CommandFlag::NO_FLAGS, nullptr, 0);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Missing command warning
|
|
244
|
+
err() << "Unknown command '" << command << "'. Skipping." << std::flush;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
void json_compiler::compile_complex_command(const nlohmann::json& command)
|
|
248
|
+
{
|
|
249
|
+
std::string val;
|
|
250
|
+
|
|
251
|
+
// Divert
|
|
252
|
+
if (get(command, "->", val)) {
|
|
253
|
+
// Check if this is a conditional divert
|
|
254
|
+
bool isConditional = false;
|
|
255
|
+
CommandFlag flag = CommandFlag::NO_FLAGS;
|
|
256
|
+
if (get(command, "c", isConditional) && isConditional)
|
|
257
|
+
flag = CommandFlag::DIVERT_HAS_CONDITION;
|
|
258
|
+
|
|
259
|
+
// Switch on whether this is a variable divert or a path divert
|
|
260
|
+
bool isVariableDivert = false;
|
|
261
|
+
if (get(command, "var", isVariableDivert) && isVariableDivert)
|
|
262
|
+
_emitter->write_variable(Command::DIVERT_TO_VARIABLE, flag, val);
|
|
263
|
+
else
|
|
264
|
+
_emitter->write_path(Command::DIVERT, flag, val);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Divert to a value
|
|
268
|
+
else if (get(command, "^->", val)) {
|
|
269
|
+
// Write path in a divert_val command
|
|
270
|
+
_emitter->write_path(Command::DIVERT_VAL, CommandFlag::NO_FLAGS, val);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Tunnel
|
|
274
|
+
else if (get(command, "->t->", val)) {
|
|
275
|
+
bool is_var;
|
|
276
|
+
if (get(command, "var", is_var) && is_var) {
|
|
277
|
+
_emitter->write_variable(Command::TUNNEL, CommandFlag::TUNNEL_TO_VARIABLE, val);
|
|
278
|
+
} else {
|
|
279
|
+
_emitter->write_path(Command::TUNNEL, CommandFlag::NO_FLAGS, val);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Declare temporary variable
|
|
284
|
+
else if (get(command, "temp=", val)) {
|
|
285
|
+
bool is_redef = false;
|
|
286
|
+
get(command, "re", is_redef);
|
|
287
|
+
_emitter->write_variable(
|
|
288
|
+
Command::DEFINE_TEMP,
|
|
289
|
+
is_redef ? CommandFlag::ASSIGNMENT_IS_REDEFINE : CommandFlag::NO_FLAGS, val
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Set variable
|
|
294
|
+
else if (get(command, "VAR=", val)) {
|
|
295
|
+
// check if it's a redefinition
|
|
296
|
+
bool is_redef = false;
|
|
297
|
+
get(command, "re", is_redef);
|
|
298
|
+
|
|
299
|
+
// Set variable
|
|
300
|
+
_emitter->write_variable(
|
|
301
|
+
Command::SET_VARIABLE,
|
|
302
|
+
is_redef ? CommandFlag::ASSIGNMENT_IS_REDEFINE : CommandFlag::NO_FLAGS, val
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// create pointer value
|
|
307
|
+
else if (get(command, "^var", val)) {
|
|
308
|
+
int ci;
|
|
309
|
+
if (! get(command, "ci", ci)) {
|
|
310
|
+
throw ink_exception("failed to parse ci for pointer!");
|
|
311
|
+
}
|
|
312
|
+
inkAssert(ci < 255, "only support until 255 stack hight for refernces");
|
|
313
|
+
_emitter->write_variable(Command::VALUE_POINTER, static_cast<CommandFlag>(ci + 1), val);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Push variable
|
|
317
|
+
else if (get(command, "VAR?", val)) {
|
|
318
|
+
_emitter->write_variable(Command::PUSH_VARIABLE_VALUE, CommandFlag::NO_FLAGS, val);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Choice
|
|
322
|
+
else if (get(command, "*", val)) {
|
|
323
|
+
// Get flags
|
|
324
|
+
int flags = 0;
|
|
325
|
+
get(command, "flg", flags);
|
|
326
|
+
|
|
327
|
+
// Write choice path
|
|
328
|
+
_emitter->write_path(Command::CHOICE, ( CommandFlag ) flags, val);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Read count
|
|
332
|
+
else if (get(command, "CNT?", val)) {
|
|
333
|
+
// TODO: Why is this true again?
|
|
334
|
+
_emitter->write_path(Command::READ_COUNT, CommandFlag::NO_FLAGS, val, true);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Internal function call
|
|
338
|
+
else if (get(command, "f()", val)) {
|
|
339
|
+
bool is_var; // function address is stored in jump
|
|
340
|
+
if (get(command, "var", is_var) && is_var) {
|
|
341
|
+
_emitter->write_variable(Command::FUNCTION, CommandFlag::FUNCTION_TO_VARIABLE, val);
|
|
342
|
+
} else {
|
|
343
|
+
_emitter->write_path(Command::FUNCTION, CommandFlag::NO_FLAGS, val);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// External function call
|
|
348
|
+
else if (get(command, "x()", val)) {
|
|
349
|
+
// Get argument count
|
|
350
|
+
int numArgs = 0;
|
|
351
|
+
get(command, "exArgs", numArgs);
|
|
352
|
+
|
|
353
|
+
// Encode argument count into command flag and write out the hash of the function name
|
|
354
|
+
_emitter->write(
|
|
355
|
+
Command::CALL_EXTERNAL, hash_string(val.c_str()), static_cast<CommandFlag>(numArgs)
|
|
356
|
+
);
|
|
357
|
+
_emitter->write_path(Command::FUNCTION, CommandFlag::FALLBACK_FUNCTION, val);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// list initialisation
|
|
361
|
+
else if (has(command, "list")) {
|
|
362
|
+
std::vector<list_flag> entries;
|
|
363
|
+
auto& list = command["list"];
|
|
364
|
+
|
|
365
|
+
if (list.size()) {
|
|
366
|
+
for (const auto& [key, value] : list.items()) {
|
|
367
|
+
entries.push_back(
|
|
368
|
+
{_list_meta.get_lid(key.substr(0, key.find('.'))),
|
|
369
|
+
static_cast<decltype(list_flag::flag)>(value.get<int>())}
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
} else {
|
|
373
|
+
if (has(command, "origins")) {
|
|
374
|
+
for (const auto& origin_list : command["origins"]) {
|
|
375
|
+
// list id < -1 -> origin flag
|
|
376
|
+
entries.push_back(
|
|
377
|
+
{static_cast<int16_t>(-2 - _list_meta.get_lid(origin_list.get<std::string>())), -1}
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
} else {
|
|
381
|
+
entries.push_back(empty_flag);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
_emitter->write_list(Command::LIST, CommandFlag::NO_FLAGS, entries);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
else if (get(command, "#", val)) {
|
|
389
|
+
if (_ink_version > 20) {
|
|
390
|
+
ink_exception("with inkVerison 21 the tag system chages, and the '#: <tag>' is deprecated now"
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
_emitter->write_string(Command::TAG, CommandFlag::NO_FLAGS, val);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
else {
|
|
397
|
+
throw ink_exception("failed to parse complex command!");
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
void json_compiler::compile_lists_definition(const nlohmann::json& list_defs)
|
|
402
|
+
{
|
|
403
|
+
for (auto& [list_name, flags] : list_defs.items()) {
|
|
404
|
+
_list_meta.new_list(list_name);
|
|
405
|
+
for (auto& [flag_name, value] : flags.items()) {
|
|
406
|
+
_list_meta.new_flag(flag_name, value.get<int>());
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
_list_meta.sort();
|
|
410
|
+
}
|
|
411
|
+
} // namespace ink::compiler::internal
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* Copyright (c) 2024 Julian Benda
|
|
2
|
+
*
|
|
3
|
+
* This file is part of inkCPP which is released under MIT license.
|
|
4
|
+
* See file LICENSE.txt or go to
|
|
5
|
+
* https://github.com/JBenda/inkcpp for full license details.
|
|
6
|
+
*/
|
|
7
|
+
#pragma once
|
|
8
|
+
#include "json.hpp"
|
|
9
|
+
#include "system.h"
|
|
10
|
+
#include "compilation_results.h"
|
|
11
|
+
#include "emitter.h"
|
|
12
|
+
#include "reporter.h"
|
|
13
|
+
#include "list_data.h"
|
|
14
|
+
|
|
15
|
+
#include <vector>
|
|
16
|
+
|
|
17
|
+
namespace ink::compiler::internal
|
|
18
|
+
{
|
|
19
|
+
struct container_meta;
|
|
20
|
+
|
|
21
|
+
// Compiles ink json and outputs using a given emitter
|
|
22
|
+
class json_compiler : public reporter
|
|
23
|
+
{
|
|
24
|
+
public:
|
|
25
|
+
// create new compiler
|
|
26
|
+
json_compiler();
|
|
27
|
+
|
|
28
|
+
// compile from json using an emitter
|
|
29
|
+
void compile(const nlohmann::json& input, emitter* output, compilation_results* results = nullptr);
|
|
30
|
+
|
|
31
|
+
private: // == Compiler methods ==
|
|
32
|
+
void handle_container_metadata(const nlohmann::json& meta, container_meta& data);
|
|
33
|
+
void compile_container(const nlohmann::json& container, int index_in_parent, const std::string& name_override = "");
|
|
34
|
+
void compile_command(const std::string& command);
|
|
35
|
+
void compile_complex_command(const nlohmann::json& command);
|
|
36
|
+
void compile_lists_definition(const nlohmann::json& list_defs);
|
|
37
|
+
|
|
38
|
+
private: // == JSON Helpers ==
|
|
39
|
+
inline bool has(const nlohmann::json& json, const std::string& key)
|
|
40
|
+
{
|
|
41
|
+
return json.find(key) != json.end();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
template<typename T>
|
|
45
|
+
bool get(const nlohmann::json& json, const std::string& key, T& value)
|
|
46
|
+
{
|
|
47
|
+
auto iter = json.find(key);
|
|
48
|
+
if (iter == json.end())
|
|
49
|
+
return false;
|
|
50
|
+
|
|
51
|
+
value = iter->get<T>();
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private: // == Private members ==
|
|
56
|
+
emitter* _emitter;
|
|
57
|
+
container_t _next_container_index;
|
|
58
|
+
|
|
59
|
+
list_data _list_meta;
|
|
60
|
+
int _ink_version;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* Copyright (c) 2024 Julian Benda
|
|
2
|
+
*
|
|
3
|
+
* This file is part of inkCPP which is released under MIT license.
|
|
4
|
+
* See file LICENSE.txt or go to
|
|
5
|
+
* https://github.com/JBenda/inkcpp for full license details.
|
|
6
|
+
*/
|
|
7
|
+
#include "list_data.h"
|
|
8
|
+
|
|
9
|
+
#include <algorithm>
|
|
10
|
+
#include <limits>
|
|
11
|
+
|
|
12
|
+
namespace ink::compiler::internal
|
|
13
|
+
{
|
|
14
|
+
void list_data::new_list(const std::string& list_name)
|
|
15
|
+
{
|
|
16
|
+
_lists.insert({list_name, static_cast<int>(_list_end.size())});
|
|
17
|
+
_list_name.emplace_back(list_name);
|
|
18
|
+
int current_back = _list_end.empty() ? 0 : _list_end.back();
|
|
19
|
+
_list_end.push_back(current_back);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
void list_data::new_flag(const std::string& flag_name, int value)
|
|
23
|
+
{
|
|
24
|
+
inkAssert(
|
|
25
|
+
value <= std::numeric_limits<decltype(list_flag::flag)>::max()
|
|
26
|
+
&& value >= std::numeric_limits<decltype(list_flag::flag)>::min(),
|
|
27
|
+
"Value outside of current supported scope"
|
|
28
|
+
);
|
|
29
|
+
_list_end.back() += 1;
|
|
30
|
+
_flags.emplace_back(
|
|
31
|
+
&flag_name,
|
|
32
|
+
list_flag{
|
|
33
|
+
.list_id = static_cast<decltype(list_flag::list_id)>(_list_name.size() - 1),
|
|
34
|
+
.flag = static_cast<decltype(list_flag::flag)>(value)}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
void list_data::sort()
|
|
39
|
+
{
|
|
40
|
+
size_t begin = 0;
|
|
41
|
+
for (size_t i = 0; i < _list_end.size(); ++i) {
|
|
42
|
+
std::sort(_flags.begin() + begin, _flags.begin() + _list_end[i]);
|
|
43
|
+
begin = _list_end[i];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
} // namespace ink::compiler::internal
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* Copyright (c) 2024 Julian Benda
|
|
2
|
+
*
|
|
3
|
+
* This file is part of inkCPP which is released under MIT license.
|
|
4
|
+
* See file LICENSE.txt or go to
|
|
5
|
+
* https://github.com/JBenda/inkcpp for full license details.
|
|
6
|
+
*/
|
|
7
|
+
#pragma once
|
|
8
|
+
|
|
9
|
+
#include "system.h"
|
|
10
|
+
|
|
11
|
+
#include <vector>
|
|
12
|
+
#include <string>
|
|
13
|
+
#include <map>
|
|
14
|
+
#include <string_view>
|
|
15
|
+
|
|
16
|
+
namespace ink::compiler::internal
|
|
17
|
+
{
|
|
18
|
+
class list_data
|
|
19
|
+
{
|
|
20
|
+
using flag_t = decltype(list_flag::flag);
|
|
21
|
+
using lid_t = decltype(list_flag::list_id);
|
|
22
|
+
|
|
23
|
+
public:
|
|
24
|
+
// add new list and set it to current
|
|
25
|
+
void new_list(const std::string& list_name);
|
|
26
|
+
|
|
27
|
+
// add flag to current list
|
|
28
|
+
void new_flag(const std::string& flag_name, int value);
|
|
29
|
+
|
|
30
|
+
// sort flags per list
|
|
31
|
+
void sort();
|
|
32
|
+
|
|
33
|
+
lid_t get_lid(const std::string_view& list_name)
|
|
34
|
+
{
|
|
35
|
+
auto itr = _lists.find(list_name);
|
|
36
|
+
return static_cast<lid_t>(itr->second);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
bool empty() const { return _lists.empty(); }
|
|
40
|
+
|
|
41
|
+
struct named_list_flag {
|
|
42
|
+
named_list_flag(const std::string* name, list_flag flag)
|
|
43
|
+
: name{name}
|
|
44
|
+
, flag{flag}
|
|
45
|
+
{
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const std::string* name;
|
|
49
|
+
list_flag flag;
|
|
50
|
+
|
|
51
|
+
bool operator<(const named_list_flag& oth) const
|
|
52
|
+
{
|
|
53
|
+
inkAssert(
|
|
54
|
+
flag.list_id == oth.flag.list_id, "Compare flags from different lists is not supported"
|
|
55
|
+
);
|
|
56
|
+
return flag.flag < oth.flag.flag;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const std::vector<named_list_flag>& get_flags() const { return _flags; }
|
|
61
|
+
|
|
62
|
+
const std::vector<std::string_view>& get_list_names() const { return _list_name; }
|
|
63
|
+
|
|
64
|
+
private:
|
|
65
|
+
std::map<std::string, int, std::less<>> _lists;
|
|
66
|
+
std::vector<std::string_view> _list_name;
|
|
67
|
+
std::vector<int> _list_end;
|
|
68
|
+
std::vector<named_list_flag> _flags;
|
|
69
|
+
};
|
|
70
|
+
} // namespace ink::compiler::internal
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* Copyright (c) 2024 Julian Benda
|
|
2
|
+
*
|
|
3
|
+
* This file is part of inkCPP which is released under MIT license.
|
|
4
|
+
* See file LICENSE.txt or go to
|
|
5
|
+
* https://github.com/JBenda/inkcpp for full license details.
|
|
6
|
+
*/
|
|
7
|
+
#include "reporter.h"
|
|
8
|
+
#include "compilation_results.h"
|
|
9
|
+
#include "system.h"
|
|
10
|
+
|
|
11
|
+
#include <iostream>
|
|
12
|
+
#include <sstream>
|
|
13
|
+
|
|
14
|
+
namespace ink::compiler::internal
|
|
15
|
+
{
|
|
16
|
+
reporter::reporter()
|
|
17
|
+
: _results(nullptr), _stream(&_buffer)
|
|
18
|
+
{
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
void reporter::set_results(compilation_results* results)
|
|
22
|
+
{
|
|
23
|
+
_results = results;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
void reporter::clear_results()
|
|
27
|
+
{
|
|
28
|
+
_results = nullptr;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
std::ostream& reporter::warn()
|
|
32
|
+
{
|
|
33
|
+
// setp warning buffer
|
|
34
|
+
if (_results != nullptr)
|
|
35
|
+
{
|
|
36
|
+
_buffer.start(&_results->warnings);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return _stream;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
std::ostream& reporter::err()
|
|
43
|
+
{
|
|
44
|
+
// setp error buffer
|
|
45
|
+
if (_results != nullptr)
|
|
46
|
+
{
|
|
47
|
+
_buffer.start(&_results->errors);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return _stream;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
std::ostream& reporter::crit()
|
|
54
|
+
{
|
|
55
|
+
// setp error buffer
|
|
56
|
+
if (_results != nullptr)
|
|
57
|
+
{
|
|
58
|
+
_buffer.start(&_results->errors);
|
|
59
|
+
_buffer.throw_on_sync(true);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return _stream;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
void error_strbuf::start(error_list* list)
|
|
66
|
+
{
|
|
67
|
+
// store list
|
|
68
|
+
_list = list;
|
|
69
|
+
|
|
70
|
+
// Make sure our buffer is empty
|
|
71
|
+
#ifdef WIN32
|
|
72
|
+
_Tidy();
|
|
73
|
+
#endif
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
void error_strbuf::throw_on_sync(bool t)
|
|
77
|
+
{
|
|
78
|
+
_throw = t;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
int error_strbuf::sync()
|
|
82
|
+
{
|
|
83
|
+
// TODO: Assert?
|
|
84
|
+
if (_list == nullptr)
|
|
85
|
+
return -1;
|
|
86
|
+
|
|
87
|
+
// Add string to list
|
|
88
|
+
std::string val = str();
|
|
89
|
+
_list->push_back(val);
|
|
90
|
+
|
|
91
|
+
// Clear our state
|
|
92
|
+
_list = nullptr;
|
|
93
|
+
#ifdef WIN32
|
|
94
|
+
_Tidy();
|
|
95
|
+
#endif
|
|
96
|
+
|
|
97
|
+
// Should we throw?
|
|
98
|
+
if (_throw)
|
|
99
|
+
{
|
|
100
|
+
_throw = false;
|
|
101
|
+
throw ink::ink_exception(("CRITICAL ERROR: " + val).c_str());
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Return success
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
}
|