From db1adbb838250307595f0b41528f9c93e9546f77 Mon Sep 17 00:00:00 2001 From: herbglitch Date: Thu, 27 Oct 2022 15:16:54 -0600 Subject: [PATCH] first --- .gitignore | 533 ++++++ CMakeLists.txt | 84 + Doxyfile | 29 + cmake/archeus_std-config.cmake.in | 9 + .../.github/workflows/publish.yaml | 29 + doxygen/doxygen-awesome-css/.gitignore | 3 + doxygen/doxygen-awesome-css/LICENSE | 21 + .../docs/doxygen-custom/custom.css | 16 + .../docs/doxygen-custom/footer.html | 30 + .../docs/doxygen-custom/header.html | 78 + doxygen/doxygen-awesome-css/docs/page.dox | 15 + .../doxygen-awesome-darkmode-toggle.js | 115 ++ ...n-awesome-sidebar-only-darkmode-toggle.css | 40 + .../doxygen-awesome-sidebar-only.css | 108 ++ .../doxygen-awesome-css/doxygen-awesome.css | 1504 +++++++++++++++++ doxygen/doxygen-awesome-css/footer.html | 26 + doxygen/doxygen-awesome-css/header.html | 74 + .../doxygen-awesome-css/img/screenshot.png | Bin 0 -> 222971 bytes .../img/theme-variations.drawio.svg | 1 + include/arc/graphics/data.h | 5 + include/arc/std/config.h | 141 ++ include/arc/std/defaults/config.h | 48 + include/arc/std/errno.h | 36 + include/arc/std/handler.h | 110 ++ include/arc/std/hashtable.h | 121 ++ include/arc/std/io.h | 26 + include/arc/std/string.h | 104 ++ include/arc/std/vector.h | 82 + src/std/config.c | 417 +++++ src/std/defaults/config.c | 116 ++ src/std/handler.c | 68 + src/std/hashtable.c | 167 ++ src/std/io.c | 28 + src/std/string.c | 115 ++ src/std/vector.c | 109 ++ 35 files changed, 4408 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 Doxyfile create mode 100644 cmake/archeus_std-config.cmake.in create mode 100644 doxygen/doxygen-awesome-css/.github/workflows/publish.yaml create mode 100644 doxygen/doxygen-awesome-css/.gitignore create mode 100644 doxygen/doxygen-awesome-css/LICENSE create mode 100644 doxygen/doxygen-awesome-css/docs/doxygen-custom/custom.css create mode 100644 doxygen/doxygen-awesome-css/docs/doxygen-custom/footer.html create mode 100644 doxygen/doxygen-awesome-css/docs/doxygen-custom/header.html create mode 100644 doxygen/doxygen-awesome-css/docs/page.dox create mode 100644 doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js create mode 100644 doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css create mode 100644 doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only.css create mode 100644 doxygen/doxygen-awesome-css/doxygen-awesome.css create mode 100644 doxygen/doxygen-awesome-css/footer.html create mode 100644 doxygen/doxygen-awesome-css/header.html create mode 100644 doxygen/doxygen-awesome-css/img/screenshot.png create mode 100644 doxygen/doxygen-awesome-css/img/theme-variations.drawio.svg create mode 100644 include/arc/graphics/data.h create mode 100644 include/arc/std/config.h create mode 100644 include/arc/std/defaults/config.h create mode 100644 include/arc/std/errno.h create mode 100644 include/arc/std/handler.h create mode 100644 include/arc/std/hashtable.h create mode 100644 include/arc/std/io.h create mode 100644 include/arc/std/string.h create mode 100644 include/arc/std/vector.h create mode 100644 src/std/config.c create mode 100644 src/std/defaults/config.c create mode 100644 src/std/handler.c create mode 100644 src/std/hashtable.c create mode 100644 src/std/io.c create mode 100644 src/std/string.c create mode 100644 src/std/vector.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e7bcb40 --- /dev/null +++ b/.gitignore @@ -0,0 +1,533 @@ +# Created by https://www.toptal.com/developers/gitignore/api/c,c++,visualstudiocode,visualstudio,vim,cmake +# Edit at https://www.toptal.com/developers/gitignore?templates=c,c++,visualstudiocode,visualstudio,vim,cmake + +### C ### +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +### C++ ### +# Prerequisites + +# Compiled Object files +*.slo + +# Precompiled Headers + +# Compiled Dynamic libraries + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai + +# Executables + +### CMake ### +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps + +### CMake Patch ### +# External projects +*-prefix/ + +### Vim ### +# Swap +[._]*.s[a-v][a-z] +!*.svg # comment out if you don't need vector files +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +*~ +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Support for Project snippet scope +.vscode/*.code-snippets + +# Ignore code-workspaces +*.code-workspace + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.meta +*.iobj +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools + +# Local History for Visual Studio Code + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +### VisualStudio Patch ### +# Additional files built by Visual Studio + +# End of https://www.toptal.com/developers/gitignore/api/c,c++,visualstudiocode,visualstudio,vim,cmake + +doxygen/html +[Bb][Uu][Ii][Ll][Dd] +.ccls \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..8a7c993 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,84 @@ +cmake_minimum_required(VERSION 3.10) + +set(ARCHEUS_STD_VERSION 0.0.0) +project(archeus_std LANGUAGES C VERSION ${ARCHEUS_STD_VERSION} DESCRIPTION "libarcheus_std standard archeus c library") + +include(GNUInstallDirs) + +function(print var) + message("${var} = ${${var}}") +endfunction() + +option(ARCHEUS_STD_DEBUG "Build in debug mode" ON) +option(ARCHEUS_STD_DEFAULT_CONFIG "Build with default config keys" ON) + +set(ARCHEUS_STD_FLAGS "") + +if(ARCHEUS_STD_DEBUG) + string(APPEND ARCHEUS_STD_FLAGS "-Wall -Werror -g ") +endif() + +if(ARCHEUS_STD_DEFAULT_CONFIG) + string(APPEND ARCHEUS_STD_FLAGS "-DARC_DEFAULT_CONFIG ") +endif() + +set(CMAKE_C_FLAGS ${ARCHEUS_STD_FLAGS}) + +add_library(archeus_std SHARED) + +target_sources(archeus_std PRIVATE + src/std/config.c +# src/arc_ecs.c + src/std/hashtable.c + src/std/io.c + src/std/string.c + src/std/vector.c + src/std/handler.c + + src/std/defaults/config.c +) + +target_include_directories(archeus_std PRIVATE + include +) + +install(TARGETS archeus_std EXPORT archeus_std_Exports + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +install(EXPORT archeus_std_Exports + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/archeus_std-${PROJECT_VERSION} +) + +install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/include/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN *.h +) + +include(CMakePackageConfigHelpers) +set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) +set(LIBRARY_INSTALL_BIN ${CMAKE_INSTALL_LIBDIR}) + +configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/archeus_std-config.cmake.in" + "${PROJECT_BINARY_DIR}/archeus_std-config.cmake" + + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/archeus_std-${PROJECT_VERSION} + PATH_VARS INCLUDE_INSTALL_DIR LIBRARY_INSTALL_BIN +) + +write_basic_package_version_file( + "archeus_std-ConfigVersion.cmake" + VERSION {PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/archeus_std-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/archeus_std-ConfigVersion.cmake +DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/archeus_std-${PROJECT_VERSION} +) diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..340951c --- /dev/null +++ b/Doxyfile @@ -0,0 +1,29 @@ +PROJECT_NAME = ge_lib +PROJECT_NUMBER = 0.0.0 +OUTPUT_DIRECTORY = ./doxygen/ +OPTIMIZE_OUTPUT_FOR_C = YES +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_ANON_NSPACES = YES +RECURSIVE = YES +SOURCE_BROWSER = YES +INLINE_SOURCES = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +USE_MATHJAX = NO +GENERATE_LATEX = NO +INPUT = ./src/ + +# Include the required Javascript +HTML_EXTRA_FILES = doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js + +# Add the additional CSS. This is ONLY required for the sidebar-only theme variant! +HTML_EXTRA_STYLESHEET = doxygen/doxygen-awesome-css/doxygen-awesome.css \ + doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only.css \ + doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css + +# set custom header & footer files generated in previous step +HTML_HEADER = doxygen/doxygen-awesome-css/header.html +HTML_FOOTER = doxygen/doxygen-awesome-css/footer.html + diff --git a/cmake/archeus_std-config.cmake.in b/cmake/archeus_std-config.cmake.in new file mode 100644 index 0000000..c1ff713 --- /dev/null +++ b/cmake/archeus_std-config.cmake.in @@ -0,0 +1,9 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@_Exports.cmake") + +set_and_check(ARCHEUS_STD_INCLUDE_DIRS "@PACKAGE_INCLUDE_INSTALL_DIR@") +set_and_check(ARCHEUS_STD_LINK_DIRS "@PACKAGE_LIBRARY_INSTALL_BIN@") +set(ARCHEUS_STD_LIBRARIES "@PROJECT_NAME@") + +check_required_components("@PROJECT_NAME@") diff --git a/doxygen/doxygen-awesome-css/.github/workflows/publish.yaml b/doxygen/doxygen-awesome-css/.github/workflows/publish.yaml new file mode 100644 index 0000000..d415af3 --- /dev/null +++ b/doxygen/doxygen-awesome-css/.github/workflows/publish.yaml @@ -0,0 +1,29 @@ +name: publish +on: + release: + types: [published] +jobs: + deploy: + runs-on: ubuntu-20.04 + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: install Doxygen 1.9.2 + run: | + sudo apt-get update + sudo apt-get install -y graphviz libclang-cpp1-9 libclang1-9 + wget https://www.doxygen.nl/files/doxygen-1.9.2.linux.bin.tar.gz + tar -xvzf doxygen-1.9.2.linux.bin.tar.gz + ln -s doxygen-1.9.2/bin/doxygen doxygen + - name: set version + run: echo "PROJECT_NUMBER = `git describe --tags`" >> Doxyfile + - name: Generate Documentation + run: ./doxygen Doxyfile + - name: Publish generated content to GitHub Pages + uses: tsunematsu21/actions-publish-gh-pages@v1.0.1 + with: + dir: docs/html + branch: gh-pages + token: ${{ secrets.ACCESS_TOKEN }} \ No newline at end of file diff --git a/doxygen/doxygen-awesome-css/.gitignore b/doxygen/doxygen-awesome-css/.gitignore new file mode 100644 index 0000000..5c40af7 --- /dev/null +++ b/doxygen/doxygen-awesome-css/.gitignore @@ -0,0 +1,3 @@ +docs/html +.DS_Store +.idea \ No newline at end of file diff --git a/doxygen/doxygen-awesome-css/LICENSE b/doxygen/doxygen-awesome-css/LICENSE new file mode 100644 index 0000000..1d8b99a --- /dev/null +++ b/doxygen/doxygen-awesome-css/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/doxygen/doxygen-awesome-css/docs/doxygen-custom/custom.css b/doxygen/doxygen-awesome-css/docs/doxygen-custom/custom.css new file mode 100644 index 0000000..73bedc4 --- /dev/null +++ b/doxygen/doxygen-awesome-css/docs/doxygen-custom/custom.css @@ -0,0 +1,16 @@ +.github-corner svg { + fill: var(--primary-light-color); + color: var(--page-background-color); + width: 72px; + height: 72px; +} + +@media screen and (max-width: 767px) { + .github-corner svg { + width: 55px; + height: 55px; + } + #projectnumber { + margin-right: 22px; + } +} diff --git a/doxygen/doxygen-awesome-css/docs/doxygen-custom/footer.html b/doxygen/doxygen-awesome-css/docs/doxygen-custom/footer.html new file mode 100644 index 0000000..d4a0439 --- /dev/null +++ b/doxygen/doxygen-awesome-css/docs/doxygen-custom/footer.html @@ -0,0 +1,30 @@ + + + + + + + + + + + diff --git a/doxygen/doxygen-awesome-css/docs/doxygen-custom/header.html b/doxygen/doxygen-awesome-css/docs/doxygen-custom/header.html new file mode 100644 index 0000000..0e9d120 --- /dev/null +++ b/doxygen/doxygen-awesome-css/docs/doxygen-custom/header.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + +$projectname: $title +$title + + + + + +$treeview +$search +$mathjax + +$extrastylesheet + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +
+
$projectname +  $projectnumber +
+
$projectbrief
+
+
$projectbrief
+
$searchbox
+
+ + diff --git a/doxygen/doxygen-awesome-css/docs/page.dox b/doxygen/doxygen-awesome-css/docs/page.dox new file mode 100644 index 0000000..ab82ae9 --- /dev/null +++ b/doxygen/doxygen-awesome-css/docs/page.dox @@ -0,0 +1,15 @@ +/*! + +\page page1 Example Page +\tableofcontents +Leading text. +\section sec An example section +This page contains the subsections \ref subsection1 and \ref subsection2. +\subsection subsection1 The first subsection +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. +\subsection subsection2 The second subsection +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + +\note Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + +*/ \ No newline at end of file diff --git a/doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js b/doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js new file mode 100644 index 0000000..ae72bf7 --- /dev/null +++ b/doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js @@ -0,0 +1,115 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeDarkModeToggle extends HTMLElement { + static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode" + static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode" + + static _staticConstructor = function() { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + // Update the color scheme when the browsers preference changes + // without user interaction on the website. + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + }) + // Update the color scheme when the tab is made visible again. + // It is possible that the appearance was changed in another tab + // while this tab was in the background. + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + } + }); + }() + + constructor() { + super(); + this.onclick=this.toggleDarkMode + } + + /** + * @returns `true` for dark-mode, `false` for light-mode system preference + */ + static get systemPreference() { + return window.matchMedia('(prefers-color-scheme: dark)').matches + } + + /** + * @returns `true` for dark-mode, `false` for light-mode user preference + */ + static get userPreference() { + return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) || + (DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)) + } + + static set userPreference(userPreference) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference + if(!userPreference) { + if(DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey) + } + } else { + if(!DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey) + } + } + DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged() + } + + static enableDarkMode(enable) { + let head = document.getElementsByTagName('head')[0] + if(enable) { + document.documentElement.classList.add("dark-mode") + document.documentElement.classList.remove("light-mode") + } else { + document.documentElement.classList.remove("dark-mode") + document.documentElement.classList.add("light-mode") + } + } + + static onSystemPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + static onUserPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + toggleDarkMode() { + DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference + } +} + +customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle); diff --git a/doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css b/doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css new file mode 100644 index 0000000..b988b6f --- /dev/null +++ b/doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css @@ -0,0 +1,40 @@ + +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +@media screen and (min-width: 768px) { + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height)); + } +} diff --git a/doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only.css b/doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only.css new file mode 100644 index 0000000..655a90c --- /dev/null +++ b/doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only.css @@ -0,0 +1,108 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + */ + +html { + /* side nav width. MUST be = `TREEVIEW_WIDTH`. + * Make sure it is wide enought to contain the page title (logo + title + version) + */ + --side-nav-fixed-width: 340px; + --menu-display: none; + + --top-height: 120px; +} + + +@media screen and (min-width: 768px) { + html { + --searchbar-background: var(--page-background-color); + } + + #side-nav { + min-width: var(--side-nav-fixed-width); + max-width: var(--side-nav-fixed-width); + top: var(--top-height); + overflow: visible; + } + + #nav-tree, #side-nav { + height: calc(100vh - var(--top-height)) !important; + } + + #nav-tree { + padding: 0; + } + + #top { + display: block; + border-bottom: none; + height: var(--top-height); + margin-bottom: calc(0px - var(--top-height)); + max-width: var(--side-nav-fixed-width); + background: var(--side-nav-background); + } + #main-nav { + float: left; + padding-right: 0; + } + + .ui-resizable-handle { + cursor: default; + width: 1px !important; + box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color); + } + + #nav-path { + position: fixed; + right: 0; + left: var(--side-nav-fixed-width); + bottom: 0; + width: auto; + } + + #doc-content { + height: calc(100vh - 31px) !important; + padding-bottom: calc(3 * var(--spacing-large)); + padding-top: calc(var(--top-height) - 80px); + box-sizing: border-box; + margin-left: var(--side-nav-fixed-width) !important; + } + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium))); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px); + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: auto; + } +} diff --git a/doxygen/doxygen-awesome-css/doxygen-awesome.css b/doxygen/doxygen-awesome-css/doxygen-awesome.css new file mode 100644 index 0000000..549c139 --- /dev/null +++ b/doxygen/doxygen-awesome-css/doxygen-awesome.css @@ -0,0 +1,1504 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #00559f; + --primary-light-color: #7aabd6; + --primary-lighter-color: #cae1f1; + --primary-lightest-color: #e9f1f8; + + /* page base colors */ + --page-background-color: white; + --page-foreground-color: #2c3e50; + --page-secondary-foreground-color: #67727e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most compontest reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, Searchresult, ... */ + --box-shadow: 0 2px 10px 0 rgba(0,0,0,.1); + + --odd-color: rgba(0,0,0,.03); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --code-font-size: 14.4px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1000px; + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #fca49b; + --warning-color-dark: #b61825; + --warning-color-darker: #75070f; + --note-color: rgba(255,229,100,.3); + --note-color-dark: #c39900; + --note-color-darker: #8d7400; + --deprecated-color: rgb(214, 216, 224); + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: rgb(246, 208, 178); + --bug-color-dark: #a53a00; + --bug-color-darker: #5b1d00; + --invariant-color: #b7f8d0; + --invariant-color-dark: #00ba44; + --invariant-color-darker: #008622; + + /* blockquote colors */ + --blockquote-background: #f5f5f5; + --blockquote-foreground: #727272; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #282c34; + --fragment-foreground: #ffffff; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + /* height of an item in any tree / collapsable table */ + --tree-item-height: 30px; + + --darkmode-toggle-button-icon: '☀️' +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #5ca8e2; + --primary-light-color: #4779ac; + --primary-lighter-color: #191e21; + --primary-lightest-color: #191a1c; + + --box-shadow: 0 2px 10px 0 rgba(0,0,0,.35); + + --odd-color: rgba(0,0,0,.1); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #000000; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #1f2022; + --blockquote-foreground: #77848a; + + --warning-color: #b61825; + --warning-color-dark: #510a02; + --warning-color-darker: #f5b1aa; + --note-color: rgb(255, 183, 0); + --note-color-dark: #9f7300; + --note-color-darker: #645b39; + --deprecated-color: rgb(88, 90, 96); + --deprecated-color-dark: #262e37; + --deprecated-color-darker: #a0a5b0; + --bug-color: rgb(248, 113, 0); + --bug-color-dark: #812a00; + --bug-color-darker: #ffd3be; + + --darkmode-toggle-button-icon: '🌛'; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #5ca8e2; + --primary-light-color: #4779ac; + --primary-lighter-color: #191e21; + --primary-lightest-color: #191a1c; + + --box-shadow: 0 2px 10px 0 rgba(0,0,0,.35); + + --odd-color: rgba(0,0,0,.1); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #000000; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #1f2022; + --blockquote-foreground: #77848a; + + --warning-color: #b61825; + --warning-color-dark: #510a02; + --warning-color-darker: #f5b1aa; + --note-color: rgb(255, 183, 0); + --note-color-dark: #9f7300; + --note-color-darker: #645b39; + --deprecated-color: rgb(88, 90, 96); + --deprecated-color-dark: #262e37; + --deprecated-color-darker: #a0a5b0; + --bug-color: rgb(248, 113, 0); + --bug-color-dark: #812a00; + --bug-color-darker: #ffd3be; + + --darkmode-toggle-button-icon: '🌛'; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, .sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, .SelectItem, #MSearchField, .navpath li.navelem a, .navpath li.navelem a:hover { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: .9em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl { + font-size: var(--page-font-size); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-height); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +.left #MSearchSelect { + left: 0; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +.left #MSearchSelect { + padding-left: 8px; +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + height: auto !important; + padding-bottom: calc(2 * var(--spacing-large)); + } +} + +#nav-tree { + background: transparent; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-sync { + top: 12px !important; + right: 12px; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + box-shadow: inset 4px 0 0 0 var(--primary-color); +} + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + background: var(--separator-color); + width: 1px; +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 210%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +.mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background: var(--code-background); +} + +.mdescRight { + color: var(--page-secondary-foreground-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe { + filter: hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color); +} + +blockquote { + padding: var(--spacing-small) var(--spacing-medium); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 2px solid var(--blockquote-foreground); + margin: 0; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname { + font-weight: 600; + color: var(--primary-dark-color); +} + +.glow { + text-shadow: 0 0 15px var(--primary-light-color) !important; +} + +.alphachar a { + color: var(--page-foreground-color); +} + +/* + Table of Contents + */ + +div.toc { + background-color: var(--side-nav-background); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + padding: 0 var(--spacing-large); + margin: 0 0 var(--spacing-medium) var(--spacing-medium); +} + +div.toc h3 { + color: var(--side-nav-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0; +} + +div.toc li { + font-size: var(--navigation-font-size); + padding: 0; + background: none; +} + +div.toc li:before { + content: '↓'; + font-weight: 800; + font-family: var(--font-family); + margin-right: var(--spacing-small); + color: var(--side-nav-foreground); + opacity: .4; +} + +div.toc ul li.level1 { + margin: 0; +} + +div.toc ul li.level2, div.toc ul li.level3 { + margin-top: 0; +} + + +@media screen and (max-width: 767px) { + div.toc { + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: none; + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; + word-break: break-word; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: 14px 16px; + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + .contents > div.fragment, .textblock > div.fragment, .textblock > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + } + + .textblock li > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .memdoc > div.fragment, .memdoc > pre.fragment, dl dd > div.fragment, dl dd pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt { + color: var(--note-color-dark); +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); +} + +div.memproto, h2.memtitle { + background: var(--code-background); + text-shadow: none; +} + +h2.memtitle { + font-weight: 500; + font-family: monospace, fixed; + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +a:target + h2.memtitle { + box-shadow: -3px -3px 3px 0 var(--primary-lightest-color), 3px -3px 3px 0 var(--primary-lightest-color); +} + +a:target + h2.memtitle + div.memitem { + box-shadow: 0 0 10px 0 var(--primary-lighter-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: monospace, fixed; + color: var(--page-foreground-color); +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +table.markdownTable, table.fieldtable { + width: 100%; + border: 1px solid var(--separator-color); + margin: var(--spacing-medium) 0; +} + +table.fieldtable { + box-shadow: none; + border-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +table.markdownTable td, table.markdownTable th, table.fieldtable dt { + border: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); + border-bottom: 1px solid var(--separator-color); +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--separator-color); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: 0 0 15px var(--primary-lighter-color); +} + +table.memberdecls { + display: block; + overflow-x: auto; + overflow-y: hidden; +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + border-top:1px solid var(--separator-color); +} + +.contents hr { + box-shadow: var(--content-maxwidth) 0 0 0 var(--separator-color), calc(0px - var(--content-maxwidth)) 0 0 0 var(--separator-color); +} + +.contents img { + max-width: 100%; +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; +} + +.directory td.entry { + padding: var(--spacing-small); + display: flex; + align-items: center; +} + +.directory tr.even { + background-color: var(--odd-color); +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + width: 18px; + height: 18px; + line-height: 18px; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-medium)); + margin-right: calc(0px - var(--spacing-medium)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +@media screen and (max-width: 767px) { + .classindex { + margin: 0 calc(0px - var(--spacing-small)); + } +} + +/* + Footer and nav-path + */ + +#nav-path { + margin-bottom: -1px; + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + font-size: 23px; + border-radius: var(--border-radius-medium); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); +} + +doxygen-awesome-dark-mode-toggle:hover { + background: var(--separator-color); +} + +doxygen-awesome-dark-mode-toggle:after { + content: var(--darkmode-toggle-button-icon) +} diff --git a/doxygen/doxygen-awesome-css/footer.html b/doxygen/doxygen-awesome-css/footer.html new file mode 100644 index 0000000..b667e73 --- /dev/null +++ b/doxygen/doxygen-awesome-css/footer.html @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/doxygen/doxygen-awesome-css/header.html b/doxygen/doxygen-awesome-css/header.html new file mode 100644 index 0000000..cd6634f --- /dev/null +++ b/doxygen/doxygen-awesome-css/header.html @@ -0,0 +1,74 @@ + + + + + + + + +$projectname: $title +$title + + + + + + + + +$treeview +$search +$mathjax + +$extrastylesheet + + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
$projectname $projectnumber +
+
$projectbrief
+
+
$projectbrief
+
$searchbox
$searchbox
+
+ + diff --git a/doxygen/doxygen-awesome-css/img/screenshot.png b/doxygen/doxygen-awesome-css/img/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c65033fabdd8a76575666647593ba21831b69d26 GIT binary patch literal 222971 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

n;f&Y^Vw1twe!5{(8mVZ@k> z*zrr6KyT0>+8Ehn=P+El@{!Vkj8k40g2!VY-XpM?`h5gVc^asuj$ho%yT!ut;`k7! zErvJYrc}f;ps*$$&5*}80x`BP*yNv0=%3#_j6s$eeQ-qKwI0K(Ocqod5gc4o4y>B# z>1oen;Vq|%=S~$KI=26QV#DYKxI}c{4I8<*=lNV&InQ?f*=)Od)!X+30|llIZr;C{ z7?@8qQh+Sd23}KpyTMrbUR#W40x7f7~W0F;ooIZ!T zz!*|3G~;g##|zhNZE49|{q#HK#QZ_zhfx`l2(X-)nMv0uxc#X|weVw4PsabA%<}8a zq3L3fCINACz4_c3%+)1$$Tpx9F8vEz5(^;4;FiGja6ynPh<YNzomlW6 z&|p(`^Zu7{K(|qrjRke{QI3!M0gt9XsfIr?Sx^dRCw@K$7xDoJ!23i}|6b`dF$6uB z$OkudI!H7PEQG?@)jM)wya9IOf8I@!)*xmNk~qE#{Y>>D3wq;GfxeqJbM$7O06kCAs)mEvBw?dyxqm z#jDx>-kVr}6Zljv2zu#*ieL4_tDeDG^noNY=zaTL;9tAj>x^83em z`?4r5OHN59b>BeSjcsxgs9y=**8j6=V+PwBFiSMf8w?%!;b~CaqqS=L z1@d5wS)V^aWH$M0an%s=4bxZ!$aIHhQd4}0)ARE`vNOo&cIEa;2#ITH(Qp~HPkxKg zn$2y^8h=NEm#b4Pr{Q|cC!`e^{9hp@m^2<2fX^*9{06L);-T{amIlQO!8RqwEd*8q z)Ib%E_c#)DJ(;3fah~Q+_Baxm(EYMay&^xexiHPM|_39k>6%w$#^9_qvxM~`?MAlLWHrQ`Sm8{<7ZBjSr!U+crH2Ak-CpfIU| z)<>;|GV`E>Dr?kU;mXoVXYN9FMKE`5?-2H{NI=AZC9CNcGZU+RYvFnO<&G3xJ)z~{ z{G|IDOS;S8E9Re2jc{8Ipb^YhtT%n$3B5mZC$md1%h!zG?k0uxiS++RAk*tDG(@$8s$#7qoumzJ>FvRT^N88Q03r zt{+&?->Ac{DxH=Yu?2zXaxG|>qBbv*Q`VYx3W*hUEPHI1p2ryV$uPw{?rctx%u8m` zuKaj0QM{`{xl;!Lu$IknVF$oFoq7ogH+#j7v%lMWjow}s)%@>$RLREHN9{$ghUU7s z16+hGK$J)+H!t^PU-=c@F>7Yn_tcNq9e@)BwUkY^QXiX6#Ov54GxuoW1LdqgFkF~~ z(^*Z>NPe=?6CM>OC8^54Ofu;y8L4e8KwW;a&sE*eR#c{x0ONNyFY81ikd68ZuQOj) z(8V_O+_zV3$k#idaJst^gSBfsVO_cBj_c-PKl9b50ot#J9Qtf|v#eia(#SMCdLLm4 ztxu{`;Ep&=_2!$5h4$nxm!q2_Mvmq-rT6CuA+SN$Pgw^=M?YyvmYH4}X(u5@`gShs zjTGm>4Wz`o01Z>%SB8`XCi>q`Di9MFx9T#8=*m%G><~cNdtqMV620ym4)U-1pd2i(KXT|kXgcx3&9~} z1h1ik*`r3c{1hTRpcrG?jU|&cT)w^mr*+2h-6Hq8_4UgV4V4Fe#S=KG{*I|hLa zN>{SEdN8lqxWBUYH}f)ks84<977v_w_XgWHz*l!Dl=iW#tjJfFKgc?GHXF*Y5AIYD z?-eD^lwNOYFT_|>R)@da^70NsY)efe%nlqsiF?#I&oDTY~j;LJ$?*Q0&k#(@}TCyJg?5Z?Di@A zk#1-e2LluXJi7-QX*bvO18tf~BS2SS5OnJk+_o-$PyH95DmMK&AYEvNuRmK?2rH&A z84umTf2sbPf%LvRF7kvgVo6x>{=t%zo`zMIYP#IugO*wIk*s7A;xAY*b;h-x$y zI~x2cK_G5osaw`?_eZVo#}DAjwIAnrY1Ac4=U2aWo|8h$#rnvQFvTf5C)F$W)}mnp z$F3?gS2q>6R82ajtM2}8rT-sc7>_X*?YK?5g%SSUZMb8VQpbzfc!Uj8>m2ioSym+) z61LQTjZ+U&cZBGtanM*@uFsPLp<_U8Lgh?BOJ4H%i#pvvd1&?}c2;!!3X|Mg8H=)! zrIk#qbA&p&4yWhxfO3=pdi+3COGFLNlZU8lg_4WA?!}mA-7mXyuVe{rV|B^DnHjUTb^yOq z8v(nQwQgw9s&LjH03sNNU9rN29K!kkAa)!^U1;M8z@0(-+S=jG&o5BfbpYEhiC%a>RR4EYO;R=#K7K^LInv4wGePdc)vM>uq?&51EL6m~N4Nx)>k4aSMZkoy{`L8O^^{Sp9RsXF zXXXcpqw8KoOLBS-uwhTm zxy=*>P>&9N{Ts3*$ucpr&JFf#h&eO5nuip3Y$+hGmZ0%?8xSW5ErGePp!*N>=&rj2 zbGd|Fj>vYM|A)}pUNl-gmy@EPsVURHG774?EU~ub}RN}!kYGu`$9rHI%x2s06PGl$LXpzjy9RVtPLHVw(%Vd`?Bz(HCw7BiO zH|#Bb6t&~vhKRm)d*fBL1kPK z*B{D#acc~Sby_Kbf0amO`8T7zxQBxca<=~f&A+cY9@{>6_`q?aTCn&a+*I=A1qr1U z3;P+;U%3W07R9rdWCec+B3*YxP};Aqqeon56WsTigiGyjurWkK86OfV$DL+Il_Gmq zo)~|7YJm$^$r=PL%kLXJGVm`E+3)n&ojegqOf3zT)hzv)CPxd*k=-@Xli4_4WK}MU z{p{?@ok7SgnJ~ zm})-=FS#`;tO8nLxX6+bVy&%w+h4!BK_iKgo*p}^Qv#R)rywi7VToR;O=ZIm1PQEH zPu0{uAXi0oL~HMYIu{rKwY0Vn@kyvS@?F0!+tSLswlYY93cNr@CJquZVPRpA%+uyW zfB`WH)N*gJvp3FIAKjP#;Ijnmg~9kB@lCRffc*j0s9}!?t3ShidUq-{lY!l`U*0Lc zCsBgfJz9{m40Hm#)+1DjFybEO#>Ov_jCvl=f@c22CUtT2O?u%YA5?n!_s<*sWx9K; zPo$o>7icRQ+*AznzBAdSsHpfzQLz_lD=dDwxxbM7bbp=*B+UqjN@)i?QI1k8yGQPz zuPr$oQZ9*9@CVk8>_24yz-4%32M15;n`r#`9Dn6*xz_lckX-65c1$|wjyQ=-8waIW z5E+47vZ=ZGIwNmHY%CR=uerJTCKne;(Xb{`7rYk|#2z^f%F}k=ZATjXdp;5B43uP8 z7%A49n?uKD&D0Q8cf^&QZjKSgkG;3S;2j&Q0etr#XTTtUDmS@Zt;gZ)h9Kx_>8M8X zsJnUp+0Qn-ADazO47{!oVQ?rLg7we@h6Qv<_I@f9`;NrF9%te2Vf0w>(;H$ z*ATDY*3`IZlb_K-&CJL{+Z36DNgQ=_fSLr=lhjGf#laDTI1ib)=+1yXh!aF`oA&oP z{L}LAuFsE(1RLYjCpUrH^v^NP4h7FPcmp5}>DGvOB-R7c-Cpg6lh%r+9-{v_-^D#C zPQu!Iff!QevXeDU$%!x z=etjT^fWm{Zd?iZo1pi0>#w5b=<~LQ7?hny%~*yp&h}L z%pA0(X#DQcu`oW3BE}?^sxZ<$;zHk7c6T|_M}8;%DSTxe?q2QpYjXni_#Wg4^-i}t zPh?+W^)jY+-=!X)BVkhI4_b(w7C0EBC-I?lB=l;RREY^`I+~Sj`*e2Fd+hCu%~X8u zQL)S#U)*)9=gKELXXGA-tklK7s=t2_YQ7ual7ACn950H^bt8CyB&&v|*Jo6LR^jb` z(zI!cTn|0aw3qI_#!^X`C3J8t<7(sDTq|wf?jq^#k;tKYT1SPNd(?$No9vFzYWBco znG4h%6nJrHtj$BU6YY2f`t^J?jl6^PoJz_$P#y`QzZ^V3WTYopMVD@Hg3aLgAljBO z$;yaBnk9=;dU!(SMI;}IpiZE4-Fg038#T&`5A6B`VhIJGRvPzBv|D}58(s!UPN>yv z9B@i+HZ^{DdGB#85#F-G6*8B)-}UUKb-3d5-9qEPCX(B|X3(@@H)`2Q1YJ%B%x2wv zFEB@L<*<;{uJsE=L>s@+R@$LbJ5Lr~khS_HKt56JrChp;+|kU@;E5VKVfCI(FICxW zaijWMIOUR;?sv>{ndas6nY;V;7okE`>XE00O4_jwl~c{cQ&kaOC$5B(QPdt+?w}c5 zX8&UK;^rhroP_Rkzqfmq{e#cq!nPn6KF8RL8vcxy8g^*N%~ex-MtD57mr?UX%3mU+(O|A6$os~Wa`?BUb=hPu9^2V z&P21e2F{>ym@Us^b$b~T*JtC1+@p%xnHkw=YtedJZI3w%i-) z>bpuc@y=~-Hnly@$_oUuTc=i~{N*0sPoFpnQ_Kw(lP?R=be?MT_xYG)?kx+w&0IT$ zmizjAmmn$@9m`dMHDSB@;_$~crK2Bh-}gMDb!{$;8R}#l@60ub+4AAEPJMOVq&m#Z zbu$mb7qh*3>Rx@g)9!5oV*Y^dG)8&?wN}g0Uj$s-GIp}VkItG7(!%W&@%e4E+nBJl zk`ASlU-uWBVrr>Th`jGOe4lSp?P=~Tv(O{eHzKV27lx83cbdF*Q$JXt%)jXk*SLKf z^OCg9vf(tdPqk0SOqQR?!W>k(p_wsM<+R@Z`y{qZo~Qez()6}VM2*pUBVrwYd;GZVP}r`yIhr~8zO9==|0n{ zATz&zf)nUnv=o@9E3w2Wv!-}?yhASWwmy!#oWW;5;m{`86g@9-`S?2|MtTQTH2gex zy@QnB2THMCH+9hCn~#tpQvR>3w*aa#YPrMtUBT0k14yCemXlJ0I$LAsIdF6r(D zY2nb_NO#xWet+FN_spCbhIl#WJ$pZUJ+an8(mEbjH)S3;hxaXV?tMq!dNg?ZCX7Kj zUHVIqVF1@LOal6B`KY?JUhuZd)BY84Bs-Nr6b(%_X@cPz%V56I1xf3+N5^{kf5c{f zpA{)SpoJ57y$UppPED6I%B6EYUWr>4a7yNMLF$tXdiFXZXQ@&(4g|_Aej-l7D1NS&jjJk(de{|FI(}FzRQA=@OG{*&Ve%B)@*BvxLGIW3GG^rLPJzzoF;o`gMd^j18 z9hfEtNR-KooFLl+gjc|y2EnJHT5y^mQYEK3Q*=6VTHDvIlBIgs+}e=ib~!$2>~zhc zXNRJB)&r{XykTR(PCxy3xpDBZ3v0rv^j*Px5U#v+hdet;_D?#+^5iuRo8EM1?(9*| z>A&PFz6>peA|Vxmhp`;YP=79Ti>Tsuvm0=V`i%pqi5NClyaHNkscm{2R#dg|86_$1VMs%A#7KLu8lY*khe zQveCN{e3XRJp_1`0(r6LtKH{~2sRTz(Sf9hR`Z#9t0Dp07Y0$55=)&{?BZ06AFpUJ z=A;>qw+@02y>-eg%ZD!WaYnqbhYz})12LyJ6%JKVtA6xh%$qn@>PrL}@@}MHPc|}9 zM)1Q&NxPDT*i7St_xh?c=1*XfFa9RWAZ5t`0m)g}O$3-?Nkcqh&^Z@Q=r}fkrHKAw z?L2ld*S%p$5_RZE)KVzu*}0AIUxB)UUXUu5l3MD+XU!q>m#5Is^Ujruvc)>H%lX~O z(ibSakqkob+Y@_!L?GgKa-*j4F=UqbmUQ9R9wf7JE*iLo>+5ret|d&RMdjrs9KiFN znwbhF)grf~8mmFz6#5;63o$CZchhmxp1*S58ZZ@Kk5woD}kw`}>OuBi^U8y*>w zFDgc*%E8g7$6E4+$!c6pBV-OZw?4fdIuasoCtRItS_Ex zp!mMgUf45#4)K%u>qB-T=q9jEiT2sk59w~zud_)@WR$O`h0{e8$xcKNbyydbK!R(p z`+;rw$13{l@(o=JWGSG5FFEztJ9-^ic))SDl+%5)%b~H&m$hY6qr`Qt zlRd;*B=&->CGbMZdEnq;y#b}X#h!Q3G1Oxx|J7E-9n$bgu4rz8;8kY?Xi1PgC`%u= zJ<{mBi|qT?+OM=7w$Jco4F^Kb??)fzs;qdFi1@<~e<>WgK0vQFNGYcNX_8jfWc}Pb zL>mTWzS@LLJx(B9cq}CIv7=n-#gs+ot@Wign65MWD4oIe$nD#a2`kM4&Z(e05X8p< zNgaCYddZdvlpV4r`~EG`Cub-*O+V44&V%o}w?h|aI7gkye-bM3p1vcJ^^l3VFUCO^ z4QU5fUajM6!#eUUk=5VQUaFAy`a>fP>4S_Z_vv6zt*s@iP(nqd1XE_jz+M zi1c={Xzl0TVkuV?IZuq=dezQxmf-hziCyTbAu`=5S5&_wR}Fp)eg<27opmIO--=Wl zue?>g)x={i7b|4n^%ZXMg@3%rI;j#gir^1{Q>{d@Ywp0nAL6Q%fIRQ0flWkooqA08 z^$5!A=(a?@vzh_G&A>vDP|j>rjwiN!_r4cQku9l_Kjz@C8RV0p-)kRWhaA2|VrN+8 zN-ZHRMYNjE{H;WdV8V(Po6i#S`dCu z!i79Yr~r|}hb@QM!!lxs#7jX9>J21ueIZ%Qy+t&D>rm!PAtpGF89zQvLsztP{n4%b z(YMYrUdVj+nmH;AocJ5THd5Wcz2=0TEWB~yJI;>(`{>G&kIDd9^4Xo1{;N0vD1o<= zAL|W#4F=hJKxM&blgNIdu_ib)q<{B9Eh%$gX-}<~fvr%Z#TA9ugPm4VlFNDtuBAuG z!-5e)=O_NrV$H3$@)SWT(*=#g!2wKMy%`$T=Jmqk`XV7Vo} zzRx2x*tKc=*C-oAy~YiT#pUHj%R})r^kv!LJVhb&AOa1Q<9w}3YN3cGNFf#;S^KJ> zE4boEUNbztWPz`pSQfcsf~iu9DZmVufrXJT&ucozg}C|pP|{qR*ETV1lsN8Vl{qD8 zi*v5mYWw5u@|RE~m=3Et+u01!!pNoJ*rJ#Wods8RCN5Ya_H_Xu&}VyC5Sz2t^V>#C(@dtxa0~t3KL__R9HHW5ZXffO-Xv} z{Zo#sbgxb=(V2~?r20JkT;=25KK%62nx^ef9)t69hf2bkRgryaB3;bG20i1&;UshM z@5+cat+`R``W2XaL|>rkRrWY;Jq}nyt7AFRL8r`#57x7mPM{<9ML|c*W5rc$L&ts- zp8msLoqY=n3QPz;XEUzW)03wX;hzvjWFBCb>}gGRxj&!oAl~A*T&Hzm`5CYMSD!Y4 zx(5Y6)z3vXp=3M1h4-?m&}F&}8{MjH7OTx1qz`EH9s@8%aecW(NibWb zFPEF~mVIPwSP!=NE>wcKGMS!4852NlM13dEF(Eyf-t44-(RJD5&~BUUv;!OK2vVPcTafJu;a z*&zaZj!jA@Po)BZQ{z^W3 zy4t=vr;b>=;T-EtuFwQ;g!hvB%3MS@IFYZ)g3U#KR$r~odf0%tg|+aD9!fH7CHIXJ zDu&FLcl;L?Bn~Y9!Xn6ArG5X)^nR;xBFDuFR2Z#TdUkH^v>PlXPhBL`ad!0`aR1fN zli$Uk{+4-#M%s_)A9N0hg4pw>_0rR9I5Z{m81q-568-U8qmasQpj-9jz=UuSzBQt8 zI6Gt3=gkDyR3Z@!P?L&SUu1hmhnP}Ry~S!-?kdR-8(gi!{;H(c0w!SxLnV>HzT64u z65kVAg99q~5~fo8!}ue+KUIyBo{wn2X68Wg7wwV$LqQp{jl8S&S@YjZVYeO^1U1EQ zULO*m(QCB5A&G;xHBqdq%)%kB2frd>QOSrQm;^`} z;z-4Dr=)rEyJ=1P_+2U}?<2~|1cNDz*k;>huj68`=2CT+{j{3of_qOoWhT=VK6!H+ z%bfE1l>A{fI(j>Wr7lhn9gcMs^Ju5nof!gQe4GVq=&6rqO{mr{18gd}q$KqPf0lfC zMDDIpB^16c98XTFFYkX4AUF&m(RLwc*u+7%1)`B;k zFjBk6c^0I&vfN5uQw(R-CHcv9-TQlB_i$-L^+kS=$|aOJnj^$-@V06 z0b##fv1YB)h==Ntf=_4of=U)5K@}qtiEa27Zir`XMF0KJ;rJ$t9(;H2$3_NCf&6kf zth}D{M8Ee#znH2TtE+Yu>D4>%b$29iO8sSYxtj~0;oewGYMd(vWV_kzJ6n5x-(uW_ zHIOBRjCWyMFrMr#K_l=aV%oBbSIvPxmUb%0=Kr92#QOEN!v|5_=J?;wfBMPX=dfk- zeW)_Q%W>o0VAh_~TjLPR^6udvFIcvfp3ObOc-qXjYi{H9gv-8}K|8nh!}GevIW#tn ze(NO3Ty3^H9FU6M{}2#)Nag$mKh&}-LpMBOOUflL%en9f61(JIa28*-mp(a5#AF>3 zSaDhAKBbmd#=lZ%hx8tb^RVw?0@rInQ96B?0Zf?idYLhy+Y8S)`lm<&27=yjzWT-!2HpP;igJnr-KAjr${ej_oT= zdOY{7jAPhS3LK8%huvR}8op{v^fgbHn%i0B7gT?5t=ddd=R%d#sL}??N<10qiw)Iw zxX5;vPM$MsEAT!jx%P zujmaoT@*MD-Z^=g%)0*~jQc$_mQ}|jHr-yvU<$|0h@Hrk{2s2}_7nO96b!Uybh_@$ z1sl_t^lS^$pt53`6F5q_E%9-Ga$R2D|?o3*G( z=SD2rLs1HhZ?4xQmYqjR^g`1=-mPWanHQCo^|7OjwcLI#Kg=Mm`LA$I(##EBS z?u>OA7la{JU`~vx({M9u=!St71UPa2Nc10>@ql!71X)D2->UD3;rW6ekqXX_a7idZWq6&KkYVXUgEdH~l;ugh*RIK2ZXHX2yY*!Le_#Tv7n=ZF}k!-|7m=L>Q62!|Wcr*M+W z%ei*=NZH%FHzlOW-hWTESNinblJr@m%z^J)q^M2z6yod&t;P9=L*reHqLn~SKWM0L z=cq}TFXrf07@Ahh>3UqAmzeMUFQ=$Ue9sGF9+LT2p6ratIbm^dIk#w4nyU24Sq2ps zmi%a&{!-zD*>Keu2R?lAdT5O{-uDq3>ie^bN&Qze>1md7QWLdXqH0d%XpjJrL=aEw z#I37s>pGxXLwXbX2(`rY^NT4`mo6c$d7!A=_tJC2x?jEbu-R7c=v{h>d-&L;W8c(4;(5kIH6@G{+?opxCMrc0~J zjQ@TgJm)IyWw&6dH+$yl5|b?S*yd>FpH!6!VHBVkJ>bkV6*FBCm#_sydSFvp+lQA2;B z;|VV%(A_R`L(1NE{7vXf`R1K$gMF}$E?3dPSycOdL>QFp(9rC8-*eA z9=DS_B$#jCu@);3h!(}?NMwuN;fuXzc*Bk>%JAn0qr~B@0;%6zC;5-yVvN$S&ekAm zefBvf6mB>)8f!bH3c%pvnS#vQ(&Hc*5ft|0XEDf)bWt0-W92d+UEndV%`DndQ*$CK zYJkxqY8RKs)d8~nV|%^U3Qoq56WQyvd~NrtbJ^QY}sG0j@jiVdFPTq@SjZ?3`oh zpSIDn`tW?Wb!KfSv9-k)wCunSU^f<<>4nuS?$8rW@54>`+UR`XXLyt3*};(4o)kki z5Sz6(8iaMt(W*$VqV``~0qlr#i-O|zj1VvgVd=@Qm!5vx+`NIwH@oDFtXYbyh9H(r zA%>vY{)m-+^kn53_+7L=JTrQYwQ+pdwm_7I#Iz^nrl_psFGQLW3oRxghQqwJ#4@er zkjnAA|8!-D$K2N1z+03O|Fh>^^nfvvC@+cW<^uPWdIEaNKyum=DdN-tiYgB6bN9Oa z9LcrsqGoBl3~#t$FI6xww1t?BQ~GVt=%f%Kq8AZD{4r4{ak+w%-lR~&W1Qtrk`yEK ziLt|Yx`lri!JxpvOA3YWOTqCAQbAB*aqZ@Z%Q5KnCxYuv?%BFaj7d%o5kZk<#UIxC z)Uy~Q^8Plpc{hBcc&WE*9~UQloYHQF7DtJh!nz1h-AEy`!5H6VBnHT#B@trPCeN~{ zf=9O6_BZ~M)mCFx%UG%%tQ1~^+u8%9C%^0JEKC9{OCUx)4Qf}sQM!^*_|_;dE)4l zDFx`Sp{fUBrWYo^7do9T&St*Ck=&~fK~ayBp~*z)S|ClzX0@J=lTG*GM!+7I9`6$e zj5S;Sub6*3V`Jrq4og+In3@}s?Ki(+m!#%=+~fxHlZv{5lRlB*uH4}a)H~iEPD!=J z2X^Ss6749aRQMUV=gbkNk0b~%nFo^_LlX=gOpI@JCWNRDI7rryr>tF5eF8G*(H@eL zX_R$eb<<3KKr4~D@7Dbj%lS>aHf&mm3>X(xOg^vsVHe#-%Roeb?QJThe75|+A6Zp% z&t=|Np#SPCAu4V7Bn$%2RbGM`yMKBBv7E6V(G6vDx(NN-W`%!&{6F#ByP2=jjmI}L zYFo=YgUfAXFvo&Ot#F)zo+oOjUrM1TtE~=KQk6i!5GLCoT7~_0K)2XVdX2mK1(@3( zfDBIUK`_MtxUo0;^44zw6Nz4#kVXr_Rqf>XRr`oS zSz17n)3kS2cKo-&b1W@yTr9%v6C5lw5|D&sFgXOi2T&R)1DZCbecqD zzuJ~p=-+!ZOm3->T+Oh?4jCDA4&hZKCw?>Ngci?RSYKe;_2ucsTqruJp9YA z7HSq9n6wXKHiVJ1o4c0FfZ7+vRWebg*9+ zy!6M$itoU$=9pZKcmCN#!_>Y0qF##4Nkn7wjQ@}?E-=AR^5amxL;4^^8ezto-sSkJ zF_bN2kNj^Ziq}Nio`3({b%#9IODfE+OS`@iGdE=Y;kOQvnesc5t5S9R7G5vtx5KlU zT+6io4R^2x3xfH$~dWfvab4s}%Kw-remlKx}+Kl3a71vj%W z90R@2LM=%j1k=sAhO%MBMU)Z9?}AIHS!fCiYpm}i)wO0Z`C2jMH945dn-YSv4O3v2 z!}%0p6ivKq3%?Wg#eHgM(V~xyxgT6!2ue6Q5zQzx6h!Vz_g3HegI<6g(%XhmmG0BQM-HYb@ zwWzsmB+~02Y#%3C%u|NqqC`-oS0W0{IWY)?iuWZBD}tfFAxK>2j>lAc_i1cxZJ!-( z`eo-A$0QWcC46?~08p~?*xta6x2T*UYH{!IM_3ZyF7t}#k;a>0v`C7lUQDOc;G~8^ zdbbrbQea$J9mXbw&_(?6NbmRHr`)UjHqh`C81r5D?D{#*EHy28t-3WmtR9nm&;(wS zHRJqYRmKB`ZgUnz6}xNSV7cC1`ib-L@g>hYjTtQkAQq*_8T-I`-5eI=w%r(}=P)QR zu@=~GNB}kh$TV|HO1@XazE*BL0*Lz1;{t%m-Q1(ajV2}y4HL@=u28d)&TYB=%{`;l z6(MyE&3>0ZToHH3`0Mukyp4V$YGI*C(V5DCy9y*bkj#|998ZxsQIm(qt@r1BG;&iv z3&yVFDOaFN`(roF--3wb4U=*INOE{4`!}H$x0;qb8anEZufSR*dPk|S6e12T^!oaQ zo`{sB+N?n!Nx)C|2R8DVr;oaZx{B*5RCBo+uLG4@Sb?gpZco?KlX4pTj~_USOa;Zo z9KsbKZ$JsLSYz^GI$i_mOkX%!X0=)p=mTEO4UEA_cA#Q@1&Es-{A` zYGI;<$U^_ckAvEGVZ|?e#N@_coT>j~W$^oHQy5%g+0>f~-v0EyM%~O{Nf(QEDEi0? zvX18f5#Wr<⋙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 HgYW+j42Lck literal 0 HcmV?d00001 diff --git a/doxygen/doxygen-awesome-css/img/theme-variations.drawio.svg b/doxygen/doxygen-awesome-css/img/theme-variations.drawio.svg new file mode 100644 index 0000000..c6b395f --- /dev/null +++ b/doxygen/doxygen-awesome-css/img/theme-variations.drawio.svg @@ -0,0 +1 @@ +
1. Base Theme
1. Base Theme
Content
Content
Titlebar (Navigation + Search)
Titlebar (Navigation + Search)
Sidebar (Navigation)
Sidebar (Navigation)
Footer (Breadcrumbs)
Footer (Breadcrumbs)
Search
Search
Title
Tit...
Content
Content
Sidebar
(Title + Navigation)
Sidebar...
Footer (Breadcrumbs)
Footer (Breadcrumbs)
Search
Search
Title
Tit...
2. Sidebar-Only Theme
2. Sidebar-Only Theme
Viewer does not support full SVG 1.1
diff --git a/include/arc/graphics/data.h b/include/arc/graphics/data.h new file mode 100644 index 0000000..b04c3c3 --- /dev/null +++ b/include/arc/graphics/data.h @@ -0,0 +1,5 @@ + +#ifndef ARC_GRAPHICS_DATA_H_ +#define ARC_GRAPHICS_DATA_H_ + +#endif //ARC_GRAPHICS_DATA_H_ \ No newline at end of file diff --git a/include/arc/std/config.h b/include/arc/std/config.h new file mode 100644 index 0000000..c05e9e4 --- /dev/null +++ b/include/arc/std/config.h @@ -0,0 +1,141 @@ +#ifndef ARC_STD_CONFIG_H_ +#define ARC_STD_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "arc/std/hashtable.h" +#include "arc/std/string.h" +#include + +#ifndef ARC_HOME_PATH +#define ARC_HOME_PATH "./res/" +#endif //ARC_HOME_PATH + +#define ARC_KEY_BUCKET_SIZE 0x20 +#define ARC_GROUP_BUCKET_SIZE 0x20 +#define ARC_GROUP_DATA_BUCKET_SIZE 0x20 + +/** + * @brief a type that keeps permanice of data for when loading and unloading config files + */ +typedef struct ARC_Config ARC_Config; + +/** + * @brief a function to read a key from string to a ARC_ConfigTypeTemplate + * + * @param config ARC_Config to store data to + * @param data string of what is to be read in + * @param subdata location of stubstring in data for what is to be read in + * @param value value of read in variable + */ +typedef int32_t (* ARC_ConfigKeyRead)(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); + +/** + * @brief a function to delete a value from a key in ARC_Config + * + * @param config ARC_Config that can be used to check for references in data + * @param data string of what is going to be deleted (used to check if value is a reference) + * @param subdata location of substring in data for what is going to be deleted (used to check if value is a reference) + * @param value pointer of data to be deleted + */ +typedef int32_t (* ARC_ConfigKeyDelete)(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); + +/** + * @brief adds a usable key to ARC_Config + * + * @param config ARC_Config we are adding keys to + * @param type string of key type + * @param keyRead function for reading/creating key from string + * @param keyDelete function for deleting stored key + * + * @return 0 on sucess, ARC_ERRNO_ on fail + */ +int32_t ARC_ConfigKey_Add(ARC_Config *config, char *type, ARC_ConfigKeyRead keyRead, ARC_ConfigKeyDelete keyDelete); + +/** + * @brief external callback to add keys to config + */ +typedef int32_t (* ARC_ConfigKey_AddFunc)(ARC_Config *config); + +/** + * @brief creates ARC_Config type + * + * @param config ARC_Config we are initializing + * @param keysAdd callback to add ConfigKeys to config->keys, can be NULL + * + * @return 0 on sucess, ARC_ERRNO_ on fail + */ +int32_t ARC_Config_Create(ARC_Config **config, ARC_ConfigKey_AddFunc keysAdd); + +/** + * @brief destroys ARC_Config type + * + * @return 0 on sucess, ARC_ERRNO_ on fail + */ +int32_t ARC_Config_Destroy(ARC_Config *config); + +/** + * @brief commands that can be used in ARC_Config_FileIO + */ +#define ARC_CONFIG_FILE_IO_LOAD 0x00 +#define ARC_CONFIG_FILE_IO_UNLOAD 0x01 + +/** + * @brief handles file io for ARC_Config Type + * + * @param config ARC_Config where io operations will take place + * @param path file path for io + * + * @return 0 on sucess, ARC_ERRNO_ on fail + */ +int32_t ARC_Config_FileIO(ARC_Config *config, const char *path, uint8_t command); + +/** + * @brief sets current group in config + * + * @note ARC_Config_Get will use this set group + * + * @param config ARC_Config we are setting current group in + * @param groupname name of group that will be set + * + * @return 0 on sucess, ARC_ERRNO_ on fail + */ +int32_t ARC_Config_SetGroup(ARC_Config *config, char *groupname); + +/** + * @brief get a value from a given keyname + * + * @note name may be prefaced with :: to specify group + * + * @param config ARC_Config to get value from + * @param keyname name of key to get from config + * @param value data retrieved from config + * + * @return 0 on sucess, ARC_ERRNO_ on fail + */ +int32_t ARC_Config_Get(ARC_Config *config, char *keyname, void **value); + +/** + * @brief get a reference value from a given substring + * + * @note this function is meant to help with creation and deletion functions for types + * + * @param config ARC_Config to get value from + * @param data string that holds the substring that will be used + * @param subdata location of stubstring in data for what is to be read in + * + * @return a valid pointer on sucess, NULL on fail + */ +void *ARC_Config_GetReference(ARC_Config *config, char *data, ARC_StringSubstr *subdata); + +#ifdef __cplusplus +} +#endif + +#endif //ARC_STD_CONFIG_H_ + +#ifdef ARC_DEFAULT_CONFIG +#include "defaults/config.h" +#endif //ARC_DEFAULT_CONFIG \ No newline at end of file diff --git a/include/arc/std/defaults/config.h b/include/arc/std/defaults/config.h new file mode 100644 index 0000000..bfca04c --- /dev/null +++ b/include/arc/std/defaults/config.h @@ -0,0 +1,48 @@ +#ifdef ARC_DEFAULT_CONFIG + +#ifndef ARC_DEFAULTS_CONFIG_H_ +#define ARC_DEFAULTS_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "arc/std/string.h" + +typedef struct ARC_Config ARC_Config; +int32_t ARC_Defaults_ConfigKey_Create(ARC_Config *config); + +int32_t ARC_ConfigKey_Read_Uint8_t (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_Int8_t (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +//int32_t ARC_ConfigKey_Read_Char (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_Uint16_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_Int16_t (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_Uint32_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_Int32_t (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_Int (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_Uint64_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_Int64_t (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_Long (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); +int32_t ARC_ConfigKey_Read_String (ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value); + +int32_t ARC_ConfigKey_Delete_Uint8_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Int8_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Char (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Uint16_t(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Int16_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Uint32_t(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Int32_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Int (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Uint64_t(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Int64_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_Long (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); +int32_t ARC_ConfigKey_Delete_String (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value); + +#ifdef __cplusplus +} +#endif + +#endif //ARC_DEFAULTS_CONFIG_H_ + +#endif //ARC_DEFAULT_CONFIG diff --git a/include/arc/std/errno.h b/include/arc/std/errno.h new file mode 100644 index 0000000..90e3612 --- /dev/null +++ b/include/arc/std/errno.h @@ -0,0 +1,36 @@ +#ifndef ARC_STD_ERRNO_H_ +#define ARC_STD_ERRNO_H_ + +#include + +#define ARC_ERRNO_NULL -0x01 +#define ARC_ERRNO_DATA -0x02 +#define ARC_ERRNO_COPY -0x03 +#define ARC_ERRNO_EXISTS -0x04 +#define ARC_ERRNO_OVERFLOW -0x05 + + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-variable" +static int32_t arc_errno = 0; +// #pragma GCC diagnostic pop + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#ifdef ARC_DEBUG +# include +# define ARC_DEBUG_LOG(ERR, STR, ...) printf("[ERROR %d] " STR "\n", ERR, __VA_ARGS__) +#else +# define ARC_DEBUG_LOG(ERR, STR, ...) +#endif + +#define ARC_ERR_CHECK(FUNC) FUNC; if(arc_errno){ ARC_DEBUG_LOG(arc_errno, "%s", #FUNC); return; } + +#endif //ARC_STD_ERRNO_H_ \ No newline at end of file diff --git a/include/arc/std/handler.h b/include/arc/std/handler.h new file mode 100644 index 0000000..ef67966 --- /dev/null +++ b/include/arc/std/handler.h @@ -0,0 +1,110 @@ +#ifndef ARC_STD_HANDLER_H_ +#define ARC_STD_HANDLER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @brief a handler type + */ +typedef struct ARC_Handler ARC_Handler; + +/** + * @brief a function that will take iterated data + * + * @param data iterated data from ARC_Handler_Iterate + */ +typedef void (* ARC_Handler_DataFn)(void *data); + +/** + * @brief a function that will be used during destruction of trash vector + * + * @param data data that is being destroyed from trash + */ +typedef void (* ARC_Handler_CleanDataFn)(void *data); + +/** + * @brief creates ARC_Handler type + * + * @param config ARC_Handler to initialize + */ +void ARC_Handler_Create(ARC_Handler **handler); + +/** + * @brief destroyes ARC_Handler type + */ +void ARC_Handler_Destroy(ARC_Handler *handler, ARC_Handler_CleanDataFn cleanfn); + +/** + * @brief adds data to handler + * + * @param handler ARC_Handler to add to + * @param data data that is being added + */ +void ARC_Handler_Add(ARC_Handler *handler, void *data); + +/** + * @brief remove from handler + * + * @note the data that is removed is stored in a trash vector + * the ARC_Handler_Clean function must be called clean the trash vector + * the trash vector is to make sure a state is not deleted while being run + * + * @param handler ARC_Handler to remove from + * @param data data that is being removed + */ +void ARC_Handler_Remove(ARC_Handler *handler, void *data); + +/** + * @brief remove from handler + * + * @note the data that is removed is stored in a trash vector + * the ARC_Handler_Clean function must be called clean the trash vector + * the trash vector is to make sure a state is not deleted while being run + * + * @param handler ARC_Handler to remove from + * @param index index of data that is being removed + */ +void ARC_Handler_RemoveIndex(ARC_Handler *handler, uint32_t *index); + +/** + * @brief calls provided function on each element in handler + * + * @param handler ARC_Handler to iterate through + * @param datafn function that will be called on each element of data + */ +void ARC_Handler_Iterate(ARC_Handler *handler, ARC_Handler_DataFn datafn); + +/** + * @brief clears all data from handler and puts it in trash vector + * + * @param handler ARC_Handler to clear data from + */ +void ARC_Handler_Clear(ARC_Handler *handler); + +/** + * @brief clears trash from handler + * + * @note cleanfn's main purpose is to help manage memory + * + * @param handler ARC_Handler to remove trash from + * @param cleanfn user provided function to run on trash before clearing from trash vector + * can be null + */ +void ARC_Handler_Clean(ARC_Handler *handler, ARC_Handler_CleanDataFn cleanfn); + +/** + * @brief gets size of vector + * + * @param handler ARC_handler to get size from + */ +uint32_t *ARC_Handler_Size(ARC_Handler *handler); + +#ifdef __cplusplus +} +#endif + +#endif //ARC_STD_HANDLER_H_ \ No newline at end of file diff --git a/include/arc/std/hashtable.h b/include/arc/std/hashtable.h new file mode 100644 index 0000000..41c7ab3 --- /dev/null +++ b/include/arc/std/hashtable.h @@ -0,0 +1,121 @@ +#ifndef ARC_STD_HASHTABLE_H_ +#define ARC_STD_HASHTABLE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** + * @brief the arc hashtable data type +*/ +typedef struct ARC_Hashtable ARC_Hashtable; + +/** + * @brief a node that contains a key-value reference along with a linked list like node +*/ +typedef struct ARC_HashtableNode ARC_HashtableNode; +struct ARC_HashtableNode { + void *key; + size_t keysize; + + void *data; + ARC_HashtableNode *node; +}; + +/** + * @brief a hashing function ptr + * + * @param key value to hash + * @param keysize should be sizeof(key) before key is a void ptr + * @param hashval value of hash, does not need to be within range of buckets + * + * @return 0 on sucess, ARC_ERRNO_ on fail +*/ +typedef int32_t (* ARC_Hashtable_Hash)(void *key, size_t *keysize, uint32_t *hashval); + +/** + * @brief key comparison function ptr + * + * @param key1 first key + * @param key2 second key + * + * @return 0 on sucess +*/ +typedef int32_t (* ARC_Hashtable_KeyCompare)(void *key1, size_t *key1size, void *key2, size_t *key2size); + +/** + * @brief callback to allow memory freeing of nodes + * + * @param node node to be destroyed + * @param userdata any data the user wants to access in the callback + * + * @return 0 on sucess, ARC_ERRNO_ on fail +*/ +typedef int32_t (* ARC_HashtableNode_DestroyExternal)(ARC_HashtableNode *node, void *userdata); + +/** + * @brief cteates ARC_Hashtable type + * + * @param htable where to store data + * @param bucketsize num of nodes to create in inital table + * @param hash hashing function to be used, if set to NULL, CRC32 will be used + * @param compare comparison functon for checking keys, if set to NULL, addresses will be compared +*/ +void ARC_Hashtable_Create(ARC_Hashtable **htable, uint32_t bucketsize, ARC_Hashtable_Hash hash, ARC_Hashtable_KeyCompare compare); + +/** + * @brief destroys ARC_Hashtable type + * + * @param htable htable that will be destroyed + * @param external function to allow external freeing of nodes, can be NULL + * @param userdata any data the user wants access to in the callback + * + * @return 0 on sucess, ARC_ERRNO_ on fail +*/ +int32_t ARC_Hashtable_Destroy(ARC_Hashtable *htable, ARC_HashtableNode_DestroyExternal external, void *userdata); + +/** + * @brief adds value to hastable + * + * @param htable ARC_Hashtable to add to + * @param key key for node that is being added + * @param keysize sizeof key before it is passed into a void * + * @param data data for node that is being added + * + * @return 0 on sucess, ARC_ERRNO_ on fail +*/ +int32_t ARC_Hashtable_Add(ARC_Hashtable *htable, void *key, size_t keysize, void *data); + +/** + * @brief gets value from hashtable by key + * + * @param htable table to get value from + * @param key key to get value from table + * @param keysize sizeof key before it is passed into a void * + * @param data data retrieved from table + * + * @return 0 on sucess, ARC_ERRNO_ on fail +*/ +int32_t ARC_Hashtable_Get(ARC_Hashtable *htable, void *key, size_t keysize, void **data); + +/** + * @brief removes value from hashtable + * + * @param htable ARC_Hashtable to remove from + * @param key key of data to remove from hash table + * @param keysize sizeof key before it is passed into a void * + * @param external function to allow external freeing of data, can be NULL + * @param userdata any data the user wants access to in the callback +* + * @return 0 on sucess, ARC_ERRNO_ on fail +*/ +int32_t ARC_Hashtable_Remove(ARC_Hashtable *htable, void *key, size_t keysize, ARC_HashtableNode_DestroyExternal external, void *userdata); + +#ifdef __cplusplus +} +#endif + +#endif //ARC_STD_HASHTABLE_H_ \ No newline at end of file diff --git a/include/arc/std/io.h b/include/arc/std/io.h new file mode 100644 index 0000000..fec28dc --- /dev/null +++ b/include/arc/std/io.h @@ -0,0 +1,26 @@ +#ifndef ARC_STD_IO_H_ +#define ARC_STD_IO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @brief get string and size from file + * + * @param path a string to path of target file + * @param data pointer to where string will be created + * this will need to be freed once done using it + * @param size size of string + * + * @return int 0 on success, ARC_ERRNO_ on fail +*/ +int32_t ARC_IO_FileToStr(const char *path, char **data, uint64_t *size); + +#ifdef __cplusplus +} +#endif + +#endif //ARC_STD_IO_H_ \ No newline at end of file diff --git a/include/arc/std/string.h b/include/arc/std/string.h new file mode 100644 index 0000000..86db75c --- /dev/null +++ b/include/arc/std/string.h @@ -0,0 +1,104 @@ +#ifndef ARC_STD_STRING_H_ +#define ARC_STD_STRING_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @brief substring position within a string +*/ +typedef struct ARC_StringSubstr { + uint64_t index; + uint64_t length; +} ARC_StringSubstr; + +/** + * @brief substring position within a string, stored as 4 bytes +*/ +typedef struct ARC_StringSubstr32_t { + uint32_t index; + uint32_t length; +} ARC_StringSubstr32_t; + +/** + * @brief substring position within a string, stored as 1 byte +*/ +typedef struct ARC_StringSubstr8_t { + uint8_t index; + uint8_t length; +} ARC_StringSubstr8_t; + +/** + * @brief checks if string is alphabetic + * + * @param val string to check + * @param length length of string to check + * + * @return 1 if alphabetic, 0 if not alphabetic + */ +uint8_t ARC_String_Alpha(char *val, uint64_t length); + +/** + * @brief converst substring from string to uint64_t + * + * @param data string to get substring from + * @param substr substring to convert to long + * + * @return uint64_t converted number +*/ +uint64_t ARC_String_ToUint64_t(const char *data, ARC_StringSubstr *substr); + +/** + * @brief takes a given string, and assigns index and length for position of first matching substring + * + * @param data the string to find substring in + * @param substr the string to find + * @param index the index of substring within the string will be ~uint64_t if not found + * + * @return int ARC_ERRNO_ error code + */ +int32_t ARC_String_Find(char *data, char *substr, uint64_t *index); + +/** + * @brief takes a given string, and assigns index and length for position of last matching substring + * + * @param data the string to find substring in + * @param substr the string to find + * @param index the index of substring within the string will be ~uint64_t if not found + * + * @return int ARC_ERRNO_ error code + */ +int32_t ARC_String_FindBack(char *data, char *substr, uint64_t *index); + +/** + * @brief strips the ends based on a given substing + * + * @param data the string to find the substring in + * @param substr the substring to strip ends by, defaults to " " if NULL + * @param subdata the substring of data, will use given substring data, or strlen if length == 0 + * also will hold the return values + * + * @return int ARC_ERRNO_ error code +*/ +int32_t ARC_StringSubstr_StripEnds(char *data, char *substr, ARC_StringSubstr *subdata); + +/** + * @brief strips the ends based on a given substing + * + * @param data the string to find the substring in + * @param substr the substring to strip ends by, defaults to " " if NULL + * @param subdata the substring of data, will use given substring data, or strlen if length == 0 + * also will hold the return values + * + * @return int ARC_ERRNO_ error code +*/ +int32_t ARC_StringSubstr_StripWhitespaceEnds(char *data, ARC_StringSubstr *subdata); + +#ifdef __cplusplus +} +#endif + +#endif //ARC_STD_STRING_H_ \ No newline at end of file diff --git a/include/arc/std/vector.h b/include/arc/std/vector.h new file mode 100644 index 0000000..ca34029 --- /dev/null +++ b/include/arc/std/vector.h @@ -0,0 +1,82 @@ +#ifndef ARC_STD_VECTOR_H_ +#define ARC_STD_VECTOR_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @brief a dynamic array type + */ +typedef struct ARC_Vector ARC_Vector; + +/** + * @brief data comparison function ptr + * + * @param a first data struct + * @param b second data struct + * + * @return 0 when a == b +*/ +typedef int8_t (* ARC_Vector_CompareDataFn)(void *a, void *b); + +/** + * @brief creates ARC_Vector type + * + * @param config ARC_Vector to initialize + */ +void ARC_Vector_Create(ARC_Vector **vector, uint32_t dataSize); + +/** + * @brief destroyes ARC_Vector type + */ +void ARC_Vector_Destroy(ARC_Vector *vector); + +/** + * @brief adds value to vector + * + * @param vector ARC_Vector to add to + * @param data data that is being added + */ +void ARC_Vector_Add(ARC_Vector *vector, void *data); + +/** + * @brief remove from ARC_Vector + * + * @param vector ARC_Vector to remove from + * @param data data that is being removed + */ +void ARC_Vector_Remove(ARC_Vector *vector, void *data, ARC_Vector_CompareDataFn compare); + +/** + * @brief remove from ARC_Vector + * + * @param vector ARC_Vector to remove from + * @param index index of data that is being removed + */ +void ARC_Vector_RemoveIndex(ARC_Vector *vector, uint32_t *index); + +/** + * @brief gets size of vector + * + * @param vector ARC_Vector to get size from + */ +uint32_t *ARC_Vector_Size(ARC_Vector *vector); + +/** + * @brief gets data from ARC_Vector at position index + * + * @param vector ARC_Vector to get data from + * @param index position of data in ARC_Vector + * + * @return pointer to data on success, NULL on fail + */ +void *ARC_Vector_Get(ARC_Vector *vector, uint32_t *index); + +#ifdef __cplusplus +} +#endif + +#endif //ARC_STD_VECTOR_H_ \ No newline at end of file diff --git a/src/std/config.c b/src/std/config.c new file mode 100644 index 0000000..678c81e --- /dev/null +++ b/src/std/config.c @@ -0,0 +1,417 @@ +#include "arc/std/config.h" + +#include "arc/std/errno.h" +#include "arc/std/io.h" +#include +#include +#include +#include + +struct ARC_Config { + ARC_Hashtable *currgroup; + + ARC_Hashtable *groups; + ARC_Hashtable *keys; +}; + +typedef struct ARC_ConfigKey { + ARC_ConfigKeyRead Read; + ARC_ConfigKeyDelete Delete; +} ARC_ConfigKey; + +typedef struct ARC_ConfigTypeTemplate { + ARC_ConfigKey *key; + + void *data; +} ARC_ConfigTypeTemplate; + +typedef struct ARC_DeleteUserData { + ARC_Config *config; + + const char* data; + ARC_StringSubstr *subdata; +} ARC_DeleteUserData; + +int32_t ARC_Config_KeyComp(void *key1, size_t *key1size, void *key2, size_t *key2size){ + if(*key1size - *key2size){ return -1; } + return strncmp((const char *)key1, (const char *)key2, *key1size); +} + +int32_t ARC_ConfigKey_Add(ARC_Config *config, char *type, ARC_ConfigKeyRead keyRead, ARC_ConfigKeyDelete keyDelete){ + ARC_ConfigKey *temp = (ARC_ConfigKey *)malloc(sizeof(ARC_ConfigKey)); + temp->Read = keyRead; + temp->Delete = keyDelete; + return ARC_Hashtable_Add(config->keys, (void *)type, strlen(type), (void *)temp); +} + +int32_t ARC_ConfigKey_Destroy(ARC_HashtableNode *node, void *userdata){ + if(!node->data){ return ARC_ERRNO_NULL; } + free((ARC_ConfigKey *)node->data); + return 0; +} + +int32_t ARC_ConfigGroup_Create(ARC_Config *config, const char *name){ + ARC_Hashtable *data; + ARC_Hashtable_Create(&data, ARC_GROUP_DATA_BUCKET_SIZE, NULL, ARC_Config_KeyComp); + + char *group = (char *) malloc(sizeof(char) * strlen(name)); + strncpy(group, name, strlen(name)); + + return ARC_Hashtable_Add(config->groups, (void *)group, strlen(name), (void *)data); +} + +int32_t ARC_ConfigGroupNode_Destroy(ARC_HashtableNode *node, void *userdata){ + free((char *)node->key); + + ARC_ConfigTypeTemplate *temp = (ARC_ConfigTypeTemplate *)node->data; + if(temp->key){ + ARC_DeleteUserData *deldata = (ARC_DeleteUserData *)userdata; + temp->key->Delete(deldata->config, deldata->data, deldata->subdata, temp->data); + } + + free(temp); + return 0; +} + +int32_t ARC_ConfigGroup_Destroy(ARC_HashtableNode *group, void *userdata){ + free((char *)group->key); + return ARC_Hashtable_Destroy((ARC_Hashtable *)group->data, ARC_ConfigGroupNode_Destroy, userdata); +} + +int32_t ARC_Config_Create(ARC_Config **config, ARC_ConfigKey_AddFunc keysAdd){ + *config = (ARC_Config *) malloc(sizeof(ARC_Config)); + (*config)->currgroup = NULL; + + ARC_Hashtable *groups; + ARC_Hashtable_Create(&groups, ARC_GROUP_BUCKET_SIZE, NULL, ARC_Config_KeyComp); + (*config)->groups = groups; + ARC_ConfigGroup_Create(*config, ""); + + ARC_Hashtable *keys; + ARC_Hashtable_Create(&keys, ARC_KEY_BUCKET_SIZE, NULL, ARC_Config_KeyComp); + (*config)->keys = keys; + +#ifdef ARC_DEFAULT_CONFIG + ARC_Defaults_ConfigKey_Create(*config); +#endif + + if(keysAdd){ keysAdd(*config); } + + return 0; +} + +int32_t ARC_Config_Destroy(ARC_Config *config){ + ARC_DeleteUserData deldata = { .config = config, .data = NULL, .subdata = NULL }; + int32_t err = ARC_Hashtable_Destroy(config->groups, ARC_ConfigGroup_Destroy, (void *)&deldata); + if(err){ return err; } + + err = ARC_Hashtable_Destroy(config->keys, ARC_ConfigKey_Destroy, NULL); + if(err){ return err; } + + free(config); + return 0; +} + +int32_t ARC_Config_Get(ARC_Config *config, char *keyname, void **value){ + uint64_t len = 0; + ARC_ConfigTypeTemplate *temp; + + int32_t err = ARC_String_Find(keyname, (char *)"::", &len); + if(err){ return err; } + + if(len != ~((uint64_t)0)){ + char group[len + 1]; + strncpy(group, keyname, len); + group[len] = '\0'; + + ARC_Hashtable *currgroup = config->currgroup; + err = ARC_Config_SetGroup(config, group); + if(err){ return err; } + + char *namestr = (len + 2) + keyname; + char name[strlen(namestr)]; + strcpy(name, namestr); + + err = ARC_Hashtable_Get(config->currgroup, (void *)name, strlen(name), (void **)&temp); + if(err){ return err; } + + config->currgroup = currgroup; + *value = temp->data; + return 0; + } + + err = ARC_Hashtable_Get(config->currgroup, (void *)keyname, strlen(keyname), (void **)&temp); + if(err){ return err; } + + *value = temp->data; + return 0; +} + +int32_t ARC_Config_Remove(ARC_Config *config, const char *keyname, const char* data, ARC_StringSubstr *subdata){ + ARC_DeleteUserData deldata = { .config = config, .data = data, .subdata = subdata }; + printf("data: %s\n\n", data); + return ARC_Hashtable_Remove(config->currgroup, (void *)keyname, strlen(keyname), ARC_ConfigGroupNode_Destroy, (void *)&deldata); +} + +int32_t ARC_Config_SetGroup(ARC_Config *config, char *groupstr){ + int err = ARC_Hashtable_Get(config->groups, groupstr, strlen(groupstr), (void **)&(config->currgroup)); + if(err && err != ARC_ERRNO_NULL){ return err; } + + if(!(config->currgroup)){ + err = ARC_ConfigGroup_Create(config, groupstr); + if(err){ return err; } + + err = ARC_Hashtable_Get(config->groups, groupstr, strlen(groupstr), (void **)&(config->currgroup)); + if(err){ return err; } + } + + return 0; +} + +void ARC_ConfigPath_Create(char *data, ARC_StringSubstr *subpath, char **path){ + if(*(data + subpath->index) == '~'){ + *path = (char *) malloc(sizeof(char) * (subpath->length + strlen(ARC_HOME_PATH) + 1)); + strcpy(*path, ARC_HOME_PATH); + strncpy((*path) + strlen(ARC_HOME_PATH) - 1, data + subpath->index, subpath->length); + (*path)[subpath->length + strlen(ARC_HOME_PATH)] = '\0'; + return; + } + + *path = (char *) malloc(sizeof(char) * (subpath->length + 1)); + strncpy(*path, data + subpath->index, subpath->length); + (*path)[subpath->length] = '\0'; +} + +void ARC_ConfigPath_Destroy(char *url){ + free(url); +} + +int32_t ARC_Config_Recurse(ARC_Config *config, char *data, uint64_t *size, char *groupstr, ARC_StringSubstr *subkey, uint8_t *command); + +int32_t ARC_ConfigKey_Command(ARC_Config *config, char *data, uint64_t *size, ARC_StringSubstr *subkey){ + ARC_StringSubstr subcommand = { subkey->index + 1, 0 }; + int32_t err = ARC_String_Find(data + subcommand.index, " ", &(subcommand.length)); + if(err){ return err; } + if(subcommand.length == ~((uint64_t)0)){ return ARC_ERRNO_DATA; } + subkey->index += subcommand.length + 1; + + ARC_StringSubstr_StripEnds(data, NULL, &subcommand); + if(strncmp("load", data + subcommand.index, strlen("load")) && strncmp("unload", data + subcommand.index, strlen("unload"))){ return ARC_ERRNO_DATA; } + + ARC_StringSubstr subpath = { subkey->index, 0 }; + err = ARC_String_Find(data + subpath.index, (char *)"\"", &(subpath.index)); + if(err){ return err; } + if(subpath.length == ~((uint64_t)0)){ return ARC_ERRNO_DATA; } + subkey->index += subpath.length + 2; //we want to skip over the first \" that is why it is 2 not 1 + + subpath = (ARC_StringSubstr) { subkey->index, 0 }; + err = ARC_String_Find(data + subpath.index, (char *)"\"", &(subpath.length)); + if(err){ return err; } + if(subpath.length == ~((uint64_t)0)){ return ARC_ERRNO_DATA; } + subkey->index += subpath.length + 1; + + char *path; + ARC_ConfigPath_Create(data, &subpath, &path); + + if (!strncmp( "load", data + subcommand.index, strlen( "load"))){ err = ARC_Config_FileIO(config, path, ARC_CONFIG_FILE_IO_LOAD ); } + else if(!strncmp("unload", data + subcommand.index, strlen("unload"))){ err = ARC_Config_FileIO(config, path, ARC_CONFIG_FILE_IO_UNLOAD); } + else { return ARC_ERRNO_DATA; } + + ARC_ConfigPath_Destroy(path); + return err; +} + +int32_t ARC_ConfigKey_Comment(ARC_Config *config, char *data, uint64_t *size, ARC_StringSubstr *subkey){ + uint64_t commentlen = 0; + if(data[subkey->index + 1] == '*'){ + int32_t err = ARC_String_Find(data + subkey->index, (char *)"*/", &commentlen); + if(err){ return err; } + + subkey->index += commentlen + 1; + return 0; + } + + int32_t err = ARC_String_Find(data + subkey->index, (char *)"\n", &commentlen); + if(err){ return err; } + + subkey->index += commentlen + 1; + return 0; +} + +int32_t ARC_ConfigKey_Group(ARC_Config *config, char *data, uint64_t *size, ARC_StringSubstr *subkey, uint8_t *command){ + ARC_StringSubstr subgroup = { subkey->index, 0 }; + int32_t err = ARC_String_Find(data + subgroup.index, "{", &(subgroup.length)); + if(err){ return err; } + if(subgroup.length == ~((uint64_t)0)){ return ARC_ERRNO_DATA; } + subkey->index += subgroup.length + 1; + + ARC_StringSubstr_StripEnds(data, NULL, &subgroup); + + char groupstr[subgroup.length + 1]; + strncpy(groupstr, data + subgroup.index, subgroup.length); + groupstr[subgroup.length] = '\0'; + + return ARC_Config_Recurse(config, data, size, groupstr, subkey, command); +} + +int32_t ARC_ConfigKey_Load(ARC_Config *config, char *data, uint64_t *size, char *keyname, ARC_StringSubstr *subkey){ + ARC_ConfigKey *key; + int32_t err = ARC_Hashtable_Get(config->keys, (void *)keyname, strlen(keyname), (void **)&key); + if(err){ return err; } + + ARC_StringSubstr subname = { subkey->index, 0 }; + err = ARC_String_Find(data + subname.index, (char *)"=", &(subname.length)); + if(err){ return err; } + if(subname.length == ~((uint64_t)0)){ return ARC_ERRNO_DATA; } + subkey->index += subname.length + 1; + + ARC_StringSubstr_StripEnds(data, NULL, &subname); + + ARC_StringSubstr subvalue = { subkey->index, 0 }; + err = ARC_String_Find(data + subvalue.index, (char *)";", &(subvalue.length)); + if(err){ return err; } + if(subvalue.length == ~((uint64_t)0)){ return ARC_ERRNO_DATA; } + subkey->index += subvalue.length + 1; + + ARC_StringSubstr_StripEnds(data, NULL, &subvalue); + ARC_ConfigTypeTemplate *templateVal = NULL; + + char *name = malloc(sizeof(char) * subname.length + 1); + strncpy(name, data + subname.index, sizeof(char) * subname.length); + name[subname.length] = '\0'; + + templateVal = (ARC_ConfigTypeTemplate *) malloc(sizeof(ARC_ConfigTypeTemplate)); + templateVal->key = NULL; + templateVal->data = ARC_Config_GetReference(config, data, &subvalue); + + if(!templateVal->data){ + err = key->Read(config, data, &subvalue, &(templateVal->data)); + if(err){ return err; } + templateVal->key = key; + } + + return ARC_Hashtable_Add(config->currgroup, (void *)name, strlen(name), (void *)templateVal); +} + +int32_t ARC_ConfigKey_Unload(ARC_Config *config, char *data, uint64_t *size, char *keyname, ARC_StringSubstr *subkey){ + ARC_StringSubstr subname = { subkey->index, 0 }; + int32_t err = ARC_String_Find(data + subname.index, (char *)"=", &(subname.length)); + if(err){ return err; } + if(subname.length == ~((uint64_t)0)){ return ARC_ERRNO_DATA; } + subkey->index += subname.length + 1; + + ARC_StringSubstr_StripEnds(data, NULL, &subname); + char name[subname.length + 1]; + strncpy(name, data + subname.index, subname.length); + name[subname.length] = '\0'; + + subname = (ARC_StringSubstr){ subkey->index, 0 }; + err = ARC_String_Find(data + subname.index, (char *)";", &(subname.length)); + if(err){ return err; } + if(subname.length == ~((uint64_t)0)){ return ARC_ERRNO_DATA; } + subkey->index += subname.length + 1; + + return ARC_Config_Remove(config, name, data, &subname); +} + +int32_t ARC_Config_Recurse(ARC_Config *config, char *data, uint64_t *size, char *groupstr, ARC_StringSubstr *subkey, uint8_t *command){ + int32_t err = ARC_Config_SetGroup(config, groupstr); + if(err){ return err; } + ARC_Hashtable *group = config->currgroup; + + while(subkey->index < *size){ + if(data[subkey->index] == ' ' || data[subkey->index] == '\n' || data[subkey->index] == '\t' || data[subkey->index] == '\r'){ + subkey->index++; + continue; + } + + if(data[subkey->index] == '}'){ + config->currgroup = NULL; + subkey->index++; + return 0; + } + + if(data[subkey->index] == '#'){ + err = ARC_ConfigKey_Command(config, data, size, subkey); + if(err){ return err; } + continue; + } + + if(data[subkey->index] == '/'){ + err = ARC_ConfigKey_Comment(config, data, size, subkey); + if(err){ return err; } + continue; + } + + err = ARC_String_Find(data + subkey->index, (char *)" ", &(subkey->length)); + if(err){ return err; } + if(subkey->length == ~((uint64_t)0)){ return 0; } + + if(!(config->currgroup)){ + config->currgroup = group; + } + + char keyname[subkey->length + 1]; + strncpy(keyname, data + subkey->index, subkey->length); + keyname[subkey->length] = '\0'; + subkey->index += subkey->length + 1; + + if(subkey->length == strlen("group") && !strcmp(keyname, "group")){ + err = ARC_ConfigKey_Group(config, data, size, subkey, command); + if(err){ return err; } + continue; + } + + if(*command == ARC_CONFIG_FILE_IO_LOAD){ + err = ARC_ConfigKey_Load(config, data, size, keyname, subkey); + if(err){ return err; } + continue; + } + + if(*command == ARC_CONFIG_FILE_IO_UNLOAD){ + err = ARC_ConfigKey_Unload(config, data, size, keyname, subkey); + if(err){ return err;} + continue; + } + + return ARC_ERRNO_DATA; + } + + config->currgroup = group; + return 0; +} + +int32_t ARC_Config_FileIO(ARC_Config *config, const char *pathstr, uint8_t command){ + char *path, *data; + uint64_t size; + ARC_StringSubstr subpath = { 0, strlen(pathstr) }; + ARC_ConfigPath_Create((char *)pathstr, &subpath, &path); + + int32_t err = ARC_IO_FileToStr(path, &data, &size); + if(err){ + ARC_DEBUG_LOG(err, "ARC_IO_FileToStr(%s, &data, &size);\n", path); + ARC_ConfigPath_Destroy(path); + return err; + } + + ARC_ConfigPath_Destroy(path); + + ARC_StringSubstr subkey = { 0, 0 }; + err = ARC_Config_Recurse(config, data, &size, "", &subkey, &command); + if(err){ return err; } + + free(data); + return 0; +} + +void *ARC_Config_GetReference(ARC_Config *config, char *data, ARC_StringSubstr *subdata){ + if(ARC_String_Alpha(data + subdata->index, 1) && *(data + subdata->index) != ':'){ return NULL; } + + char refname[subdata->length + 1]; + strncpy(refname, data + subdata->index, subdata->length); + refname[subdata->length] = 0; + + void *value; + int32_t err = ARC_Config_Get(config, refname, &value); + return (err)? NULL : value; +} diff --git a/src/std/defaults/config.c b/src/std/defaults/config.c new file mode 100644 index 0000000..3842690 --- /dev/null +++ b/src/std/defaults/config.c @@ -0,0 +1,116 @@ +#ifdef ARC_DEFAULT_CONFIG + +#include "arc/std/defaults/config.h" + +#include "arc/std/config.h" +#include "arc/std/errno.h" +#include +#include +#include + +int32_t ARC_Defaults_ConfigKey_Create(ARC_Config *config){ + ARC_ConfigKey_Add(config, "uint8_t" , ARC_ConfigKey_Read_Uint8_t , ARC_ConfigKey_Delete_Uint8_t ); + ARC_ConfigKey_Add(config, "int8_t" , ARC_ConfigKey_Read_Int8_t , ARC_ConfigKey_Delete_Int8_t ); +// ARC_ConfigKey_Add(config, "char" , ARC_ConfigKey_Read_Char , ARC_ConfigKey_Delete_Char ); + ARC_ConfigKey_Add(config, "uint16_t", ARC_ConfigKey_Read_Uint16_t, ARC_ConfigKey_Delete_Uint16_t); + ARC_ConfigKey_Add(config, "int16_t" , ARC_ConfigKey_Read_Int16_t , ARC_ConfigKey_Delete_Int16_t ); + ARC_ConfigKey_Add(config, "uint32_t", ARC_ConfigKey_Read_Uint32_t, ARC_ConfigKey_Delete_Uint32_t); + ARC_ConfigKey_Add(config, "int32_t" , ARC_ConfigKey_Read_Int32_t , ARC_ConfigKey_Delete_Int32_t ); + ARC_ConfigKey_Add(config, "int" , ARC_ConfigKey_Read_Int , ARC_ConfigKey_Delete_Int ); + ARC_ConfigKey_Add(config, "uint64_t", ARC_ConfigKey_Read_Uint64_t, ARC_ConfigKey_Delete_Uint64_t); + ARC_ConfigKey_Add(config, "int64_t" , ARC_ConfigKey_Read_Int64_t , ARC_ConfigKey_Delete_Int64_t ); + ARC_ConfigKey_Add(config, "long" , ARC_ConfigKey_Read_Long , ARC_ConfigKey_Delete_Long ); + ARC_ConfigKey_Add(config, "string" , ARC_ConfigKey_Read_String , ARC_ConfigKey_Delete_String ); + return 0; +} + +int32_t ARC_ConfigKey_Read_Uint8_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (uint8_t *) malloc(sizeof(uint8_t)); + *((uint8_t *)(*value)) = (uint8_t) ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_Int8_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (int8_t *) malloc(sizeof(int8_t)); + *((int8_t *)(*value)) = (int8_t) ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_Char(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (char *) malloc(sizeof(char)); + *((char *)(* value)) = (char) *(data + subdata->index); + return 0; +} + +int32_t ARC_ConfigKey_Read_Uint16_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (uint16_t *) malloc(sizeof(uint16_t)); + *((uint16_t *)(*value)) = (uint16_t) ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_Int16_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (int16_t *) malloc(sizeof(int16_t)); + *((int16_t *)(*value)) = (int16_t) ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_Uint32_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (uint32_t *) malloc(sizeof(uint32_t)); + *((uint32_t *)(*value)) = (uint32_t) ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_Int32_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (int32_t *) malloc(sizeof(int32_t)); + *((int32_t *)(*value)) = (int32_t) ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_Int(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (int *) malloc(sizeof(int)); + *((int *)(*value)) = (int) ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_Uint64_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (uint64_t *) malloc(sizeof(uint64_t)); + *((uint64_t *)(*value)) = ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_Int64_t(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (int64_t *) malloc(sizeof(int64_t)); + *((int64_t *)(*value)) = (int64_t) ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_Long(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + *value = (long *) malloc(sizeof(long)); + *((long *)(*value)) = (long) ARC_String_ToUint64_t(data, subdata); + return 0; +} + +int32_t ARC_ConfigKey_Read_String(ARC_Config* config, const char *data, ARC_StringSubstr *subdata, void **value){ + ARC_StringSubstr_StripWhitespaceEnds((char *)data, subdata); + if(data[subdata->index] != '"' || data[subdata->index + subdata->length] != '"'){ return ARC_ERRNO_DATA; } + ARC_StringSubstr_StripEnds((char *)data, (char *)"\"", subdata); + *value = (char *) malloc(sizeof(char) * (subdata->length + 1)); + strncpy((char *)(*value), data + subdata->index, subdata->length); + ((char *)(*value))[subdata->length] = '\0'; + return 0; +} + +int32_t ARC_ConfigKey_Delete_Uint8_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((uint8_t *)value){ free((uint8_t *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Int8_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((int8_t *)value){ free((int8_t *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Char (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((char *)value){ free((char *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Uint16_t(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((uint16_t *)value){ free((uint16_t *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Int16_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((int16_t *)value){ free((int16_t *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Uint32_t(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((uint32_t *)value){ free((uint32_t *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Int32_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((int32_t *)value){ free((int32_t *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Int (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((int *)value){ free((int *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Uint64_t(ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((uint64_t *)value){ free((uint64_t *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Int64_t (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((int64_t *)value){ free((int64_t *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_Long (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((long *)value){ free((long *)value); } return 0; } +int32_t ARC_ConfigKey_Delete_String (ARC_Config* config, const char* data, ARC_StringSubstr *subdata, void *value){ if((char *)value){ free((char *)value); } return 0; } + +#endif //ARC_DEFAULT_CONFIG diff --git a/src/std/handler.c b/src/std/handler.c new file mode 100644 index 0000000..0f4ae1c --- /dev/null +++ b/src/std/handler.c @@ -0,0 +1,68 @@ +#include "arc/std/handler.h" + +#include "arc/std/errno.h" +#include "arc/std/vector.h" +#include + +struct ARC_Handler { + ARC_Vector *data; + ARC_Vector *trash; +}; + +void ARC_Handler_Create(ARC_Handler **handler){ + *handler = (ARC_Handler *) malloc(sizeof(ARC_Handler)); + ARC_Vector_Create(&((*handler)->data), sizeof(void *)); + ARC_Vector_Create(&((*handler)->trash), sizeof(void *)); +} + +void ARC_Handler_Destroy(ARC_Handler *handler, ARC_Handler_CleanDataFn cleanfn){ + ARC_Handler_Clear(handler); + ARC_Handler_Clean(handler, cleanfn); + + ARC_Vector_Destroy(handler->data); + ARC_Vector_Destroy(handler->trash); + + free(handler); +} + +void ARC_Handler_Add(ARC_Handler *handler, void *data){ + ARC_Vector_Add(handler->data, data); +} + +int8_t ARC_Handler_RemoveCompareFn(void *a, void *b){ return a == b; } + +void ARC_Handler_Remove(ARC_Handler *handler, void *data){ + ARC_Vector_Remove(handler->data, data, ARC_Handler_RemoveCompareFn); + ARC_Vector_Add(handler->trash, data); +} + +void ARC_Handler_RemoveIndex(ARC_Handler *handler, uint32_t *index){ + void *data = ARC_Vector_Get(handler->data, index); + ARC_Vector_RemoveIndex(handler->data, index); + ARC_Vector_Add(handler->trash, data); +} + +void ARC_Handler_Iterate(ARC_Handler *handler, ARC_Handler_DataFn datafn){ + for(uint32_t i = 0; i < *ARC_Vector_Size(handler->data); i++){ + datafn(ARC_Vector_Get(handler->data, &i)); + } +} + +void ARC_Handler_Clear(ARC_Handler *handler){ + while(*ARC_Vector_Size(handler->data)){ + ARC_Handler_Remove(handler, 0); + } +} + +void ARC_Handler_Clean(ARC_Handler *handler, ARC_Handler_CleanDataFn cleanfn){ + uint32_t i = 0; + while(*ARC_Vector_Size(handler->trash)){ + void *data = ARC_Vector_Get(handler->trash, &i); + cleanfn(data); + ARC_Vector_RemoveIndex(handler->trash, &i); + } +} + +uint32_t *ARC_Handler_Size(ARC_Handler *handler){ + return ARC_Vector_Size(handler->data); +} diff --git a/src/std/hashtable.c b/src/std/hashtable.c new file mode 100644 index 0000000..d7a511d --- /dev/null +++ b/src/std/hashtable.c @@ -0,0 +1,167 @@ +#include "arc/std/hashtable.h" + +#include "arc/std/errno.h" +#include +#include + +struct ARC_Hashtable { + uint32_t size; + ARC_HashtableNode **nodes; + ARC_Hashtable_Hash hash; + ARC_Hashtable_KeyCompare compare; +}; + +int32_t CRC32(void *key, size_t *keysize, uint32_t *hashval){ + *hashval = 0xffffffff; + + for(size_t i = 0; i < *keysize; i++){ + uint8_t value = *(((uint8_t *)key) + i); + for(uint8_t j = 0; j < 8; j++){ + uint8_t flag = (uint8_t)((value ^ *hashval) & 1); + *hashval >>= 1; + if(flag){ *hashval ^= 0xEDB888320; } + value >>= 1; + } + } + + *hashval = ~*hashval; + return 0; +} + +int32_t ARC_Default_Key_Compare(void *key1, size_t *key1size, void *key2, size_t *key2size){ + return key1 - key2; +} + +void ARC_HashtableNode_Create(ARC_HashtableNode **node, void *key, size_t *keysize, void *data){ + *node = (ARC_HashtableNode *) malloc(sizeof(ARC_HashtableNode)); + (*node)->key = key; + (*node)->keysize = *keysize; + (*node)->data = data; + (*node)->node = NULL; +} + +int32_t ARC_HashtableNode_Destroy(ARC_HashtableNode *node, ARC_HashtableNode_DestroyExternal external, void *userdata){ + if(node == NULL){ return 0; } + ARC_HashtableNode_Destroy(node->node, external, userdata); + + if(external){ + int32_t err = external(node, userdata); + if(err){ return err; } + } + + free(node); + return 0; +} + +void ARC_Hashtable_Create(ARC_Hashtable **htable, uint32_t bucketsize, ARC_Hashtable_Hash hash, ARC_Hashtable_KeyCompare compare){ + *htable = (ARC_Hashtable *) malloc(sizeof(ARC_Hashtable)); + (*htable)->size = bucketsize; + (*htable)->nodes = (ARC_HashtableNode **) calloc(bucketsize, sizeof(ARC_HashtableNode *)); + (*htable)->hash = (hash)? hash : CRC32; + (*htable)->compare = (compare)? compare : ARC_Default_Key_Compare; +} + +int32_t ARC_Hashtable_Destroy(ARC_Hashtable *htable, ARC_HashtableNode_DestroyExternal external, void *userdata){ + for(uint32_t i = 0; i < htable->size; i++){ + if(htable->nodes[i]){ + int32_t err = ARC_HashtableNode_Destroy(htable->nodes[i], external, userdata); + if(err){ return err; } + } + } + + free(htable->nodes); + free(htable); + + return 0; +} + +int32_t ARC_Hashtable_Add(ARC_Hashtable *htable, void *key, size_t keysize, void *data){ + uint32_t size = 0; + int32_t err = htable->hash(key, &keysize, &size); + if(err){ return err; } + + ARC_HashtableNode *bucket = htable->nodes[size % htable->size]; + if(!bucket){ + ARC_HashtableNode_Create(&bucket, key, &keysize, data); + htable->nodes[size % htable->size] = bucket; + return 0; + } + + if(!htable->compare(bucket->key, &bucket->keysize, key, &keysize)){ return ARC_ERRNO_EXISTS; } + + while(bucket->node){ + if(!htable->compare(bucket->node->key, &bucket->node->keysize, key, &keysize)){ return ARC_ERRNO_EXISTS; } + bucket = bucket->node; + } + + ARC_HashtableNode_Create(&(bucket->node), key, &keysize, data); + return 0; +} + +int32_t ARC_Hashtable_Get(ARC_Hashtable *htable, void *key, size_t keysize, void **data){ + uint32_t size = 0; + int32_t err = htable->hash(key, &keysize, &size); + if(err){ return err; } + + ARC_HashtableNode *bucket = htable->nodes[size % htable->size]; + if(!bucket){ + *data = NULL; + return ARC_ERRNO_NULL; + } + + if(!htable->compare(bucket->key, &bucket->keysize, key, &keysize)){ + *data = bucket->data; + return 0; + } + + while(bucket->node){ + if(!htable->compare(bucket->node->key, &bucket->node->keysize, key, &keysize)){ + *data = bucket->node->data; + return 0; + } + bucket = bucket->node; + } + + return ARC_ERRNO_NULL; +} + +int32_t ARC_Hashtable_Remove(ARC_Hashtable *htable, void *key, size_t keysize, ARC_HashtableNode_DestroyExternal external, void *userdata){ + uint32_t size = 0; + int32_t err = htable->hash(key, &keysize, &size); + if(err){ return err; } + + ARC_HashtableNode *bucket = htable->nodes[size % htable->size]; + if(!bucket){ return ARC_ERRNO_NULL; } + + if(!htable->compare(bucket->key, &bucket->keysize, key, &keysize)){ + ARC_HashtableNode *temp = bucket; + htable->nodes[size % htable->size] = bucket->node; + + if(external){ + err = external(temp, userdata); + if(err){ return err; } + } + + free(temp); + return 0; + } + + while(bucket->node){ + if(!htable->compare(bucket->node->key, &bucket->node->keysize, key, &keysize)){ + ARC_HashtableNode *temp = bucket->node; + bucket->node = bucket->node->node; + + if(external){ + err = external(temp, userdata); + if(err){ return err; } + } + + free(temp); + return 0; + } + + bucket = bucket->node; + } + + return ARC_ERRNO_NULL; +} diff --git a/src/std/io.c b/src/std/io.c new file mode 100644 index 0000000..16b57a2 --- /dev/null +++ b/src/std/io.c @@ -0,0 +1,28 @@ +#include "arc/std/io.h" + +#include "arc/std/errno.h" +#include +#include + +int32_t ARC_IO_FileToStr(const char *path, char **data, uint64_t *size){ + FILE *file = fopen(path, "rb"); + if(!file){ return ARC_ERRNO_NULL; } + + fseek(file, 0L, SEEK_END); + *size = ftell(file); + rewind(file); + + *data = (char *) calloc(1, *size + 1); + if(!*data){ + fclose(file); + return ARC_ERRNO_NULL; + } + + if(1 != fread(*data, *size, 1, file)){ + fclose(file); + return ARC_ERRNO_COPY; + } + + fclose(file); + return 0; +} diff --git a/src/std/string.c b/src/std/string.c new file mode 100644 index 0000000..1bab3e6 --- /dev/null +++ b/src/std/string.c @@ -0,0 +1,115 @@ +#include "arc/std/string.h" + +#include "arc/std/errno.h" +#include +#include + +uint8_t ARC_String_Alpha(char *val, uint64_t length){ + for(; length; length--){ + if(val[length - 1] >= 'a' && val[length - 1] <= 'z'){ continue; } + if(val[length - 1] >= 'A' && val[length - 1] <= 'Z'){ continue; } + return 1; + } + return 0; +} + +uint64_t ARC_String_ToUint64_t(const char *data, ARC_StringSubstr *substr){ + char temp[substr->length + 1]; + strncpy(temp, data + substr->index, substr->length); + temp[substr->length] = '\0'; + + return (uint64_t) strtoul(temp, NULL, 10); +} + +int32_t ARC_String_Find(char *data, char *substr, uint64_t *index){ + if(!data || !substr){ return ARC_ERRNO_NULL; } + + uint64_t max = strlen(data); + uint64_t sub = strlen(substr); + if(!max || !sub || sub > max){ return ARC_ERRNO_DATA; } + + max -= sub - 1; + for(uint64_t i = 0; max; i++, max--){ + if(!strncmp(data + i, substr, sub)){ + *index = i; + return 0; + } + } + + *index = ~((uint64_t)0); + return 0; +} + +int32_t ARC_String_FindBack(char *data, char *substr, uint64_t *index){ + if(!data || !substr){ return ARC_ERRNO_NULL; } + + uint64_t max = strlen(data); + uint64_t sub = strlen(substr); + if(!max || !sub || sub > max){ return ARC_ERRNO_DATA; } + + max -= sub - 1; + for(; max; max--){ + if(!strncmp(data + (max - 1), substr, sub)){ + *index = max; + return 0; + } + } + + *index = ~((uint64_t)0); + return 0; +} + +int32_t ARC_StringSubstr_StripEnds(char *data, char *substr, ARC_StringSubstr *subdata){ + if(!subdata){ return ARC_ERRNO_NULL; } + if(!substr){ substr = (char *)" "; } + + subdata->length = (subdata->length)? subdata->length : strlen(data); + uint64_t max = subdata->length; + uint64_t sub = strlen(substr); + if(!max || !sub || sub > max){ return ARC_ERRNO_DATA; } + + max -= sub - 1; + for(; max; max--){ + if(strncmp(data + subdata->index + (max - 1), substr, sub)){ + subdata->length = max; + break; + } + } + + max = subdata->length - (sub - 1); + for(uint64_t i = 0; max; i++, max--){ + if(strncmp(data + subdata->index + i, substr, sub)){ + subdata->index += i; + subdata->length -= i; + return 0; + } + } + + return 0; +} + +int32_t ARC_StringSubstr_StripWhitespaceEnds(char *data, ARC_StringSubstr *subdata){ + if(!subdata){ return ARC_ERRNO_NULL; } + + subdata->length = (subdata->length)? subdata->length : strlen(data); + uint64_t max = subdata->length; + if(!max){ return ARC_ERRNO_DATA; } + + for(; max; max--){ + if(data[subdata->index + (max - 1)] != ' ' && data[subdata->index + (max - 1)] != '\n' && data[subdata->index + (max - 1)] != '\t' && data[subdata->index + (max - 1)] != '\r'){ + subdata->length = max; + break; + } + } + + max = subdata->length; + for(uint64_t i = 0; max; i++, max--){ + if(data[subdata->index + i] != ' ' && data[subdata->index + i] != '\n' && data[subdata->index + i] != '\t' && data[subdata->index + i] != '\r'){ + subdata->index += i; + subdata->length -= i; + return 0; + } + } + + return 0; +} diff --git a/src/std/vector.c b/src/std/vector.c new file mode 100644 index 0000000..b02d03f --- /dev/null +++ b/src/std/vector.c @@ -0,0 +1,109 @@ +#include "arc/std/vector.h" + +#include "arc/std/errno.h" +#include +#include +#include + +struct ARC_Vector { + uint32_t *currentSize, *capacity; + uint32_t *dataSize; + void *data; +}; + +void ARC_Vector_Create(ARC_Vector **vector, uint32_t dataSize){ + *vector = (ARC_Vector *) malloc(sizeof(ARC_Vector)); + (*vector)->currentSize = (uint32_t *) malloc(sizeof(uint32_t)); + (*vector)->capacity = (uint32_t *) malloc(sizeof(uint32_t)); + (*vector)->dataSize = (uint32_t *) malloc(sizeof(uint32_t)); + (*vector)->data = (void *) malloc(dataSize); + + *((*vector)->currentSize) = 0; + *((*vector)->capacity) = 1; + *((*vector)->dataSize) = dataSize; +} + +void ARC_Vector_Destroy(ARC_Vector *vector){ + free(vector->currentSize); + free(vector->capacity); + free(vector->data); + free(vector->dataSize); + free(vector); +} + +void ARC_Vector_Add(ARC_Vector *vector, void *data){ + if(*(vector->currentSize) == ~((uint32_t)0)){ + arc_errno = ARC_ERRNO_OVERFLOW; + return; + } + + if(*(vector->currentSize) == *(vector->capacity)){ + *(vector->capacity) <<= 1; + + vector->data = (void *) realloc(vector->data, *(vector->dataSize) * *(vector->capacity)); + } + + memcpy(vector->data + (*(vector->currentSize) * *(vector->dataSize)), data, *(vector->dataSize)); + ++*(vector->currentSize); +} + +void ARC_Vector_Remove(ARC_Vector *vector, void *data, ARC_Vector_CompareDataFn compare){ + if(!*(vector->currentSize)){ + arc_errno = ARC_ERRNO_DATA; + return; + } + + --*(vector->currentSize); + + if(*(vector->currentSize) != *(vector->capacity) >> 1){ + for(uint32_t i = 0; i <= *(vector->currentSize); i++){ + if(!compare(data, vector->data + (i * *(vector->dataSize)))){ + memcpy(vector->data + (i * *(vector->dataSize)), vector->data + ((i + 1) * *(vector->dataSize)), *(vector->currentSize - i) * *(vector->dataSize)); + return; + } + } + + arc_errno = ARC_ERRNO_DATA; + return; + } + + *(vector->capacity) >>= 1; + void *temp = (void *) malloc(*(vector->dataSize) * *(vector->capacity)); + + for(uint32_t i = 0; i <= *(vector->currentSize); i++){ + if(compare(data, vector->data + (i * *(vector->dataSize)))){ + memcpy(temp, vector->data, i * *(vector->dataSize)); + memcpy(temp + (i * *(vector->dataSize)), vector->data + ((i + 1) * *(vector->dataSize)), *(vector->currentSize - i) * *(vector->dataSize)); + free(vector->data); + vector->data = temp; + return; + } + } + + arc_errno = ARC_ERRNO_DATA; +} + +void ARC_Vector_RemoveIndex(ARC_Vector *vector, uint32_t *index){ + if(!*(vector->currentSize) || *index >= *(vector->currentSize)){ + arc_errno = ARC_ERRNO_DATA; + return; + } + + --*(vector->currentSize); + if(*(vector->currentSize) != *(vector->capacity) >> 1){ + memcpy(vector->data + (*index * *(vector->dataSize)), vector->data + ((*index + 1) * *(vector->dataSize)), *(vector->currentSize - *index) * *(vector->dataSize)); + return; + } + + *(vector->capacity) >>= 1; + void **temp = (void **) malloc(sizeof(void *) * (*(vector->capacity))); + memcpy(temp, vector->data, *index * *(vector->dataSize)); + memcpy(temp + (*index * *(vector->dataSize)), vector->data + ((*index + 1) * *(vector->dataSize)), *(vector->currentSize - *index) * *(vector->dataSize)); + + free(vector->data); + vector->data = temp; +} + +uint32_t *ARC_Vector_Size(ARC_Vector *vector){ return vector->currentSize; } + +void *ARC_Vector_Get(ARC_Vector *vector, uint32_t *index){ return (void *)(uint8_t (*)[*(vector->dataSize)]) vector->data + (*index * *(vector->dataSize)); }

Q=hkuuB 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