Initial commit
This commit is contained in:
commit
a6642911d7
63
.gitattributes
vendored
Normal file
63
.gitattributes
vendored
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
###############################################################################
|
||||||
|
# Set default behavior to automatically normalize line endings.
|
||||||
|
###############################################################################
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set default behavior for command prompt diff.
|
||||||
|
#
|
||||||
|
# This is need for earlier builds of msysgit that does not have it on by
|
||||||
|
# default for csharp files.
|
||||||
|
# Note: This is only used by command line
|
||||||
|
###############################################################################
|
||||||
|
#*.cs diff=csharp
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set the merge driver for project and solution files
|
||||||
|
#
|
||||||
|
# Merging from the command prompt will add diff markers to the files if there
|
||||||
|
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||||
|
# the diff markers are never inserted). Diff markers may cause the following
|
||||||
|
# file extensions to fail to load in VS. An alternative would be to treat
|
||||||
|
# these files as binary and thus will always conflict and require user
|
||||||
|
# intervention with every merge. To do so, just uncomment the entries below
|
||||||
|
###############################################################################
|
||||||
|
#*.sln merge=binary
|
||||||
|
#*.csproj merge=binary
|
||||||
|
#*.vbproj merge=binary
|
||||||
|
#*.vcxproj merge=binary
|
||||||
|
#*.vcproj merge=binary
|
||||||
|
#*.dbproj merge=binary
|
||||||
|
#*.fsproj merge=binary
|
||||||
|
#*.lsproj merge=binary
|
||||||
|
#*.wixproj merge=binary
|
||||||
|
#*.modelproj merge=binary
|
||||||
|
#*.sqlproj merge=binary
|
||||||
|
#*.wwaproj merge=binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# behavior for image files
|
||||||
|
#
|
||||||
|
# image files are treated as binary by default.
|
||||||
|
###############################################################################
|
||||||
|
#*.jpg binary
|
||||||
|
#*.png binary
|
||||||
|
#*.gif binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# diff behavior for common document formats
|
||||||
|
#
|
||||||
|
# Convert binary document formats to text before diffing them. This feature
|
||||||
|
# is only available from the command line. Turn it on by uncommenting the
|
||||||
|
# entries below.
|
||||||
|
###############################################################################
|
||||||
|
#*.doc diff=astextplain
|
||||||
|
#*.DOC diff=astextplain
|
||||||
|
#*.docx diff=astextplain
|
||||||
|
#*.DOCX diff=astextplain
|
||||||
|
#*.dot diff=astextplain
|
||||||
|
#*.DOT diff=astextplain
|
||||||
|
#*.pdf diff=astextplain
|
||||||
|
#*.PDF diff=astextplain
|
||||||
|
#*.rtf diff=astextplain
|
||||||
|
#*.RTF diff=astextplain
|
363
.gitignore
vendored
Normal file
363
.gitignore
vendored
Normal file
@ -0,0 +1,363 @@
|
|||||||
|
## 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/master/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/
|
||||||
|
[Oo]ut/
|
||||||
|
[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
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.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 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/
|
||||||
|
|
||||||
|
# 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
|
31
JacksEscape.sln
Normal file
31
JacksEscape.sln
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.9.34622.214
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JacksEscape", "JacksEscape.vcxproj", "{C7225F7B-40C6-4C57-98A9-F7D751A53D28}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Release|x64.Build.0 = Release|x64
|
||||||
|
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{C7225F7B-40C6-4C57-98A9-F7D751A53D28}.Release|x86.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {366A3442-CF71-45E8-9C4F-D2BCB7223B10}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
144
JacksEscape.vcxproj
Normal file
144
JacksEscape.vcxproj
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>17.0</VCProjectVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectGuid>{c7225f7b-40c6-4c57-98a9-f7d751a53d28}</ProjectGuid>
|
||||||
|
<RootNamespace>JacksEscape</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="util\minmax.h" />
|
||||||
|
<ClInclude Include="util\queue.h" />
|
||||||
|
<ClInclude Include="util\tree.h" />
|
||||||
|
<ClInclude Include="util\tree_internal.h" />
|
||||||
|
<ClInclude Include="util\vector.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="util\queue.c" />
|
||||||
|
<ClCompile Include="util\tree.c" />
|
||||||
|
<ClCompile Include="util\vector.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
48
JacksEscape.vcxproj.filters
Normal file
48
JacksEscape.vcxproj.filters
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="源文件">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="头文件">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="资源文件">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Util">
|
||||||
|
<UniqueIdentifier>{81dbe199-c614-445b-8e13-b76101c45c5e}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="util\minmax.h">
|
||||||
|
<Filter>Util</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="util\queue.h">
|
||||||
|
<Filter>Util</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="util\tree.h">
|
||||||
|
<Filter>Util</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="util\tree_internal.h">
|
||||||
|
<Filter>Util</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="util\vector.h">
|
||||||
|
<Filter>Util</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="util\queue.c">
|
||||||
|
<Filter>Util</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="util\tree.c">
|
||||||
|
<Filter>Util</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="util\vector.c">
|
||||||
|
<Filter>Util</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
21
LICENSE.txt
Normal file
21
LICENSE.txt
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) [year] [fullname]
|
||||||
|
|
||||||
|
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.
|
64
_clang-format
Normal file
64
_clang-format
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
---
|
||||||
|
AccessModifierOffset: '-4'
|
||||||
|
AlignAfterOpenBracket: AlwaysBreak
|
||||||
|
AlignConsecutiveMacros: 'true'
|
||||||
|
AlignConsecutiveAssignments: 'true'
|
||||||
|
AlignConsecutiveDeclarations: 'true'
|
||||||
|
AlignEscapedNewlines: Left
|
||||||
|
AlignOperands: 'true'
|
||||||
|
AlignTrailingComments: 'true'
|
||||||
|
AllowAllArgumentsOnNextLine: 'true'
|
||||||
|
AllowAllConstructorInitializersOnNextLine: 'true'
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: 'true'
|
||||||
|
AllowShortBlocksOnASingleLine: 'true'
|
||||||
|
AllowShortCaseLabelsOnASingleLine: 'true'
|
||||||
|
AllowShortFunctionsOnASingleLine: 'true'
|
||||||
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
|
AllowShortLambdasOnASingleLine: All
|
||||||
|
AllowShortLoopsOnASingleLine: 'true'
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: 'false'
|
||||||
|
AlwaysBreakTemplateDeclarations: 'Yes'
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
BreakBeforeBraces: Attach
|
||||||
|
BreakBeforeTernaryOperators: 'false'
|
||||||
|
BreakStringLiterals: 'true'
|
||||||
|
ColumnLimit: '0'
|
||||||
|
CompactNamespaces: 'false'
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: 'true'
|
||||||
|
FixNamespaceComments: 'true'
|
||||||
|
IncludeBlocks: Preserve
|
||||||
|
IndentCaseLabels: 'true'
|
||||||
|
IndentGotoLabels: 'false'
|
||||||
|
IndentPPDirectives: None
|
||||||
|
IndentWidth: '4'
|
||||||
|
IndentWrappedFunctionNames: 'true'
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: 'false'
|
||||||
|
Language: Cpp
|
||||||
|
MaxEmptyLinesToKeep: '2'
|
||||||
|
NamespaceIndentation: None
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: '1000'
|
||||||
|
PointerAlignment: Right
|
||||||
|
ReflowComments: 'true'
|
||||||
|
SortIncludes: 'false'
|
||||||
|
SortUsingDeclarations: 'false'
|
||||||
|
SpaceAfterCStyleCast: 'false'
|
||||||
|
SpaceAfterLogicalNot: 'false'
|
||||||
|
SpaceAfterTemplateKeyword: 'false'
|
||||||
|
SpaceBeforeAssignmentOperators: 'true'
|
||||||
|
SpaceBeforeCpp11BracedList: 'false'
|
||||||
|
SpaceBeforeCtorInitializerColon: 'false'
|
||||||
|
SpaceBeforeInheritanceColon: 'false'
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: 'false'
|
||||||
|
SpaceInEmptyParentheses: 'false'
|
||||||
|
SpacesBeforeTrailingComments: '1'
|
||||||
|
SpacesInAngles: 'false'
|
||||||
|
SpacesInCStyleCastParentheses: 'false'
|
||||||
|
SpacesInContainerLiterals: 'false'
|
||||||
|
SpacesInParentheses: 'false'
|
||||||
|
SpacesInSquareBrackets: 'false'
|
||||||
|
Standard: Cpp11
|
||||||
|
TabWidth: '4'
|
||||||
|
UseTab: ForContinuationAndIndentation
|
||||||
|
...
|
43
util/minmax.h
Normal file
43
util/minmax.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
static inline int intmin(int x, int y) {
|
||||||
|
return x < y ? x : y;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int intmax(int x, int y) {
|
||||||
|
return x > y ? x : y;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int intmin3(int x, int y, int z) {
|
||||||
|
if (x < y)
|
||||||
|
if (x < z)
|
||||||
|
return x;
|
||||||
|
else
|
||||||
|
return z;
|
||||||
|
else if (y < z)
|
||||||
|
return y;
|
||||||
|
else
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int intmax3(int x, int y, int z) {
|
||||||
|
if (x > y)
|
||||||
|
if (x > z)
|
||||||
|
return x;
|
||||||
|
else
|
||||||
|
return z;
|
||||||
|
else if (y > z)
|
||||||
|
return y;
|
||||||
|
else
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int intminmax(int x, int min, int max) {
|
||||||
|
if (x < min)
|
||||||
|
return min;
|
||||||
|
else if (x > max)
|
||||||
|
return max;
|
||||||
|
else
|
||||||
|
return x;
|
||||||
|
}
|
72
util/queue.c
Normal file
72
util/queue.c
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
|
||||||
|
#include "queue.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
void queue_InitBuffered(queue *q, void *buffer, uintptr_t size) {
|
||||||
|
q->data = q->begin = q->end = buffer;
|
||||||
|
q->size = size;
|
||||||
|
q->count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void queue_PushByte(queue *q, const uint8_t b) {
|
||||||
|
if (q->count == q->size) { // no more space
|
||||||
|
fprintf(stderr, "queue_PushByte: full[%llu bytes], discarding byte 0x%x\n", q->size, b);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
q->count++;
|
||||||
|
*((uint8_t *)(q->end++)) = b;
|
||||||
|
if (q->end == q->data + q->size)
|
||||||
|
q->end = q->data; // out of the buffer: wrap around
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t queue_PopByte(queue *q) {
|
||||||
|
if (q->count == 0) {
|
||||||
|
fprintf(stderr, "queue_PopByte: poping an empty queue\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
q->count--;
|
||||||
|
uint8_t data = *((uint8_t *)(q->begin++));
|
||||||
|
if (q->begin == q->data + q->size)
|
||||||
|
q->begin = q->data; // wrap around
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void queue_Push(queue *q, const void *buffer, uintptr_t size) {
|
||||||
|
// TODO Optimize queue_Push and queue_Pop
|
||||||
|
if (queue_Space(q) < size)
|
||||||
|
return;
|
||||||
|
for (const uint8_t *i = buffer; i < (const uint8_t *)buffer + size; i++)
|
||||||
|
queue_PushByte(q, *i);
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t queue_Pop(queue *q, void *buffer, uintptr_t size) {
|
||||||
|
if (queue_Size(q) < size)
|
||||||
|
return 0;
|
||||||
|
for (uint8_t *i = buffer; i < (uint8_t *)buffer + size; i++)
|
||||||
|
*i = queue_PopByte(q);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t queue_FrontByte(queue *q) {
|
||||||
|
if (q->count == 0) {
|
||||||
|
fprintf(stderr, "queue_TopByte: accessing an empty queue\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return *((uint8_t *)q->begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool queue_Empty(queue *q) {
|
||||||
|
return q->count == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t queue_Size(queue *q) {
|
||||||
|
return q->count;
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t queue_Space(queue *q) {
|
||||||
|
return q->size - q->count;
|
||||||
|
}
|
49
util/queue.h
Normal file
49
util/queue.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t *data; // the data buffer
|
||||||
|
uintptr_t size; // size of data buffer
|
||||||
|
uint8_t *begin, *end; // begin and past-the-end for in-queue data
|
||||||
|
uintptr_t count; // number of in-queue bytes
|
||||||
|
} queue;
|
||||||
|
|
||||||
|
// initialize a queue with a existing buffer
|
||||||
|
void queue_InitBuffered(queue *q, void *buffer, uintptr_t size);
|
||||||
|
|
||||||
|
// writes one byte to the queue, discarding if full
|
||||||
|
void queue_PushByte(queue *q, const uint8_t b);
|
||||||
|
|
||||||
|
// pops one byte from the front of the queue, returning it
|
||||||
|
uint8_t queue_PopByte(queue *q);
|
||||||
|
|
||||||
|
// write Size bytes to the queue, none written if there is not space for all the bytes
|
||||||
|
void queue_Push(queue *q, const void *buffer, uintptr_t size);
|
||||||
|
|
||||||
|
// pops Size bytes from the queue, none popped if there are no enough data
|
||||||
|
// returns the number of bytes popped (either Size or 0)
|
||||||
|
uintptr_t queue_Pop(queue *q, void *buffer, uintptr_t size);
|
||||||
|
|
||||||
|
// return the byte at the front of the queue
|
||||||
|
uint8_t queue_FrontByte(queue *q);
|
||||||
|
|
||||||
|
// tells if the queue is empty
|
||||||
|
bool queue_Empty(queue *q);
|
||||||
|
|
||||||
|
// returns the number of bytes in the queue
|
||||||
|
uintptr_t queue_Size(queue *q);
|
||||||
|
|
||||||
|
// returns the empty space left at the end of the queue
|
||||||
|
uintptr_t queue_Space(queue *q);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
176
util/tree.c
Normal file
176
util/tree.c
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
|
||||||
|
#include "tree.h"
|
||||||
|
#include "tree_internal.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Create allocates and creates a new default Tree object.
|
||||||
|
tree_Tree *tree_Create(uintptr_t objectSize) {
|
||||||
|
tree_Tree *t = malloc(sizeof(tree_Tree));
|
||||||
|
t->objectSize = objectSize;
|
||||||
|
t->size = 0;
|
||||||
|
t->root = 0;
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline tree_Node *__tree_NewNode(tree_Tree *t, uintptr_t key, tree_Node *father, uintptr_t internal) {
|
||||||
|
t->size++;
|
||||||
|
|
||||||
|
tree_Node *node = malloc(sizeof(tree_Node) - 1 + t->objectSize);
|
||||||
|
node->left = node->right = 0;
|
||||||
|
node->father = father;
|
||||||
|
node->key = key;
|
||||||
|
node->internal = internal;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __tree_DestroyNodes(tree_Node *node) {
|
||||||
|
if (node->left)
|
||||||
|
__tree_DestroyNodes(node->left);
|
||||||
|
if (node->right)
|
||||||
|
__tree_DestroyNodes(node->right);
|
||||||
|
free(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tree_Destroy(tree_Tree *tree) {
|
||||||
|
if (tree->root)
|
||||||
|
__tree_DestroyNodes(tree->root);
|
||||||
|
free(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Will not return NULL
|
||||||
|
tree_Node *__tree_InsertNodes(tree_Tree *t, tree_Node *node, tree_Node *father, uintptr_t key, tree_Node **result, bool *added) {
|
||||||
|
if (!node) {
|
||||||
|
if (added)
|
||||||
|
*added = true;
|
||||||
|
#ifdef HELOS_UTIL_TREE_TYPE_TREAP
|
||||||
|
return *result = __tree_NewNode(t, key, father, random_Rand() ^ key);
|
||||||
|
#else
|
||||||
|
return *result = __tree_NewNode(t, key, father, 0);
|
||||||
|
#endif
|
||||||
|
} else if (key < node->key) {
|
||||||
|
node->left = __tree_InsertNodes(t, node->left, node, key, result, added);
|
||||||
|
return node;
|
||||||
|
} else if (key > node->key) {
|
||||||
|
node->right = __tree_InsertNodes(t, node->right, node, key, result, added);
|
||||||
|
return node;
|
||||||
|
} else {
|
||||||
|
if (added)
|
||||||
|
*added = false;
|
||||||
|
*result = node;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tree_Node *tree_InsertNode(tree_Tree *t, uintptr_t key, bool *added) {
|
||||||
|
tree_Node *result;
|
||||||
|
t->root = __tree_InsertNodes(t, t->root, 0, key, &result, added);
|
||||||
|
|
||||||
|
#ifdef HELOS_UTIL_TREE_TYPE_TREAP
|
||||||
|
if (*added)
|
||||||
|
__tree_treap_Adjust(result, &t->root);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *tree_Insert(tree_Tree *t, uintptr_t key, bool *added) {
|
||||||
|
return tree_InsertNode(t, key, added)->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static tree_Node *__tree_FindNode(tree_Node *node, uintptr_t key) {
|
||||||
|
if (!node)
|
||||||
|
return NULL;
|
||||||
|
else if (key < node->key)
|
||||||
|
return __tree_FindNode(node->left, key);
|
||||||
|
else if (key > node->key)
|
||||||
|
return __tree_FindNode(node->right, key);
|
||||||
|
else
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
tree_Node *tree_FindNode(tree_Tree *t, uintptr_t key) {
|
||||||
|
return __tree_FindNode(t->root, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *tree_Find(tree_Tree *t, uintptr_t key) {
|
||||||
|
tree_Node *node = tree_FindNode(t, key);
|
||||||
|
if (!node)
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
return node->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void tree_Delete(tree_Tree *t, tree_Node *node) {
|
||||||
|
#ifdef HELOS_UTIL_TREE_TYPE_TREAP
|
||||||
|
while (node->left && node->right)
|
||||||
|
if (node->left->internal < node->right->internal)
|
||||||
|
__tree_Rotate(node->left, &t->root);
|
||||||
|
else
|
||||||
|
__tree_Rotate(node->right, &t->root);
|
||||||
|
#else
|
||||||
|
while (node->left)
|
||||||
|
__tree_Rotate(node->left, &t->root);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (node == t->root)
|
||||||
|
t->root = (node->left ? node->left : node->right);
|
||||||
|
__tree_Connect(node->father, (node->left ? node->left : node->right), __tree_Tell(node));
|
||||||
|
|
||||||
|
free(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
tree_Node *tree_FirstNode(tree_Tree *tree) {
|
||||||
|
tree_Node *result = tree->root;
|
||||||
|
if (!result)
|
||||||
|
return 0;
|
||||||
|
while (result->right)
|
||||||
|
result = result->left;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
tree_Node *tree_LastNode(tree_Tree *tree) {
|
||||||
|
tree_Node *result = tree->root;
|
||||||
|
if (!result)
|
||||||
|
return 0;
|
||||||
|
while (result->right)
|
||||||
|
result = result->right;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
tree_Node *tree_Node_Next(tree_Node *node) {
|
||||||
|
if (node->right) {
|
||||||
|
tree_Node *result = node->right;
|
||||||
|
while (result->left)
|
||||||
|
result = result->left;
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
tree_Node *result = node;
|
||||||
|
while (result->father && __tree_Tell(result) == __tree_Right)
|
||||||
|
result = result->father;
|
||||||
|
return result->father;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Node_Previous returns the previous node. Returns NULL if first.
|
||||||
|
tree_Node *tree_Node_Previous(tree_Node *node) {
|
||||||
|
if (node->left) {
|
||||||
|
tree_Node *result = node->left;
|
||||||
|
while (result->right)
|
||||||
|
result = result->right;
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
tree_Node *result = node;
|
||||||
|
while (result->father && __tree_Tell(result) == __tree_Left)
|
||||||
|
result = result->father;
|
||||||
|
return result->father;
|
||||||
|
}
|
||||||
|
}
|
75
util/tree.h
Normal file
75
util/tree.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct __tree_Node {
|
||||||
|
uintptr_t key; // node key
|
||||||
|
struct __tree_Node *left, *right; // left and right sons
|
||||||
|
struct __tree_Node *father; // father node
|
||||||
|
uintptr_t internal; // internal data for balanced trees
|
||||||
|
char data[1]; // placeholder for object data
|
||||||
|
} tree_Node;
|
||||||
|
|
||||||
|
// Tree is a basic tree-based associative container.
|
||||||
|
//
|
||||||
|
// Right now it's a Treap.
|
||||||
|
typedef struct {
|
||||||
|
uintptr_t objectSize; // size in bytes of the object
|
||||||
|
tree_Node *root; // root of the tree, NULL if empty
|
||||||
|
uintptr_t size; // number of objects in the tree
|
||||||
|
} tree_Tree;
|
||||||
|
|
||||||
|
// Create allocates and creates a new default Tree object.
|
||||||
|
tree_Tree *tree_Create(uintptr_t objectSize);
|
||||||
|
|
||||||
|
// Destroy properly frees all data related to the structure, and itself.
|
||||||
|
void tree_Destroy(tree_Tree *tree);
|
||||||
|
|
||||||
|
// Insert inserts a new object (or locates an existing one).
|
||||||
|
//
|
||||||
|
// If *added is not NULL, it is set to true if the key does
|
||||||
|
// not exist and is actually added.
|
||||||
|
//
|
||||||
|
// Newly allocated data is not zeroed, nor initialized in any way.
|
||||||
|
//
|
||||||
|
// Returns the pointer to the newly allocated (or existing) data.
|
||||||
|
void *tree_Insert(tree_Tree *tree, uintptr_t key, bool *added);
|
||||||
|
|
||||||
|
// InsertNode does the same as Insert, but returns Node* instead of data.
|
||||||
|
tree_Node *tree_InsertNode(tree_Tree *tree, uintptr_t key, bool *added);
|
||||||
|
|
||||||
|
// Find locates an existing object by its key.
|
||||||
|
//
|
||||||
|
// Returns NULL if the object does not exist.
|
||||||
|
void *tree_Find(tree_Tree *tree, uintptr_t key);
|
||||||
|
|
||||||
|
// FindNode returns an existing tree node by its key.
|
||||||
|
//
|
||||||
|
// Used for iterating the tree objects.
|
||||||
|
tree_Node *tree_FindNode(tree_Tree *tree, uintptr_t key);
|
||||||
|
|
||||||
|
// FirstNode returns the first node in increasing order.
|
||||||
|
tree_Node *tree_FirstNode(tree_Tree *tree);
|
||||||
|
|
||||||
|
// LastNode returns the last node in increasing order.
|
||||||
|
tree_Node *tree_LastNode(tree_Tree *tree);
|
||||||
|
|
||||||
|
// Delete deletes an existing node from the tree.
|
||||||
|
void tree_Delete(tree_Tree *tree, tree_Node *node);
|
||||||
|
|
||||||
|
// Node_Next returns the next node. Returns NULL if the node is the last.
|
||||||
|
tree_Node *tree_Node_Next(tree_Node *node);
|
||||||
|
|
||||||
|
// Node_Previous returns the previous node. Returns NULL if first.
|
||||||
|
tree_Node *tree_Node_Previous(tree_Node *node);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
60
util/tree_internal.h
Normal file
60
util/tree_internal.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "tree.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
__tree_Left,
|
||||||
|
__tree_Right,
|
||||||
|
} __tree_ConnectType;
|
||||||
|
|
||||||
|
static inline __tree_ConnectType __tree_ConnectType_Invert(__tree_ConnectType type) {
|
||||||
|
return (__tree_ConnectType)(!type);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline __tree_ConnectType __tree_Tell(tree_Node *son) {
|
||||||
|
if (!son->father)
|
||||||
|
return __tree_Left;
|
||||||
|
if (son->father->left == son)
|
||||||
|
return __tree_Left;
|
||||||
|
else
|
||||||
|
return __tree_Right;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline tree_Node *__tree_Get(tree_Node *father, __tree_ConnectType type) {
|
||||||
|
return (type == __tree_Left) ? father->left : father->right;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __tree_Connect(tree_Node *father, tree_Node *son, __tree_ConnectType type) {
|
||||||
|
if (son)
|
||||||
|
son->father = father;
|
||||||
|
if (father) {
|
||||||
|
if (type == __tree_Left)
|
||||||
|
father->left = son;
|
||||||
|
else
|
||||||
|
father->right = son;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotates the node up.
|
||||||
|
static inline void __tree_Rotate(tree_Node *node, tree_Node **root) {
|
||||||
|
if (!node->father)
|
||||||
|
return;
|
||||||
|
|
||||||
|
__tree_ConnectType type = __tree_Tell(node);
|
||||||
|
|
||||||
|
tree_Node *f = node->father,
|
||||||
|
*b = __tree_Get(node, __tree_ConnectType_Invert(type));
|
||||||
|
__tree_Connect(f->father, node, __tree_Tell(f));
|
||||||
|
__tree_Connect(node, f, __tree_ConnectType_Invert(type));
|
||||||
|
__tree_Connect(f, b, type);
|
||||||
|
|
||||||
|
if (!node->father)
|
||||||
|
*root = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adjust the tree as a Treap
|
||||||
|
static inline void __tree_treap_Adjust(tree_Node *node, tree_Node **root) {
|
||||||
|
while (node->father && node->father->internal > node->internal)
|
||||||
|
__tree_Rotate(node, root);
|
||||||
|
}
|
91
util/vector.c
Normal file
91
util/vector.c
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
|
||||||
|
#include "vector.h"
|
||||||
|
|
||||||
|
#include "string.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
vector_Vector *vector_Create(uintptr_t objectSize) {
|
||||||
|
vector_Vector *vec = malloc(sizeof(vector_Vector));
|
||||||
|
vec->objectSize = objectSize;
|
||||||
|
vec->size = 0;
|
||||||
|
vec->data = 0;
|
||||||
|
|
||||||
|
vec->data = malloc(objectSize);
|
||||||
|
vec->cap = objectSize;
|
||||||
|
|
||||||
|
return vec;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resizes the underlying buffer to a new capacity
|
||||||
|
static inline void __vector_Rebuffer(vector_Vector *vec, uintptr_t newcap) {
|
||||||
|
void *newbuf = malloc(newcap);
|
||||||
|
memcpy(newbuf, vec->data, vec->size);
|
||||||
|
free(vec->data);
|
||||||
|
vec->data = newbuf;
|
||||||
|
vec->cap = newcap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vector_Destroy(vector_Vector *vec) {
|
||||||
|
free(vec->data);
|
||||||
|
free(vec);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *vector_Push(vector_Vector *vec, const void *data) {
|
||||||
|
vector_Append(vec, data, 1);
|
||||||
|
return vec->data + vec->size - vec->objectSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vector_Append(vector_Vector *vec, const void *data, uintptr_t n) {
|
||||||
|
uintptr_t oldsize = vec->size, addsize = vec->objectSize * n;
|
||||||
|
vector_Resize(vec, oldsize + addsize);
|
||||||
|
|
||||||
|
if (data)
|
||||||
|
memcpy(vec->data + oldsize, data, addsize);
|
||||||
|
else
|
||||||
|
memset(vec->data + oldsize, 0, addsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vector_Resize(vector_Vector *vec, uintptr_t size) {
|
||||||
|
uintptr_t newsize = vec->size + size * vec->objectSize;
|
||||||
|
if (newsize > vec->cap) {
|
||||||
|
// grow the buffer exponentially
|
||||||
|
uint64_t newcap = vec->cap;
|
||||||
|
while (newcap < newsize)
|
||||||
|
newcap *= 2;
|
||||||
|
__vector_Rebuffer(vec, newcap);
|
||||||
|
}
|
||||||
|
vec->size = newsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t vector_Size(vector_Vector *vec) {
|
||||||
|
return vec->size / vec->objectSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vector_Clear(vector_Vector *vec) {
|
||||||
|
vec->size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vector_ShrinkBuffer(vector_Vector *vec) {
|
||||||
|
if (vec->size != vec->cap)
|
||||||
|
__vector_Rebuffer(vec, vec->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t vector_Capacity(vector_Vector *vec) {
|
||||||
|
return vec->cap / vec->objectSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vector_Reserve(vector_Vector *vec, uintptr_t cap) {
|
||||||
|
uintptr_t newcap = vec->objectSize * cap;
|
||||||
|
if (newcap > vec->cap)
|
||||||
|
__vector_Rebuffer(vec, newcap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *vector_At(vector_Vector *vec, uintptr_t i) {
|
||||||
|
return vec->data + vec->objectSize * i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Data returns the data buffer.
|
||||||
|
void *vector_Data(vector_Vector *vec) {
|
||||||
|
return vec->data;
|
||||||
|
}
|
65
util/vector.h
Normal file
65
util/vector.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// Vector is an automatic-resizing array.
|
||||||
|
typedef struct {
|
||||||
|
uint8_t *data; // actual data buffer
|
||||||
|
uintptr_t size, cap; // size of the data and buffer, in bytes
|
||||||
|
uintptr_t objectSize; // size of the object
|
||||||
|
} vector_Vector;
|
||||||
|
|
||||||
|
// Create allocates a new vector.
|
||||||
|
vector_Vector *vector_Create(uintptr_t objectSize);
|
||||||
|
|
||||||
|
// Destroy properly frees all data related to the structure, and itself.
|
||||||
|
void vector_Destroy(vector_Vector *vec);
|
||||||
|
|
||||||
|
// Push pushes an object at the back of the vector.
|
||||||
|
//
|
||||||
|
// If data is NULL, the data is zeroed.
|
||||||
|
//
|
||||||
|
// Returns a pointer to data.
|
||||||
|
void *vector_Push(vector_Vector *vec, const void *data);
|
||||||
|
|
||||||
|
// Append pushes multiple objects at the back of the buffer.
|
||||||
|
//
|
||||||
|
// If data is NULL, the data is zeroed.
|
||||||
|
void vector_Append(vector_Vector *vec, const void *data, uintptr_t n);
|
||||||
|
|
||||||
|
// Resize resizes the vector to a new number of elements.
|
||||||
|
void vector_Resize(vector_Vector *vec, uintptr_t size);
|
||||||
|
|
||||||
|
// Size returns the number of objects in a vector.
|
||||||
|
uintptr_t vector_Size(vector_Vector *vec);
|
||||||
|
|
||||||
|
// Clear clears a vector, without resizing the buffer.
|
||||||
|
void vector_Clear(vector_Vector *vec);
|
||||||
|
|
||||||
|
// ShrinkBuffer shrinks the internal buffer to exactly the size of the elements.
|
||||||
|
void vector_ShrinkBuffer(vector_Vector *vec);
|
||||||
|
|
||||||
|
// Capacity returns the size of the internal buffer.
|
||||||
|
uintptr_t vector_Capacity(vector_Vector *vec);
|
||||||
|
|
||||||
|
// Reserve reallocates the size of the buffer to CAP objects,
|
||||||
|
// if the current buffer is smaller.
|
||||||
|
void vector_Reserve(vector_Vector *vec, uintptr_t cap);
|
||||||
|
|
||||||
|
// At returns the i-th object of the vector.
|
||||||
|
//
|
||||||
|
// No boundary test is performed.
|
||||||
|
void *vector_At(vector_Vector *vec, uintptr_t i);
|
||||||
|
|
||||||
|
// Data returns the data buffer.
|
||||||
|
void *vector_Data(vector_Vector *vec);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user