Compare commits

...

109 Commits

Author SHA1 Message Date
Merlyn Morgan-Graham
de0e089165 includes/std+type: Add DOS datetime types (#57)
Add type::dosdate16_t and type::dostime16_t in pattern library
2022-11-14 10:08:00 +01:00
Fredrick Brennan
e7ea6fd77f patterns: Added APNG support to PNG pattern (#53) 2022-11-10 10:36:46 +01:00
Fredrick Brennan
ff3c796de8 patterns: Added sRGB, zTXt, tEXt support to PNG pattern (#55)
* patterns: png.hexpat: APNG support

* patterns: png.hexpat: +sRGB, zTXt, tEXt
2022-11-10 10:23:42 +01:00
lieyanqzu
0c83764f24 patterns: Fix java class pattern and update to javase17 format (#56)
fix java class pattern and update to javase17 format
2022-11-10 10:23:06 +01:00
Fredrick Brennan
d87f95dbfa includes/type: Add RGB8 to color.pat (#54) 2022-11-10 10:22:17 +01:00
Nik
51dad63779 includes/std: Removed invalid returns 2022-11-09 21:56:06 +01:00
Nik
764b86acc9 includes/std: Added section functions 2022-11-09 21:53:31 +01:00
Nik
10fdf94899 includes/std: Fixed syntax error 2022-11-09 21:25:01 +01:00
Nik
9ba998e618 includes/std: Added new functions 2022-11-09 21:21:59 +01:00
WerWolv
aceeb2b7b3 git: Don't build plcli tool in tests 2022-11-06 18:40:39 +01:00
fr0ntlin3
3b1b7cc379 patterns: Fixed ELF pattern for 32-bit files (#51)
Co-authored-by: z <z>
2022-11-06 18:36:37 +01:00
gmestanley
49be43e0e1 patterns: Making pe.hexpat even better (#52)
* Update pe.hexpat

Implementing a number of things and fixing others

* Update pe.hexpat

Adding the readonlyData pattern

* Update pe.hexpat

Testing putting the number of tabs on Github to 4 instead of 8 (so that comments on the code for the Sections don't break)

* Update pe.hexpat

Reverting change that turned out to be needless

* Update pe.hexpat

Actually sending the `products[while($ != richHeaderEndPosition)]` to `products[while($ < richHeaderEndPosition)]` change
2022-10-30 12:07:54 +01:00
Nik
8e70a5524d includes/type: Added templates for number types with specific base 2022-10-10 22:36:46 +02:00
Nik
9c0bf1433c includes/std: Added new Array and SizedString type 2022-10-10 22:36:09 +02:00
Nik
43afbfa120 includes/type: Made size and float16 types more generic 2022-10-09 17:38:05 +02:00
Nik
f75703fd2b includes/std: Added MagicSearch and Reinterpreter helper type 2022-10-09 17:37:37 +02:00
Nik
16eebea2fb patterns: Added USB Descriptor pattern 2022-10-09 12:46:29 +02:00
Florian Limberger
6cb208d975 patterns: Added pattern for ID3 tags (#48)
* Add naive first implementation of ID3 patterns

* Refine string handling a bit

* Optimize structs using the static keyword

* Add MIME type pragma and update README
2022-10-09 12:26:34 +02:00
Nik
665c50b914 patterns: Fixed minidump pattern formatting 2022-10-08 11:20:46 +02:00
Nik
04ef9d6085 includes/type: Fixed copy-paste error in float16 type 2022-10-03 14:14:35 +02:00
Nik
dc5b219d24 includes/type: Fixed duplicate type definition in 010 types library 2022-10-03 10:51:43 +02:00
Nik
e6c800b71c includes/type: Fixed missing preprocessor instructions in size type library 2022-10-03 08:37:05 +02:00
Nik
5c9a7b1ac0 includes/type: Display space optimized version of IPv6 addresses 2022-10-02 23:25:10 +02:00
Nik
22390d0adf includes/type: Fixed broken float16 type 2022-10-02 22:57:46 +02:00
Nik
dfc9b17067 includes/type: Fixed missing include in color include 2022-10-02 21:55:48 +02:00
Nik
d33fdfafb8 git: Added links to all the files mentioned in the readme 2022-10-02 18:36:46 +02:00
Nik
58d63d1d4a includes/hex: Fixed mangled name format function 2022-10-01 21:53:41 +02:00
Nik
86f38ca545 includes/type: Added new color types 2022-09-30 14:52:30 +02:00
Nik
27d98d4552 includes/hex: Added support for new demangle function 2022-09-30 14:52:21 +02:00
Nik
dba93afe06 patterns: Fixed duplicate variable names 2022-09-21 16:34:23 +02:00
Nik
5481c2ff6a includes/std: Made relevant std::core functions take patterns as reference 2022-09-15 14:30:01 +02:00
Nik
efa9957935 git: Disable ci sanitizers again for now 2022-09-15 14:29:37 +02:00
Nik
073768fec3 includes/std: Fix passing std::file::Mode enum to builtin function 2022-09-15 11:39:17 +02:00
WerWolv
ceb322019c git: Fix CI command line 2022-09-14 15:12:59 +02:00
WerWolv
befd05f8dd tests: Enable sanitizers on unit tests 2022-09-14 15:11:17 +02:00
Nik
6a1abd8fec git: Look for coverage information in correct folder 2022-09-14 15:01:44 +02:00
Nik
b2ebbc6d66 git: Added coverage checking to tests 2022-09-14 14:56:52 +02:00
Nik
24c003b333 tests: Disable imhex checks in unit tests 2022-09-14 14:29:12 +02:00
Nik
caea4544ef includes/hex: Added library files 2022-09-14 14:01:54 +02:00
Nik
36b107f0ca includes/hex: Added imhex support library 2022-09-14 14:01:28 +02:00
Nik
6367f434ab includes: Removed old types library files 2022-09-14 14:01:15 +02:00
Nik
2cfd3c43a7 patterns: Added x-dosexec MIME type to PE pattern 2022-09-13 15:57:34 +02:00
Nik
4bda291de1 patterns: Added minidump pattern 2022-09-13 13:26:50 +02:00
Nik
ce542887c4 includes/type: Added aliases for builtin types 2022-09-11 21:53:18 +02:00
Nik
44216762fd patterns: Added msgpack pattern 2022-09-08 13:29:55 +02:00
Nik
3621144815 patterns: Added BSON pattern 2022-09-07 14:42:38 +02:00
Nik
244dd88098 includes/type: Fixed time_t format function 2022-09-07 14:21:53 +02:00
Nik
93c53f2d2e includes/type: Fixed time_t type and added time32_t and time64_t 2022-09-07 14:21:05 +02:00
Nik
ccd163b981 git: Added repository dispatch event to CI 2022-09-07 11:51:09 +02:00
Nik
cfc6a442de patterns: Added basic FLAC metadata pattern 2022-09-07 09:42:51 +02:00
Nik
62b1eb927e patterns: Added Xilinx bitstream pattern 2022-09-05 22:09:23 +02:00
Nik
2baae9c5f6 patterns: Added MIME types to ELF pattern 2022-09-04 23:01:31 +02:00
Nik
6ccb3bf465 includes/std: Add endian parameter to std::mem::read_unsigned and std::mem::read_signed 2022-09-04 20:37:19 +02:00
Nik
fc997133a1 patterns: Fix use of std::core::Endian 2022-09-04 20:26:46 +02:00
Nik
966c4e15b0 includes/std: Moved Endian enum to std::mem 2022-09-04 20:26:05 +02:00
Nik
935a26e9f9 patterns: Fixed parsing of WAV files generated by AudaCity
Thanks to @rikogeln
2022-09-04 17:45:39 +02:00
Nik
529c419ca8 git: Added pattern pull request template 2022-09-04 15:57:51 +02:00
Nik
befd6ef448 includes/std: Cast endian to integer before passing it to evaluator 2022-09-04 14:31:26 +02:00
Nik
45da27275d tests: Added elf test data 2022-09-04 14:17:04 +02:00
Nik
60c5f795a0 patterns: Greatly improve ELF pattern 2022-09-04 14:15:41 +02:00
Nik
72acac1082 tests: Added lnk test data 2022-09-02 23:45:11 +02:00
Nik
a9d6c882ac patterns: Replaced tabs with spaces in lnk pattern 2022-09-02 23:21:40 +02:00
Nik
7ecfcd446d patterns: Added Microsoft Shell Link pattern 2022-09-02 23:13:43 +02:00
Nik
b094757b03 includes/type: Display size type bytes without decimal points 2022-09-02 22:49:35 +02:00
Nik
1d0b11372f includes/type: Fixed size type visualizer 2022-09-02 22:45:20 +02:00
mirusu400
f01ddec350 encodings: Add euc_kr table (#46)
* Add euc_kr table

* Fix euc_kr to numberic order, Add README to euc_kr table
2022-09-02 18:34:49 +02:00
Nik
64136ba16c tests: Added correct ntag test file 2022-09-02 17:22:40 +02:00
Nik
1e45938887 patterns: Added NTAG pattern 2022-09-02 17:14:23 +02:00
Nik
f32b162647 patterns: Added VHDX pattern 2022-08-31 15:08:32 +02:00
Nik
d2685aabf5 lib/type: Added size type 2022-08-31 15:05:10 +02:00
Nik
8027cda032 lib/std: Added std::core::formatted_value function 2022-08-31 15:02:47 +02:00
WerWolv
a178509b3c patterns: Added stl pattern 2022-08-29 15:23:43 +02:00
WerWolv
56411ae067 patterns: Added MIME type for ogg pattern 2022-08-29 15:02:42 +02:00
WerWolv
7ee489237d patterns: Added Ogg pattern 2022-08-29 15:02:08 +02:00
WerWolv
4d97e79097 lib/std: Added std::core::member_count and std::core::has_member functions 2022-08-28 22:41:43 +02:00
WerWolv
9fec10000a patterns: Fixed ZigZag encoding in protobuf pattern 2022-08-28 19:07:30 +02:00
WerWolv
b0d8b81861 patterns: Added protobuf pattern 2022-08-28 13:51:58 +02:00
ThePixelCoder
c7fbb661ae patterns: Add GNU program types to ELF (#35) 2022-08-27 12:51:45 +02:00
jz5
7e19b4cb10 patterns: Fixed chunk size issues in WAV pattern. (#44) 2022-08-27 12:50:53 +02:00
Berylskid
ff2726ce8a encodings: Added control characters to shiftjis encoding(#43)
Fixed and added control character encoding.
2022-08-27 12:43:50 +02:00
Alexander Kozlov
ed47fa65f1 encodings: Add cyrillyc cp866 encoding (#45) 2022-08-27 12:42:44 +02:00
WerWolv
f0963603bf patterns: Added bencode pattern 2022-08-27 12:41:59 +02:00
WerWolv
15548b92e2 includes/std: Added core library functions 2022-08-19 00:00:30 +02:00
WerWolv
87efc6cf54 includes/std: Fixed std::string::contains function not checking last character 2022-08-16 09:48:42 +02:00
WerWolv
5e48adcb9d scripts: Properly open legacy hexproj files as UTF-8 2022-08-16 09:27:05 +02:00
Lucy
f548643933 encodings: Add English Pokémon generation 1 character encoding (#42)
* encodings: Add English Pokémon generation 1 character encoding

Source: https://bulbapedia.bulbagarden.net/wiki/Character_encoding_(Generation_I)#English

* readme: Add `pokegen1_en.tbl`
2022-08-14 17:46:40 +02:00
WerWolv
575e4d5381 scripts: Added helper scripts to extract old project files 2022-08-14 14:47:28 +02:00
WerWolv
6b0fad199e git: Remove LR line ending requirements 2022-08-10 19:22:35 +02:00
gmestanley
ece86f1124 patterns: Added enhancements for PE pattern (#41)
The current pattern file for the PE format doesn't have a lot of the format's quirks, so I decided to code them in after I noticed that it doesn't cover the structure known as Rich Header. (Forgive the garbage code for its ProductType enum, it was the only way I found to make the values appear.)
Here are my sources for the improvements included here:

How the MZ header works and some of its variables' names: [How to determine the size of an PE executable file from headers and or footers](https://stackoverflow.com/questions/34684660/how-to-determine-the-size-of-an-pe-executable-file-from-headers-and-or-footers)
The function of some of the MZ header variables: [https://github.com/corkami/pics/blob/master/binary/pe102.png](PE102 by Corkami)
The existence of sections: [https://github.com/corkami/pics/blob/master/binary/pe101/pe101.png](PE101 by Corkami)
The Machine values for LoongArch processors, the architecture enum and how it's used in the Optional Header, Subsystem types, DLL & Section characteristics, how sections, their line numbers and relocations work: [PE Format](https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#the-rsrc-section)
The Machine values for DECAlphaAXP and i860: [Peering Inside the PE: A Tour of the Win32 Portable Executable File Format](https://docs.microsoft.com/en-us/previous-versions/ms809762(v=msdn.10)#the-pe-header)
How the Rich Header works: [https://www.virusbulletin.com/virusbulletin/2020/01/vb2019-paper-rich-headers-leveraging-mysterious-artifact-pe-format/](VB2019 paper: Rich Headers: leveraging this mysterious artifact of the PE format)
Values of products in the Rich Header: [https://securelist.com/the-devils-in-the-rich-header/84348/](The devil’s in the Rich header)
Every other value not found in the above source: Ghidra
2022-08-10 15:06:10 +02:00
WerWolv
ce2b4d60ca patterns: Added very basic MBR and FAT32 filesystem pattern 2022-08-10 14:36:06 +02:00
WerWolv
7c88439681 git: Output errors when ctest fails 2022-08-09 16:10:27 +02:00
WerWolv
8d3c94be8f tests: Make tests compile with latest PatternLanguage update 2022-08-07 22:55:00 +02:00
WerWolv
0b15299980 patterns: Remove [[static]] attribute from non-static struct in elf pattern 2022-08-07 21:40:54 +02:00
WerWolv
eda13b2518 includes/type: Added [[sealed]] attribute to LEB128 type 2022-08-05 13:49:26 +02:00
Oded Shapira
aa6c90fa5b includes/type: Added LEB128 type (#40)
* Implement VarInt type

* VarInts are little endian, make result u128

* Rename VarInt to LEB128

* It didn't remove the varint file
2022-08-05 13:45:34 +02:00
Oded Shapira
65f2b7821b patterns: Fix typo in pe.hexpat (#39)
Fixed a typo where it said numberOfRelactions to numberOfRelocations.
2022-08-04 23:49:26 +02:00
WerWolv
de752cdbc3 tests: Added tests for magic files 2022-08-03 16:18:18 +02:00
WerWolv
e574f8048e git: Updated ubuntu runner to latest release 2022-08-03 15:51:37 +02:00
WerWolv
874855dc1c git: Updated test workflow script 2022-08-03 15:49:32 +02:00
WerWolv
6f161f7c52 yara: Updated official rules 2022-08-03 15:45:14 +02:00
WerWolv
a6e5efbb7f includes: Added missing #pragma once to all files 2022-08-03 15:44:30 +02:00
WerWolv
72c92ce671 tests: Added tests for include libraries 2022-08-03 15:44:10 +02:00
WerWolv
5cf0daca4b includes/type: Replaced std/types.pat with the types library 2022-08-01 13:12:23 +02:00
WerWolv
c41f7479aa includes/std: Added std::time library 2022-08-01 13:11:41 +02:00
WerWolv
660da67e3b patterns: Removed [[static]] attribute from ARFile struct 2022-07-31 14:53:03 +02:00
Berylskid
9b564fe403 encodings: Change 00=() to space bar (#38)
Currently, the decode column is too wide horizontally, making it unusable. This PR is intended to solve that.
2022-07-30 21:27:39 +02:00
WerWolv
be0632fac2 encodings: Fixed readme copy-paste errors 2022-07-27 16:26:08 +02:00
WerWolv
3a4b3873d1 scripts: Added script to transform 010 editor CSV encoding files to table files 2022-07-27 15:58:03 +02:00
WerWolv
63468e543a encodings: Added various new encoding files 2022-07-27 15:57:45 +02:00
106 changed files with 1143420 additions and 943 deletions

8
.gitattributes vendored
View File

@@ -1,10 +1,2 @@
*.pat linguist-language=Rust
*.hexpat linguist-language=Rust
constants/* text eol=lf
encodings/* text eol=lf
includes/* text eol=lf
magic/* text eol=lf
patterns/* text eol=lf
structs/* text eol=lf
tips/* text eol=lf
yara/* text eol=lf

View File

@@ -0,0 +1,10 @@
# Pattern
[Information about your pattern]
## Checklist
- [ ] A pattern for this format doesn't exist yet (or this PR improves the existing one)
- [ ] The new pattern has been added to the relevant table in the Readme
- [ ] The pattern was associated with all relevant MIME types (using `#pragma MIME mime-type` in the source code)
- [ ] A test file for this pattern has been added to [/tests/patterns/test_data](/tests/patterns/test_data)
- Try to keep this file below ~ 1 MB

View File

@@ -5,11 +5,13 @@ on:
branches: [ '*' ]
pull_request:
branches: [ '*' ]
repository_dispatch:
types: [run_tests]
jobs:
tests:
name: 🧪 Unit Tests
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
actions: read
contents: read
@@ -19,7 +21,6 @@ jobs:
- name: 🧰 Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: recursive
- name: ⬇️ Install dependencies
@@ -27,14 +28,16 @@ jobs:
sudo apt update
sudo apt install -y \
build-essential \
gcc-11 \
g++-11 \
gcc-12 \
g++-12 \
lld \
${PKGCONF:-} \
cmake \
make \
python3 \
python3-pip
python3-pip \
libmagic-dev \
lcov
sudo pip install jsonschema
@@ -43,17 +46,30 @@ jobs:
cd tests
mkdir -p build
cd build
CC=gcc-11 CXX=g++-11 cmake \
-DCMAKE_C_FLAGS="-fuse-ld=lld" \
-DCMAKE_CXX_FLAGS="-fuse-ld=lld" \
-DLIBPL_ENABLE_TESTS=OFF \
CC=gcc-12 CXX=g++-12 cmake \
-DCMAKE_C_FLAGS="-fuse-ld=lld --coverage" \
-DCMAKE_CXX_FLAGS="-fuse-ld=lld --coverage" \
-DLIBPL_ENABLE_TESTS=OFF \
-DLIBPL_ENABLE_CLI=OFF \
..
make -j4
- name: 🧪 Perform Unit Tests
run: |
cd tests/build
ctest
ctest --output-on-failure
- name: ⚗️ Generate Coverage Report
run: |
cd tests/build
lcov -d ./_deps/pattern_language-build/lib --gcov-tool /usr/bin/gcov-12 -c -o coverage.info
- name: ⬆️ Upload Coverage Report
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
path-to-lcov: tests/build/coverage.info
- name: 📎 Validate JSON Files
run: |
cd constants

6
.gitmodules vendored
View File

@@ -1,8 +1,4 @@
[submodule "rules"]
path = yara/official_rules
url = https://github.com/Yara-Rules/rules
branch = master
[submodule "tests/lib/pl"]
path = tests/lib/pl
url = https://github.com/WerWolv/PatternLanguage
branch = master
branch = master

128
README.md
View File

@@ -8,83 +8,123 @@ Hex patterns, include patterns and magic files for the use with the ImHex Hex Ed
| Name | MIME | Path | Description |
|------|------|------|-------------|
| BMP | `image/bmp` | `patterns/bmp.hexpat` | OS2/Windows Bitmap files |
| ELF | `application/x-executable`, `application/x-sharedlib` | `patterns/elf.hexpat` | ELF header in elf binaries |
| PE | `application/x-dosexec` | `patterns/pe.hexpat` | PE header, COFF header, Standard COFF fields and Windows Specific fields |
| Intel HEX | | `patterns/intel_hex.hexpat` | [Intel hexadecimal object file format definition]("https://en.wikipedia.org/wiki/Intel_HEX") |
| MIDI | `audio/midi` | `patterns/midi.hexpat` | MIDI header, event fields provided |
| WAV | `audio/wav` | `patterns/wav.hexpat` | RIFF header, WAVE header, PCM header |
| ZIP | `application/zip` | `patterns/zip.hexpat` | End of Central Directory Header, Central Directory File Headers |
| PCAP | `application/vnd.tcpdump.pcap` | `patterns/pcap.hexpat` | pcap header and packets |
| SPIRV | | `patterns/spirv.hexpat` | SPIR-V header and instructions |
| AFE2 | | `patterns/afe2.hexpat` | Nintendo Switch Atmosphère CFW Fatal Error log |
| AR | `application/x-archive` | `patterns/ar.hexpat` | Static library archive files |
| NACP | | `patterns/nacp.hexpat` | Nintendo Switch NACP files |
| NRO | | `patterns/nro.hexpat` | Nintendo Switch NRO files |
| PRODINFO | | `patterns/prodinfo.hexpat` | Nintendo Switch PRODINFO |
| Java Class | `application/x-java-applet` | `patterns/java_class.hexpat` | Java Class files |
| ARM VTOR | | `patterns/arm_cm_vtor.hexpat` | ARM Cortex M Vector Table Layout |
| ICO | | `patterns/ico.hexpat` | Icon (.ico) or Cursor (.cur) files |
| PNG | `image/png` | `patterns/png.hexpat` | PNG image files |
| DDS | `image/vnd-ms.dds` | `patterns/dds.hexpat` | DirectDraw Surface |
| TGA | `image/tga` | `patterns/tga.hexpat` | Truevision TGA/TARGA image |
| ISO | | `patterns/iso.hexpat` | ISO 9660 file system |
| VDF | | `patterns/vdf.hexpat` | Binary Value Data Format (.vdf) files |
| IP | | `patterns/ip.hexpat` | Ethernet II Frames (IP Packets) |
| UF2 | | `patterns/uf2.hexpat` | [USB Flashing Format](https://github.com/microsoft/uf2) |
| BMP | `image/bmp` | [`patterns/bmp.hexpat`](patterns/bmp.hexpat) | OS2/Windows Bitmap files |
| ELF | `application/x-executable` | [`patterns/elf.hexpat`](patterns/elf.hexpat) | ELF header in elf binaries |
| PE | `application/x-dosexec` | [`patterns/pe.hexpat`](patterns/pe.hexpat) | PE header, COFF header, Standard COFF fields and Windows Specific fields |
| Intel HEX | | [`patterns/intel_hex.hexpat`](patterns/intel_hex.hexpat) | [Intel hexadecimal object file format definition]("https://en.wikipedia.org/wiki/Intel_HEX") |
| MIDI | `audio/midi` | [`patterns/midi.hexpat`](patterns/midi.hexpat) | MIDI header, event fields provided |
| WAV | `audio/wav` | [`patterns/wav.hexpat`](patterns/wav.hexpat) | RIFF header, WAVE header, PCM header |
| ZIP | `application/zip` | [`patterns/zip.hexpat`](patterns/zip.hexpat) | End of Central Directory Header, Central Directory File Headers |
| PCAP | `application/vnd.tcpdump.pcap` | [`patterns/pcap.hexpat`](patterns/pcap.hexpat) | pcap header and packets |
| SPIRV | | [`patterns/spirv.hexpat`](patterns/spirv.hexpat) | SPIR-V header and instructions |
| AFE2 | | [`patterns/afe2.hexpat`](patterns/afe2.hexpat) | Nintendo Switch Atmosphère CFW Fatal Error log |
| AR | `application/x-archive` | [`patterns/ar.hexpat`](patterns/ar.hexpat) | Static library archive files |
| NACP | | [`patterns/nacp.hexpat`](patterns/nacp.hexpat) | Nintendo Switch NACP files |
| NRO | | [`patterns/nro.hexpat`](patterns/nro.hexpat) | Nintendo Switch NRO files |
| PRODINFO | | [`patterns/prodinfo.hexpat`](patterns/prodinfo.hexpat) | Nintendo Switch PRODINFO |
| Java Class | `application/x-java-applet` | [`patterns/java_class.hexpat`](patterns/java_class.hexpat) | Java Class files |
| ARM VTOR | | [`patterns/arm_cm_vtor.hexpat`](patterns/arm_cm_vtor.hexpat) | ARM Cortex M Vector Table Layout |
| ICO | | [`patterns/ico.hexpat`](patterns/ico.hexpat) | Icon (.ico) or Cursor (.cur) files |
| PNG | `image/png` | [`patterns/png.hexpat`](patterns/png.hexpat) | PNG image files |
| DDS | `image/vnd-ms.dds` | [`patterns/dds.hexpat`](patterns/dds.hexpat) | DirectDraw Surface |
| TGA | `image/tga` | [`patterns/tga.hexpat`](patterns/tga.hexpat) | Truevision TGA/TARGA image |
| ISO | | [`patterns/iso.hexpat`](patterns/iso.hexpat) | ISO 9660 file system |
| VDF | | [`patterns/vdf.hexpat`](patterns/vdf.hexpat) | Binary Value Data Format (.vdf) files |
| IP | | [`patterns/ip.hexpat`](patterns/ip.hexpat) | Ethernet II Frames (IP Packets) |
| UF2 | | [`patterns/uf2.hexpat`](patterns/uf2.hexpat) | [USB Flashing Format](https://github.com/microsoft/uf2) |
| File System | | [`patterns/fs.hexpat`](patterns/fs.hexpat) | Drive File System |
| Bencode | `application/x-bittorrent` | [`patterns/bencode.hexpat`](patterns/bencode.hexpat) | Bencode encoding, used by Torrent files |
| Protobuf | | [`patterns/protobuf.hexpat`](patterns/protobuf.hexpat) | Google Protobuf encoding |
| OGG | `audio/ogg` | [`patterns/ogg.hexpat`](patterns/ogg.hexpat) | OGG Audio format |
| STL | `model/stl` | [`patterns/stl.hexpat`](patterns/stl.hexpat) | STL 3D Model format |
| VHDX | | [`patterns/vhdx.hexpat`](patterns/vhdx.hexpat) | Microsoft Hyper-V Virtual Hard Disk format |
| NTAG | | [`patterns/ntag.hexpat`](patterns/ntag.hexpat) | NTAG213/NTAG215/NTAG216, NFC Forum Type 2 Tag compliant IC |
| Shell Link | `application/x-ms-shortcut` | [`patterns/lnk.hexpat`](patterns/lnk.hexpat) | Windows Shell Link file format |
| Xilinx BIT | | [`patterns/xilinx_bit.hexpat`](patterns/xilinx_bit.hexpat) | Xilinx FPGA Bitstreams |
| FLAC | `audio/flac` | [`patterns/flac.hexpat`](patterns/flac.hexpat) | Free Lossless Audio Codec, FLAC Audio Format |
| BSON | `application/bson` | [`patterns/bson.hexpat`](patterns/bson.hexpat) | BSON (Binary JSON) format |
| msgpack | `application/x-msgpack` | [`patterns/msgpack.hexpat`](patterns/msgpack.hexpat) | MessagePack binary serialization format |
| MiniDump | `application/x-dmp` | [`patterns/minidump.hexpat`](patterns/minidump.hexpat) | Windows MiniDump files |
| ID3 | `audio/mpeg` | [`patterns/id3tag.hexpat`](patterns/id3tag.hexpat) | ID3 tags in MP3 files |
### Scripts
| Name | Path | Description |
|------|------|-------------|
| svd2pat | `scripts/svd2pat.py` | Converts a ARM .svd register MMIO definition file into a pattern |
| svd2pat | [`scripts/svd2pat.py`](scripts/svd2pat.py) | Converts a ARM .svd register MMIO definition file into a pattern |
| csv2tbl | [`scripts/csv2tbl.py`](scripts/csv2tbl.py) | Converts a 010 editor CSV encoding file into a table file |
### Pattern Libraries
| Name | Path | Description |
|------|------|-------------|
| libstd | `includes/std/*` | Pattern Language Standard Libaray |
| cstdint | `includes/cstdint.pat` | C integer types |
| libstd | [`includes/std/*`](includes/std) | Pattern Language Standard Libaray |
| libtype | [`includes/type/*`](includes/type) | Various custom types with special formatters |
| libhex | [`includes/hex/*`](includes/hex) | Functions to interact with ImHex |
### Yara rules
| Name | Path | Description |
|------|------|-------------|
| Official Rules | `yara/official_rules/*` | Official Yara rules repository |
| Official Rules | [`yara/official_rules/*`](yara/official_rules) | Official Yara rules repository |
### Magic files
| Name | Path | Description |
|------|------|-------------|
| Nintendo Switch | `magic/nintendo_switch_magic` | Identifies common file types used on the Nintendo Switch |
| Portable Executable | `magic/portable_executable_magic` | Identifies PE files used on Windows
| Nintendo Switch | [`magic/nintendo_switch_magic`](magic/nintendo_switch_magic) | Identifies common file types used on the Nintendo Switch |
| Portable Executable | [`magic/portable_executable_magic`](magic/portable_executable_magic) | Identifies PE files used on Windows
### Constants files
| Name | Path | Description |
|------|------|-------------|
| CRC-16 | `constants/crc16.json` | Constants associated with CRC-16 operations |
| CRC-32 | `constants/crc32.json` | Constants associated with CRC-32 operations |
| HTTP-Codes | `constants/http_status.json` | HTTP Status code values |
| Linux Error Codes | `constants/linux_errors.json` | Values of Linux error results |
| CRC-16 | [`constants/crc16.json`](constants/crc16.json) | Constants associated with CRC-16 operations |
| CRC-32 | [`constants/crc32.json`](constants/crc32.json) | Constants associated with CRC-32 operations |
| HTTP-Codes | [`constants/http_status.json`](constants/http_status.json) | HTTP Status code values |
| Linux Error Codes | [`constants/linux_errors.json`](constants/linux_errors.json) | Values of Linux error results |
### Encoding files
| Name | Path | Description |
|------|------|-------------|
| ANSI | `encodings/ansi.tbl` | ANSI encoding |
| EUC-JP | `encodings/euc_jp.tbl` | EUC-JP encoding with NEC special and IBM extended characters |
| ISO/IEC 646 | `encodings/iso_646.tbl` | ISO/IEC 646 encoding, an older version of ASCII |
| ISO/IEC 6937 | `encodings/iso_6937.tbl` | ISO/IEC 6937 encoding, an extension of ASCII containing additional character |
| Shift-JIS with half-width characters | `encodings/shiftjis_halfchars.tbl` | Shift-JIS encoding including half-width characters at 0xA1 - 0xDF |
| Shift-JIS UTF-8 | `encodings/shiftjis.tbl` | Shift-JIS encoding in UTF-8 |
| JIS 0201 | `encodings/jis_x_0201.tbl` | JIS X 0201 encoding in UTF-8 |
| JIS X 0211 | `encodings/jis_x_0211.tbl` | JIS X 0211 encoding in UTF-8 |
| JIS 0213 | `encodings/jis_x_0213.tbl` | JIS X 0213 encoding in UTF-8 |
| Arabic ISO | [`encodings/arabic_iso.tbl`](encodings/arabic_iso.tbl) | Arabic ISO encoding |
| Arabic Windows | [`encodings/arabic_windows.tbl`](encodings/arabic_windows.tbl) | Arabic Windows encoding |
| ASCII | [`encodings/ascii.tbl`](encodings/ascii.tbl) | Regular ASCII encoding |
| ASCII+ANSI | [`encodings/ascii_ansi.tbl`](encodings/ascii_ansi.tbl) | Extended ASCII encoding |
| ASCII+OEM | [`encodings/ascii_oem.tbl`](encodings/ascii_oem.tbl) | ASCII encoding with Windows OEM characters |
| Baltic ISO | [`encodings/baltic_iso.tbl`](encodings/baltic_iso.tbl) | Baltic ISO encoding |
| Baltic Windows | [`encodings/baltic_windows.tbl`](encodings/baltic_windows.tbl) | Baltic Windows encoding |
| Cyrillic ISO | [`encodings/cyrillic_iso.tbl`](encodings/cyrillic_iso.tbl) | Cyrillic ISO encoding |
| Cyrillic Windows | [`encodings/cyrillic_windows.tbl`](encodings/cyrillic_windows.tbl) | Cyrillic Windows encoding |
| Cyrillic KOI8-R | [`encodings/cyrillic_koi8_r.tbl`](encodings/cyrillic_koi8_r.tbl) | Cyrillic KOI8-R encoding (Russian Characters) |
| Cyrillic KOI8-U | [`encodings/cyrillic_koi8_u.tbl`](encodings/cyrillic_koi8_u.tbl) | Cyrillic KOI8-U encoding (Ukranian Characters) |
| Eastern Europe ISO | [`encodings/eastern_europe_iso.tbl`](encodings/eastern_europe_iso.tbl) | Eastern Europe ISO encoding |
| Eastern Europe Windows | [`encodings/eastern_europe_windows.tbl`](encodings/eastern_europe_windows.tbl) | Eastern Europe Windows encoding |
| EBCDIC | [`encodings/ebcdic.tbl`](encodings/ebcdic.tbl) | Extended Binary Coded Decimal Interchange Code, developed by IBM for their Main Frames |
| EUC-JP | [`encodings/euc_jp.tbl`](encodings/euc_jp.tbl) | EUC-JP encoding with NEC special and IBM extended characters |
| EUC-KR | [`encodings/euc_kr.tbl`](encodings/euc_kr.tbl) | EUC-KR encoding |
| Greek ISO | [`encodings/greek_iso.tbl`](encodings/greek_iso.tbl) | Greek ISO encoding |
| Greek Windows | [`encodings/greek_windows.tbl`](encodings/greek_windows.tbl) | Greek Windows encoding |
| Hebrew ISO | [`encodings/hebrew_iso.tbl`](encodings/hebrew_iso.tbl) | Hebrew ISO encoding |
| Hebrew Windows | [`encodings/hebrew_windows.tbl`](encodings/hebrew_windows.tbl) | Hebrew Windows encoding |
| ISO/IEC 646 | [`encodings/iso_646.tbl`](encodings/iso_646.tbl) | ISO/IEC 646 encoding, an older version of ASCII |
| ISO/IEC 6937 | [`encodings/iso_6937.tbl`](encodings/iso_6937.tbl) | ISO/IEC 6937 encoding, an extension of ASCII containing additional character |
| JIS 0201 | [`encodings/jis_x_0201.tbl`](encodings/jis_x_0201.tbl) | JIS X 0201 encoding in UTF-8 |
| JIS X 0211 | [`encodings/jis_x_0211.tbl`](encodings/jis_x_0211.tbl) | JIS X 0211 encoding in UTF-8 |
| JIS 0213 | [`encodings/jis_x_0213.tbl`](encodings/jis_x_0213.tbl) | JIS X 0213 encoding in UTF-8 |
| Macintosh | [`encodings/macintosh.tbl`](encodings/macintosh.tbl) | Macintosh character encoding used by the Kermit protocol |
| Pokémon (English, Generation 1) | [`encodings/pokegen1_en.tbl`](encodings/pokegen1_en.tbl) | Character encoding used by the English generation 1 Pokémon games |
| Shift-JIS UTF-8 | [`encodings/shiftjis.tbl`](encodings/shiftjis.tbl) | Shift-JIS encoding in UTF-8 |
| Thai | [`encodings/thai.tbl`](encodings/thai.tbl) | Thai character encoding |
| Turkish ISO | [`encodings/turkish_iso.tbl`](encodings/turkish_iso.tbl) | Turkish ISO encoding |
| Turkish Windows | [`encodings/turkish_windows.tbl`](encodings/turkish_windows.tbl) | Turkish Windows encoding |
| UTF-8 | [`encodings/utf8.tbl`](encodings/utf8.tbl) | UTF-8 encoding |
| Vietnamese | [`encodings/vietnamese.tbl`](encodings/vietnamese.tbl) | Vietnamese character encoding |
## Contributing
If you want to contribute a file to the database, please make a PR which adds it to the right folder and adds a new entry to the table in this readme.
To take advantage of the automatic pattern testing, please consider adding a test file named `<pattern_name>.hexpat.<extension>` to the `/tests/patterns/test_data` directory. Try to keep this file as small as possible so the repository doesn't become excessively large
Thanks a lot :)
Thanks a lot :)

View File

@@ -1,255 +0,0 @@
*0D0A
00
01
02
03
04
05
06
07
0B
0C
0E
0F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
7E
7F
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
B7
08=BackSpace
09=\t
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
91='
92='
9F==<3D>
A0=
A1=<3D>
A2=<3D>
A3=<3D>
A4=<3D>
A5=<3D>
A6=<3D>
A7=<3D>
A8=<3D>
A9=<3D>
AA=<3D>
AB=<3D>
AC=<3D>
AD=<3D>
AE=<3D>
AF=<3D>
B0=<3D>
B1=<3D>
B2=<3D>
B3=<3D>
B4=<3D>
B5=<3D>
B6=<3D>
B8=<3D>
B9=<3D>
BA=<3D>
BB=<3D>
BC=<3D>
BD=<3D>
BE=<3D>
BF=<3D>
C0=A
C1=<3D>
C2=<3D>
C3=<3D>
C4=<3D>
C5=<3D>
C6=<3D>
C7=<3D>
C8=<3D>
C9=<3D>
CA=<3D>
CB=<3D>
CC=<3D>
CD=<3D>
CE=<3D>
CF=<3D>
D0=<3D>
D1=<3D>
D2=<3D>
D3=<3D>
D4=<3D>
D5=<3D>
D6=<3D>
D7=<3D>
D8=<3D>
D9=<3D>
DA=<3D>
DB=<3D>
DC=<3D>
DD=<3D>
DE=<3D>
DF=<3D>
E0=<3D>
E1=<3D>
E2=<3D>
E3=<3D>
E4=<3D>
E5=<3D>
E6=<3D>
E7=<3D>
E8=<3D>
E9=<3D>
EA=<3D>
EB=<3D>
EC=<3D>
ED=<3D>
EE=<3D>
EF=<3D>
F0=<3D>
F1=<3D>
F2=<3D>
F3=<3D>
F4=<3D>
F5=<3D>
F6=<3D>
F7=<3D>
F8=<3D>
F9=<3D>
FA=<3D>
FB=<3D>
FC=<3D>
FD=<3D>
FE=<3D>
FF=<3D>

256
encodings/arabic_iso.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81=
82=‚
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=Š
8B=‹
8C=Œ
8D=
8E=Ž
8F=
90=
91=‘
92=’
93=“
94=”
95=•
96=–
97=—
98=˜
99=™
9A=š
9B=›
9C=œ
9D=
9E=ž
9F=Ÿ
A0= 
A1
A2
A3
A4=¤
A5
A6
A7
A8
A9
AA
AB
AC=،
AD=­
AE
AF
B0
B1
B2
B3
B4
B5
B6
B7
B8
B9
BA
BB=؛
BC
BD
BE
BF=؟
C0
C1=ء
C2=آ
C3=أ
C4=ؤ
C5=إ
C6=ئ
C7=ا
C8=ب
C9=ة
CA=ت
CB=ث
CC=ج
CD=ح
CE=خ
CF=د
D0=ذ
D1=ر
D2=ز
D3=س
D4=ش
D5=ص
D6=ض
D7=ط
D8=ظ
D9=ع
DA=غ
DB
DC
DD
DE
DF
E0=ـ
E1=ف
E2=ق
E3=ك
E4=ل
E5=م
E6=ن
E7=ه
E8=و
E9=ى
EA=ي
EB=ً
EC=ٌ
ED=ٍ
EE=َ
EF=ُ
F0=ِ
F1=ّ
F2=ْ
F3
F4
F5
F6
F7
F8
F9
FA
FB
FC
FD
FE
FF

View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81=پ
82=
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=ٹ
8B=
8C=Œ
8D=چ
8E=ژ
8F=ڈ
90=گ
91=
92=
93=“
94=”
95=•
96=
97=—
98=ک
99=™
9A=ڑ
9B=
9C=œ
9D=
9E=
9F=ں
A0= 
A1=،
A2=¢
A3=£
A4=¤
A5=¥
A6=¦
A7=§
A8=¨
A9=©
AA=ھ
AB=«
AC=¬
AD=­
AE=®
AF=¯
B0=°
B1=±
B2=²
B3=³
B4=´
B5=µ
B6=¶
B7=·
B8=¸
B9=¹
BA=؛
BB=»
BC=¼
BD=½
BE=¾
BF=؟
C0=ہ
C1=ء
C2=آ
C3=أ
C4=ؤ
C5=إ
C6=ئ
C7=ا
C8=ب
C9=ة
CA=ت
CB=ث
CC=ج
CD=ح
CE=خ
CF=د
D0=ذ
D1=ر
D2=ز
D3=س
D4=ش
D5=ص
D6=ض
D7=×
D8=ط
D9=ظ
DA=ع
DB=غ
DC=ـ
DD=ف
DE=ق
DF=ك
E0=à
E1=ل
E2=â
E3=م
E4=ن
E5=ه
E6=و
E7=ç
E8=è
E9=é
EA=ê
EB=ë
EC=ى
ED=ي
EE=î
EF=ï
F0=ً
F1=ٌ
F2=ٍ
F3=َ
F4=ô
F5=ُ
F6=ِ
F7=÷
F8=ّ
F9=ù
FA=ْ
FB=û
FC=ü
FD=
FE=
FF=ے

256
encodings/ascii.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
AA
AB
AC
AD
AE
AF
B0
B1
B2
B3
B4
B5
B6
B7
B8
B9
BA
BB
BC
BD
BE
BF
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
DA
DB
DC
DD
DE
DF
E0
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED
EE
EF
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
FA
FB
FC
FD
FE
FF

256
encodings/ascii_ansi.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81
82=
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=Š
8B=
8C=Œ
8D
8E=Ž
8F
90
91=
92=
93=“
94=”
95=•
96=
97=—
98=˜
99=™
9A=š
9B=
9C=œ
9D
9E=ž
9F=Ÿ
A0= 
A1=¡
A2=¢
A3=£
A4=¤
A5=¥
A6=¦
A7=§
A8=¨
A9=©
AA=ª
AB=«
AC=¬
AD=­
AE=®
AF=¯
B0=°
B1=±
B2=²
B3=³
B4=´
B5=µ
B6=¶
B7=·
B8=¸
B9=¹
BA=º
BB=»
BC=¼
BD=½
BE=¾
BF=¿
C0=À
C1=Á
C2=Â
C3=Ã
C4=Ä
C5=Å
C6=Æ
C7=Ç
C8=È
C9=É
CA=Ê
CB=Ë
CC=Ì
CD=Í
CE=Î
CF=Ï
D0=Ð
D1=Ñ
D2=Ò
D3=Ó
D4=Ô
D5=Õ
D6=Ö
D7=×
D8=Ø
D9=Ù
DA=Ú
DB=Û
DC=Ü
DD=Ý
DE=Þ
DF=ß
E0=à
E1=á
E2=â
E3=ã
E4=ä
E5=å
E6=æ
E7=ç
E8=è
E9=é
EA=ê
EB=ë
EC=ì
ED=í
EE=î
EF=ï
F0=ð
F1=ñ
F2=ò
F3=ó
F4=ô
F5=õ
F6=ö
F7=÷
F8=ø
F9=ù
FA=ú
FB=û
FC=ü
FD=ý
FE=þ
FF=ÿ

256
encodings/ascii_oem.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=Ç
81=ü
82=é
83=â
84=ä
85=à
86=å
87=ç
88=ê
89=ë
8A=è
8B=ï
8C=î
8D=ì
8E=Ä
8F=Å
90=É
91=æ
92=Æ
93=ô
94=ö
95=ò
96=û
97=ù
98=ÿ
99=Ö
9A=Ü
9B=¢
9C=£
9D=¥
9E=₧
9F=ƒ
A0=á
A1=í
A2=ó
A3=ú
A4=ñ
A5=Ñ
A6=ª
A7=º
A8=¿
A9=⌐
AA=¬
AB=½
AC=¼
AD=¡
AE=«
AF=»
B0=░
B1=▒
B2=▓
B3=│
B4=┤
B5=╡
B6=╢
B7=╖
B8=╕
B9=╣
BA=║
BB=╗
BC=╝
BD=╜
BE=╛
BF=┐
C0=└
C1=┴
C2=┬
C3=├
C4=─
C5=┼
C6=╞
C7=╟
C8=╚
C9=╔
CA=╩
CB=╦
CC=╠
CD=═
CE=╬
CF=╧
D0=╨
D1=╤
D2=╥
D3=╙
D4=╘
D5=╒
D6=╓
D7=╫
D8=╪
D9=┘
DA=┌
DB=█
DC=▄
DD=▌
DE=▐
DF=▀
E0=α
E1=ß
E2=Γ
E3=π
E4=Σ
E5=σ
E6=µ
E7=τ
E8=Φ
E9=Θ
EA=Ω
EB=δ
EC=∞
ED=φ
EE=ε
EF=∩
F0=≡
F1=±
F2=≥
F3=≤
F4=⌠
F5=⌡
F6=÷
F7=≈
F8=°
F9=∙
FA=·
FB=√
FC=ⁿ
FD=²
FE=■
FF= 

256
encodings/baltic_iso.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81=
82=‚
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=Š
8B=‹
8C=Œ
8D=
8E=Ž
8F=
90=
91=‘
92=’
93=“
94=”
95=•
96=–
97=—
98=˜
99=™
9A=š
9B=›
9C=œ
9D=
9E=ž
9F=Ÿ
A0= 
A1=”
A2=¢
A3=£
A4=¤
A5=„
A6=¦
A7=§
A8=Ø
A9=©
AA=Ŗ
AB=«
AC=¬
AD=­
AE=®
AF=Æ
B0=°
B1=±
B2=²
B3=³
B4=“
B5=µ
B6=¶
B7=·
B8=ø
B9=¹
BA=ŗ
BB=»
BC=¼
BD=½
BE=¾
BF=æ
C0=Ą
C1=Į
C2=Ā
C3=Ć
C4=Ä
C5=Å
C6=Ę
C7=Ē
C8=Č
C9=É
CA=Ź
CB=Ė
CC=Ģ
CD=Ķ
CE=Ī
CF=Ļ
D0=Š
D1=Ń
D2=Ņ
D3=Ó
D4=Ō
D5=Õ
D6=Ö
D7=×
D8=Ų
D9=Ł
DA=Ś
DB=Ū
DC=Ü
DD=Ż
DE=Ž
DF=ß
E0=ą
E1=į
E2=ā
E3=ć
E4=ä
E5=å
E6=ę
E7=ē
E8=č
E9=é
EA=ź
EB=ė
EC=ģ
ED=ķ
EE=ī
EF=ļ
F0=š
F1=ń
F2=ņ
F3=ó
F4=ō
F5=õ
F6=ö
F7=÷
F8=ų
F9=ł
FA=ś
FB=ū
FC=ü
FD=ż
FE=ž
FF=

View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81
82=
83
84=„
85=…
86=†
87=‡
88
89=‰
8A
8B=
8C
8D=¨
8E=ˇ
8F=¸
90
91=
92=
93=“
94=”
95=•
96=
97=—
98
99=™
9A
9B=
9C
9D=¯
9E=˛
9F
A0= 
A1
A2=¢
A3=£
A4=¤
A5
A6=¦
A7=§
A8=Ø
A9=©
AA=Ŗ
AB=«
AC=¬
AD=­
AE=®
AF=Æ
B0=°
B1=±
B2=²
B3=³
B4=´
B5=µ
B6=¶
B7=·
B8=ø
B9=¹
BA=ŗ
BB=»
BC=¼
BD=½
BE=¾
BF=æ
C0=Ą
C1=Į
C2=Ā
C3=Ć
C4=Ä
C5=Å
C6=Ę
C7=Ē
C8=Č
C9=É
CA=Ź
CB=Ė
CC=Ģ
CD=Ķ
CE=Ī
CF=Ļ
D0=Š
D1=Ń
D2=Ņ
D3=Ó
D4=Ō
D5=Õ
D6=Ö
D7=×
D8=Ų
D9=Ł
DA=Ś
DB=Ū
DC=Ü
DD=Ż
DE=Ž
DF=ß
E0=ą
E1=į
E2=ā
E3=ć
E4=ä
E5=å
E6=ę
E7=ē
E8=č
E9=é
EA=ź
EB=ė
EC=ģ
ED=ķ
EE=ī
EF=ļ
F0=š
F1=ń
F2=ņ
F3=ó
F4=ō
F5=õ
F6=ö
F7=÷
F8=ų
F9=ł
FA=ś
FB=ū
FC=ü
FD=ż
FE=ž
FF=˙

View File

@@ -0,0 +1,256 @@
00=NUL
01=☺
02=☻
03=♥
04=♦
05=♣
06=♠
07=•
08=◘
09=○
0A=◙
0B=♂
0C=♀
0D=♪
0E=♫
0F=☼
10=►
11=◄
12=↕
13=‼
14=¶
15=§
16=▬
17=↨
18=↑
19=↓
1A=→
1B=←
1C=∟
1D=↔
1E=▲
1F=▼
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=⌂
80=А
81=Б
82=В
83=Г
84=Д
85=Е
86=Ж
87=З
88=И
89=Й
8A=К
8B=Л
8C=М
8D=Н
8E=О
8F=П
90=Р
91=С
92=Т
93=У
94=Ф
95=Х
96=Ц
97=Ч
98=Ш
99=Щ
9A=Ъ
9B=Ы
9C=Ь
9D=Э
9E=Ю
9F=Я
A0=а
A1=б
A2=в
A3=г
A4=д
A5=е
A6=ж
A7=з
A8=и
A9=й
AA=к
AB=л
AC=м
AD=н
AE=о
AF=п
B0=░
B1=▒
B2=▓
B3=│
B4=┤
B5=╡
B6=╢
B7=╖
B8=╕
B9=╣
BA=║
BB=╗
BC=╝
BD=╜
BE=╛
BF=┐
C0=└
C1=┴
C2=┬
C3=├
C4=─
C5=┼
C6=╞
C7=╟
C8=╚
C9=╔
CA=╩
CB=╦
CC=╠
CD=═
CE=╬
CF=╧
D0=╨
D1=╤
D2=╥
D3=╙
D4=╘
D5=╒
D6=╓
D7=╫
D8=╪
D9=┘
DA=┌
DB=█
DC=▄
DD=▌
DE=▐
DF=▀
E0=р
E1=с
E2=т
E3=у
E4=ф
E5=х
E6=ц
E7=ч
E8=ш
E9=щ
EA=ъ
EB=ы
EC=ь
ED=э
EE=ю
EF=я
F0=Ё
F1=ё
F2=Є
F3=є
F4=Ї
F5=ї
F6=Ў
F7=ў
F8=°
F9=∙
FA=·
FB=√
FC=№
FD=¤
FE=■
FF= 

256
encodings/cyrillic_iso.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81=
82=‚
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=Š
8B=‹
8C=Œ
8D=
8E=Ž
8F=
90=
91=‘
92=’
93=“
94=”
95=•
96=–
97=—
98=˜
99=™
9A=š
9B=›
9C=œ
9D=
9E=ž
9F=Ÿ
A0= 
A1=Ё
A2=Ђ
A3=Ѓ
A4=Є
A5=Ѕ
A6=І
A7=Ї
A8=Ј
A9=Љ
AA=Њ
AB=Ћ
AC=Ќ
AD=­
AE=Ў
AF=Џ
B0=А
B1=Б
B2=В
B3=Г
B4=Д
B5=Е
B6=Ж
B7=З
B8=И
B9=Й
BA=К
BB=Л
BC=М
BD=Н
BE=О
BF=П
C0=Р
C1=С
C2=Т
C3=У
C4=Ф
C5=Х
C6=Ц
C7=Ч
C8=Ш
C9=Щ
CA=Ъ
CB=Ы
CC=Ь
CD=Э
CE=Ю
CF=Я
D0=а
D1=б
D2=в
D3=г
D4=д
D5=е
D6=ж
D7=з
D8=и
D9=й
DA=к
DB=л
DC=м
DD=н
DE=о
DF=п
E0=р
E1=с
E2=т
E3=у
E4=ф
E5=х
E6=ц
E7=ч
E8=ш
E9=щ
EA=ъ
EB=ы
EC=ь
ED=э
EE=ю
EF=я
F0=№
F1=ё
F2=ђ
F3=ѓ
F4=є
F5=ѕ
F6=і
F7=ї
F8=ј
F9=љ
FA=њ
FB=ћ
FC=ќ
FD=§
FE=ў
FF=џ

View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=─
81=│
82=┌
83=┐
84=└
85=┘
86=├
87=┤
88=┬
89=┴
8A=┼
8B=▀
8C=▄
8D=█
8E=▌
8F=▐
90=░
91=▒
92=▓
93=⌠
94=■
95=∙
96=√
97=≈
98=≤
99=≥
9A= 
9B=⌡
9C=°
9D=²
9E=·
9F=÷
A0=═
A1=║
A2=╒
A3=ё
A4=╓
A5=╔
A6=╕
A7=╖
A8=╗
A9=╘
AA=╙
AB=╚
AC=╛
AD=╜
AE=╝
AF=╞
B0=╟
B1=╠
B2=╡
B3=Ё
B4=╢
B5=╣
B6=╤
B7=╥
B8=╦
B9=╧
BA=╨
BB=╩
BC=╪
BD=╫
BE=╬
BF=©
C0=ю
C1=а
C2=б
C3=ц
C4=д
C5=е
C6=ф
C7=г
C8=х
C9=и
CA=й
CB=к
CC=л
CD=м
CE=н
CF=о
D0=п
D1=я
D2=р
D3=с
D4=т
D5=у
D6=ж
D7=в
D8=ь
D9=ы
DA=з
DB=ш
DC=э
DD=щ
DE=ч
DF=ъ
E0=Ю
E1=А
E2=Б
E3=Ц
E4=Д
E5=Е
E6=Ф
E7=Г
E8=Х
E9=И
EA=Й
EB=К
EC=Л
ED=М
EE=Н
EF=О
F0=П
F1=Я
F2=Р
F3=С
F4=Т
F5=У
F6=Ж
F7=В
F8=Ь
F9=Ы
FA=З
FB=Ш
FC=Э
FD=Щ
FE=Ч
FF=Ъ

View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=─
81=│
82=┌
83=┐
84=└
85=┘
86=├
87=┤
88=┬
89=┴
8A=┼
8B=▀
8C=▄
8D=█
8E=▌
8F=▐
90=░
91=▒
92=▓
93=⌠
94=■
95=∙
96=√
97=≈
98=≤
99=≥
9A= 
9B=⌡
9C=°
9D=²
9E=·
9F=÷
A0=═
A1=║
A2=╒
A3=ё
A4=є
A5=╔
A6=і
A7=ї
A8=╗
A9=╘
AA=╙
AB=╚
AC=╛
AD=ґ
AE=╝
AF=╞
B0=╟
B1=╠
B2=╡
B3=Ё
B4=Є
B5=╣
B6=І
B7=Ї
B8=╦
B9=╧
BA=╨
BB=╩
BC=╪
BD=Ґ
BE=╬
BF=©
C0=ю
C1=а
C2=б
C3=ц
C4=д
C5=е
C6=ф
C7=г
C8=х
C9=и
CA=й
CB=к
CC=л
CD=м
CE=н
CF=о
D0=п
D1=я
D2=р
D3=с
D4=т
D5=у
D6=ж
D7=в
D8=ь
D9=ы
DA=з
DB=ш
DC=э
DD=щ
DE=ч
DF=ъ
E0=Ю
E1=А
E2=Б
E3=Ц
E4=Д
E5=Е
E6=Ф
E7=Г
E8=Х
E9=И
EA=Й
EB=К
EC=Л
ED=М
EE=Н
EF=О
F0=П
F1=Я
F2=Р
F3=С
F4=Т
F5=У
F6=Ж
F7=В
F8=Ь
F9=Ы
FA=З
FB=Ш
FC=Э
FD=Щ
FE=Ч
FF=Ъ

View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=Ђ
81=Ѓ
82=
83=ѓ
84=„
85=…
86=†
87=‡
88=€
89=‰
8A=Љ
8B=
8C=Њ
8D=Ќ
8E=Ћ
8F=Џ
90=ђ
91=
92=
93=“
94=”
95=•
96=
97=—
98
99=™
9A=љ
9B=
9C=њ
9D=ќ
9E=ћ
9F=џ
A0= 
A1=Ў
A2=ў
A3=Ј
A4=¤
A5=Ґ
A6=¦
A7=§
A8=Ё
A9=©
AA=Є
AB=«
AC=¬
AD=­
AE=®
AF=Ї
B0=°
B1=±
B2=І
B3=і
B4=ґ
B5=µ
B6=¶
B7=·
B8=ё
B9=№
BA=є
BB=»
BC=ј
BD=Ѕ
BE=ѕ
BF=ї
C0=А
C1=Б
C2=В
C3=Г
C4=Д
C5=Е
C6=Ж
C7=З
C8=И
C9=Й
CA=К
CB=Л
CC=М
CD=Н
CE=О
CF=П
D0=Р
D1=С
D2=Т
D3=У
D4=Ф
D5=Х
D6=Ц
D7=Ч
D8=Ш
D9=Щ
DA=Ъ
DB=Ы
DC=Ь
DD=Э
DE=Ю
DF=Я
E0=а
E1=б
E2=в
E3=г
E4=д
E5=е
E6=ж
E7=з
E8=и
E9=й
EA=к
EB=л
EC=м
ED=н
EE=о
EF=п
F0=р
F1=с
F2=т
F3=у
F4=ф
F5=х
F6=ц
F7=ч
F8=ш
F9=щ
FA=ъ
FB=ы
FC=ь
FD=э
FE=ю
FF=я

View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81=
82=‚
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=Š
8B=‹
8C=Œ
8D=
8E=Ž
8F=
90=
91=‘
92=’
93=“
94=”
95=•
96=–
97=—
98=˜
99=™
9A=š
9B=›
9C=œ
9D=
9E=ž
9F=Ÿ
A0= 
A1=Ą
A2=˘
A3=Ł
A4=¤
A5=Ľ
A6=Ś
A7=§
A8=¨
A9=Š
AA=Ş
AB=Ť
AC=Ź
AD=­
AE=Ž
AF=Ż
B0=°
B1=ą
B2=˛
B3=ł
B4=´
B5=ľ
B6=ś
B7=ˇ
B8=¸
B9=š
BA=ş
BB=ť
BC=ź
BD=˝
BE=ž
BF=ż
C0=Ŕ
C1=Á
C2=Â
C3=Ă
C4=Ä
C5=Ĺ
C6=Ć
C7=Ç
C8=Č
C9=É
CA=Ę
CB=Ë
CC=Ě
CD=Í
CE=Î
CF=Ď
D0=Đ
D1=Ń
D2=Ň
D3=Ó
D4=Ô
D5=Ő
D6=Ö
D7=×
D8=Ř
D9=Ů
DA=Ú
DB=Ű
DC=Ü
DD=Ý
DE=Ţ
DF=ß
E0=ŕ
E1=á
E2=â
E3=ă
E4=ä
E5=ĺ
E6=ć
E7=ç
E8=č
E9=é
EA=ę
EB=ë
EC=ě
ED=í
EE=î
EF=ď
F0=đ
F1=ń
F2=ň
F3=ó
F4=ô
F5=ő
F6=ö
F7=÷
F8=ř
F9=ů
FA=ú
FB=ű
FC=ü
FD=ý
FE=ţ
FF=˙

View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81
82=
83
84=„
85=…
86=†
87=‡
88
89=‰
8A=Š
8B=
8C=Ś
8D=Ť
8E=Ž
8F=Ź
90
91=
92=
93=“
94=”
95=•
96=
97=—
98
99=™
9A=š
9B=
9C=ś
9D=ť
9E=ž
9F=ź
A0= 
A1=ˇ
A2=˘
A3=Ł
A4=¤
A5=Ą
A6=¦
A7=§
A8=¨
A9=©
AA=Ş
AB=«
AC=¬
AD=­
AE=®
AF=Ż
B0=°
B1=±
B2=˛
B3=ł
B4=´
B5=µ
B6=¶
B7=·
B8=¸
B9=ą
BA=ş
BB=»
BC=Ľ
BD=˝
BE=ľ
BF=ż
C0=Ŕ
C1=Á
C2=Â
C3=Ă
C4=Ä
C5=Ĺ
C6=Ć
C7=Ç
C8=Č
C9=É
CA=Ę
CB=Ë
CC=Ě
CD=Í
CE=Î
CF=Ď
D0=Đ
D1=Ń
D2=Ň
D3=Ó
D4=Ô
D5=Ő
D6=Ö
D7=×
D8=Ř
D9=Ů
DA=Ú
DB=Ű
DC=Ü
DD=Ý
DE=Ţ
DF=ß
E0=ŕ
E1=á
E2=â
E3=ă
E4=ä
E5=ĺ
E6=ć
E7=ç
E8=č
E9=é
EA=ę
EB=ë
EC=ě
ED=í
EE=î
EF=ď
F0=đ
F1=ń
F2=ň
F3=ó
F4=ô
F5=ő
F6=ö
F7=÷
F8=ř
F9=ů
FA=ú
FB=ű
FC=ü
FD=ý
FE=ţ
FF=˙

256
encodings/ebcdic.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=œ
05=TAB
06=†
07=DEL
08=—
09=
0A=Ž
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=
15=…
16=BS
17=‡
18=CAN
19=EM
1A=’
1B=
1C=FS
1D=GS
1E=RS
1F=US
20=€
21=
22=‚
23=ƒ
24=„
25=LF
26=ETB
27=ESC
28=ˆ
29=‰
2A=Š
2B=‹
2C=Œ
2D=ENQ
2E=ACK
2F=BEL
30=
31=‘
32=SYN
33=“
34=”
35=•
36=–
37=EOT
38=˜
39=™
3A=š
3B=›
3C=DC4
3D=NAK
3E=ž
3F=SUB
40=
41= 
42=â
43=ä
44=à
45=á
46=ã
47=å
48=ç
49=ñ
4A=¢
4B=.
4C=<
4D=(
4E=+
4F=|
50=&
51=é
52=ê
53=ë
54=è
55=í
56=î
57=ï
58=ì
59=ß
5A=!
5B=$
5C=*
5D=)
5E=;
5F=¬
60=-
61=/
62=Â
63=Ä
64=À
65=Á
66=Ã
67=Å
68=Ç
69=Ñ
6A=¦
6B=,
6C=%
6D=_
6E=>
6F=?
70=ø
71=É
72=Ê
73=Ë
74=È
75=Í
76=Î
77=Ï
78=Ì
79=`
7A=:
7B=#
7C=@
7D='
7E==
7F="
80=Ø
81=a
82=b
83=c
84=d
85=e
86=f
87=g
88=h
89=i
8A=«
8B=»
8C=ð
8D=ý
8E=þ
8F=±
90=°
91=j
92=k
93=l
94=m
95=n
96=o
97=p
98=q
99=r
9A=ª
9B=º
9C=æ
9D=¸
9E=Æ
9F=¤
A0=µ
A1=~
A2=s
A3=t
A4=u
A5=v
A6=w
A7=x
A8=y
A9=z
AA=¡
AB=¿
AC=Ð
AD=Ý
AE=Þ
AF=®
B0=^
B1=£
B2=¥
B3=·
B4=©
B5=§
B6=¶
B7=¼
B8=½
B9=¾
BA=[
BB=]
BC=¯
BD=¨
BE=´
BF=×
C0={
C1=A
C2=B
C3=C
C4=D
C5=E
C6=F
C7=G
C8=H
C9=I
CA=­
CB=ô
CC=ö
CD=ò
CE=ó
CF=õ
D0=}
D1=J
D2=K
D3=L
D4=M
D5=N
D6=O
D7=P
D8=Q
D9=R
DA=¹
DB=û
DC=ü
DD=ù
DE=ú
DF=ÿ
E0=\
E1=÷
E2=S
E3=T
E4=U
E5=V
E6=W
E7=X
E8=Y
E9=Z
EA=²
EB=Ô
EC=Ö
ED=Ò
EE=Ó
EF=Õ
F0=0
F1=1
F2=2
F3=3
F4=4
F5=5
F6=6
F7=7
F8=8
F9=9
FA=³
FB=Û
FC=Ü
FD=Ù
FE=Ú
FF=Ÿ

16674
encodings/euc_kr.tbl Normal file

File diff suppressed because it is too large Load Diff

256
encodings/greek_iso.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81=
82=‚
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=Š
8B=‹
8C=Œ
8D=
8E=Ž
8F=
90=
91=‘
92=’
93=“
94=”
95=•
96=–
97=—
98=˜
99=™
9A=š
9B=›
9C=œ
9D=
9E=ž
9F=Ÿ
A0= 
A1=
A2=
A3=£
A4
A5
A6=¦
A7=§
A8=¨
A9=©
AA
AB=«
AC=¬
AD=­
AE
AF=―
B0=°
B1=±
B2=²
B3=³
B4=΄
B5=΅
B6=Ά
B7=·
B8=Έ
B9=Ή
BA=Ί
BB=»
BC=Ό
BD=½
BE=Ύ
BF=Ώ
C0=ΐ
C1=Α
C2=Β
C3=Γ
C4=Δ
C5=Ε
C6=Ζ
C7=Η
C8=Θ
C9=Ι
CA=Κ
CB=Λ
CC=Μ
CD=Ν
CE=Ξ
CF=Ο
D0=Π
D1=Ρ
D2
D3=Σ
D4=Τ
D5=Υ
D6=Φ
D7=Χ
D8=Ψ
D9=Ω
DA=Ϊ
DB=Ϋ
DC=ά
DD=έ
DE=ή
DF=ί
E0=ΰ
E1=α
E2=β
E3=γ
E4=δ
E5=ε
E6=ζ
E7=η
E8=θ
E9=ι
EA=κ
EB=λ
EC=μ
ED=ν
EE=ξ
EF=ο
F0=π
F1=ρ
F2=ς
F3=σ
F4=τ
F5=υ
F6=φ
F7=χ
F8=ψ
F9=ω
FA=ϊ
FB=ϋ
FC=ό
FD=ύ
FE=ώ
FF

256
encodings/greek_windows.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81
82=
83=ƒ
84=„
85=…
86=†
87=‡
88
89=‰
8A
8B=
8C
8D
8E
8F
90
91=
92=
93=“
94=”
95=•
96=
97=—
98
99=™
9A
9B=
9C
9D
9E
9F
A0= 
A1=΅
A2=Ά
A3=£
A4=¤
A5=¥
A6=¦
A7=§
A8=¨
A9=©
AA
AB=«
AC=¬
AD=­
AE=®
AF=―
B0=°
B1=±
B2=²
B3=³
B4=΄
B5=µ
B6=¶
B7=·
B8=Έ
B9=Ή
BA=Ί
BB=»
BC=Ό
BD=½
BE=Ύ
BF=Ώ
C0=ΐ
C1=Α
C2=Β
C3=Γ
C4=Δ
C5=Ε
C6=Ζ
C7=Η
C8=Θ
C9=Ι
CA=Κ
CB=Λ
CC=Μ
CD=Ν
CE=Ξ
CF=Ο
D0=Π
D1=Ρ
D2
D3=Σ
D4=Τ
D5=Υ
D6=Φ
D7=Χ
D8=Ψ
D9=Ω
DA=Ϊ
DB=Ϋ
DC=ά
DD=έ
DE=ή
DF=ί
E0=ΰ
E1=α
E2=β
E3=γ
E4=δ
E5=ε
E6=ζ
E7=η
E8=θ
E9=ι
EA=κ
EB=λ
EC=μ
ED=ν
EE=ξ
EF=ο
F0=π
F1=ρ
F2=ς
F3=σ
F4=τ
F5=υ
F6=φ
F7=χ
F8=ψ
F9=ω
FA=ϊ
FB=ϋ
FC=ό
FD=ύ
FE=ώ
FF

256
encodings/hebrew_iso.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81=
82=‚
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=Š
8B=‹
8C=Œ
8D=
8E=Ž
8F=
90=
91=‘
92=’
93=“
94=”
95=•
96=–
97=—
98=˜
99=™
9A=š
9B=›
9C=œ
9D=
9E=ž
9F=Ÿ
A0= 
A1
A2=¢
A3=£
A4=¤
A5=¥
A6=¦
A7=§
A8=¨
A9=©
AA=×
AB=«
AC=¬
AD=­
AE=®
AF=‾
B0=°
B1=±
B2=²
B3=³
B4=´
B5=µ
B6=¶
B7=·
B8=¸
B9=¹
BA=÷
BB=»
BC=¼
BD=½
BE=¾
BF
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
DA
DB
DC
DD
DE
DF=‗
E0=א
E1=ב
E2=ג
E3=ד
E4=ה
E5=ו
E6=ז
E7=ח
E8=ט
E9=י
EA=ך
EB=כ
EC=ל
ED=ם
EE=מ
EF=ן
F0=נ
F1=ס
F2=ע
F3=ף
F4=פ
F5=ץ
F6=צ
F7=ק
F8=ר
F9=ש
FA=ת
FB
FC
FD
FE
FF

View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81
82=
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A
8B=
8C
8D
8E
8F
90
91=
92=
93=“
94=”
95=•
96=
97=—
98=˜
99=™
9A
9B=
9C
9D
9E
9F
A0= 
A1=¡
A2=¢
A3=£
A4=₪
A5=¥
A6=¦
A7=§
A8=¨
A9=©
AA=×
AB=«
AC=¬
AD=­
AE=®
AF=¯
B0=°
B1=±
B2=²
B3=³
B4=´
B5=µ
B6=¶
B7=·
B8=¸
B9=¹
BA=÷
BB=»
BC=¼
BD=½
BE=¾
BF=¿
C0=ְ
C1=ֱ
C2=ֲ
C3=ֳ
C4=ִ
C5=ֵ
C6=ֶ
C7=ַ
C8=ָ
C9=ֹ
CA
CB=ֻ
CC=ּ
CD=ֽ
CE=־
CF=ֿ
D0=׀
D1=ׁ
D2=ׂ
D3=׃
D4=װ
D5=ױ
D6=ײ
D7=׳
D8=״
D9
DA
DB
DC
DD
DE
DF
E0=א
E1=ב
E2=ג
E3=ד
E4=ה
E5=ו
E6=ז
E7=ח
E8=ט
E9=י
EA=ך
EB=כ
EC=ל
ED=ם
EE=מ
EF=ן
F0=נ
F1=ס
F2=ע
F3=ף
F4=פ
F5=ץ
F6=צ
F7=ק
F8=ר
F9=ש
FA=ת
FB
FC
FD=
FE=
FF

256
encodings/macintosh.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=Ä
81=Å
82=Ç
83=É
84=Ñ
85=Ö
86=Ü
87=á
88=à
89=â
8A=ä
8B=ã
8C=å
8D=ç
8E=é
8F=è
90=ê
91=ë
92=í
93=ì
94=î
95=ï
96=ñ
97=ó
98=ò
99=ô
9A=ö
9B=õ
9C=ú
9D=ù
9E=û
9F=ü
A0=†
A1=°
A2=¢
A3=£
A4=§
A5=•
A6=¶
A7=ß
A8=®
A9=©
AA=™
AB=´
AC=¨
AD=≠
AE=Æ
AF=Ø
B0=∞
B1=±
B2=≤
B3=≥
B4=¥
B5=µ
B6=∂
B7=∑
B8=∏
B9=π
BA=∫
BB=ª
BC=º
BD=Ω
BE=æ
BF=ø
C0=¿
C1=¡
C2=¬
C3=√
C4=ƒ
C5=≈
C6=∆
C7=«
C8=»
C9=…
CA= 
CB=À
CC=Ã
CD=Õ
CE=Œ
CF=œ
D0=
D1=—
D2=“
D3=”
D4=
D5=
D6=÷
D7=◊
D8=ÿ
D9=Ÿ
DA=
DB=€
DC=
DD=
DE=fi
DF=fl
E0=‡
E1=·
E2=
E3=„
E4=‰
E5=Â
E6=Ê
E7=Á
E8=Ë
E9=È
EA=Í
EB=Î
EC=Ï
ED=Ì
EE=Ó
EF=Ô
F0=
F1=Ò
F2=Ú
F3=Û
F4=Ù
F5=ı
F6=ˆ
F7=˜
F8=¯
F9=˘
FA=˙
FB=˚
FC=¸
FD=˝
FE=˛
FF=ˇ

255
encodings/pokegen1_en.tbl Normal file
View File

@@ -0,0 +1,255 @@
00=NUL
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F
40
41
42
43
44
45
46
47
48
49=page
4A=PkMn
4B=_cont
4C=autocont
4D
4E=next line
4F=bottom line
50=end
51=paragraph
52=player name
53=rival name
54=Poké
55=cont
56=......
57=done
58=prompt
59=target
5A=user
5B=PC
5C=TM
5D=TRAINER
5E=ROCKET
5F=dex
60=A
61=B
62=C
63=D
64=E
65=F
66=G
67=H
68=I
69=V
6A=S
6B=L
6C=M
6D=:
6E=ぃ
6F=ぅ
70=
71=
72=“
73=”
74=・
75=⋯
76=ぁ
77=ぇ
78=ぉ
79
7A
7B
7C
7D
7E
7F
80=A
81=B
82=C
83=D
84=E
85=F
86=G
87=H
88=I
89=J
8A=K
8B=L
8C=M
8D=N
8E=O
8F=P
90=Q
91=R
92=S
93=T
94=U
95=V
96=W
97=X
98=Y
99=Z
9A=(
9B=)
9C=
9D=;
9E=[
9F=]
A0=a
A1=b
A2=c
A3=d
A4=e
A5=f
A6=g
A7=h
A8=i
A9=j
AA=k
AB=l
AC=m
AD=n
AE=o
AF=p
B0=q
B1=r
B2=s
B3=t
B4=u
B5=v
B6=w
B7=x
B8=y
B9=z
BA=é
BB='d
BC='l
BD='s
BE='t
BF='v
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
DA
DB
DC
DD
DE
DF
E0='
E1=Pk
E2=Mn
E3=-
E4='r
E5='m
E6=?
E7=!
E8=.
E9=ァ
EA=ゥ
EB=ェ
EC=▷
ED=▶
EE=▼
EF=♂
F0=$
F1=×
F2=.
F3=/
F4=,
F5=♀
F6=0
F7=1
F8=2
F9=3
FA=4
FB=5
FC=6
FD=7
FE=8
FF=9

View File

@@ -1,6 +1,10 @@
00=()
090D=(R)
0A=(BR)
00=
08=\b
09=\t
0A=\n
0B=\v
0C=\f
0D=\r
20=
21=!
22="

256
encodings/thai.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81
82
83
84
85=…
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91=
92=
93=“
94=”
95=•
96=
97=—
98
99
9A
9B
9C
9D
9E
9F
A0
A1=ก
A2=ข
A3=ฃ
A4=ค
A5=ฅ
A6=ฆ
A7=ง
A8=จ
A9=ฉ
AA=ช
AB=ซ
AC=ฌ
AD=ญ
AE=ฎ
AF=ฏ
B0=ฐ
B1=ฑ
B2=ฒ
B3=ณ
B4=ด
B5=ต
B6=ถ
B7=ท
B8=ธ
B9=น
BA=บ
BB=ป
BC=ผ
BD=ฝ
BE=พ
BF=ฟ
C0=ภ
C1=ม
C2=ย
C3=ร
C4=ฤ
C5=ล
C6=ฦ
C7=ว
C8=ศ
C9=ษ
CA=ส
CB=ห
CC=ฬ
CD=อ
CE=ฮ
CF=ฯ
D0=ะ
D1=ั
D2=า
D3=ำ
D4=ิ
D5=ี
D6=ึ
D7=ื
D8=ุ
D9=ู
DA=ฺ
DB
DC
DD
DE
DF=฿
E0=เ
E1=แ
E2=โ
E3=ใ
E4=ไ
E5=ๅ
E6=ๆ
E7=็
E8=่
E9=้
EA=๊
EB=๋
EC=์
ED=ํ
EE=๎
EF=๏
F0=
F1=๑
F2=๒
F3=๓
F4=๔
F5=๕
F6=๖
F7=๗
F8=๘
F9=๙
FA=๚
FB=๛
FC
FD
FE
FF

256
encodings/turkish_iso.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81=
82=‚
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=Š
8B=‹
8C=Œ
8D=
8E=Ž
8F=
90=
91=‘
92=’
93=“
94=”
95=•
96=–
97=—
98=˜
99=™
9A=š
9B=›
9C=œ
9D=
9E=ž
9F=Ÿ
A0= 
A1=¡
A2=¢
A3=£
A4=¤
A5=¥
A6=¦
A7=§
A8=¨
A9=©
AA=ª
AB=«
AC=¬
AD=­
AE=®
AF=¯
B0=°
B1=±
B2=²
B3=³
B4=´
B5=µ
B6=¶
B7=·
B8=¸
B9=¹
BA=º
BB=»
BC=¼
BD=½
BE=¾
BF=¿
C0=À
C1=Á
C2=Â
C3=Ã
C4=Ä
C5=Å
C6=Æ
C7=Ç
C8=È
C9=É
CA=Ê
CB=Ë
CC=Ì
CD=Í
CE=Î
CF=Ï
D0=Ğ
D1=Ñ
D2=Ò
D3=Ó
D4=Ô
D5=Õ
D6=Ö
D7=×
D8=Ø
D9=Ù
DA=Ú
DB=Û
DC=Ü
DD=İ
DE=Ş
DF=ß
E0=à
E1=á
E2=â
E3=ã
E4=ä
E5=å
E6=æ
E7=ç
E8=è
E9=é
EA=ê
EB=ë
EC=ì
ED=í
EE=î
EF=ï
F0=ğ
F1=ñ
F2=ò
F3=ó
F4=ô
F5=õ
F6=ö
F7=÷
F8=ø
F9=ù
FA=ú
FB=û
FC=ü
FD=ı
FE=ş
FF=ÿ

View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81
82=
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A=Š
8B=
8C=Œ
8D
8E
8F
90
91=
92=
93=“
94=”
95=•
96=
97=—
98=˜
99=™
9A=š
9B=
9C=œ
9D
9E
9F=Ÿ
A0= 
A1=¡
A2=¢
A3=£
A4=¤
A5=¥
A6=¦
A7=§
A8=¨
A9=©
AA=ª
AB=«
AC=¬
AD=­
AE=®
AF=¯
B0=°
B1=±
B2=²
B3=³
B4=´
B5=µ
B6=¶
B7=·
B8=¸
B9=¹
BA=º
BB=»
BC=¼
BD=½
BE=¾
BF=¿
C0=À
C1=Á
C2=Â
C3=Ã
C4=Ä
C5=Å
C6=Æ
C7=Ç
C8=È
C9=É
CA=Ê
CB=Ë
CC=Ì
CD=Í
CE=Î
CF=Ï
D0=Ğ
D1=Ñ
D2=Ò
D3=Ó
D4=Ô
D5=Õ
D6=Ö
D7=×
D8=Ø
D9=Ù
DA=Ú
DB=Û
DC=Ü
DD=İ
DE=Ş
DF=ß
E0=à
E1=á
E2=â
E3=ã
E4=ä
E5=å
E6=æ
E7=ç
E8=è
E9=é
EA=ê
EB=ë
EC=ì
ED=í
EE=î
EF=ï
F0=ğ
F1=ñ
F2=ò
F3=ó
F4=ô
F5=õ
F6=ö
F7=÷
F8=ø
F9=ù
FA=ú
FB=û
FC=ü
FD=ı
FE=ş
FF=ÿ

1114111
encodings/utf8.tbl Normal file

File diff suppressed because it is too large Load Diff

256
encodings/vietnamese.tbl Normal file
View File

@@ -0,0 +1,256 @@
00=NUL
01=SOH
02=STX
03=ETX
04=EOT
05=ENQ
06=ACK
07=BEL
08=BS
09=TAB
0A=LF
0B=VT
0C=FF
0D=CR
0E=SO
0F=SI
10=DLE
11=DC1
12=DC2
13=DC3
14=DC4
15=NAK
16=SYN
17=ETB
18=CAN
19=EM
1A=SUB
1B=ESC
1C=FS
1D=GS
1E=RS
1F=US
20=
21=!
22="
23=#
24=$
25=%
26=&
27='
28=(
29=)
2A=*
2B=+
2C=,
2D=-
2E=.
2F=/
30=0
31=1
32=2
33=3
34=4
35=5
36=6
37=7
38=8
39=9
3A=:
3B=;
3C=<
3D==
3E=>
3F=?
40=@
41=A
42=B
43=C
44=D
45=E
46=F
47=G
48=H
49=I
4A=J
4B=K
4C=L
4D=M
4E=N
4F=O
50=P
51=Q
52=R
53=S
54=T
55=U
56=V
57=W
58=X
59=Y
5A=Z
5B=[
5C=\
5D=]
5E=^
5F=_
60=`
61=a
62=b
63=c
64=d
65=e
66=f
67=g
68=h
69=i
6A=j
6B=k
6C=l
6D=m
6E=n
6F=o
70=p
71=q
72=r
73=s
74=t
75=u
76=v
77=w
78=x
79=y
7A=z
7B={
7C=|
7D=}
7E=~
7F=DEL
80=€
81
82=
83=ƒ
84=„
85=…
86=†
87=‡
88=ˆ
89=‰
8A
8B=
8C=Œ
8D
8E
8F
90
91=
92=
93=“
94=”
95=•
96=
97=—
98=˜
99=™
9A
9B=
9C=œ
9D
9E
9F=Ÿ
A0= 
A1=¡
A2=¢
A3=£
A4=¤
A5=¥
A6=¦
A7=§
A8=¨
A9=©
AA=ª
AB=«
AC=¬
AD=­
AE=®
AF=¯
B0=°
B1=±
B2=²
B3=³
B4=´
B5=µ
B6=¶
B7=·
B8=¸
B9=¹
BA=º
BB=»
BC=¼
BD=½
BE=¾
BF=¿
C0=À
C1=Á
C2=Â
C3=Ă
C4=Ä
C5=Å
C6=Æ
C7=Ç
C8=È
C9=É
CA=Ê
CB=Ë
CC=̀
CD=Í
CE=Î
CF=Ï
D0=Đ
D1=Ñ
D2=̉
D3=Ó
D4=Ô
D5=Ơ
D6=Ö
D7=×
D8=Ø
D9=Ù
DA=Ú
DB=Û
DC=Ü
DD=Ư
DE=̃
DF=ß
E0=à
E1=á
E2=â
E3=ă
E4=ä
E5=å
E6=æ
E7=ç
E8=è
E9=é
EA=ê
EB=ë
EC=́
ED=í
EE=î
EF=ï
F0=đ
F1=ñ
F2=̣
F3=ó
F4=ô
F5=ơ
F6=ö
F7=÷
F8=ø
F9=ù
FA=ú
FB=û
FC=ü
FD=ư
FE=₫
FF=ÿ

View File

@@ -1,16 +0,0 @@
#pragma once
using uint8_t = u8;
using uint16_t = u16;
using uint32_t = u32;
using uint64_t = u64;
using uint128_t = u128;
using int8_t = s8;
using int16_t = s16;
using int32_t = s32;
using int64_t = s64;
using int128_t = s128;
using size_t = u32;
using ssize_t = s32;

29
includes/hex/core.pat Normal file
View File

@@ -0,0 +1,29 @@
#pragma once
#include <hex/impl/imhex_check.pat>
namespace hex::core {
struct Selection {
bool valid;
u64 address, size;
};
fn get_selection() {
u128 result = builtin::hex::core::get_selection();
Selection result;
if (result == u128(-1)) {
result.valid = false;
result.address = 0x00;
result.size = 0x00;
} else {
result.valid = true;
result.address = result >> 64;
result.size = result & u64(-1);
}
return result;
};
}

11
includes/hex/dec.pat Normal file
View File

@@ -0,0 +1,11 @@
#pragma once
#include <hex/impl/imhex_check.pat>
namespace hex::dec {
fn demangle(str mangled_name) {
return builtin::hex::dec::demangle(mangled_name);
};
}

11
includes/hex/http.pat Normal file
View File

@@ -0,0 +1,11 @@
#pragma once
#include <hex/impl/imhex_check.pat>
namespace hex::http {
fn get(str url) {
return builtin::hex::http::get(url);
};
}

View File

@@ -0,0 +1,7 @@
#ifndef __PL_UNIT_TESTS__
#ifndef __IMHEX__
#error This library is only available in the ImHex Hex editor
#endif
#endif

View File

@@ -0,0 +1,23 @@
#pragma once
#include <std/io.pat>
#include <std/mem.pat>
#include <hex/impl/imhex_check.pat>
#include <hex/dec.pat>
namespace hex::type {
struct MangledName {
char value[];
} [[sealed, format("hex::type::impl::format_mangled_name")]];
namespace impl {
fn format_mangled_name(ref MangledName name) {
return hex::dec::demangle(name.value);
};
}
}

9
includes/std/array.pat Normal file
View File

@@ -0,0 +1,9 @@
#pragma once
namespace std {
struct Array<T, auto Size> {
T data[Size] [[inline]];
};
}

View File

@@ -1,23 +0,0 @@
#pragma once
namespace std {
using uint8_t = u8;
using uint16_t = u16;
using uint32_t = u32;
using uint64_t = u64;
using uint128_t = u128;
using int8_t = s8;
using int16_t = s16;
using int32_t = s32;
using int64_t = s64;
using int128_t = s128;
using float32_t = float;
using float64_t = double;
using size_t = u64;
using ssize_t = s64;
}

60
includes/std/core.pat Normal file
View File

@@ -0,0 +1,60 @@
#pragma once
#include <std/mem.pat>
namespace std::core {
enum BitfieldOrder : u8 {
LeftToRight = 0,
RightToLeft = 1
};
fn has_attribute(ref auto pattern, str attribute) {
return builtin::std::core::has_attribute(pattern, attribute);
};
fn get_attribute_value(ref auto pattern, str attribute) {
return builtin::std::core::get_attribute_value(pattern, attribute);
};
fn set_endian(std::mem::Endian endian) {
builtin::std::core::set_endian(u32(endian));
};
fn get_endian() {
return builtin::std::core::get_endian();
};
fn set_bitfield_order(BitfieldOrder order) {
builtin::std::core::set_bitfield_order(u32(order));
};
fn get_bitfield_order() {
return builtin::std::core::get_bitfield_order();
};
fn array_index() {
return builtin::std::core::array_index();
};
fn member_count(ref auto pattern) {
return builtin::std::core::member_count(pattern);
};
fn has_member(ref auto pattern, str name) {
return builtin::std::core::has_member(pattern, name);
};
fn formatted_value(ref auto pattern) {
return builtin::std::core::formatted_value(pattern);
};
fn is_valid_enum(ref auto pattern) {
return builtin::std::core::is_valid_enum(pattern);
};
}

View File

@@ -12,7 +12,7 @@ namespace std::file {
fn open(str path, Mode mode) {
return builtin::std::file::open(path, mode);
return builtin::std::file::open(path, u32(mode));
};
fn close(Handle handle) {

View File

@@ -2,28 +2,8 @@
namespace std::hash {
fn crc32(u128 address, u64 size, u32 init, u32 poly) {
u8 byte;
u32 crc, mask;
crc = init;
u64 i;
while (i < size) {
byte = std::mem::read_unsigned(address + i, 1);
crc = crc ^ byte;
u8 j;
while (j < 8) {
mask = u32(-(crc & 1));
crc = (crc >> 1) ^ (poly & mask);
j = j + 1;
}
i = i + 1;
}
return u32(~crc);
fn crc32(ref auto pattern, u32 init, u32 poly) {
return builtin::std::hash::crc32(pattern, init, poly);
};
}

View File

@@ -1,9 +0,0 @@
#pragma once
namespace std::http {
fn get(str url) {
return builtin::std::http::get(url);
};
}

View File

@@ -2,6 +2,14 @@
namespace std::mem {
using Section = u128;
enum Endian : u8 {
Native = 0,
Big = 1,
Little = 2
};
fn eof() {
return $ >= std::mem::size();
};
@@ -29,16 +37,60 @@ namespace std::mem {
return builtin::std::mem::find_sequence_in_range(occurrence_index, offsetFrom, offsetTo, bytes);
};
fn read_unsigned(u128 address, u8 size) {
return builtin::std::mem::read_unsigned(address, size);
fn read_unsigned(u128 address, u8 size, Endian endian = Endian::Native) {
return builtin::std::mem::read_unsigned(address, size, u32(endian));
};
fn read_signed(u128 address, u8 size) {
return builtin::std::mem::read_signed(address, size);
fn read_signed(u128 address, u8 size, Endian endian = Endian::Native) {
return builtin::std::mem::read_signed(address, size, u32(endian));
};
fn read_string(u128 address, u8 size) {
return builtin::std::mem::read_string(address, size);
};
fn create_section(str name) {
return builtin::std::mem::create_section(name);
};
fn delete_section(Section section) {
builtin::std::mem::delete_section(section);
};
fn get_section_size(Section section) {
return builtin::std::mem::get_section_size(section);
};
fn copy_section_to_section(Section from_section, u64 from_address, Section to_section, u64 to_address, u64 size) {
builtin::std::mem::get_section_size(from_section, from_address, to_section, to_address, size);
};
fn copy_value_to_section(ref auto value, Section to_section, u64 to_address) {
builtin::std::mem::copy_value_to_section(value, to_section, to_address);
};
struct MagicSearch<auto Magic, T> {
if ($ < (std::mem::size() - std::string::length(Magic) - 1)) {
char __potentialMagic__[std::string::length(Magic)] [[hidden, no_unique_address]];
if (__potentialMagic__ == Magic) {
T data [[inline]];
} else {
padding[1];
continue;
}
} else {
padding[1];
continue;
}
};
union Reinterpreter<From, To> {
From from;
To to;
};
}

View File

@@ -1,17 +0,0 @@
#pragma once
namespace std {
using i8 = s8;
using i16 = s16;
using i32 = s32;
using i64 = s64;
using i128 = s128;
using f32 = float;
using f64 = double;
using usize = u64;
using isize = s64;
}

View File

@@ -4,6 +4,22 @@
namespace std::string {
struct SizedStringBase<SizeType, DataType> {
SizeType size;
DataType data[size];
} [[sealed, format("std::string::impl::format_sized_string"), transform("std::string::impl::format_sized_string")]];
using SizedString<SizeType> = SizedStringBase<SizeType, char>;
using SizedString16<SizeType> = SizedStringBase<SizeType, char16>;
namespace impl {
fn format_sized_string(ref auto string) {
return string.data;
};
}
fn length(str string) {
return builtin::std::string::length(string);
};
@@ -39,15 +55,12 @@ namespace std::string {
};
fn contains(str a, str b) {
s32 a_len, b_len;
a_len = std::string::length(a);
b_len = std::string::length(b);
s32 a_len = std::string::length(a);
s32 b_len = std::string::length(b);
s32 i;
while (i < a_len - b_len) {
for (s32 i = 0, i <= (a_len - b_len), i += 1) {
if (std::string::substr(a, i, b_len) == b)
return true;
i = i + 1;
}
return false;

121
includes/std/time.pat Normal file
View File

@@ -0,0 +1,121 @@
#pragma once
#include <std/io.pat>
namespace std::time {
struct Time {
u8 sec;
u8 min;
u8 hour;
u8 mday;
u8 mon;
u16 year;
u8 wday;
u16 yday;
bool isdst;
} [[sealed]];
union TimeConverter {
Time time;
u128 value;
};
using EpochTime = u128;
enum TimeZone : u8 {
Local,
UTC
};
bitfield DOSDate {
day: 5;
month: 4;
year: 7;
} [[sealed]];
bitfield DOSTime {
seconds: 5;
minutes: 6;
hours: 5;
} [[sealed]];
namespace impl {
union DOSDateConverter {
DOSDate date;
u16 value;
};
union DOSTimeConverter {
DOSTime time;
u16 value;
};
}
fn epoch() {
return builtin::std::time::epoch();
};
fn to_local(EpochTime epoch_time) {
TimeConverter converter;
converter.value = builtin::std::time::to_local(epoch_time);
return converter.time;
};
fn to_utc(EpochTime epoch_time) {
TimeConverter converter;
converter.value = builtin::std::time::to_utc(epoch_time);
return converter.time;
};
fn now(TimeZone time_zone = TimeZone::Local) {
TimeConverter converter;
if (time_zone == TimeZone::Local)
converter.value = builtin::std::time::to_local(std::time::epoch());
else if (time_zone == TimeZone::UTC)
converter.value = builtin::std::time::to_utc(std::time::epoch());
else
converter.value = 0x00;
return converter.time;
};
fn to_dos_date(u16 value) {
impl::DOSDateConverter converter;
converter.value = value;
return converter.date;
};
fn to_dos_time(u16 value) {
impl::DOSTimeConverter converter;
converter.value = value;
return converter.time;
};
fn format(Time time, str format_string = "%c") {
TimeConverter converter;
converter.time = time;
return builtin::std::time::format(format_string, converter.value);
};
fn format_dos_date(DOSDate date, str format_string = "{}/{}/{}") {
return std::format(format_string, date.day, date.month, date.year + 1980);
};
fn format_dos_time(DOSTime time, str format_string = "{:02}:{:02}:{:02}") {
return std::format(format_string, time.hours, time.minutes, time.seconds * 2);
};
}

View File

@@ -1,100 +0,0 @@
#include <std/io.pat>
#include <std/math.pat>
namespace std::type {
struct GUID {
u32 time_low;
u16 time_mid;
u16 time_high_and_version;
u8 clock_seq_and_reserved;
u8 clock_seq_low;
u8 node[6];
} [[format("std::type::guid_formatter"), single_color]];
fn guid_formatter(GUID guid) {
bool valid = ((le u16(guid.time_high_and_version) >> 12) <= 5) && (((guid.clock_seq_and_reserved >> 4) >= 8) || ((guid.clock_seq_and_reserved >> 4) == 0));
return std::format("{}{{{:08X}-{:04X}-{:04X}-{:02X}{:02X}-{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}}}",
valid ? "" : "Invalid ",
le u32(guid.time_low),
le u16(guid.time_mid),
le u16(guid.time_high_and_version),
guid.clock_seq_and_reserved,
guid.clock_seq_low,
guid.node[0],
guid.node[1],
guid.node[2],
guid.node[3],
guid.node[4],
guid.node[5]);
};
using float16 = u16 [[format("std::type::float16_formatter")]];
fn float16_formatter(float16 value) {
float sign = (value >> 15) == 0b01 ? -1.0 : 1.0;
float exponent = std::math::pow(2.0, float((value >> 10) & 0x1F) - 14);
u16 mantissa = value & 0x3FF;
float fraction = 0;
for (s8 i = 9, i >= 0, i -= 1) {
if ((mantissa & (1 << i)) != 0) {
fraction += 1.0 / std::math::pow(2.0, (10.0 - i));
}
}
return std::format("{:f}", sign * exponent * fraction);
};
bitfield Bits {
bit0 : 1;
bit1 : 1;
bit2 : 1;
bit3 : 1;
bit4 : 1;
bit5 : 1;
bit6 : 1;
bit7 : 1;
} [[format("std::type::bits_formatter"), right_to_left]];
bitfield Nibbles {
low : 4;
high : 4;
} [[format("std::type::nibble_formatter")]];
union Byte {
u8 value;
Bits bits;
Nibbles nibbles;
} [[format("std::type::byte_formatter"), single_color]];
fn byte_formatter(Byte byte) {
return std::format("0x{0:02X} (0b{1:08b}) LSB:{2}, MSB:{3}",
byte.value,
byte.value,
byte.bits.bit0,
byte.bits.bit7);
};
fn bits_formatter(Bits bits) {
return std::format("0b{}{}{}{}{}{}{}{}",
bits.bit7,
bits.bit6,
bits.bit5,
bits.bit4,
bits.bit6,
bits.bit2,
bits.bit1,
bits.bit0);
};
fn nibble_formatter(Nibbles nibbles) {
return std::format("{{ {0:0X}, {1:0X} }}", nibbles.high, nibbles.low);
};
}

31
includes/type/base.pat Normal file
View File

@@ -0,0 +1,31 @@
#pragma once
#include <std/io.pat>
#include <std/math.pat>
namespace type {
using Hex<T> = T [[format("type::impl::format_hex")]];
using Oct<T> = T [[format("type::impl::format_oct")]];
using Dec<T> = T [[format("type::impl::format_dec")]];
using Bin<T> = T [[format("type::impl::format_bin")]];
namespace impl {
fn format_number(auto value, str fmt) {
bool negative = value < 0;
if (negative)
return std::format("-" + fmt, std::math::abs(value));
else
return std::format(fmt, value);
};
fn format_hex(auto value) { return format_number(value, "0x{:02X}"); };
fn format_oct(auto value) { return format_number(value, "0o{:03o}"); };
fn format_dec(auto value) { return format_number(value, "{}"); };
fn format_bin(auto value) { return format_number(value, "0b{:08b}"); };
}
}

58
includes/type/byte.pat Normal file
View File

@@ -0,0 +1,58 @@
#pragma once
#include <std/io.pat>
namespace type {
bitfield Bits {
bit0 : 1;
bit1 : 1;
bit2 : 1;
bit3 : 1;
bit4 : 1;
bit5 : 1;
bit6 : 1;
bit7 : 1;
} [[format("type::impl::format_bits"), right_to_left]];
bitfield Nibbles {
low : 4;
high : 4;
} [[format("type::impl::format_nibbles")]];
union Byte {
u8 value;
Bits bits;
Nibbles nibbles;
} [[format("type::impl::format_byte"), single_color]];
namespace impl {
fn format_byte(Byte byte) {
return std::format("0x{0:02X} (0b{1:08b}) LSB:{2}, MSB:{3}",
byte.value,
byte.value,
byte.bits.bit0,
byte.bits.bit7);
};
fn format_bits(Bits bits) {
return std::format("0b{}{}{}{}{}{}{}{}",
bits.bit7,
bits.bit6,
bits.bit5,
bits.bit4,
bits.bit6,
bits.bit2,
bits.bit1,
bits.bit0);
};
fn format_nibbles(Nibbles nibbles) {
return std::format("{{ {0:0X}, {1:0X} }}", nibbles.high, nibbles.low);
};
}
}

48
includes/type/color.pat Normal file
View File

@@ -0,0 +1,48 @@
#pragma once
#include <std/io.pat>
#include <std/core.pat>
namespace type {
struct RGB8 {
u8 r, g, b;
} [[sealed, format("type::impl::format_color")]];
struct RGBA8 {
u8 r, g, b, a;
} [[sealed, format("type::impl::format_color")]];
bitfield RGB565 {
r : 5;
g : 6;
b : 5;
} [[sealed, format("type::impl::format_color")]];
bitfield RGBA4 {
r : 4;
g : 4;
b : 4;
a : 4;
} [[sealed, format("type::impl::format_color")]];
namespace impl {
fn format_color(ref auto color) {
if (!std::core::has_member(color, "a")) {
return std::format("#{0:02X}{1:02X}{2:02X} | rgb({0}, {1}, {2})",
color.r,
color.g,
color.b);
} else {
return std::format("#{0:02X}{1:02X}{2:02X}{3:02X} | rgba({0}, {1}, {2}, {3})",
color.r,
color.g,
color.b,
color.a);
}
};
}
}

53
includes/type/float16.pat Normal file
View File

@@ -0,0 +1,53 @@
#pragma once
#include <std/io.pat>
#include <std/math.pat>
#include <std/mem.pat>
namespace type {
using float16 = u16 [[format("type::impl::format_float16")]];
namespace impl {
union U32ToFloatConverter {
u32 intValue;
float floatValue;
};
fn format_float16(float16 value) {
u32 sign = value >> 15;
u32 exponent = (value >> 10) & 0x1F;
u32 mantissa = value & 0x3FF;
u32 result = 0x00;
if (exponent == 0) {
if (mantissa == 0) {
result = sign << 31;
} else {
exponent = 0x7F - 14;
while ((mantissa & (1 << 10)) == 0) {
exponent -= 1;
mantissa <<= 1;
}
mantissa &= 0x3FF;
result = (sign << 31) | (exponent << 23) | (mantissa << 13);
}
} else if (exponent == 0x1F) {
result = (sign << 31) | (0xFF << 23) | (mantissa << 13);
} else {
result = (sign << 31) | ((exponent + (0x7F - 15)) << 23) | (mantissa << 13);
}
std::mem::Reinterpreter<u32, float> converter;
converter.from = result;
return std::format("{}", converter.to);
};
}
}

38
includes/type/guid.pat Normal file
View File

@@ -0,0 +1,38 @@
#pragma once
#include <std/io.pat>
namespace type {
struct GUID {
u32 time_low;
u16 time_mid;
u16 time_high_and_version;
u8 clock_seq_and_reserved;
u8 clock_seq_low;
u8 node[6];
} [[sealed, format("type::impl::format_guid")]];
namespace impl {
fn format_guid(GUID guid) {
bool valid = ((le u16(guid.time_high_and_version) >> 12) <= 5) && (((guid.clock_seq_and_reserved >> 4) >= 8) || ((guid.clock_seq_and_reserved >> 4) == 0));
return std::format("{}{{{:08X}-{:04X}-{:04X}-{:02X}{:02X}-{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}}}",
valid ? "" : "Invalid ",
le u32(guid.time_low),
le u16(guid.time_mid),
le u16(guid.time_high_and_version),
guid.clock_seq_and_reserved,
guid.clock_seq_low,
guid.node[0],
guid.node[1],
guid.node[2],
guid.node[3],
guid.node[4],
guid.node[5]);
};
}
}

56
includes/type/ip.pat Normal file
View File

@@ -0,0 +1,56 @@
#pragma once
#include <std/io.pat>
namespace type {
struct IPv4Address {
u8 bytes[4];
} [[sealed, format("type::impl::format_ipv4_address")]];
struct IPv6Address {
u16 words[8];
} [[sealed, format("type::impl::format_ipv6_address")]];
namespace impl {
fn format_ipv4_address(IPv4Address address) {
return std::format("{}.{}.{}.{}",
address.bytes[0],
address.bytes[1],
address.bytes[2],
address.bytes[3]);
};
fn format_ipv6_address(IPv6Address address) {
str result;
bool hadZeros = false;
s8 startIndex = -1;
for (u8 i = 0, i < 8, i += 1) {
if (address.words[i] == 0x00 && !hadZeros) {
hadZeros = true;
startIndex = i;
while (i < 7) {
if (address.words[i + 1] != 0x00)
break;
i += 1;
}
if (startIndex == 0 || i == 7)
result += ":";
} else {
result += std::format("{:04X}", address.words[i]);
}
result += ":";
}
return std::string::substr(result, 0, std::string::length(result) - 1);
};
}
}

33
includes/type/leb128.pat Normal file
View File

@@ -0,0 +1,33 @@
#pragma once
#include <std/io.pat>
#include <std/mem.pat>
namespace type {
struct LEB128 {
u8 array[while($ == addressof(this) || std::mem::read_unsigned($-1, 1) & 0x80 != 0)] [[hidden]];
} [[sealed, format("type::impl::format_leb128"), transform("type::impl::transform_leb128")]];
namespace impl {
fn transform_leb128_array(auto array) {
u128 res = array[0] & 0x7f;
for(u8 i = 1, array[i-1] & 0x80 != 0, i+=1) {
res |= u64(array[i] & 0x7f) << 7 * i;
}
return res;
};
fn format_leb128(auto leb128) {
u128 res = type::impl::transform_leb128_array(leb128.array);
return std::format("{} ({:#x})", res, res);
};
fn transform_leb128(auto leb128) {
return type::impl::transform_leb128_array(leb128.array);
};
}
}

25
includes/type/mac.pat Normal file
View File

@@ -0,0 +1,25 @@
#pragma once
#include <std/io.pat>
namespace type {
struct MACAddress {
u8 bytes[6];
} [[sealed, format("type::impl::format_mac_address")]];
namespace impl {
fn format_mac_address(MACAddress address) {
return std::format("{:02X}:{:02X}:{:02X}:{:02X}:{:02X}:{:02X}",
address.bytes[0],
address.bytes[1],
address.bytes[2],
address.bytes[3],
address.bytes[4],
address.bytes[5]);
};
}
}

32
includes/type/path.pat Normal file
View File

@@ -0,0 +1,32 @@
#include <std/mem.pat>
namespace type {
struct UnixPathSegment {
char string[while(std::mem::read_unsigned($, 1) != '/' && std::mem::read_unsigned($, 1) != 0x00)];
char separator [[hidden]];
if (separator == 0x00) {
$ -= 1;
break;
}
} [[sealed, format("type::impl::format_unix_path_segment")]];
struct UnixPath {
UnixPathSegment segments[while(true)];
} [[format("type::impl::format_unix_path")]];
namespace impl {
fn format_unix_path_segment(UnixPathSegment segment) {
return segment.string;
};
fn format_unix_path(UnixPath path) {
return std::mem::read_string($, sizeof(path));
};
}
}

49
includes/type/size.pat Normal file
View File

@@ -0,0 +1,49 @@
#include <std/io.pat>
namespace type {
using Size<T> = T [[format("type::impl::size_formatter")]];
using Size8 = Size<u8>;
using Size16 = Size<u16>;
using Size32 = Size<u32>;
using Size64 = Size<u64>;
using Size128 = Size<u128>;
namespace impl {
fn size_formatter(u128 size) {
double sizeFloat = size;
u32 i = 0;
while (sizeFloat >= 1024 && i <= 6) {
i += 1;
sizeFloat /= 1024;
}
if (i == 0) {
if (size == 1)
return std::format("{} Byte", size);
else
return std::format("{} Bytes", size);
} else {
str result = std::format("{:.3f} ", sizeFloat);
if (i == 1)
return result + "kiB";
else if (i == 2)
return result + "MiB";
else if (i == 3)
return result + "GiB";
else if (i == 4)
return result + "TiB";
else if (i == 5)
return result + "PiB";
else
return result + "EiB";
}
};
}
}

29
includes/type/time.pat Normal file
View File

@@ -0,0 +1,29 @@
#pragma once
#include <std/io.pat>
#include <std/time.pat>
namespace type {
using time32_t = u32 [[format("type::impl::format_time_t")]];
using time64_t = u64 [[format("type::impl::format_time_t")]];
using dosdate16_t = u16 [[format("type::impl::format_dosdate16_t")]];
using dostime16_t = u16 [[format("type::impl::format_dostime16_t")]];
namespace impl {
fn format_time_t(u128 value) {
return std::time::format(std::time::to_utc(value));
};
fn format_dosdate16_t(u16 value) {
return std::time::format_dos_date(std::time::to_dos_date(value));
};
fn format_dostime16_t(u16 value) {
return std::time::format_dos_time(std::time::to_dos_time(value));
};
}
}

View File

@@ -0,0 +1,62 @@
#pragma once
// Explicitly don't add these types to the `type` namespace for usability
// namespace type {
// using char = s8;
using byte = s8;
using CHAR = s8;
using BYTE = s8;
using uchar = u8;
using ubyte = u8;
using UCHAR = u8;
using UBYTE = u8;
using short = s16;
using int16 = s16;
using SHORT = s16;
using INT16 = s16;
using ushort = u16;
using uint16 = u16;
using USHORT = u16;
using UINT16 = u16;
using WORD = u16;
using int = s32;
using int32 = s32;
using long = s32;
using INT = s32;
using INT32 = s32;
using LONG = s32;
using uint = u32;
using uint32 = u32;
using ulong = u32;
using UINT = u32;
using UINT32 = u32;
using ULONG = u32;
using DWORD = u32;
using int64 = s64;
using quad = s64;
using QUAD = s64;
using INT64 = s64;
using __int64 = s64;
using uint64 = u64;
using uquad = u64;
using UQUAD = u64;
using UINT64 = u64;
using QWORD = u64;
using __uint64 = u64;
// using float = float;
using FLOAT = float;
// using double = double;
using DOUBLE = double;
// }

39
includes/type/types/c.pat Normal file
View File

@@ -0,0 +1,39 @@
#pragma once
// Explicitly don't add these types to the `type` namespace for usability
// namespace type {
using uint8_t = u8;
using uint16_t = u16;
using uint32_t = u32;
using uint64_t = u64;
using __uint64_t = u64;
using uint128_t = u128;
using __uint128_t = u128;
using int8_t = s8;
using int16_t = s16;
using int32_t = s32;
using int64_t = s64;
using __int64_t = s64;
using int128_t = s128;
using __int128_t = s128;
using size_t = u64;
using ssize_t = s64;
using uintptr_t = u64;
using intptr_t = s64;
using ptrdiff_t = s64;
// using char = char;
using wchar_t = char16;
using char8_t = char;
using char16_t = char16;
using char32_t = u32;
using short = s16;
using int = s32;
using long = s32;
// }

View File

@@ -0,0 +1,13 @@
#pragma once
// Explicitly don't add these types to the `type` namespace for usability
// namespace type {
using le16 = le u16;
using be16 = be u16;
using le32 = le u32;
using be32 = be u32;
using le64 = le u64;
using be64 = be u64;
// }

View File

@@ -0,0 +1,24 @@
#pragma once
// Explicitly don't add these types to the `type` namespace for usability
// namespace type {
// using u8 = u8;
// using u16 = u16;
// using u32 = u32;
// using u64 = u64;
// using u128 = u128;
using i8 = s8;
using i16 = s16;
using i32 = s32;
using i64 = s64;
using i128 = s128;
using f32 = float;
using f64 = double;
using usize = u64;
using isize = i64;
// }

View File

@@ -0,0 +1,53 @@
#pragma once
// Explicitly don't add these types to the `type` namespace for usability
// namespace type {
using BYTE = u8;
using WORD = u16;
using DWORD = u32;
using QWORD = u64;
using DWORDLONG = u64;
using DWORD32 = u32;
using DWORD64 = u64;
using INT = s32;
using UINT = u32;
using FLOAT = float;
using SHORT = s16;
using USHORT = u16;
using BOOL = bool;
using BOOLEAN = bool;
using INT8 = s8;
using INT16 = s16;
using INT32 = s32;
using INT64 = s64;
using UINT8 = u8;
using UINT16 = u16;
using UINT32 = u32;
using UINT64 = u64;
using LONG = s32;
using ULONG = u32;
using LONG32 = s32;
using ULONG32 = u32;
using LONG64 = s64;
using ULONG64 = u64;
using LONGLONG = s64;
using ULONGLONG = u64;
using SIZE_T = u64;
using SSIZE_T = s64;
using UCHAR = u8;
using CHAR = char;
using CCHAR = char;
using ATOM = WORD;
using PVOID = SIZE_T;
using HANDLE = PVOID;
using HINSTANCE = HANDLE;
using HRESULT = LONG;
// }

View File

@@ -17,9 +17,9 @@ struct ARFile {
u8 data[std::string::parse_int(this.file_size, 10)];
padding[sizeof(data) & 1];
}
} [[static]];
};
char signature[8] @ 0x00;
std::assert(signature == "!<arch>\n", "File is not a valid archive!");
ARFile files[while($ < std::mem::size())] @ $;
ARFile files[while($ < std::mem::size())] @ $;

73
patterns/bencode.hexpat Normal file
View File

@@ -0,0 +1,73 @@
#pragma MIME application/x-bittorrent
#include <std/ctype.pat>
#include <std/mem.pat>
#include <std/string.pat>
namespace bencode {
struct ASCIIDecimal {
char value[while(std::ctype::isdigit(std::mem::read_unsigned($, 1)))];
} [[sealed, format("bencode::format_ascii_decimal"), transform("bencode::format_ascii_decimal")]];
fn format_ascii_decimal(ASCIIDecimal adsasd) {
return std::string::parse_int(adsasd.value, 10);
};
enum Type : u8 {
Integer = 'i',
Dictionary = 'd',
List = 'l',
String0 = '0',
String1 = '1',
String2 = '2',
String3 = '3',
String4 = '4',
String5 = '5',
String6 = '6',
String7 = '7',
String8 = '8',
String9 = '9'
};
struct String {
ASCIIDecimal length;
char separator [[hidden]];
char value[length];
} [[sealed, format("bencode::format_string"), transform("bencode::format_string")]];
fn format_string(String string) {
return string.value;
};
using Bencode;
using Value;
struct DictionaryEntry {
String key;
Value value;
};
struct Value {
Type type;
if (type == Type::Dictionary) {
DictionaryEntry entry[while(std::mem::read_unsigned($, 1) != 'e')];
} else if (type == Type::Integer) {
ASCIIDecimal value;
char end;
} else {
$ -= 1;
String value;
}
};
struct Bencode {
Value value[while(!std::mem::eof())] [[inline]];
char end;
};
}
bencode::Bencode bencode @ 0x00;

128
patterns/bson.hexpat Normal file
View File

@@ -0,0 +1,128 @@
#pragma MIME application/bson
#include <type/time.pat>
enum Type : u8 {
Double = 0x01,
String = 0x02,
EmbeddedDocument = 0x03,
Array = 0x04,
Binary = 0x05,
Undefined = 0x06,
ObjectId = 0x07,
Boolean = 0x08,
UTCDatetime = 0x09,
Null = 0x0A,
Regex = 0x0B,
DBPointer = 0x0C,
JavaScript = 0x0D,
Symbol = 0x0E,
JavaScriptWithScope = 0x0F,
Int32 = 0x10,
Timestamp = 0x11,
Int64 = 0x12,
Decimal128 = 0x13,
MinKey = 0xFF,
MaxKey = 0x7F
};
enum Subtype : u8 {
GenericBinarySubtype = 0x00,
Function = 0x01,
BinaryOld = 0x02,
UUIDOld = 0x03,
UUID = 0x04,
MD5 = 0x05,
EncryptedBSONValue = 0x06,
CompressedBSONColumn = 0x07,
UserDefined = 0x80
};
struct Binary {
s32 length;
Subtype subtype;
u8 data[length];
};
struct String {
u32 length [[hidden]];
char value[length];
} [[sealed, format("format_string")]];
struct CString {
char value[];
} [[sealed, format("format_string")]];
fn format_string(auto string) {
return string.value;
};
struct ObjectId {
type::time32_t timestamp;
u8 randomValue[5];
u24 counter;
};
struct DBPointer {
String name;
ObjectId value;
};
using Document;
struct Element {
Type type;
CString name;
if (type == Type::Double) {
double value;
} else if (type == Type::String) {
String value;
} else if (type == Type::EmbeddedDocument) {
Document value;
} else if (type == Type::Array) {
Document value;
} else if (type == Type::Binary) {
Binary value;
} else if (type == Type::Undefined) {
/* undefined */
} else if (type == Type::ObjectId) {
ObjectId value;
} else if (type == Type::Boolean) {
bool value;
} else if (type == Type::UTCDatetime) {
type::time64_t value;
} else if (type == Type::Null) {
/* null */
} else if (type == Type::Regex) {
CString regexPattern;
CString regexOptions;
} else if (type == Type::DBPointer) {
DBPointer value;
} else if (type == Type::JavaScript) {
String value;
} else if (type == Type::Symbol) {
String value;
} else if (type == Type::JavaScriptWithScope) {
String value;
} else if (type == Type::Int32) {
s32 value;
} else if (type == Type::Timestamp) {
u64 value;
} else if (type == Type::Int64) {
s64 value;
} else if (type == Type::Decimal128) {
u128 value;
}
};
struct Document {
s32 listLength;
Element elements[while($ < ((addressof(this) + listLength) - 1))];
padding[1];
};
Document document @ 0x00;

View File

@@ -1,261 +1,744 @@
#pragma MIME application/x-executable
#pragma MIME application/x-elf
#pragma MIME application/x-coredump
#pragma MIME application/x-object
#pragma MIME application/x-sharedlib
namespace elf {
#include <std/core.pat>
#include <std/mem.pat>
enum Class : u8 {
_32Bit = 1,
_64Bit = 2
};
enum Endian : u8 {
Little = 1,
Big = 2
};
enum OSABI : u8 {
SystemV = 0x00,
HP_UX = 0x01,
NetBSD = 0x02,
Linux = 0x03,
GNU_Hurd = 0x04,
Solaris = 0x06,
AIX = 0x07,
IRIX = 0x08,
FreeBSD = 0x09,
Tru64 = 0x0A,
NovellModesto = 0x0B,
OpenBSD = 0x0C,
OpenVMS = 0x0D,
NonStop_Kernel = 0x0E,
AROS = 0x0F,
FenixOS = 0x10,
CloudABI = 0x11,
Stratus_Technologies_OpenVOS = 0x12
};
enum Type : u16 {
using EI_ABIVERSION = u8;
using Elf32_Addr = u32;
using Elf32_BaseAddr = u32;
using Elf32_BaseOff = u32;
using Elf32_Half = u16;
using Elf32_Off = u32;
using Elf32_Sword = s32;
using Elf32_VAddr = u32;
using Elf32_Word = u32;
using Elf64_Addr = u64;
using Elf64_BaseAddr = u64;
using Elf64_BaseOff = u64;
using Elf64_Half = u16;
using Elf64_Off = u64;
using Elf64_Sword = s32;
using Elf64_Sxword = s64;
using Elf64_VAddr = u64;
using Elf64_Word = u32;
using Elf64_Xword = u64;
using E_VERSION = u32;
enum EI_CLASS : u8 {
ELFCLASSNONE = 0x00,
ELFCLASS32 = 0x01,
ELFCLASS64 = 0x02,
};
enum EI_DATA : u8 {
ELFDATANONE = 0x00,
ELFDATA2LSB = 0x01,
ELFDATA2MSB = 0x02,
};
enum EI_OSABI : u8 {
SYSV = 0x00,
HPUX = 0x01,
NetBSD = 0x02,
Linux = 0x03,
GNUHurd = 0x04,
Solaris = 0x06,
AIX = 0x07,
IRIX = 0x08,
FreeBSD = 0x09,
Tru64 = 0x0A,
NovellModesto = 0x0B,
OpenBSD = 0x0C,
OpenVMS = 0x0D,
NonStopKernel = 0x0E,
AROS = 0x0F,
FenixOS = 0x10,
CloudABI = 0x11,
OpenVOS = 0x12,
ARM_EABI = 0x40,
STANDALONE = 0xFF,
};
enum EI_VERSION : u8 {
NONE = 0x00,
REL = 0x01,
EXEC = 0x02,
DYN = 0x03,
CORE = 0x04,
LOOS = 0xFE00,
HIOS = 0xFEFF,
LOPROC = 0xFF00,
HIPROC = 0xFFFF
};
enum Machine : u16 {
Undefined = 0x00,
ATNT_WE_32100 = 0x01,
SPARC = 0x02,
x86 = 0x03,
Motorola_68000 = 0x04,
Motorola_88000 = 0x05,
IntelMCU = 0x06,
Intel_80860 = 0x07,
MIPS = 0x08,
IBM_System370 = 0x09,
MIPS_RS300_LE = 0x0A,
/* 0x0B - 0x0D: Reserved */
HP_PA_RISC = 0x0E,
/* 0x0F: Reserved */
Intel_80960 = 0x13,
PowerPC = 0x14,
PowerPC_64 = 0x15,
S390 = 0x16,
IBM_SPU_SPC = 0x17,
/* 0x18 - 0x23: Reserved */
NEC_V800 = 0x24,
Fujitsu_FR20 = 0x25,
TRW_RH_32 = 0x26,
Motorola_RCE = 0x27,
ARM32 = 0x28,
Digital_Alpha = 0x29,
SuperH = 0x2A,
SPARCv9 = 0x2B,
Siemens_TriCore = 0x2C,
Argonaut_RISC_Core = 0x2D,
Hitachi_H8_300 = 0x2E,
Hitachi_H8_300H = 0x2F,
Hitachi_H8S = 0x30,
Hitachi_H8_500 = 0x31,
IA_64 = 0x32,
Standford_MIPS_X = 0x33,
Motorola_ColdFire = 0x34,
Motorola_M68HC12 = 0x35,
Fujitsu_MMA = 0x36,
Siemens_PCP = 0x37,
Sony_nCPU = 0x38,
Denso_NDR1 = 0x39,
Motorola_StarCore = 0x3A,
Toyota_ME16 = 0x3B,
STMicroelectronics_ST100 = 0x3C,
Advanced_Logic_Corp_TinyJ = 0x3D,
AMD_x86_64 = 0x3E,
TMS320C6000 = 0x8C,
MCST_Elbrus_e2k = 0xAF,
ARM64 = 0xB7,
RISC_V = 0xF3,
Berkeley_Packet_Filter = 0xF7,
WDC_65C816 = 0x101
};
struct Identity {
char magic[4];
Class class;
Endian endian;
u8 version;
OSABI os_abi;
if (os_abi == elf::OSABI::Linux)
u8 dynamic_linker_version;
else
u8 abi_version;
};
CURRENT = 0x01,
};
struct Header {
Identity identity;
enum EM : u16 {
EM_NONE = 0x0000,
EM_M32 = 0x0001,
EM_SPARC = 0x0002,
EM_386 = 0x0003,
EM_68K = 0x0004,
EM_88K = 0x0005,
EM_IAMCU = 0x0006,
EM_860 = 0x0007,
EM_MIPS = 0x0008,
EM_S370 = 0x0009,
EM_MIPS_RS4_BE = 0x000a,
EM_PARISC = 0x000f,
EM_VPP500 = 0x0011,
EM_SPARC32PLUS = 0x0012,
EM_960 = 0x0013,
EM_PPC = 0x0014,
EM_PPC64 = 0x0015,
EM_S390 = 0x0016,
EM_SPU = 0x0017,
EM_V800 = 0x0024,
EM_FR20 = 0x0025,
EM_RH32 = 0x0026,
EM_RCE = 0x0027,
EM_ARM = 0x0028,
EM_ALPHA = 0x0029,
EM_SH = 0x002A,
EM_SPARCV9 = 0x002B,
EM_TRICORE = 0x002C,
EM_ARC = 0x002D,
EM_H8_300 = 0x002E,
EM_H8_300H = 0x002F,
EM_H8S = 0x0030,
EM_H8_500 = 0x0031,
EM_IA_64 = 0x0032,
EM_MIPS_X = 0x0033,
EM_COLDFIRE = 0x0034,
EM_68HC12 = 0x0035,
EM_MMA = 0x0036,
EM_PCP = 0x0037,
EM_NCPU = 0x0038,
EM_NDR1 = 0x0039,
EM_STARCORE = 0x003A,
EM_ME16 = 0x003B,
EM_ST100 = 0x003C,
EM_TINYJ = 0x003D,
EM_X86_64 = 0x003E,
EM_PDSP = 0x003F,
EM_PDP10 = 0x0040,
EM_PDP11 = 0x0041,
EM_FX66 = 0x0042,
EM_ST9PLUS = 0x0043,
EM_ST7 = 0x0044,
EM_68HC16 = 0x0045,
EM_68HC11 = 0x0046,
EM_68HC08 = 0x0047,
EM_68HC05 = 0x0048,
EM_SVX = 0x0049,
EM_ST19 = 0x004A,
EM_VAX = 0x004B,
EM_CRIS = 0x004C,
EM_JAVELIN = 0x004D,
EM_FIREPATH = 0x004E,
EM_ZSP = 0x004F,
EM_MMIX = 0x0050,
EM_HUANY = 0x0051,
EM_PRISM = 0x0052,
EM_AVR = 0x0053,
EM_FR30 = 0x0054,
EM_D10V = 0x0055,
EM_D30V = 0x0056,
EM_V850 = 0x0057,
EM_M32R = 0x0058,
EM_MN10300 = 0x0059,
EM_MN10200 = 0x005A,
EM_PJ = 0x005B,
EM_OPENRISC = 0x005C,
EM_ARC_COMPACT = 0x005D,
EM_XTENSA = 0x005E,
EM_VIDEOCORE = 0x005F,
EM_TMM_GPP = 0x0060,
EM_NS32K = 0x0061,
EM_TPC = 0x0062,
EM_SNP1K = 0x0063,
EM_ST200 = 0x0064,
EM_IP2K = 0x0065,
EM_MAX = 0x0066,
EM_CR = 0x0067,
EM_F2MC16 = 0x0068,
EM_MSP430 = 0x0069,
EM_BLACKFIN = 0x006A,
EM_SE_C33 = 0x006B,
EM_SEP = 0x006C,
EM_ARCA = 0x006D,
EM_UNICORE = 0x006E,
EM_EXCESS = 0x006F,
EM_DXP = 0x0070,
EM_ALTERA_NIOS2 = 0x0071,
EM_CRX = 0x0072,
EM_XGATE = 0x0073,
EM_C166 = 0x0074,
EM_M16C = 0x0075,
EM_DSPIC30F = 0x0076,
EM_CE = 0x0077,
EM_M32C = 0x0078,
EM_TSK3000 = 0x0083,
EM_RS08 = 0x0084,
EM_SHARC = 0x0085,
EM_ECOG2 = 0x0086,
EM_SCORE7 = 0x0087,
EM_DSP24 = 0x0088,
EM_VIDEOCORE3 = 0x0089,
EM_LATTICEMICO32 = 0x008A,
EM_SE_C17 = 0x008B,
EM_TI_C6000 = 0x008C,
EM_TI_C2000 = 0x008D,
EM_TI_C5500 = 0x008E,
EM_TI_ARP32 = 0x008F,
EM_TI_PRU = 0x0090,
EM_MMDSP_PLUS = 0x00A0,
EM_CYPRESS_M8C = 0x00A1,
EM_R32C = 0x00A2,
EM_TRIMEDIA = 0x00A3,
EM_QDSP6 = 0x00A4,
EM_8051 = 0x00A5,
EM_STXP7X = 0x00A6,
EM_NDS32 = 0x00A7,
EM_ECOG1 = 0x00A8,
EM_ECOG1X = 0x00A8,
EM_MAXQ30 = 0x00A9,
EM_XIMO16 = 0x00AA,
EM_MANIK = 0x00AB,
EM_CRAYNV2 = 0x00AC,
EM_RX = 0x00AD,
EM_METAG = 0x00AE,
EM_MCST_ELBRUS = 0x00AF,
EM_ECOG16 = 0x00B0,
EM_CR16 = 0x00B1,
EM_ETPU = 0x00B2,
EM_SLE9X = 0x00B3,
EM_L10M = 0x00B4,
EM_K10M = 0x00B5,
EM_AARCH64 = 0x00B7,
EM_AVR32 = 0x00B9,
EM_STM8 = 0x00BA,
EM_TILE64 = 0x00BB,
EM_TILEPRO = 0x00BC,
EM_MICROBLAZE = 0x00BD,
EM_CUDA = 0x00BE,
EM_TILEGX = 0x00BF,
EM_CLOUDSHIELD = 0x00C0,
EM_COREA_1ST = 0x00C1,
EM_COREA_2ND = 0x00C2,
EM_ARC_COMPACT2 = 0x00C3,
EM_OPEN8 = 0x00C4,
EM_RL78 = 0x00C5,
EM_VIDEOCORE5 = 0x00C6,
EM_78KOR = 0x00C7,
EM_56800EX = 0x00C8,
EM_BA1 = 0x00C9,
EM_BA2 = 0x00CA,
EM_XCORE = 0x00CB,
EM_MCHP_PIC = 0x00CC,
EM_INTEL205 = 0x00CD,
EM_INTEL206 = 0x00CE,
EM_INTEL207 = 0x00CF,
EM_INTEL208 = 0x00D0,
EM_INTEL209 = 0x00D1,
EM_KM32 = 0x00D2,
EM_KMX32 = 0x00D3,
EM_KMX16 = 0x00D4,
EM_KMX8 = 0x00D5,
EM_KVARC = 0x00D6,
EM_CDP = 0x00D7,
EM_COGE = 0x00D8,
EM_COOL = 0x00D9,
EM_NORC = 0x00DA,
EM_CSR_KALIMBA = 0x00DB,
EM_Z80 = 0x00DC,
EM_VISIUM = 0x00DD,
EM_FT32 = 0x00DE,
EM_MOXIE = 0x00DF,
EM_AMDGPU = 0x00E0,
EM_RISCV = 0x00F3,
};
enum ET : u16 {
NONE = 0x0000,
REL = 0x0001,
EXEC = 0x0002,
DYN = 0x0003,
CORE = 0x0004,
};
enum DT : u32 {
DT_NULL = 0x0,
DT_NEEDED = 0x1,
DT_PLTRELSZ = 0x2,
DT_PLTGOT = 0x3,
DT_HASH = 0x4,
DT_STRTAB = 0x5,
DT_SYMTAB = 0x6,
DT_RELA = 0x7,
DT_RELASZ = 0x8,
DT_RELAENT = 0x9,
DT_STRSZ = 0xA,
DT_SYMENT = 0xB,
DT_INIT = 0xC,
DT_FINI = 0xD,
DT_SONAME = 0xE,
DT_RPATH = 0xF,
DT_SYMBOLIC = 0x10,
DT_REL = 0x11,
DT_RELSZ = 0x12,
DT_RELENT = 0x13,
DT_PLTREL = 0x14,
DT_DEBUG = 0x15,
DT_TEXTREL = 0x16,
DT_JMPREL = 0x17,
DT_BIND_NOW = 0x18,
DT_INIT_ARRAY = 0x19,
DT_FINI_ARRAY = 0x1A,
DT_INIT_ARRAYSZ = 0x1B,
DT_FINI_ARRAYSZ = 0x1C,
DT_RUNPATH = 0x1D,
DT_FLAGS = 0x1E,
DT_PREINIT_ARRAY = 0x20,
DT_PREINIT_ARRAYSZ = 0x21,
DT_MAXPOSTAGS = 0x22,
DT_NUM = 0x23,
DT_GNU_PRELINKED = 0x6FFFFDF5,
DT_GNU_CONFLICTSZ = 0x6FFFFDF6,
DT_GNU_LIBLISTSZ = 0x6FFFFDF7,
DT_CHECKSUM = 0x6FFFFDF8,
DT_PLTPADSZ = 0x6FFFFDF9,
DT_MOVEENT = 0x6FFFFDFA,
DT_MOVESZ = 0x6FFFFDFB,
DT_FEATURE_1 = 0x6FFFFDFC,
DT_POSFLAG_1 = 0x6FFFFDFD,
DT_SYMINSZ = 0x6FFFFDFE,
DT_SYMINENT = 0x6FFFFDFF,
DT_GNU_HASH = 0x6FFFFEF5,
DT_TLSDESC_PLT = 0x6FFFFEF6,
DT_TLSDESC_GOT = 0x6FFFFEF7,
DT_GNU_CONFLICT = 0x6FFFFEF8,
DT_GNU_LIBLIST = 0x6FFFFEF9,
DT_CONFIG = 0x6FFFFEFA,
DT_DEPAUDIT = 0x6FFFFEFB,
DT_AUDIT = 0x6FFFFEFC,
DT_PLTPAD = 0x6FFFFEFD,
DT_MOVETAB = 0x6FFFFEFE,
DT_SYMINFO = 0x6FFFFEFF,
DT_VERSYM = 0x6FFFFFF0,
DT_RELACOUNT = 0x6FFFFFF9,
DT_RELCOUNT = 0x6FFFFFFA,
DT_FLAGS_1 = 0x6FFFFFFB,
DT_VERDEF = 0x6FFFFFFC,
DT_VERDEFNUM = 0x6FFFFFFD,
DT_VERNEED = 0x6FFFFFFE,
DT_VERNEEDNUM = 0x6FFFFFFF,
DT_AUXILIARY = 0x7FFFFFFD,
DT_USED = 0x7FFFFFFE,
DT_FILTER = 0x7FFFFFFF,
DT_DEPRECATED_SPARC_REGISTER = 0x7000001,
DT_SUNW_AUXILIARY = 0x6000000D,
DT_SUNW_RTLDINF = 0x6000000E,
DT_SUNW_FILTER = 0x6000000F,
DT_SUNW_CAP = 0x60000010,
DT_SUNW_SYMTAB = 0x60000011,
DT_SUNW_SYMSZ = 0x60000012,
DT_SUNW_SORTENT = 0x60000013,
DT_SUNW_SYMSORT = 0x60000014,
DT_SUNW_SYMSORTSZ = 0x60000015,
DT_SUNW_TLSSORT = 0x60000016,
DT_SUNW_TLSSORTSZ = 0x60000017,
DT_SUNW_STRPAD = 0x60000019,
DT_SUNW_LDMACH = 0x6000001B,
};
enum RT : Elf32_Word {
CONSISTENT = 0x00,
ADD = 0x01,
DELETE = 0x02,
};
enum PT : Elf32_Word {
NULL = 0x00,
LOAD = 0x01,
DYNAMIC = 0x02,
INTERP = 0x03,
NOTE = 0x04,
SHLIB = 0x05,
PHDR = 0x06,
TLS = 0x07,
LOOS = 0x60000000,
HIOS = 0x6FFFFFFF,
GNU_EH_FRAME = PT::LOOS + 0x474E550,
GNU_STACK = PT::LOOS + 0x474E551,
GNU_RELRO = PT::LOOS + 0x474E552,
GNU_PROPERTY = PT::LOOS + 0x474E553,
SUNWBSS = 0x6FFFFFFA,
SUNWSTACK = 0x6FFFFFFB,
ARM_ARCHEXT = 0x70000000,
ARM_UNWIND = 0x70000001,
};
enum ELFCOMPRESS : u8 {
ZLIB = 0x01,
};
enum SHN : u16 {
UNDEF = 0x00,
BEFORE = 0xFF00,
AFTER = 0xFF01,
ABS = 0xFFF1,
COMMON = 0xFFF2,
XINDEX = 0xFFFF,
};
enum SHT : Elf32_Word {
NULL = 0x00,
PROGBITS = 0x01,
SYMTAB = 0x02,
STRTAB = 0x03,
RELA = 0x04,
HASH = 0x05,
DYNAMIC = 0x06,
NOTE = 0x07,
NOBITS = 0x08,
REL = 0x09,
SHLIB = 0x0A,
DYNSYM = 0x0B,
UNKNOWN12 = 0x0C,
UNKNOWN13 = 0x0D,
INIT_ARRAY = 0x0E,
FINI_ARRAY = 0x0F,
PREINIT_ARRAY = 0x10,
GROUP = 0x11,
SYMTAB_SHNDX = 0x12,
GNU_INCREMENTAL_INPUTS = 0x6FFF4700,
GNU_ATTRIBUTES = 0x6FFFFFF5,
GNU_HASH = 0x6FFFFFF6,
GNU_LIBLIST = 0x6FFFFFF7,
CHECKSUM = 0x6FFFFFF8,
SUNW_move = 0x6FFFFFFA,
SUNW_COMDAT = 0x6FFFFFFB,
SUNW_syminfo = 0x6FFFFFFC,
GNU_verdef = 0x6FFFFFFD,
GNU_verneed = 0x6FFFFFFE,
GNU_versym = 0x6FFFFFFF,
ARM_EXIDX = 0x70000001,
ARM_PREEMPTMAP = 0x70000002,
ARM_ATTRIBUTES = 0x70000003,
ARM_DEBUGOVERLAY = 0x70000004,
ARM_OVERLAYSECTION = 0x70000005,
};
enum STV : u8 {
DEFAULT = 0x00,
INTERNAL = 0x01,
HIDDEN = 0x02,
PROTECTED = 0x03,
};
enum SYMINFO_BT : Elf32_Half {
SELF = 0xFFFF,
PARENT = 0xFFFE,
NONE = 0xFFFD,
};
enum VER_DEF : Elf32_Half {
NON = 0x00,
CURRENT = 0x01,
NUM = 0x02,
};
enum VER_NDX : Elf32_Half {
LOCAL = 0x00,
GLOBAL = 0x01,
ELIMINATE = 0xFF01,
};
enum VER_NEED : Elf32_Half {
NONE = 0x00,
CURRENT = 0x01,
NUM = 0x02,
};
bitfield SYMINFO_FLG {
padding : 10;
NOEXTDIRECT : 1;
DIRECTBIND : 1;
LAZYLOAD : 1;
COPY : 1;
RESERVED : 1;
DIRECT : 1;
} [[left_to_right]];
bitfield ST {
ST_BIND : 4;
ST_TYPE : 4;
} [[left_to_right]];
bitfield SHF {
MASKPROC : 4;
MASKOS : 8;
UNKNOWN : 8;
COMPRESSED : 1;
TLS : 1;
GROUP : 1;
OS_NONCONFORMING : 1;
LINK_ORDER : 1;
INFO_LINK : 1;
STRINGS : 1;
MERGE : 1;
padding : 1;
EXECINSTR : 1;
ALLOC : 1;
WRITE : 1;
} [[left_to_right]];
bitfield ELF32_R_INFO {
SYM : 8;
TYPE : 8;
} [[left_to_right]];
bitfield ELF64_R_INFO {
SYM : 32;
TYPE : 32;
} [[left_to_right]];
bitfield PF {
MASKPROC : 4;
MASKOS : 4;
padding : 17;
R : 1;
W : 1;
X : 1;
} [[left_to_right]];
struct E_IDENT {
char EI_MAG[4];
EI_CLASS EI_CLASS;
EI_DATA EI_DATA;
EI_VERSION EI_VERSION;
EI_OSABI EI_OSABI;
EI_ABIVERSION EI_ABIVERSION;
padding[7];
Type type;
Machine machine;
u32 version;
};
struct Elf32_Ehdr {
ET e_type;
EM e_machine;
E_VERSION e_version;
Elf32_VAddr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
};
struct Elf64_Ehdr {
ET e_type;
EM e_machine;
E_VERSION e_version;
Elf64_VAddr e_entry;
Elf64_Off e_phoff;
Elf64_Off e_shoff;
Elf64_Word e_flags;
Elf64_Half e_ehsize;
Elf64_Half e_phentsize;
Elf64_Half e_phnum;
Elf64_Half e_shentsize;
Elf64_Half e_shnum;
Elf64_Half e_shstrndx;
};
struct Elf32_Phdr {
PT p_type;
Elf32_Off p_offset;
Elf32_Addr p_vaddr;
Elf32_Addr p_paddr;
Elf32_Word p_filesz;
Elf32_Word p_memsz;
PF p_flags;
Elf32_Word p_align;
if (identity.class == elf::Class::_32Bit) {
u32 entry_point;
u32 program_header_offset;
u32 section_header_offset;
} else {
u64 entry_point;
u64 program_header_offset;
u64 section_header_offset;
if (p_offset > 0 && p_filesz > 0 && (p_offset + p_filesz) < std::mem::size() && p_filesz < std::mem::size())
u8 p_data[p_filesz] @ p_offset;
};
struct Elf64_Phdr {
PT p_type;
PF p_flags;
Elf64_Off p_offset;
Elf64_Addr p_vaddr;
Elf64_Addr p_paddr;
Elf64_Xword p_filesz;
Elf64_Xword p_memsz;
Elf64_Xword p_align;
if (p_offset > 0 && p_filesz > 0 && (p_offset + p_filesz) < std::mem::size() && p_filesz < std::mem::size())
u8 p_data[p_filesz] @ p_offset;
};
struct Elf32_Chdr {
u32 ch_type;
Elf32_Word ch_size;
Elf32_Word ch_addralign;
};
struct Elf32_Rel {
Elf32_Off r_offset;
ELF32_R_INFO r_info;
};
struct Elf32_Rela {
Elf32_Off r_offset;
ELF32_R_INFO r_info;
Elf32_Sword r_addend;
};
struct Elf32_Sym {
u32 st_name;
Elf32_VAddr st_value;
Elf32_Word st_size;
ST st_info;
STV st_other;
u16 st_shndx;
};
struct Elf32_Syminfo {
u16 si_boundto;
SYMINFO_FLG si_flags;
};
s64 stringTableIndex;
struct String {
char value[];
} [[sealed, format("format_string")]];
fn format_string(String string) {
return string.value;
};
struct Elf32_Shdr {
u32 sh_name;
SHT sh_type;
SHF sh_flags;
u32 sh_addr;
u32 sh_offset;
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
if (sh_size > 0 && sh_offset + sh_size < std::mem::size()) {
if (sh_type == SHT::NOBITS || sh_type == SHT::NULL) {
// Section has no data
} else if (sh_type == SHT::STRTAB) {
String stringTable[while($ < (sh_offset + sh_size))] @ sh_offset;
stringTableIndex = std::core::array_index();
} else if (sh_type == SHT::DYNSYM) {
Elf32_Sym symbolTable[sh_size / sh_entsize] @ sh_offset;
} else if (sh_type == SHT::INIT_ARRAY || sh_type == SHT::FINI_ARRAY) {
u32 pointer[while($ < (sh_offset + sh_size))] @ sh_offset;
} else {
u8 data[sh_size] @ sh_offset;
}
}
} [[format("format_section_header")]];;
struct Elf64_Chdr {
u32 ch_type;
Elf64_Word ch_size;
Elf64_Word ch_addralign;
};
struct Elf64_Rel {
Elf64_Off r_offset;
ELF64_R_INFO r_info;
};
struct Elf64_Rela {
Elf64_Off r_offset;
ELF64_R_INFO r_info;
Elf64_Sxword r_addend;
};
struct Elf64_Sym {
u32 st_name;
ST st_info;
STV st_other;
u16 st_shndx;
Elf64_VAddr st_value;
Elf64_Xword st_size;
};
struct Elf64_Syminfo {
u16 si_boundto;
SYMINFO_FLG si_flags;
};
struct Elf64_Shdr {
u32 sh_name;
SHT sh_type;
SHF sh_flags;
padding[4];
u64 sh_addr;
u64 sh_offset;
Elf64_Xword sh_size;
Elf64_Word sh_link;
Elf64_Word sh_info;
Elf64_Xword sh_addralign;
Elf64_Xword sh_entsize;
u32 flags;
u16 elf_header_size;
u16 program_header_entry_size;
u16 program_header_entry_count;
u16 section_header_entry_size;
u16 section_header_entry_count;
u16 section_name_entry_id;
};
}
namespace program {
enum Type : u32 {
NULL = 0x00,
LOAD = 0x01,
DYNAMIC = 0x02,
INTERP = 0x03,
NOTE = 0x04,
SHLIB = 0x05,
PHDR = 0x06,
TLS = 0x07,
LOOS = 0x60000000,
HIOS = 0x6FFFFFFF,
LOPROC = 0x70000000,
HIPROC = 0x7FFFFFFF
};
struct Header {
Type type;
if (parent.header.identity.class == elf::Class::_32Bit) {
u32 offset;
u32 virtual_address;
u32 physical_address;
u32 file_size;
u32 memory_size;
u32 flags;
u32 alignment;
} else {
u32 flags;
u64 offset;
u64 virtual_address;
u64 physical_address;
u64 file_size;
u64 memory_size;
u64 alignment;
if (sh_size > 0 && sh_offset + sh_size < std::mem::size()) {
if (sh_type == SHT::NOBITS || sh_type == SHT::NULL) {
// Section has no data
} else if (sh_type == SHT::STRTAB) {
String stringTable[while($ < (sh_offset + sh_size))] @ sh_offset;
stringTableIndex = std::core::array_index();
} else if (sh_type == SHT::DYNSYM) {
Elf64_Sym symbolTable[sh_size / sh_entsize] @ sh_offset;
} else if (sh_type == SHT::INIT_ARRAY || sh_type == SHT::FINI_ARRAY) {
u32 pointer[while($ < (sh_offset + sh_size))] @ sh_offset;
} else {
u8 data[sh_size] @ sh_offset;
}
}
} [[static]];
} [[format("format_section_header")]];
}
fn format_section_header(auto shdr) {
u32 i = 0;
u32 nameAddress = addressof(elf.shdr[stringTableIndex].stringTable) + shdr.sh_name;
while (i < std::core::member_count(elf.shdr[stringTableIndex].stringTable)) {
if (nameAddress >= addressof(elf.shdr[stringTableIndex].stringTable[i]) && nameAddress < (addressof(elf.shdr[stringTableIndex].stringTable[i]) + sizeof(elf.shdr[stringTableIndex].stringTable[i])))
break;
i += 1;
}
namespace section {
struct String {
char characters[];
};
enum Type : u32 {
NULL = 0x00,
PROGBITS = 0x01,
SYMTAB = 0x02,
STRTAB = 0x03,
RELA = 0x04,
HASH = 0x05,
DYNAMIC = 0x06,
NOTE = 0x07,
NOBITS = 0x08,
REL = 0x09,
SHLIB = 0x0A,
DYNSYM = 0x0B,
INIT_ARRAY = 0x0E,
FINI_ARRAY = 0x0F,
PREINIT_ARRAY = 0x10,
GROUP = 0x11,
SYMTAB_SHNDX = 0x12,
NUM = 0x13,
LOOS = 0x60000000
};
bitfield Flags {
WRITE : 1;
ALLOC : 1;
EXECINSTR : 1;
pad1 : 1;
MERGE : 1;
STRINGS : 1;
INFO_LINK : 1;
LINK_ORDER : 1;
OS_NONCONFORMING : 1;
GROUP : 1;
TLS : 1;
};
struct Header {
u32 name_offset;
section::Type type;
Flags flags;
padding[2];
if (parent.header.identity.class == elf::Class::_32Bit) {
u32 address;
u32 offset;
u32 size;
u32 link;
u32 info;
u32 address_alignment;
u32 entry_size;
} else {
padding[4];
u64 address;
u64 offset;
u64 size;
u32 link;
u32 info;
u64 address_alignment;
u64 entry_size;
}
} [[static]];
}
return elf.shdr[stringTableIndex].stringTable[i].value;
};
elf::Header header @ 0x00;
program::Header program_headers[header.program_header_entry_count] @ header.program_header_offset;
section::Header section_headers[header.section_header_entry_count] @ header.section_header_offset;
struct ELF {
E_IDENT e_ident;
if (e_ident.EI_DATA == EI_DATA::ELFDATA2LSB)
std::core::set_endian(std::mem::Endian::Little);
else
std::core::set_endian(std::mem::Endian::Big);
if (e_ident.EI_CLASS == EI_CLASS::ELFCLASS32) {
Elf32_Ehdr ehdr;
Elf32_Phdr phdr[ehdr.e_phnum] @ ehdr.e_phoff;
Elf32_Shdr shdr[ehdr.e_shnum] @ ehdr.e_shoff;
} else if (e_ident.EI_CLASS == EI_CLASS::ELFCLASS64) {
Elf64_Ehdr ehdr;
Elf64_Phdr phdr[ehdr.e_phnum] @ ehdr.e_phoff;
Elf64_Shdr shdr[ehdr.e_shnum] @ ehdr.e_shoff;
}
};
ELF elf @ 0x00;

321
patterns/flac.hexpat Normal file
View File

@@ -0,0 +1,321 @@
#include <std/sys.pat>
#include <std/core.pat>
#include <std/io.pat>
#pragma endian big
u32 sampleSize;
u32 bitsPerSample;
// METADATA
enum BLOCK_TYPE : u8 {
STREAMINFO = 0,
PADDING = 1,
APPLICATION = 2,
SEEKTABLE = 3,
VORBIS_COMMENT = 4,
CUESHEET = 5,
PICTURE = 6,
INVALID = 127
};
bitfield METADATA_BLOCK_HEADER {
lastMetadataBlock : 1;
blockType : 7;
length : 24;
} [[left_to_right]];
bitfield STREAMINFO_FLAGS {
sampleRate : 20;
numChannels : 3 [[format("format_channels")]];
bitsPerSample : 5;
numSamplesInStream : 36;
} [[inline, left_to_right]];
fn format_channels(u8 value) {
return value + 1;
};
struct METADATA_BLOCK_STREAMINFO {
u16 minBlockSize, maxBlockSize;
u24 minFrameSize, maxFrameSize;
STREAMINFO_FLAGS flags;
u128 md5Signature;
bitsPerSample = flags.bitsPerSample;
};
struct METADATA_BLOCK_PADDING {
padding[parent.header.length];
};
struct METADATA_BLOCK_APPLICATION {
char applicationID[4];
u8 applicationData[parent.header.length - sizeof(applicationID)];
};
struct SEEKPOINT {
u64 sampleNumber;
u64 byteOffset;
u16 numSamples;
};
struct METADATA_BLOCK_SEEKTABLE {
SEEKPOINT seekPoints[parent.header.length / 18];
};
struct VORBIS_USER_COMMENT {
le u32 length;
char comment[length];
};
struct METADATA_BLOCK_VORBIS_COMMENT {
le u32 vendorLength;
u8 vendor[vendorLength];
le u32 userCommentListLength;
VORBIS_USER_COMMENT userCommentList[userCommentListLength];
};
bitfield TRACK_FLAGS {
audioTrack : 1;
preEmphasis : 1;
padding : 6;
} [[inline]];
struct CUESHEET_TRACK_INDEX {
u64 sampleOffset;
u8 indexPointNumber;
padding[3];
};
struct CUESHEET_TRACK {
u64 trackOffset;
u8 trackNumber;
char trackISRC[12];
TRACK_FLAGS flags;
padding[13];
u8 numTrackIndexPoints;
CUESHEET_TRACK_INDEX indexes[numTrackIndexPoints];
};
struct METADATA_BLOCK_CUESHEET {
char mediaCatalogNumber[128];
u64 numLeadInSamples;
bool isCD;
padding[258];
u8 numTracks;
CUESHEET_TRACK tracks[numTracks];
};
enum PICTURE_TYPE : u32 {
Other = 0,
FileIcon = 1,
OtherFileIcon = 2,
CoverFront = 3,
CoverBack = 4,
LeafletPage = 5,
Media = 6,
LeadArtist = 7,
Artist = 8,
Conductor = 9,
Band = 10,
Composer = 11,
Lyricist = 12,
RecordingLocation = 13,
DuringRecording = 14,
DuringPerformance = 15,
MovieScreenCapture = 16,
ABrightColoredFish = 17,
Illustration = 18,
BandLogoType = 19,
PublisherLogoType = 20
};
struct METADATA_BLOCK_PICTURE {
PICTURE_TYPE pictureType;
u32 mimeTypeLength;
char mimeType[mineTypeLength];
u32 descriptionLength;
char description[descriptionLength];
u32 width, height;
u32 colorDepth;
u32 colorCount;
u32 pictureDataLength;
u8 pictureData[pictureDataLength];
};
// FRAME DATA
// TODO: THIS IS INCOMPLETE / NOT WORKING CURRENTLY
bitfield FRAME_HEADER_FLAGS {
syncCode : 14;
padding : 1;
blockingStrategy : 1;
blockSize : 4;
sampleRate : 4;
channelAssignment : 4;
sampleSize : 3;
padding : 1;
} [[inline]];
struct FRAME_HEADER {
FRAME_HEADER_FLAGS flags;
sampleSize = flags.sampleSize;
if (flags.blockingStrategy)
char16 sampleNumber[7];
else
char16 frameNumber[6];
if (flags.blockSize == 0b0110)
u8 blockSize;
else if (flags.blockSize == 0b0111)
u16 blockSize;
if (flags.sampleRate == 0b1100)
u8 sampleRate;
else if (flags.sampleRate == 0b1101 || flags.sampleRate == 0b1110)
u16 sampleRate;
u8 crc8;
};
struct FRAME_FOOTER {
u16 crc16;
};
bitfield SUBFRAME_HEADER {
padding : 1;
type : 6;
wastedBits : 1;
};
fn getBitsPerSample() {
if (sampleSize == 0b000)
return bitsPerSample;
else if (sampleSize == 0b001)
return 8;
else if (sampleSize == 0b010)
return 12;
else if (sampleSize == 0b100)
return 16;
else if (sampleSize == 0b101)
return 20;
else if (sampleSize == 0b110)
return 24;
};
bitfield SUBFRAME_CONSTANT {
value : getBitsPerSample();
};
bitfield SUBFRAME_VERBATIM {
value : getBitsPerSample() * parent.parent.header.flags.blockSize;
};
bitfield SUBFRAME_FIXED_VALUE {
value : getBitsPerSample() * (parent.parent.header.type & 0b111);
codingMethod : 2;
} [[inline]];
bitfield RESIDUAL_CODING_METHOD_PARTITIONED_RICE {
partitionOrder : 4;
riceParameter : 4;
if (riceParameter == 0b1111)
bitsPerSample : 5;
} [[right_to_left]];
bitfield RESIDUAL_CODING_METHOD_PARTITIONED_RICE2 {
partitionOrder : 4;
riceParameter : 5;
if (riceParameter == 0b11111)
bitsPerSample : 5;
} [[right_to_left]];
struct RESIDUAL {
if (parent.value.codingMethod == 0b00)
RESIDUAL_CODING_METHOD_PARTITIONED_RICE rice;
else if (parent.value.codingMethod == 0b01)
RESIDUAL_CODING_METHOD_PARTITIONED_RICE2 rice;
if ((parent.parent.header.type & 0b111) == 0b000)
u8 samples[(getBitsPerSample() * (parent.parent.parent.header.flags.blockSize - (parent.parent.header.type & 0b111))) / 8];
else if (std::core::array_index() != 0)
u8 samples[(getBitsPerSample() * (parent.parent.parent.header.flags.blockSize / (1 << rice.partitionOrder))) / 8];
else
u8 samples[(getBitsPerSample() * ((parent.parent.parent.header.flags.blockSize / (1 << rice.partitionOrder)) - (parent.parent.header.type & 0b111))) / 8];
};
struct SUBFRAME_FIXED {
SUBFRAME_FIXED_VALUE value;
RESIDUAL residual;
};
bitfield SUBFRAME_LPC_VALUE {
warmUpSamples : getBitsPerSample() * ((parent.header.type & 0b011111) + 1);
quantizedLinearPredictorCoefficient : 4;
quantizedLinearPredictorCoefficientShift : 5;
predictorCoefficients : quantizedLinearPredictorCoefficient * ((parent.header.type & 0b011111) + 1);
} [[inline]];
struct SUBFRAME_LPC {
SUBFRAME_LPC_VALUE value;
RESIDUAL residual;
};
struct SUBFRAME {
SUBFRAME_HEADER header;
if (header.type == 0b00000)
SUBFRAME_CONSTANT constant;
else if (header.type == 0b000001)
SUBFRAME_VERBATIM verbatim;
else if ((header.type >> 3) == 0b001 && (header.type & 0b111) <= 4)
SUBFRAME_FIXED fixed;
else if (header.type == 0b100000)
SUBFRAME_LPC lpc;
};
struct FRAME {
FRAME_HEADER header;
SUBFRAME subframes[parent.metadata[0].data.flags.numChannels + 1];
FRAME_FOOTER footer;
};
struct METADATA_BLOCK {
METADATA_BLOCK_HEADER header;
if (header.lastMetadataBlock)
break;
if (header.blockType == BLOCK_TYPE::STREAMINFO)
METADATA_BLOCK_STREAMINFO data;
else if (header.blockType == BLOCK_TYPE::PADDING)
METADATA_BLOCK_PADDING data;
else if (header.blockType == BLOCK_TYPE::APPLICATION)
METADATA_BLOCK_APPLICATION data;
else if (header.blockType == BLOCK_TYPE::VORBIS_COMMENT)
METADATA_BLOCK_VORBIS_COMMENT data;
else if (header.blockType == BLOCK_TYPE::CUESHEET)
METADATA_BLOCK_CUESHEET data;
else if (header.blockType == BLOCK_TYPE::PICTURE)
METADATA_BLOCK_PICTURE data;
else
std::error("Invalid metadata block type!");
};
struct STREAM {
char magic[4];
METADATA_BLOCK metadata[while(true)];
//FRAME frames[while(!std::mem::eof())];
};
STREAM stream @ 0x00;

168
patterns/fs.hexpat Normal file
View File

@@ -0,0 +1,168 @@
#include <std/io.pat>
struct DiskTimeStamp {
u8 seconds, minutes, hours;
};
enum DiskProtection : u16 {
None = 0x0000,
CopyProtected = 0x5A5A
};
bitfield CHS {
h : 8;
s : 6;
c : 10;
} [[right_to_left, format("chs_formatter")]];
fn chs_formatter(CHS chs) {
return std::format("({:X}, {:X}, {:X}) | 0x{:X}", chs.c, chs.h, chs.s, (chs.c * 16 + chs.h) * 63 + (chs.s - 1));
};
enum PartitionStatus : u8 {
None = 0x00,
Active = 0x80
};
enum PartitionType : u8 {
EmptyPartitionEntry = 0x00,
FAT32_CHS = 0x0B,
FAT32_LBA = 0x0C
};
namespace fat32 {
u64 bytesPerCluster;
struct FSInfo {
u32 leadSignature;
padding[480];
u32 structSignature;
u32 freeClusterCount;
u32 nextFreeCluster;
padding[12];
u32 trailSignature;
};
bitfield SequenceNumber {
padding : 1;
lastLogical : 1;
padding : 1;
number : 5;
} [[left_to_right]];
enum EntryStatus : u8 {
Regular = 0x00,
DotEntry = 0x2E,
DeletedEntry = 0xE5
};
union EntryStatusOrSequenceNumber {
EntryStatus entryStatus;
SequenceNumber sequenceNumber;
};
bitfield Attributes {
readOnly : 1;
hidden : 1;
systemFile : 1;
volumeLabel : 1;
subdirectory : 1;
archive : 1;
padding : 2;
} [[right_to_left]];
struct DirEntry {
char fileName[8];
char extension[3];
Attributes attributes;
u8 reserved[10];
u16 time, date;
u16 startingCluster;
u32 fileSize;
u8 data[fileSize] @ startingCluster * bytesPerCluster;
};
struct VFATDirEntry {
EntryStatusOrSequenceNumber entryStatusOrSequenceNumber;
char16 name1[5];
Attributes attributes;
u8 type;
u8 nameChecksum;
char16 name2[6];
u16 startingCluster;
char16 name3[2];
if (entryStatusOrSequenceNumber.sequenceNumber.number > 1)
VFATDirEntry nextLogicalEntry;
else
DirEntry physicalEntry;
};
struct Partition {
u8 jmpCode[3];
char oemName[8];
u16 bytesPerSector;
u8 sectorsPerCluster;
u16 reservedAreaSize;
u8 numFats;
u16 rootEntryCount;
u16 numSectors;
u8 mediaType;
u16 fatSize;
u16 sectorsPerTrack;
u16 numHeads;
u32 numHiddenSectors;
u32 numFsSectors;
u32 numFatSectors;
u16 extFlags;
u16 fsVersion;
u32 rootCluster;
u16 fsInfoSector;
u16 backupBootSector;
padding[12];
u8 driveNumber;
padding[1];
u8 bootSignature;
u32 volumeID;
char volumeLabel[11];
char fsType[8];
u8 bootstrapCode[420];
u16 signature;
bytesPerCluster = (sectorsPerCluster * 1024) * bytesPerSector;
FSInfo fsInfo @ addressof(this) + fsInfoSector * bytesPerSector;
VFATDirEntry rootDirEntry @ addressof(this) + rootCluster * bytesPerCluster;
};
}
struct PartitionEntry {
PartitionStatus status;
CHS chsFirstSectorAddress;
PartitionType type;
CHS chsLastSectorAddress;
u32 lbaFirstSectorAddress;
u32 numSectors;
if (type == PartitionType::EmptyPartitionEntry)
continue;
else if (type == PartitionType::FAT32_CHS || type == PartitionType::FAT32_LBA)
fat32::Partition partition @ lbaFirstSectorAddress * 512;
};
struct MasterBootRecord {
u8 bootstrapCodeArea1[218];
padding[2];
u8 originalPhysicalDrive;
DiskTimeStamp diskTimeStamp;
u8 bootstrapCodeArea2[216];
u32 diskSignature;
DiskProtection diskProtection;
PartitionEntry partitionEntries[4];
u16 bootSignature;
};
MasterBootRecord mbr @ 0x00;

156
patterns/id3.hexpat Normal file
View File

@@ -0,0 +1,156 @@
#pragma MIME audio/mpeg
#include <std/mem.pat>
namespace v1 {
struct Tag {
char header[3];
char title[30];
char artist[30];
char album[30];
char year[4];
char comment[30];
u8 zero;
u8 track;
u8 genre;
} [[static]];
}
namespace v2 {
struct SyncSafeInt {
u8 bytes[4];
} [[sealed, static, format("v2::ssi_value"), transform("v2::ssi_value")]];
fn ssi_value(ref SyncSafeInt n) {
u32 result = 0;
for (u8 i = 0, i < 4, i = i + 1) {
u8 byteval = n.bytes[i] & 0x7F;
u8 shift = 7 * (4 - i - 1);
result = result | (byteval << shift);
}
return result;
};
struct TagVersion {
u8 major;
u8 revision;
};
bitfield TagHeaderFlags {
unsynchronized : 1;
extended : 1;
experimental : 1;
footer : 1;
padding : 4;
};
struct TagHeader {
char identifier[3];
TagVersion version;
TagHeaderFlags flags;
SyncSafeInt size;
} [[static]];
bitfield ExtendedFlag {
padding : 1;
update : 1;
crcpresent : 1;
restrictions : 1;
padding : 4;
};
struct TagExtendedHeader {
SyncSafeInt size;
u8 nflagbytes;
ExtendedFlag flags[nflagbytes];
u8 data[size];
};
struct TagFooter {
char identifier[3];
TagVersion version;
TagHeaderFlags flags;
SyncSafeInt size;
} [[static]];
bitfield FrameFlags {
padding : 1;
tagalterpreservation : 1;
filealterpreservation : 1;
readonly : 1;
padding : 5;
groupid : 1;
padding : 2;
compressed : 1;
encrypted : 1;
unzynchronized : 1;
datalengthindicator : 1;
};
enum TextEncoding : u8 {
ISO88591 = 0x00,
UTF16BOM = 0x01,
UTF16BE = 0x02,
UTF8 = 0x03,
};
struct StringData {
TextEncoding encoding;
if (encoding == TextEncoding::UTF16BOM) {
u16 bom;
char16 data[(parent.size - 3) / 2];
} else if (encoding == TextEncoding::UTF16BE)
be char16 data[(parent.size - 1) / 2];
else
char data[parent.size - 1];
};
// Hack to work around the fact, that chars may not be compared
union FrameId {
char cdata[4];
u8 ndata[4];
} [[sealed, static, format("v2::impl::format_frame_id")]];
namespace impl {
fn format_frame_id(ref FrameId id) {
return id.cdata;
};
}
struct Frame {
FrameId id;
SyncSafeInt size;
FrameFlags flags;
if (id.ndata[0] == 'T')
StringData data;
else
u8 data[size];
};
fn has_next_frame(u32 size) {
bool hasnext = $ < size;
if (hasnext) {
hasnext = std::mem::read_unsigned($, 1) != 0;
$ = $ - 1;
}
return hasnext;
};
struct Tag {
TagHeader header;
if (header.flags.extended)
TagExtendedHeader extendedheader;
Frame frames[while(v2::has_next_frame(header.size))];
if (header.flags.footer)
TagFooter footer;
};
}
v2::Tag tag @ 0;
v1::Tag oldtag @ std::mem::size() - 128;

View File

@@ -26,7 +26,9 @@ enum cp_tag : u8 {
CONSTANT_NameAndType = 12,
CONSTANT_MethodHandle = 15,
CONSTANT_MethodType = 16,
CONSTANT_InvokeDynamic = 18
CONSTANT_InvokeDynamic = 18,
CONSTANT_Module = 19,
CONSTANT_Package = 20
};
enum major_version : u2 {
@@ -36,7 +38,7 @@ enum major_version : u2 {
JDK_1_4 = 48,
Java_SE_5_0 = 49,
Java_SE_6_0 = 50,
Java_SE_6 = 50,
Java_SE_7 = 51,
Java_SE_8 = 52,
Java_SE_9 = 53,
@@ -129,37 +131,62 @@ struct CONSTANT_InvokeDynamic_info {
u2 name_and_type_index;
};
struct cp_info {
cp_tag tag;
// Tag == CONSTANT_Module
struct CONSTANT_Module_info {
u2 name_index;
};
if (tag == cp_tag::CONSTANT_Utf8)
CONSTANT_Utf8_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Integer)
CONSTANT_Integer_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Float)
CONSTANT_Float_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Long)
CONSTANT_Long_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Double)
CONSTANT_Double_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Class)
CONSTANT_Class_info info [[inline]];
else if (tag == cp_tag::CONSTANT_String)
CONSTANT_String_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Fieldref)
CONSTANT_Fieldref_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Methodref)
CONSTANT_Methodref_info info [[inline]];
else if (tag == cp_tag::CONSTANT_InterfaceMethodref)
CONSTANT_InterfaceMethodref_info info [[inline]];
else if (tag == cp_tag::CONSTANT_NameAndType)
CONSTANT_NameAndType_info info [[inline]];
else if (tag == cp_tag::CONSTANT_MethodHandle)
CONSTANT_MethodHandle_info info [[inline]];
else if (tag == cp_tag::CONSTANT_MethodType)
CONSTANT_MethodType_info info [[inline]];
else if (tag == cp_tag::CONSTANT_InvokeDynamic)
CONSTANT_InvokeDynamic_info info [[inline]];
// Tag == CONSTANT_Package
struct CONSTANT_Package_info {
u2 name_index;
};
// All 8-byte constants take up two entries in the constant_pool table of the class file
u1 padding_entry_flag = 0;
struct cp_info {
if (padding_entry_flag == 0) {
cp_tag tag;
if (tag == cp_tag::CONSTANT_Utf8)
CONSTANT_Utf8_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Integer)
CONSTANT_Integer_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Float)
CONSTANT_Float_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Long) {
CONSTANT_Long_info info [[inline]];
padding_entry_flag = 1;
}
else if (tag == cp_tag::CONSTANT_Double) {
CONSTANT_Double_info info [[inline]];
padding_entry_flag = 1;
}
else if (tag == cp_tag::CONSTANT_Class)
CONSTANT_Class_info info [[inline]];
else if (tag == cp_tag::CONSTANT_String)
CONSTANT_String_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Fieldref)
CONSTANT_Fieldref_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Methodref)
CONSTANT_Methodref_info info [[inline]];
else if (tag == cp_tag::CONSTANT_InterfaceMethodref)
CONSTANT_InterfaceMethodref_info info [[inline]];
else if (tag == cp_tag::CONSTANT_NameAndType)
CONSTANT_NameAndType_info info [[inline]];
else if (tag == cp_tag::CONSTANT_MethodHandle)
CONSTANT_MethodHandle_info info [[inline]];
else if (tag == cp_tag::CONSTANT_MethodType)
CONSTANT_MethodType_info info [[inline]];
else if (tag == cp_tag::CONSTANT_InvokeDynamic)
CONSTANT_InvokeDynamic_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Module)
CONSTANT_Module_info info [[inline]];
else if (tag == cp_tag::CONSTANT_Package)
CONSTANT_Package_info info [[inline]];
} else {
padding_entry_flag = 0;
}
};
bitfield access_flags_method {
@@ -216,7 +243,7 @@ bitfield access_flags_class {
ACC_SYNTHETIC : 1; // 0x1000
ACC_ANNOTATION : 1; // 0x2000
ACC_ENUM : 1; // 0x4000
padding : 1; // 0x8000
ACC_MODULE : 1; // 0x8000
};
struct attribute_info {
@@ -279,31 +306,29 @@ fn main() {
std::print("Fields:");
for (le u16 i = 0, i < class_file.fields_count, i = i + 1) {
str method_string = " ";
str field_string = " ";
if (class_file.fields[i].access_flags.ACC_PUBLIC)
method_string = method_string + "public ";
field_string = field_string + "public ";
if (class_file.fields[i].access_flags.ACC_PRIVATE)
method_string = method_string + "private ";
field_string = field_string + "private ";
if (class_file.fields[i].access_flags.ACC_PROTECTED)
method_string = method_string + "protected ";
field_string = field_string + "protected ";
if (class_file.fields[i].access_flags.ACC_STATIC)
method_string = method_string + "static ";
field_string = field_string + "static ";
if (class_file.fields[i].access_flags.ACC_FINAL)
method_string = method_string + "final ";
field_string = field_string + "final ";
if (class_file.fields[i].access_flags.ACC_VOLATILE)
method_string = method_string + "volatile ";
if (class_file.fields[i].access_flags.ACC_NATIVE)
method_string = method_string + "native ";
field_string = field_string + "volatile ";
if (class_file.fields[i].access_flags.ACC_TRANSIENT)
method_string = method_string + "transient ";
field_string = field_string + "transient ";
if (class_file.fields[i].access_flags.ACC_ENUM)
method_string = method_string + "enum ";
field_string = field_string + "enum ";
method_string = method_string + class_file.constant_pool[class_file.fields[i].name_index - 1].info.bytes;
method_string = method_string + " [ " + class_file.constant_pool[class_file.fields[i].descriptor_index - 1].info.bytes + " ]";
field_string = field_string + class_file.constant_pool[class_file.fields[i].name_index - 1].info.bytes;
field_string = field_string + " [ " + class_file.constant_pool[class_file.fields[i].descriptor_index - 1].info.bytes + " ]";
std::print("{}", method_string);
std::print("{}", field_string);
}
std::print("Methods:");

459
patterns/lnk.hexpat Normal file
View File

@@ -0,0 +1,459 @@
#pragma MIME application/x-ms-shortcut
#include <type/guid.pat>
#include <type/size.pat>
bitfield LinkFlags {
HasLinkTargetIDList : 1;
HasLinkInfo : 1;
HasName : 1;
HasRelativePath : 1;
HasWorkingDir : 1;
HasArguments : 1;
HasIconLocation : 1;
IsUnicode : 1;
ForceNoLinkInfo : 1;
HasExpString : 1;
RunInSeparateProcess : 1;
padding : 1;
HasDarwinID : 1;
RunAsUser : 1;
HasExpIcon : 1;
NoPidlAlias : 1;
padding : 1;
RunWithShimLayer : 1;
ForceNoLinkTrack : 1;
EnableTargetMetadata : 1;
DisableLinkPathTracking : 1;
DisableKnownFolderTracking : 1;
DisableKnownFolderAlias : 1;
AllowLinkToLink : 1;
UnaliasOnSave : 1;
PreferEnvironmentPath : 1;
KeepLocalIDListForUNCTarget : 1;
padding : 5;
} [[right_to_left]];
bitfield FileAttributesFlags {
FILE_ATTRIBUTE_READONLY : 1;
FILE_ATTRIBUTE_HIDDEN : 1;
FILE_ATTRIBUTE_SYSTEM : 1;
padding : 1;
FILE_ATTRIBUTE_DIRECTORY : 1;
FILE_ATTRIBUTE_ARCHIVE : 1;
padding : 1;
FILE_ATTRIBUTE_NORMAL : 1;
FILE_ATTRIBUTE_TEMPORARY : 1;
FILE_ATTRIBUTE_SPARSE_FILE : 1;
FILE_ATTRIBUTE_REPARSE_POINT : 1;
FILE_ATTRIBUTE_COMPRESSED : 1;
FILE_ATTRIBUTE_OFFLINE : 1;
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED : 1;
FILE_ATTRIBUTE_ENCRYPTED : 1;
padding : 17;
} [[right_to_left]];
bitfield ModifierKeys {
HOTKEYF_SHIFT : 1;
HOTKEYF_CONTROL : 1;
HOTKEYF_ALT : 1;
padding : 5;
} [[right_to_left]];
enum Keys : u8 {
KEY_NONE = 0x00,
KEY_0 = 0x30,
KEY_1 = 0x31,
KEY_2 = 0x32,
KEY_3 = 0x33,
KEY_4 = 0x34,
KEY_5 = 0x35,
KEY_6 = 0x36,
KEY_7 = 0x37,
KEY_8 = 0x38,
KEY_9 = 0x39,
KEY_A = 0x41,
KEY_B = 0x42,
KEY_C = 0x43,
KEY_D = 0x44,
KEY_E = 0x45,
KEY_F = 0x46,
KEY_G = 0x47,
KEY_H = 0x48,
KEY_I = 0x49,
KEY_J = 0x4A,
KEY_K = 0x4B,
KEY_L = 0x4C,
KEY_M = 0x4D,
KEY_N = 0x4E,
KEY_O = 0x4F,
KEY_P = 0x50,
KEY_Q = 0x51,
KEY_R = 0x52,
KEY_S = 0x53,
KEY_T = 0x54,
KEY_U = 0x55,
KEY_V = 0x56,
KEY_W = 0x57,
KEY_X = 0x58,
KEY_Y = 0x59,
KEY_Z = 0x5A,
VK_F1 = 0x70,
VK_F2 = 0x71,
VK_F3 = 0x72,
VK_F4 = 0x73,
VK_F5 = 0x74,
VK_F6 = 0x75,
VK_F7 = 0x76,
VK_F8 = 0x77,
VK_F9 = 0x78,
VK_F10 = 0x79,
VK_F11 = 0x7A,
VK_F12 = 0x7B,
VK_F13 = 0x7C,
VK_F14 = 0x7D,
VK_F15 = 0x7E,
VK_F16 = 0x7F,
VK_F17 = 0x80,
VK_F18 = 0x81,
VK_F19 = 0x82,
VK_F20 = 0x83,
VK_F21 = 0x84,
VK_F22 = 0x85,
VK_F23 = 0x86,
VK_F24 = 0x87,
VK_NUMLOCK = 0x90,
VK_SCROLL = 0x91,
};
struct HotKeyFlags {
Keys Key;
ModifierKeys ModifierKeys;
};
struct FILETIME {
u32 dwLowDateTime;
u32 dwHighDateTime;
};
enum SHOWWINDOW_FLAGS : u32 {
SW_SHOWNORMAL = 0x00000001,
SW_SHOWMAXIMIZED = 0x00000003,
SW_SHOWMINNOACTIVE = 0x00000007
};
struct ShellLinkHeader {
type::Size32 HeaderSize;
type::GUID LinkCLSID;
LinkFlags LinkFlags;
FileAttributesFlags FileAttributes;
FILETIME CreationTime, AccessTime, WriteTime;
type::Size32 FileSize;
u32 IconIndex;
SHOWWINDOW_FLAGS ShowCommand;
HotKeyFlags HotKey;
padding[2];
padding[4];
padding[4];
};
struct ItemID {
type::Size16 ItemIDSize;
if (ItemIDSize == 0x00)
break;
else
u8 Data[ItemIDSize - sizeof(ItemIDSize)];
};
struct IDList {
ItemID ItemIDList[while(true)];
};
struct LinkTargetIDList {
type::Size16 IDListSize;
IDList IDList[while($ < (addressof(IDListSize) + IDListSize))];
};
bitfield LinkInfoFlags {
VolumeIDAndLocalBasePath : 1;
CommonNetworkRelativeLinkAndPathSuffix : 1;
padding : 30;
};
enum DriveType : u32 {
DRIVE_UNKNOWN = 0x00000000,
DRIVE_NO_ROOT_DIR = 0x00000001,
DRIVE_REMOVABLE = 0x00000002,
DRIVE_FIXED = 0x00000003,
DRIVE_REMOTE = 0x00000004,
DRIVE_CDROM = 0x00000005,
DRIVE_RAMDISK = 0x00000006
};
struct VolumeID {
type::Size32 VolumeIDSize;
DriveType DriveType;
u32 DriveSerialNumber;
u32 VolumeLabelOffset;
if (VolumeLabelOffset == 0x14)
u32 VolumeLabelOffsetUnicode;
char Data[VolumeIDSize - ($ - addressof(this))];
};
bitfield CommonNetworkRelativeLinkFlags {
ValidDevice : 1;
ValidNetType : 1;
padding : 30;
} [[right_to_left]];
enum NetworkProviderType : u32 {
WNNC_NET_AVID = 0x001A0000,
WNNC_NET_DOCUSPACE = 0x001B0000,
WNNC_NET_MANGOSOFT = 0x001C0000,
WNNC_NET_SERNET = 0x001D0000,
WNNC_NET_RIVERFRONT1 = 0x001E0000,
WNNC_NET_RIVERFRONT2 = 0x001F0000,
WNNC_NET_DECORB = 0x00200000,
WNNC_NET_PROTSTOR = 0x00210000,
WNNC_NET_FJ_REDIR = 0x00220000,
WNNC_NET_DISTINCT = 0x00230000,
WNNC_NET_TWINS = 0x00240000,
WNNC_NET_RDR2SAMPLE = 0x00250000,
WNNC_NET_CSC = 0x00260000,
WNNC_NET_3IN1 = 0x00270000,
WNNC_NET_EXTENDNET = 0x00290000,
WNNC_NET_STAC = 0x002A0000,
WNNC_NET_FOXBAT = 0x002B0000,
WNNC_NET_YAHOO = 0x002C0000,
WNNC_NET_EXIFS = 0x002D0000,
WNNC_NET_DAV = 0x002E0000,
WNNC_NET_KNOWARE = 0x002F0000,
WNNC_NET_OBJECT_DIRE = 0x00300000,
WNNC_NET_MASFAX = 0x00310000,
WNNC_NET_HOB_NFS = 0x00320000,
WNNC_NET_SHIVA = 0x00330000,
WNNC_NET_IBMAL = 0x00340000,
WNNC_NET_LOCK = 0x00350000,
WNNC_NET_TERMSRV = 0x00360000,
WNNC_NET_SRT = 0x00370000,
WNNC_NET_QUINCY = 0x00380000,
WNNC_NET_OPENAFS = 0x00390000,
WNNC_NET_AVID1 = 0x003A0000,
WNNC_NET_DFS = 0x003B0000,
WNNC_NET_KWNP = 0x003C0000,
WNNC_NET_ZENWORKS = 0x003D0000,
WNNC_NET_DRIVEONWEB = 0x003E0000,
WNNC_NET_VMWARE = 0x003F0000,
WNNC_NET_RSFX = 0x00400000,
WNNC_NET_MFILES = 0x00410000,
WNNC_NET_MS_NFS = 0x00420000,
WNNC_NET_GOOGLE = 0x00430000
};
struct CommonNetworkRelativeLink {
type::Size32 CommonNetworkRelativeLinkSize;
CommonNetworkRelativeLinkFlags CommonNetworkRelativeLinkFlags;
u32 NetNameOffset;
u32 DeviceNameOffset;
NetworkProviderType NetworkProviderType;
if (NetNameOffset > 0x14) {
u32 NetNameOffsetUnicode;
u32 DeviceNameOffsetUnicode;
}
char NetName[];
char DeviceName[];
if (NetNameOffset > 0x14) {
char16 NetNameUnicode[];
char16 DeviceNameUnicode[];
}
};
struct LinkInfo {
type::Size32 LinkInfoSize;
type::Size32 LinkInfoHeaderSize;
LinkInfoFlags LinkInfoFlags;
u32 VolumeIDOffset;
u32 LocalBasePathOffset;
u32 CommonNetworkRelativeLinkOffset;
u32 CommonPathSuffixOffset;
if (LinkInfoHeaderSize >= 0x24) {
u32 LocalBasePathOffsetUnicode;
u32 CommonPathSuffixOffsetUnicode;
}
if (LinkInfoFlags.VolumeIDAndLocalBasePath) {
VolumeID VolumeID;
char LocalBasePath[];
}
if (LinkInfoFlags.CommonNetworkRelativeLinkAndPathSuffix)
CommonNetworkRelativeLink CommonNetworkRelativeLink;
char CommonPathSuffix[];
if (LinkInfoHeaderSize >= 0x24) {
if (LinkInfoFlags.VolumeIDAndLocalBasePath)
char16 LocalBasePathUnicode[];
char16 CommonPathSuffixUnicode[];
}
};
struct String {
u16 CountCharacters;
char16 String[CountCharacters];
};
struct StringData {
if (parent.ShellLinkHeader.LinkFlags.HasName)
String NAME_STRING;
if (parent.ShellLinkHeader.LinkFlags.HasRelativePath)
String RELATIVE_PATH;
if (parent.ShellLinkHeader.LinkFlags.HasWorkingDir)
String WORKING_DIR;
if (parent.ShellLinkHeader.LinkFlags.HasArguments)
String COMMAND_LINE_ARGUMENTS;
if (parent.ShellLinkHeader.LinkFlags.HasIconLocation)
String ICON_LOCATION;
};
bitfield FillAttributes {
FOREGROUND_BLUE : 1;
FOREGROUND_GREEN : 1;
FOREGROUND_RED : 1;
FOREGROUND_INTENSITY : 1;
BACKGROUND_BLUE : 1;
BACKGROUND_GREEN : 1;
BACKGROUND_RED : 1;
BACKGROUND_INTENSITY : 1;
padding : 8;
} [[right_to_left]];
struct ConsoleDataBlock {
FillAttributes FillAttributes;
FillAttributes PopupFillAttributes;
u16 ScreenBufferSizeX, ScreenBufferSizeY;
u16 WindowSizeX, WindowSizeY;
u16 WindowOriginX, WindowOriginY;
padding[4];
padding[4];
u32 FontSize;
u32 FontFamily;
u32 FontWeight;
char16 FaceName[32];
u32 CursorSize;
u32 FullScreen;
u32 QuickEdit;
u32 InsertMode;
u32 AutoPosition;
u32 HistoryBufferSize;
u32 NumberOfHistoryBuffers;
u32 HistoryNoDup;
u32 ColorTable[16];
};
struct ConsoleFEDataBlock {
u32 CodePage;
};
struct DarwinDataBlock {
char DarwinDataAnsi[260];
char16 DarwinDataUnicode[260];
};
struct EnvironmentVariableDataBlock {
char TargetAnsi[260];
char16 TargetUnicode[260];
};
struct IconEnvironmentDataBlock {
char TargetAnsi[260];
char16 TargetUnicode[260];
};
struct KnownFolderDataBlock {
type::GUID KnownFolderID;
u32 Offset;
};
struct PropertyStoreDataBlock {
u8 Bytes[parent.BlockSize - sizeof(parent.BlockSize) - sizeof(parent.BlockSignature)];
std::warning("PropertyStoreDataBlock is not yet implemented!");
};
struct ShimDataBlock {
char16 LayerName[(parent.BlockSize - sizeof(parent.BlockSize) - sizeof(parent.BlockSignature)) / sizeof(char16)];
};
struct SpecialFolderDataBlock {
u32 SpecialFolderID;
u32 Offset;
};
struct TrackerDataBlock {
type::Size32 Length;
u32 Version;
char MachineID[16];
type::GUID Droid[2];
type::GUID DroidBirth[2];
};
struct VistaAndAboveIDListDataBlock {
IDList IDList;
};
struct ExtraDataBlock {
type::Size32 BlockSize;
if (BlockSize < 0x04)
break;
else {
u32 BlockSignature;
if (BlockSignature == 0xA000'0002)
ConsoleDataBlock CONSOLE_PROPS;
else if (BlockSignature == 0xA000'0004)
ConsoleFEDataBlock CONSOLE_FE_PROPS;
else if (BlockSignature == 0xA000'0006)
DarwinDataBlock DARWIN_PROPS;
else if (BlockSignature == 0xA000'0001)
EnvironmentVariableDataBlock ENVIRONMENT_PROPS;
else if (BlockSignature == 0xA000'0007)
IconEnvironmentDataBlock ICON_ENVIRONMENT_PROPS;
else if (BlockSignature == 0xA000'000B)
KnownFolderDataBlock KNOWN_FOLDER_PROPS;
else if (BlockSignature == 0xA000'0009)
PropertyStoreDataBlock PROPERTY_STORE_PROPS;
else if (BlockSignature == 0xA000'0008)
ShimDataBlock SHIM_PROPS;
else if (BlockSignature == 0xA000'0005)
SpecialFolderDataBlock SPECIAL_FOLDER_PROPS;
else if (BlockSignature == 0xA000'0003)
TrackerDataBlock TRACKER_PROPS;
else if (BlockSignature == 0xA000'000C)
VistaAndAboveIDListDataBlock VISTA_AND_ABOVE_IDLIST_PROPS;
}
};
struct ExtraData {
ExtraDataBlock ExtraDataBlock[while(true)];
};
struct LNK {
ShellLinkHeader ShellLinkHeader;
if (ShellLinkHeader.LinkFlags.HasLinkTargetIDList)
LinkTargetIDList LinkTargetIDList;
if (ShellLinkHeader.LinkFlags.HasLinkInfo)
LinkInfo LinkInfo;
StringData StringData;
ExtraData ExtraData;
};
LNK lnk @ 0x00;

423
patterns/minidump.hexpat Normal file
View File

@@ -0,0 +1,423 @@
#pragma MIME application/x-dmp
#include <type/time.pat>
#include <type/types/win32.pat>
#include <type/size.pat>
using RVA = ULONG32;
using RVA64 = ULONG64;
enum MINIDUMP_STREAM_TYPE : ULONG32 {
UnusedStream = 0,
ReservedStream0 = 1,
ReservedStream1 = 2,
ThreadListStream = 3,
ModuleListStream = 4,
MemoryListStream = 5,
ExceptionStream = 6,
SystemInfoStream = 7,
ThreadExListStream = 8,
Memory64ListStream = 9,
CommentStreamA = 10,
CommentStreamW = 11,
HandleDataStream = 12,
FunctionTableStream = 13,
UnloadedModuleListStream = 14,
MiscInfoStream = 15,
MemoryInfoListStream = 16,
ThreadInfoListStream = 17,
HandleOperationListStream = 18,
TokenStream = 19,
JavaScriptDataStream = 20,
SystemMemoryInfoStream = 21,
ProcessVmCountersStream = 22,
IptTraceStream = 23,
ThreadNamesStream = 24,
ceStreamNull = 0x8000,
ceStreamSystemInfo = 0x8001,
ceStreamException = 0x8002,
ceStreamModuleList = 0x8003,
ceStreamProcessList = 0x8004,
ceStreamThreadList = 0x8005,
ceStreamThreadContextList = 0x8006,
ceStreamThreadCallStackList = 0x8007,
ceStreamMemoryVirtualList = 0x8008,
ceStreamMemoryPhysicalList = 0x8009,
ceStreamBucketParameters = 0x800A,
ceStreamProcessModuleMap = 0x800B,
ceStreamDiagnosisList = 0x800C,
LastReservedStream = 0xFFFF
};
struct MINIDUMP_LOCATION_DESCRIPTOR {
type::Size32 DataSize;
RVA Rva;
};
struct MINIDUMP_MEMORY_DESCRIPTOR {
ULONG64 StartOfMemoryRange;
MINIDUMP_LOCATION_DESCRIPTOR Memory;
};
struct MINIDUMP_THREAD {
ULONG32 ThreadId;
ULONG32 SuspendCount;
ULONG32 PriorityClass;
ULONG32 Priority;
ULONG64 Teb;
MINIDUMP_MEMORY_DESCRIPTOR Stack;
MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
};
struct MINIDUMP_THREAD_LIST {
ULONG32 NumberOfThreads;
MINIDUMP_THREAD Threads[NumberOfThreads];
};
struct VS_FIXEDFILEINFO {
DWORD dwSignature;
DWORD dwStrucVersion;
DWORD dwFileVersionMS;
DWORD dwFileVersionLS;
DWORD dwProductVersionMS;
DWORD dwProductVersionLS;
DWORD dwFileFlagsMask;
DWORD dwFileFlags;
DWORD dwFileOS;
DWORD dwFileType;
DWORD dwFileSubtype;
DWORD dwFileDateMS;
DWORD dwFileDateLS;
};
struct MINIDUMP_MODULE {
ULONG64 BaseOfImage;
type::Size32 SizeOfImage;
ULONG32 CheckSum;
type::time32_t TimeDateStamp;
RVA ModuleNameRva;
VS_FIXEDFILEINFO VersionInfo;
MINIDUMP_LOCATION_DESCRIPTOR CvRecord;
MINIDUMP_LOCATION_DESCRIPTOR MiscRecord;
ULONG64 Reserved0;
ULONG64 Reserved1;
char16 ModuleName[] @ ModuleNameRva + 4 [[hidden]];
} [[format("format_module")]];
fn format_module(ref MINIDUMP_MODULE module) {
return module.ModuleName;
};
struct MINIDUMP_MODULE_LIST {
ULONG32 NumberOfModules;
MINIDUMP_MODULE Modules[NumberOfModules];
};
struct MINIDUMP_MEMORY_LIST {
ULONG32 NumberOfMemoryRanges;
MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges[NumberOfMemoryRanges];
};
struct MINIDUMP_EXCEPTION {
ULONG32 ExceptionCode;
ULONG32 ExceptionFlags;
ULONG64 ExceptionRecord;
ULONG64 ExceptionAddress;
ULONG32 NumberParameters;
padding[4];
ULONG64 ExceptionInformation[15];
};
struct MINIDUMP_EXCEPTION_STREAM {
ULONG32 ThreadId;
padding[4];
MINIDUMP_EXCEPTION ExceptionRecord;
MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
};
struct CPU_INFORMATION {
ULONG32 VendorId[3];
ULONG32 VersionInformation;
ULONG32 FeatureInformation;
ULONG32 AMDExtendedCpuFeatures;
};
struct MINIDUMP_SYSTEM_INFO {
USHORT ProcessorArchitecture;
USHORT ProcessorLevel;
USHORT ProcessorRevision;
UCHAR NumberOfProcessors;
UCHAR ProductType;
ULONG32 MajorVersion;
ULONG32 MinorVersion;
ULONG32 BuildNumber;
ULONG32 PlatformId;
RVA CSDVersionRva;
USHORT SuiteMask;
USHORT Reserved;
CPU_INFORMATION Cpu;
};
struct MINIDUMP_THREAD_EX {
ULONG32 ThreadId;
ULONG32 SuspendCount;
ULONG32 PriorityClass;
ULONG32 Priority;
ULONG64 Teb;
MINIDUMP_MEMORY_DESCRIPTOR Stack;
MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
MINIDUMP_MEMORY_DESCRIPTOR BackingStore;
};
struct MINIDUMP_THREAD_EX_LIST {
ULONG32 NumberOfThreads;
MINIDUMP_THREAD_EX Threads[NumberOfThreads];
};
struct MINIDUMP_MEMORY_DESCRIPTOR64 {
ULONG64 StartOfMemoryRange;
type::Size64 DataSize;
};
struct MINIDUMP_MEMORY64_LIST {
ULONG64 NumberOfMemoryRanges;
RVA64 BaseRva;
MINIDUMP_MEMORY_DESCRIPTOR64 MemoryRanges[NumberOfMemoryRanges];
};
struct MINIDUMP_HANDLE_DESCRIPTOR {
ULONG64 Handle;
RVA TypeNameRva;
RVA ObjectNameRva;
ULONG32 Attributes;
ULONG32 GrantedAccess;
ULONG32 HandleCount;
ULONG32 PointerCount;
};
struct MINIDUMP_HANDLE_DESCRIPTOR_2 {
ULONG64 Handle;
RVA TypeNameRva;
RVA ObjectNameRva;
ULONG32 Attributes;
ULONG32 GrantedAccess;
ULONG32 HandleCount;
ULONG32 PointerCount;
RVA ObjectInfoRva;
ULONG32 Reserved0;
};
struct MINIDUMP_HANDLE_DATA_STREAM {
ULONG32 SizeOfHeader;
ULONG32 SizeOfDescriptor;
ULONG32 NumberOfDescriptors;
ULONG32 Reserved;
if (SizeOfDescriptor == 32)
MINIDUMP_HANDLE_DESCRIPTOR HandleDescriptors[NumberOfDescriptors];
else if (SizeOfDescriptor == 40)
MINIDUMP_HANDLE_DESCRIPTOR_2 HandleDescriptors[NumberOfDescriptors];
};
struct MINIDUMP_FUNCTION_TABLE_DESCRIPTOR {
ULONG64 MinimumAddress;
ULONG64 MaximumAddress;
ULONG64 BaseAddress;
ULONG32 EntryCount;
type::Size32 SizeOfAlignPad;
};
struct MINIDUMP_FUNCTION_TABLE_STREAM {
type::Size32 SizeOfHeader;
type::Size32 SizeOfDescriptor;
type::Size32 SizeOfNativeDescriptor;
type::Size32 SizeOfFunctionEntry;
ULONG32 NumberOfDescriptors;
ULONG32 SizeOfAlignPad;
MINIDUMP_FUNCTION_TABLE_DESCRIPTOR FunctionDescriptors[NumberOfDescriptors];
};
struct MINIDUMP_UNLOADED_MODULE {
ULONG64 BaseOfImage;
type::Size32 SizeOfImage;
ULONG32 CheckSum;
ULONG32 TimeDateStamp;
RVA ModuleNameRva;
char16 ModuleName[] @ ModuleNameRva + 4 [[hidden]];
} [[format("format_unloaded_module")]];
fn format_unloaded_module(ref MINIDUMP_UNLOADED_MODULE module) {
return module.ModuleName;
};
struct MINIDUMP_UNLOADED_MODULE_LIST {
ULONG32 SizeOfHeader;
ULONG32 SizeOfEntry;
ULONG32 NumberOfEntries;
if (SizeOfHeader > 12)
padding[header.SizeOfHeader - 12];
MINIDUMP_UNLOADED_MODULE Modules[NumberOfEntries];
};
struct MINIDUMP_MISC_INFO {
ULONG32 SizeOfInfo;
ULONG32 Flags1;
ULONG32 ProcessId;
ULONG32 ProcessCreateTime;
ULONG32 ProcessUserTime;
ULONG32 ProcessKernelTime;
if (SizeOfInfo > 24) {
ULONG32 ProcessorMaxMhz;
ULONG32 ProcessorCurrentMhz;
ULONG32 ProcessorMhzLimit;
ULONG32 ProcessorMaxIdleState;
ULONG32 ProcessorCurrentIdleState;
}
};
struct MINIDUMP_MEMORY_INFO {
ULONG64 BaseAddress;
ULONG64 AllocationBase;
ULONG32 AllocationProtect;
padding[4];
type::Size64 RegionSize;
ULONG32 State;
ULONG32 Protect;
ULONG32 Type;
padding[4];
};
struct MINIDUMP_MEMORY_INFO_LIST {
ULONG SizeOfHeader;
ULONG SizeOfEntry;
ULONG64 NumberOfEntries;
if (SizeOfHeader > 16)
padding[SizeOfHeader - 16];
MINIDUMP_MEMORY_INFO Info[NumberOfEntries];
};
struct MINIDUMP_THREAD_INFO {
ULONG32 ThreadId;
ULONG32 DumpFlags;
ULONG32 DumpError;
ULONG32 ExitStatus;
ULONG64 CreateTime;
ULONG64 ExitTime;
ULONG64 KernelTime;
ULONG64 UserTime;
ULONG64 StartAddress;
ULONG64 Affinity;
};
struct MINIDUMP_THREAD_INFO_LIST {
ULONG SizeOfHeader;
ULONG SizeOfEntry;
ULONG NumberOfEntries;
if (SizeOfHeader > 12)
padding[SizeOfHeader - 12];
MINIDUMP_THREAD_INFO Info[NumberOfEntries];
};
struct MINIDUMP_HANDLE_OPERATION_LIST {
ULONG32 SizeOfHeader;
ULONG32 SizeOfEntry;
ULONG32 NumberOfEntries;
ULONG32 Reserved;
};
struct MINIDUMP_DIRECTORY {
MINIDUMP_STREAM_TYPE StreamType;
MINIDUMP_LOCATION_DESCRIPTOR Location;
if (StreamType == MINIDUMP_STREAM_TYPE::ThreadListStream)
MINIDUMP_THREAD_LIST ThreadList @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::ModuleListStream)
MINIDUMP_MODULE_LIST ModuleList @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::MemoryListStream)
MINIDUMP_MEMORY_LIST MemoryList @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::ExceptionStream)
MINIDUMP_EXCEPTION_STREAM ExceptionInfo @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::SystemInfoStream)
MINIDUMP_SYSTEM_INFO SystemInfo @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::ThreadExListStream)
MINIDUMP_THREAD_EX_LIST ThreadExList @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::Memory64ListStream)
MINIDUMP_MEMORY64_LIST Mem64List @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::CommentStreamA)
char Comment[] @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::CommentStreamW)
char16 Comment[] @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::HandleDataStream)
MINIDUMP_HANDLE_DATA_STREAM HandleData @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::FunctionTableStream)
MINIDUMP_FUNCTION_TABLE_STREAM FunctionTable @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::UnloadedModuleListStream)
MINIDUMP_UNLOADED_MODULE_LIST UnloadModuleList @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::MiscInfoStream)
MINIDUMP_MISC_INFO MiscInfo @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::MemoryInfoListStream)
MINIDUMP_MEMORY_INFO_LIST MemInfoList @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::ThreadInfoListStream)
MINIDUMP_THREAD_INFO_LIST ThreadInfoList @ Location.Rva;
else if (StreamType == MINIDUMP_STREAM_TYPE::HandleOperationListStream)
MINIDUMP_HANDLE_OPERATION_LIST HandleOperList @ Location.Rva;
};
bitfield MINIDUMP_TYPE {
MiniDumpWithDataSegs : 1;
MiniDumpWithFullMemory : 1;
MiniDumpWithHandleData : 1;
MiniDumpFilterMemory : 1;
MiniDumpScanMemory : 1;
MiniDumpWithUnloadedModules : 1;
MiniDumpWithIndirectlyReferencedMemory : 1;
MiniDumpFilterModulePaths : 1;
MiniDumpWithProcessThreadData : 1;
MiniDumpWithPrivateReadWriteMemory : 1;
MiniDumpWithoutOptionalData : 1;
MiniDumpWithFullMemoryInfo : 1;
MiniDumpWithThreadInfo : 1;
MiniDumpWithCodeSegs : 1;
MiniDumpWithoutAuxiliaryState : 1;
MiniDumpWithFullAuxiliaryState : 1;
MiniDumpWithPrivateWriteCopyMemory : 1;
MiniDumpIgnoreInaccessibleMemory : 1;
MiniDumpWithTokenInformation : 1;
MiniDumpWithModuleHeaders : 1;
MiniDumpFilterTriage : 1;
MiniDumpWithAvxXStateContext : 1;
MiniDumpWithIptTrace : 1;
MiniDumpScanInaccessiblePartialPages : 1;
padding : 40;
} [[right_to_left]];
struct MINIDUMP_HEADER {
char Signature[4];
ULONG32 Version;
ULONG32 NumberOfStreams;
RVA StreamDirectoryRva;
ULONG32 Checksum;
type::time32_t TimeDateStamp;
MINIDUMP_TYPE Flags;
};
struct MINIDUMP {
MINIDUMP_HEADER Header;
MINIDUMP_DIRECTORY Streams[Header.NumberOfStreams] [[format_entries("format_stream")]];
};
fn format_stream(ref MINIDUMP_DIRECTORY stream) {
return stream.StreamType;
};
MINIDUMP MiniDump @ 0x00;

154
patterns/msgpack.hexpat Normal file
View File

@@ -0,0 +1,154 @@
#pragma MIME application/x-msgpack
enum Type : u8 {
PositiveFixInt = 0x00 ... 0x7F,
FixMap = 0x80 ... 0x8F,
FixArray = 0x90 ... 0x9F,
FixStr = 0xA0 ... 0xBF,
Nil = 0xC0,
Unused = 0xC1,
False = 0xC2,
True = 0xC3,
Bin8 = 0xC4,
Bin16 = 0xC5,
Bin32 = 0xC6,
Ext8 = 0xC7,
Ext16 = 0xC8,
Ext32 = 0xC9,
Float32 = 0xCA,
Float64 = 0xCB,
Uint8 = 0xCC,
Uint16 = 0xCD,
Uint32 = 0xCE,
Uint64 = 0xCF,
Int8 = 0xD0,
Int16 = 0xD1,
Int32 = 0xD2,
Int64 = 0xD3,
FixExt1 = 0xD4,
FixExt2 = 0xD5,
FixExt4 = 0xD6,
FixExt8 = 0xD7,
FixExt16 = 0xD8,
Str8 = 0xD9,
Str16 = 0xDA,
Str32 = 0xDB,
Array16 = 0xDC,
Array32 = 0xDD,
Map16 = 0xDE,
Map32 = 0xDF,
NegativeFixInt = 0xE0 ... 0xFF
};
fn format_positive_fixint(u8 value) {
return value & 0b0111'1111;
};
fn format_negative_fixint(u8 value) {
return -(value & 0b0001'1111);
};
using MessagePack;
struct MapEntry {
MessagePack key, value;
};
struct MessagePack {
Type type;
if (u8(type) <= 0x7F) {
$ -= 1;
u8 value [[format("format_positive_fixint")]];
} else if (u8(type) >= Type::NegativeFixInt) {
$ -= 1;
u8 value [[format("format_negative_fixint")]];
} else if (type == Type::Uint8)
be u8 value;
else if (type == Type::Uint16)
be u16 value;
else if (type == Type::Uint32)
be u32 value;
else if (type == Type::Uint64)
be u64 value;
else if (type == Type::Int8)
be s8 value;
else if (type == Type::Int16)
be s16 value;
else if (type == Type::Int32)
be s32 value;
else if (type == Type::Int64)
be s64 value;
else if (type == Type::Float32)
be float value;
else if (type == Type::Float64)
be double value;
else if ((u8(type) & 0b1110'0000) == Type::FixStr)
char value[u8(type) & 0b0001'1111];
else if (type == Type::Str8) {
be u8 length;
char value[length];
} else if (type == Type::Str16) {
be u16 length;
char value[length];
} else if (type == Type::Str32) {
be u32 length;
char value[length];
} else if (type == Type::Bin8) {
be u8 length;
u8 value[length];
} else if (type == Type::Bin16) {
be u16 length;
u8 value[length];
} else if (type == Type::Bin32) {
be u32 length;
u8 value[length];
} else if ((u8(type) & 0b1111'0000) == Type::FixArray)
MessagePack value[u8(type) & 0b0000'1111];
else if (type == Type::Array16) {
be u16 length;
MessagePack value[length];
} else if (type == Type::Array32) {
be u32 length;
MessagePack value[length];
} else if ((u8(type) & 0b1111'0000) == Type::FixMap)
MapEntry value[u8(type) & 0b0000'1111];
else if (type == Type::Map16) {
be u16 length;
MapEntry value[length];
} else if (type == Type::Map32) {
be u32 length;
MapEntry value[length];
} else if (type == Type::FixExt1) {
s8 type;
u8 data;
} else if (type == Type::FixExt2) {
s8 type;
u16 data;
} else if (type == Type::FixExt4) {
s8 type;
u32 data;
} else if (type == Type::FixExt8) {
s8 type;
u64 data;
} else if (type == Type::FixExt16) {
s8 type;
u128 data;
} else if (type == Type::Ext8) {
u8 length;
s8 type;
u8 data[length];
} else if (type == Type::Ext16) {
u16 length;
s8 type;
u8 data[length];
} else if (type == Type::Ext32) {
u32 length;
s8 type;
u8 data[length];
}
};
MessagePack pack @ 0x00;

161
patterns/ntag.hexpat Normal file
View File

@@ -0,0 +1,161 @@
bitfield AccessCapability {
Read : 4;
Write : 4;
} [[left_to_right]];
struct CapabilityContainer {
u8 magic;
u8 version;
u8 memorySize;
AccessCapability accessCapability;
};
bitfield NDEFFlags {
MB : 1;
ME : 1;
CF : 1;
SR : 1;
IL : 1;
TNF : 3;
} [[left_to_right]];
enum TNFType : u8 {
Empty = 0x00,
NFCForumWellKnownType = 0x01,
MediaType = 0x02,
AbsoluteURI = 0x03,
NFCForumExternalType = 0x04,
Unknown = 0x05,
Unchanged = 0x06,
Reserved = 0x07
};
struct NDEF {
NDEFFlags flags;
u8 typeLength;
if (flags.SR)
u8 payloadLength;
else
u32 payloadLength;
if (flags.IL)
u8 idLength;
char type[typeLength];
if (flags.IL)
u8 id[idLength];
u8 payload[payloadLength];
if (flags.ME)
break;
};
struct LockControl {
u8 dynamicLockByteOffset;
u8 numBits;
u8 pageControlInfo;
};
struct MemoryControl {
u8 reservedBytesOffset;
u8 numBytes;
u8 pageSize;
};
struct Length {
u8 byte [[hidden, no_unique_address]];
if (byte == 0xFF)
u24 length;
else
u8 length;
} [[sealed, transform("transform_length"), format("transform_length")]];
fn transform_length(Length length) {
return length.length;
};
enum Tag : u8 {
NULL = 0x00,
LockControl = 0x01,
MemoryControl = 0x02,
NDEFMessage = 0x03,
Proprietary = 0xFD,
TerminatorTLV = 0xFE
};
struct TLV {
Tag tag;
if (tag == Tag::TerminatorTLV) {
break;
} else if (tag == Tag::NULL) {
// Empty
} else {
Length length;
if (length > 0) {
if (tag == Tag::LockControl) {
LockControl lockControl;
} else if (tag == Tag::MemoryControl) {
LockControl lockControl;
} else if (tag == Tag::NDEFMessage) {
NDEF ndef[while(true)];
} else {
u8 value[length];
}
}
}
};
struct ManufacturerData {
u8 serial1[3];
u8 checkByte0;
u8 serial2[4];
u8 checkByte1;
u8 internal;
u16 lockBytes;
};
struct DynamicLockBytes {
u8 bytes[3];
padding[1];
};
bitfield MIRROR {
MIRROR_CONF : 2;
MIRROR_BYTE : 2;
padding : 1;
STRG_MOD_EN : 1;
padding : 2;
} [[left_to_right]];
bitfield ACCESS {
PROT : 1;
CFGLCK : 1;
padding : 1;
NFC_CNT_EN : 1;
NFC_CNT_PWD_PROT : 1;
AUTHLIM : 3;
};
struct Config {
MIRROR MIRROR;
u8 MIRROR_PAGE;
u8 AUTH0;
ACCESS ACCESS;
u32 PWD;
u16 PACK;
};
struct NTAG {
ManufacturerData manufacturerData;
CapabilityContainer cc;
TLV tlv[while(true)];
padding[addressof(tlv) + cc.memorySize * 8 - sizeof(tlv)];
DynamicLockBytes dynamicLockBytes;
Config config;
};
NTAG ntag @ 0x00;

29
patterns/ogg.hexpat Normal file
View File

@@ -0,0 +1,29 @@
#pragma MIME audio/ogg
#include <std/core.pat>
#include <std/mem.pat>
bitfield HeaderType {
Continuation : 1;
BeginOfStream : 1;
EndOfStream : 1;
};
struct SegmentData {
u8 data[parent.segmentTable[std::core::array_index()]];
};
struct Ogg {
char capturePattern[4];
u8 version;
HeaderType headerType;
u64 granulePosition;
u32 bitstreamSerialNumber;
u32 pageSequenceNumber;
u32 checksum;
u8 pageSegments;
u8 segmentTable[pageSegments];
SegmentData data[pageSegments];
};
Ogg ogg[while(!std::mem::eof())] @ 0x00;

File diff suppressed because it is too large Load Diff

View File

@@ -1,36 +1,117 @@
#pragma MIME image/png
#pragma endian big
struct header_t
{
struct header_t {
u8 highBitByte;
char signature[3];
char dosLineEnding[2];
char dosEOF;
char unixLineEnding;
char signature[3];
char dosLineEnding[2];
char dosEOF;
char unixLineEnding;
};
struct ihdr_t
{
struct actl_t {
u32 frames [[comment("Total № of frames in animation")]];
u32 plays [[comment("№ of times animation will loop")]];
} [[comment("Animation control chunk"), name("acTL")]];
enum ColorType: u8 {
Grayscale = 0x0,
RGBTriple = 0x2,
Palette,
GrayscaleAlpha,
RGBA = 0x6
};
enum Interlacing: u8 {
None,
Adam7
};
struct ihdr_t {
u32 width [[comment("Image width")]];
u32 height [[comment("Image height")]];
u8 bit_depth;
u8 color_type [[comment("PNG Image Type\n0: greyscale\n2: truecolour\n3: indexed-color\n4: greyscale with alpha\n6: truecolour with alpha")]];
u8 compression_method;
u8 filter_method;
u8 interlace_method [[comment("values 0 \"no interlace\" or 1 \"Adam7 interlace\"")]];
ColorType color_type [[comment("PNG Image Type")]];
u8 compression_method [[comment("Only 0x0 = zlib supported by most")]];
u8 filter_method [[comment("Only 0x0 = adaptive supported by most")]];
Interlacing interlacing;
};
struct palette_entry_t {
u8 r;
u8 g;
u8 b;
enum sRGB: u8 {
Perceptual = 0x0,
RelativeColorimetric,
Saturation,
AbsoluteColorimetric
};
enum Unit: u8 {
Unknown,
Meter
};
struct phys_t {
u32 ppu_x [[comment("Pixels per unit, X axis")]];
u32 ppu_y [[comment("Pixels per unit, Y axis")]];
u8 unit [[comment("Unit Specifier\n0: unit is unknown\n1: unit is the metre")]];
Unit unit;
};
enum BlendOp: u8 {
Source = 0x0,
Over
};
enum DisposeOp: u8 {
None = 0x0,
Background,
Previous
};
struct fctl_t {
u32 sequence_no [[comment("Sequence №")]];
u32 width [[comment("Frame width")]];
u32 height;
u32 xoff;
u32 yoff;
u16 delay_num;
u16 delay_den;
DisposeOp dispose_op;
BlendOp blend_op;
};
struct fdat_t {
u32 sequence_no;
};
fn text_len() {
u64 len = parent.parent.length - ($ - addressof(parent.keyword));
return len;
};
enum BlendOp: u8 {
Source = 0x0,
Over
};
enum DisposeOp: u8 {
None = 0x0,
Background,
Previous
};
struct fctl_t {
u32 sequence_no [[comment("Sequence №")]];
u32 width [[comment("Frame width")]];
u32 height [[comment("Frame height")]];
u32 xoff;
u32 yoff;
u16 delay_num [[comment("Frame delay fraction numerator")]];
u16 delay_den [[comment("Frame delay fraction denominator")]];
DisposeOp dispose_op;
BlendOp blend_op;
};
struct fdat_t {
u32 sequence_no;
};
struct itxt_t {
@@ -39,48 +120,92 @@ struct itxt_t {
u8 compression_method;
char language_tag[];
char translated_keyword[];
char text[parent.length - ($ - addressof(keyword))];
char text[text_len()];
};
struct ztxt_t {
char keyword[];
u8 compression_method;
char text[text_len()];
};
struct text_t {
char keyword[];
char text[text_len()];
};
struct iccp_t {
char profile [];
u8 compression_method;
u8 compressed_profile[parent.length - ($ - addressof(profile))];
char keyword[];
u8 compression_method;
u8 compressed_profile[text_len()];
};
struct palette_entry_t {
u24 color;
} [[inline]];
struct chunk_t {
u32 length [[color("17BECF")]];
char type[4];
char name[4];
#define IHDR_k "IHDR"
#define PLTE_k "PLTE"
#define sRGB_k "sRGB"
#define pHYs_k "pHYs"
#define iTXt_k "iTXt"
#define tEXt_k "tEXt"
#define zTXt_k "zTXt"
#define IDAT_k "IDAT"
#define IEND_k "IEND"
#define gAMA_k "gAMA"
#define iCCP_k "iCCP"
#define acTL_k "acTL"
#define fdAT_k "fdAT"
#define fcTL_k "fcTL"
if (type == IHDR_k) {
if (name == IHDR_k) {
ihdr_t ihdr [[comment("Image Header chunk"), name("IHDR")]];
} else if (type == PLTE_k) {
} else if (name == PLTE_k) {
palette_entry_t entries[length / 3];
} else if (type == pHYs_k) {
} else if (name == sRGB_k) {
sRGB srgb;
} else if (name == pHYs_k) {
phys_t phys;
} else if (type == acTL_k) {
actl_t actl [[comment("Animation control chunk")]];
} else if (type == fcTL_k) {
fctl_t fctl [[comment("Frame control chunk")]];
} else if (type == iTXt_k) {
itxt_t text;
} else if (type == gAMA_k) {
u32 gamma [[name("image gamma"), comment("4 byte unsigned integer representing gamma times 100000")]];
} else if (type == iCCP_k) {
iccp_t iccp;
} else if (name == tEXt_k) {
text_t text;
} else if (name == zTXt_k) {
ztxt_t text;
} else if (name == iCCP_k) {
iccp_t iccp;
} else if (name == fdAT_k) {
fdat_t fdat [[comment("Frame data chunk")]];
u8 data[length-sizeof(u32)];
} else {
u8 data[length];
}
u32 crc;
} [[format("chunkValueName")]];
fn chunkValueName(ref chunk_t chunk) {
return chunk.name;
};
struct chunk_set {
chunk_t chunks[while(builtin::std::mem::read_string($ + 4, 4) != "IEND")] [[inline]];
} [[inline]];
header_t header @ 0x00 [[comment("PNG file signature"), name("Signature")]];
chunk_t ihdr_chunk @ 0x08 [[comment("PNG Header chunk"), name("IHDR")]];
chunk_t chunk_set[while(builtin::std::mem::read_string($ + 4, 4) != "IEND")] @ $ [[comment("PNG file chunks"), name("Chunks"), inline]];
chunk_t iend_chunk @ $ [[name("IEND"), comment("Image End Chunk")]];
chunk_set set @ $ [[comment("PNG Chunks"), name("Chunks"), inline]];
chunk_t iend_chunk @ $ [[comment("Image End Chunk"), name("IEND")]];

66
patterns/protobuf.hexpat Normal file
View File

@@ -0,0 +1,66 @@
#include <std/mem.pat>
#include <type/leb128.pat>
struct ZigZag32 {
u32 value;
} [[sealed, format("format_zigzag32")]];
fn format_zigzag32(ZigZag32 zigzag) {
return s32((s32(zigzag.value) << 1) ^ (s32(zigzag.value) >> 31));
};
struct ZigZag64 {
u64 value;
} [[sealed, format("format_zigzag64")]];
fn format_zigzag64(ZigZag64 zigzag) {
return s64((s64(zigzag.value) << 1) ^ (s64(zigzag.value) >> 63));
};
enum WireType : u8 {
Varint = 0,
_64Bit = 1,
LengthDelimited = 2,
StartGroup = 3,
EndGroup = 4,
_32Bit = 5
};
bitfield Key {
field_number : 5;
wire_type : 3;
} [[left_to_right]];
union _64Bit {
u64 fixed64;
ZigZag64 sfixed64;
double dbl;
};
union _32Bit {
u32 fixed32;
ZigZag32 sfixed32;
float flt;
};
struct LengthDelimited {
type::LEB128 length;
char data[length];
};
struct Entry {
Key key;
if (key.wire_type == WireType::Varint)
type::LEB128 value;
else if (key.wire_type == WireType::_64Bit)
_64Bit value;
else if (key.wire_type == WireType::LengthDelimited)
LengthDelimited value;
else if (key.wire_type == WireType::_32Bit)
_32Bit value;
};
Entry entries[while(!std::mem::eof())] @ 0x00;

38
patterns/stl.hexpat Normal file
View File

@@ -0,0 +1,38 @@
#pragma MIME model/stl
#pragma MIME model/x.stl-binary
#pragma MIME model/x.stl-ascii
#pragma MIME application/sla
#include <std/sys.pat>
#include <std/mem.pat>
struct Vector3f {
float x, y, z;
} [[static, format("format_vector3f")]];
fn format_vector3f(Vector3f vec) {
return std::format("[ {}, {}, {} ]", vec.x, vec.y, vec.z);
};
struct Triangle {
Vector3f normal;
Vector3f points[3];
u16 flags;
} [[static]];
struct BinarySTLHeader {
char caption[];
padding[80 - sizeof(caption)];
u32 triangleCount;
};
struct STL {
if (std::mem::read_string(0, 6) == "solid ")
std::warning("ASCII STL file!");
else {
BinarySTLHeader header;
Triangle triangles[header.triangleCount];
}
};
STL stl @ 0x00;

270
patterns/usb.hexpat Normal file
View File

@@ -0,0 +1,270 @@
#include <std/io.pat>
#include <std/mem.pat>
#include <std/string.pat>
enum DescriptorType : u8 {
DeviceDescriptor = 0x01,
ConfigDescriptor = 0x02,
StringDescriptor = 0x03,
InterfaceDescriptor = 0x04,
EndpointDescriptor = 0x05,
DeviceQualifierDescriptor = 0x06,
OtherSpeedConfigurationDescriptor = 0x07,
InterfacePowerDescriptor = 0x08,
OTGDescriptor = 0x09,
DebugDescriptor = 0x0A,
InterfaceAssociationDescriptor = 0x0B,
HIDDescriptor = 0x21,
ReportDescriptor = 0x22,
PhysicalDescriptor = 0x23
};
enum InterfaceClass : u8 {
UseClassInformationInInterfaceDescriptors = 0x00,
Audio = 0x01,
CommunicationAndCDCControl = 0x02,
HID = 0x03,
Physical = 0x05,
Image = 0x06,
Printer = 0x07,
MassStorage = 0x08,
Hub = 0x09,
CDCData = 0x0A,
SmartCard = 0x0B,
ContentSecurity = 0x0C,
Video = 0x0E,
PersonalHealthcare = 0x0F,
AudioVideoDevice = 0x10,
BillboardDevice = 0x11,
USBTypeCBridge = 0x12,
I3CDevice = 0x3C,
DiagnosticDevice = 0xDC,
WirelessController = 0xE0,
Miscellaneous = 0xEF,
ApplicationSpecific = 0xFE,
VendorSpecific = 0xFF
};
enum CountryCode : u8 {
NotSupported = 0,
Arabic = 1,
Belgian = 2,
CanadianBilingual = 3,
CanadianFrench = 4,
CzechRepublic = 5,
Danish = 6,
Finnish = 7,
French = 8,
German = 9,
Greek = 10,
Hebrew = 11,
Hungary = 12,
International = 13,
Italian = 14,
JapanKatakana = 15,
Korean = 16,
LatinAmerican = 17,
Dutch = 18,
Norwegian = 19,
PersianFarsi = 20,
Polish = 21,
Portuguese = 22,
Russian = 23,
Slovakian = 24,
Spanish = 25,
Swedish = 26,
SwissFrench = 27,
SwissGerman = 28,
Switzerland = 29,
Taiwan = 30,
TurkishQ = 31,
EnglishUK = 32,
EnglishUS = 33,
Yugoslavian = 34,
TurkishF = 35,
Reserved = 36 ... 255
};
enum HubInterfaceSubClass : u8 {
Hub = 0x00
};
enum AudioVideoDeviceSubClass : u8 {
AVControlInterface = 0x01,
AVDataVideoStreamingInterface = 0x02,
AVDataAudioStreamingInterface = 0x03
};
enum HubInterfaceProtocol : u8 {
FullSpeedHub = 0x00,
HiSpeedHubWithSingleTT = 0x01,
HiSpeedHubWithMultipleTTs = 0x02
};
struct Ampere {
u8 amps;
} [[sealed, format("format_ampere")]];
fn format_ampere(Ampere ampere) {
return std::format("{} mA", ampere.amps * 2);
};
bitfield ConfigAttributes {
padding : 1;
SelfPowered : 1;
RemoteWakeup : 1;
padding : 5;
} [[left_to_right]];
struct BCD<auto Size> {
u8 bytes[Size];
} [[sealed, format("format_bcd")]];
fn format_bcd(ref auto bcd) {
str result;
for (s8 i = sizeof(bcd.bytes) - 1, i >= 0, i -= 1)
result += std::format("{:X}.", bcd.bytes[i]);
return std::string::substr(result, 0, std::string::length(result) - 1);
};
struct DeviceDescriptor {
BCD<2> bcdUSB;
InterfaceClass bDeviceClass;
if (bDeviceClass == InterfaceClass::Hub) {
HubInterfaceSubClass bDeviceSubClass;
if (bDeviceSubClass == HubInterfaceSubClass::Hub)
HubInterfaceProtocol bDeviceSubClass;
else
u8 bDeviceSubClass;
} else if (bDeviceClass == InterfaceClass::AudioVideoDevice) {
AudioVideoDeviceSubClass bDeviceSubClass;
u8 bDeviceSubClass;
} else {
u8 bDeviceSubClass;
u8 bDeviceSubClass;
}
};
struct ConfigDescriptor {
u16 wTotalLength;
u8 bNumInterfaces;
u8 bConfigurationValue;
u8 iConfiguration;
ConfigAttributes bmAttributes;
Ampere bMaxPower;
};
struct StringDescriptor {
char bString[parent.bLength - 2];
};
struct InterfaceDescriptor {
u8 bInterfaceNumber;
u8 bAlternateSetting;
u8 bNumEndpoints;
InterfaceClass bInterfaceClass;
if (bInterfaceClass == InterfaceClass::Hub) {
HubInterfaceSubClass bInterfaceSubClass;
if (bInterfaceSubClass == HubInterfaceSubClass::Hub)
HubInterfaceProtocol bInterfaceProtocol;
else
u8 bInterfaceProtocol;
} else if (bInterfaceClass == InterfaceClass::AudioVideoDevice) {
AudioVideoDeviceSubClass bInterfaceSubClass;
u8 bInterfaceProtocol;
} else {
u8 bInterfaceSubClass;
u8 bInterfaceProtocol;
}
u8 iInterface;
};
enum EndpointDirection : u8 {
OUT = 0,
IN = 1
};
fn format_direction(u8 value) {
EndpointDirection direction;
direction = value;
return direction;
};
bitfield EndpointAddress {
Direction : 1 [[format("format_direction")]];
padding : 3;
EndpointNumber : 4;
} [[left_to_right]];
bitfield EndpointAttributes {
TransferType : 2;
SynchronizationType : 2;
UsageType : 2;
} [[right_to_left]];
struct EndpointDescriptor {
EndpointAddress bEndPointAddress;
EndpointAttributes bmAttributes;
u16 wMaxPacketSize;
u8 bInterval;
};
struct OtherSpeedConfigurationDescriptor {
ConfigDescriptor content [[inline]];
};
struct DeviceQualifierDescriptor {
DeviceDescriptor deviceDescriptor [[inline]];
u8 bMaxPacketSize0;
u8 bNumConfigurations;
padding[1];
};
bitfield OTGAttributes {
SRPSupport : 1;
HNPSupport : 1;
} [[right_to_left]];
struct OTGDescriptor {
OTGAttributes bmAttributes;
};
struct HIDDescriptor {
BCD<2> bcdVersion;
CountryCode bCountryCode;
u8 bNumDescriptors;
DescriptorType bDescriptorType;
u16 wDescriptorLength;
};
struct USBDescriptor {
u8 bLength;
DescriptorType bDescriptorType;
if (bDescriptorType == DescriptorType::DeviceDescriptor)
DeviceDescriptor deviceDescriptor [[inline]];
else if (bDescriptorType == DescriptorType::ConfigDescriptor)
ConfigDescriptor configDescriptor [[inline]];
else if (bDescriptorType == DescriptorType::StringDescriptor)
StringDescriptor stringDescriptor [[inline]];
else if (bDescriptorType == DescriptorType::InterfaceDescriptor)
InterfaceDescriptor interfaceDescriptor [[inline]];
else if (bDescriptorType == DescriptorType::EndpointDescriptor)
EndpointDescriptor endpointDescriptor [[inline]];
else if (bDescriptorType == DescriptorType::OtherSpeedConfigurationDescriptor)
OtherSpeedConfigurationDescriptor otherSpeedConfigurationDescriptor [[inline]];
else if (bDescriptorType == DescriptorType::DeviceQualifierDescriptor)
DeviceQualifierDescriptor deviceQualifierDescriptor [[inline]];
else if (bDescriptorType == DescriptorType::OTGDescriptor)
OTGDescriptor otgDescriptor [[inline]];
else if (bDescriptorType == DescriptorType::HIDDescriptor)
HIDDescriptor hidDescriptor [[inline]];
padding[bLength - ($ - addressof(this))];
};
USBDescriptor descriptors[while(!std::mem::eof())] @ 0x00;

193
patterns/vhdx.hexpat Normal file
View File

@@ -0,0 +1,193 @@
#include <std/io.pat>
#include <std/ptr.pat>
#include <std/core.pat>
#include <type/guid.pat>
#include <type/size.pat>
struct FileTypeIdentifier {
char signature[8];
char16 creator[256];
padding[0x1'0000 - sizeof(signature) - sizeof(creator)];
};
struct DataSector {
u32 sequenceHigh;
u8 data[4084];
u32 sequenceLow;
} [[static]];
struct ZeroDescriptor {
padding[4];
u64 zeroLength;
DataSector *dataSector : u64;
u64 sequenceNumber;
} [[static]];
struct DataDescriptor {
u32 trailingBytes;
u64 leadingBytes;
DataSector *dataSector : u64;
u64 sequenceNumber;
} [[static]];
struct LogDescriptor {
char signature[4];
if (signature == "zero")
ZeroDescriptor descriptor [[inline]];
else if (signature == "desc")
DataDescriptor descriptor [[inline]];
};
struct LogEntry {
char signature[4];
u32 checksum;
type::Size32 entryLength;
u32 tail;
u64 sequenceNumber;
u32 descriptorCount;
padding[4];
type::GUID logGuid;
u64 flushedFileOffset;
u64 lastFileOffset;
} [[static]];
bitfield BAT {
State : 3;
padding : 17;
FileOffsetMB : 44;
} [[right_to_left]];
bitfield MetadataEntryFlags {
IsUser : 1;
IsVirtualDisk : 1;
IsRequired : 1;
padding : 29;
};
bitfield FileParameterFlags {
LeaveBlockAllocated : 1;
HasParent : 1;
padding : 30;
};
struct MetadataFileParameters {
type::Size32 blockSize;
FileParameterFlags flags;
};
struct MetadataVirtualDiskSize {
type::Size64 virtualDiskSize;
};
struct MetadataVirtualDiskID {
type::GUID virtualDiskID;
};
struct MetadataLogicalSectorSize {
type::Size32 logicalSectorSize;
};
struct MetadataPhysicalSectorSize {
type::Size32 physicalSectorSize;
};
struct ParentLocatorEntry {
u32 keyOffset;
u32 valueOffset;
u16 keyLength;
u16 valueLength;
char key[keyLength] @ addressof(parent) + keyOffset;
char value[valueLength] @ addressof(parent) + valueOffset;
};
struct MetadataParentLocator {
type::GUID locatorType;
padding[2];
u16 keyValueCount;
ParentLocatorEntry entries[keyValueCount];
};
fn metadata_relative(u128 offset) {
return addressof(parent.parent);
};
struct MetadataTableEntry {
type::GUID itemID;
if (std::core::formatted_value(itemID) == "{CAA16737-FA36-4D43-B3B6-33F0AA44E76B}")
MetadataFileParameters *data : u32 [[pointer_base("metadata_relative")]];
else if (std::core::formatted_value(itemID) == "{2FA54224-CD1B-4876-B211-5DBED83BF4B8}")
MetadataVirtualDiskSize *data : u32 [[pointer_base("metadata_relative")]];
else if (std::core::formatted_value(itemID) == "{BECA12AB-B2E6-4523-93EF-C309E000C746}")
MetadataVirtualDiskID *data : u32 [[pointer_base("metadata_relative")]];
else if (std::core::formatted_value(itemID) == "{8141BF1D-A96F-4709-BA47-F233A8FAAB5F}")
MetadataLogicalSectorSize *data : u32 [[pointer_base("metadata_relative")]];
else if (std::core::formatted_value(itemID) == "{CDA348C7-445D-4471-9CC9-E9885251C556}")
MetadataPhysicalSectorSize *data : u32 [[pointer_base("metadata_relative")]];
else if (std::core::formatted_value(itemID) == "{A8D35F2D-B30B-454D-ABF7-D3D84834AB0C}")
MetadataParentLocator *data : u32 [[pointer_base("metadata_relative")]];
else
u32 dataOffset;
type::Size32 length;
MetadataEntryFlags flags;
padding[4];
};
struct MetadataRegion {
char signature[8];
padding[2];
u16 entryCount;
padding[20];
MetadataTableEntry entries[entryCount];
};
struct RegionTableEntry {
type::GUID guid;
if (std::core::formatted_value(guid) == "{2DC27766-F623-4200-9D64-115E9BFD4A08}")
BAT *bat : u64;
else if (std::core::formatted_value(guid) == "{8B7CA206-4790-4B9A-B8FE-575F050F886E}")
MetadataRegion *metadata : u64;
else
u64 fileOffset;
type::Size32 length;
u32 required;
};
struct RegionTable {
char signature[4];
u32 checksum;
u32 entryCount;
padding[4];
RegionTableEntry entries[entryCount];
};
struct Header {
char signature[4];
u32 checksum;
u64 sequenceNumber;
type::GUID fileWriteGuid, dataWriteGuid, logGuid;
u16 logVersion;
u16 version;
type::Size32 logLength;
LogEntry *log : u64;
padding[4016];
};
struct VHDX {
FileTypeIdentifier fileTypeIdentifier;
Header header @ 0x1'0000;
Header headerBackup @ 0x2'0000;
RegionTable regionTable @ 0x3'0000;
RegionTable regionTableBackup @ 0x4'0000;
};
VHDX vhdx @ 0x00;

View File

@@ -17,6 +17,7 @@ enum WaveFormatType : u16 {
Unknown,
PCM,
MS_ADPCM,
IEEEFloatingPoint,
ALAW = 6,
MULAW,
IMA_ADPCM = 0x11,
@@ -83,6 +84,10 @@ bitfield WaveMPEGFlags {
padding : 11;
};
struct WaveFormatIEEEFloatingPoint : WaveFormatPCM {
};
struct WaveFormatMPEG : WaveFormatEx {
WaveMPEGLayer headLayersUsed;
u32 headBitrate;
@@ -169,7 +174,7 @@ struct WaveListItem : WaveChunk {
} else if (chunkId == "note") {
WaveNote note;
} else {
padding[chunkSize];
padding[(chunkSize + 1) >> 1 << 1];
}
};
@@ -181,38 +186,53 @@ struct WaveList {
WaveListItem item[while ($ < listEnd)];
};
u32 paddedChunkSize;
struct WavData {
WaveChunk chunk;
paddedChunkSize = (chunk.chunkSize + 1) >> 1 << 1;
if (chunk.chunkId == "fmt ") {
WaveFormat fmt;
if (fmt.formatTag == WaveFormatType::PCM) {
WaveFormatPCM pcmExtraData;
padding[paddedChunkSize - sizeof(fmt) - sizeof(pcmExtraData)];
} else if (fmt.formatTag == WaveFormatType::MS_ADPCM) {
WaveFormatMSADPCM msAdpcmExtraData;
padding[paddedChunkSize - sizeof(fmt) - sizeof(msAdpcmExtraData)];
} else if (fmt.formatTag == WaveFormatType::MPEG) {
WaveFormatMPEG mpegExtraData;
padding[paddedChunkSize - sizeof(fmt) - sizeof(mpegExtraData)];
} else if (fmt.formatTag == WaveFormatType::MPEGLAYER3) {
WaveFormatMPEGLayer3 mpegLayer3ExtraData;
padding[paddedChunkSize - sizeof(fmt) - sizeof(mpegLayer3ExtraData)];
} else if (fmt.formatTag == WaveFormatType::IEEEFloatingPoint) {
WaveFormatIEEEFloatingPoint ieeFloatingPointExtraData;
padding[paddedChunkSize - sizeof(fmt) - sizeof(ieeFloatingPointExtraData)];
} else {
WaveFormatExDummy unknown;
padding[paddedChunkSize - sizeof(fmt) - sizeof(unknown)];
}
} else if (chunk.chunkId == "data") {
padding[chunk.chunkSize];
padding[paddedChunkSize];
} else if (chunk.chunkId == "fact") {
WaveFact fact;
padding[paddedChunkSize - sizeof(fact)];
} else if (chunk.chunkId == "smpl") {
WaveSample smpl;
padding[paddedChunkSize - sizeof(smpl)];
} else if (chunk.chunkId == "cue ") {
WaveCue cue;
padding[paddedChunkSize - sizeof(cue)];
} else if (chunk.chunkId == "LIST") {
listEnd = $ + chunk.chunkSize;
WaveList list;
padding[paddedChunkSize % 1];
} else {
padding[chunk.chunkSize];
padding[paddedChunkSize];
}
};
RiffHeader header @0x00;
WavData data[while (!std::mem::eof())] @$;
WavData data[while (!std::mem::eof())] @ $;

View File

@@ -0,0 +1,52 @@
#include <std/mem.pat>
#include <std/io.pat>
struct Flags {
be u16 length;
u8 value[length];
};
struct TLV {
char tag[parent.keySize];
be u16 length;
char value[length];
};
struct Command {
be u32 value;
} [[static, sealed, format("format_command")]];
fn format_command(Command command) {
u32 x = command.value;
if (x == 0x20000000) return "NOP";
if (x == 0xAA995566) return "SYNC";
if (x == 0x000000BB) return "Bus Width Sync";
if (x == 0x11220044) return "Bus Width Detect";
if (x == 0x30002001) return "Write to FAR";
if (x == 0x28006000) return "Write to FDRO";
if (x == 0x30000001) return "Write to CRC";
if (x == 0x30018001) return "Write to IDCODE";
if (x == 0x30004000) return "Write to FDRI";
if (x == 0x30008001) return "Write to CMD";
if ((x & 0xF0000000) == 0x30000000)
return std::format("Write to Register {}", (x & 0x0003E000) >> 13);
return std::format("0x{:08X}", x);
};
struct Commands {
char tag[parent.keySize];
be u32 length;
Command commands[length / 4];
};
struct Header {
Flags flags;
be u16 keySize;
TLV tlv[4];
Commands data;
};
Header header @ 0x00;

31
scripts/csv2tbl.py Normal file
View File

@@ -0,0 +1,31 @@
import csv
import sys
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <file.csv>")
exit()
fileName = sys.argv[1]
index = 0x00
with open(f"{fileName}.tbl", "w", encoding="utf-8") as outFile:
with open(fileName) as file:
reader = csv.reader(file)
for row in reader:
for cell in row:
if cell != "":
try:
number = int(cell, 16)
if number <= 0x1F:
lut = [ "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", "BS", "TAB", "LF", "VT", "FF", "CR", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US"]
print(f"{index:02X}={lut[number]}", file=outFile)
elif number == 0x7F:
print(f"{index:02X}=DEL", file=outFile)
else:
if chr(number) == chr(0xFFFD):
raise Exception
print(f"{index:02X}={chr(number)}", file=outFile)
except Exception:
print(f"{index:02X}", file=outFile)
index += 1

View File

@@ -0,0 +1,35 @@
import json
import sys
from pathlib import Path
def extractData(projectName, jsonData, objectName, extension):
if objectName in jsonData:
with open(f"./{projectName}.{extension}", mode="w", encoding="utf-8") as output:
output.write(jsonData[objectName])
def main():
if len(sys.argv) != 2 or not str(sys.argv[1]).endswith(".hexproj"):
print(f"Usage: {sys.argv[0]} <filename.hexproj>")
exit(1)
projectPath = sys.argv[1]
with open(projectPath, mode="r", encoding="utf-8") as file:
jsonData = json.loads(file.read())
projectName = Path(projectPath).stem
extractData(projectName, jsonData, "dataProcessor", "hexnode")
extractData(projectName, jsonData, "pattern", "hexpat")
if "bookmarks" in jsonData:
with open(f"./{projectName}.hexbm", mode="w", encoding="utf-8") as output:
jsonOutput = {}
jsonOutput["bookmarks"] = jsonData["bookmarks"]
output.write(json.dumps(jsonOutput, indent=4))
if "filePath" in jsonData:
print(f"Project file used file {jsonData['filePath']}")
if __name__ == "__main__":
main()

View File

@@ -4,8 +4,20 @@ project(tests)
set(CMAKE_CXX_STANDARD 20)
add_subdirectory(lib/pl)
include(FetchContent)
FetchContent_Declare(
pattern_language
GIT_REPOSITORY https://github.com/WerWolv/PatternLanguage
GIT_TAG master
)
FetchContent_MakeAvailable(pattern_language)
enable_testing()
add_subdirectory(patterns)
add_subdirectory(patterns)
add_subdirectory(includes)
add_subdirectory(magic)
add_custom_target(test_all DEPENDS patterns_tests includes_test magic_test)

View File

@@ -0,0 +1,29 @@
cmake_minimum_required(VERSION 3.16)
project(includes_test)
set(TOP_LEVEL "${CMAKE_CURRENT_SOURCE_DIR}/../..")
file(GLOB INCLUDES
"${TOP_LEVEL}/includes/*/*.pat"
)
set(PATTERN_INCLUDES "${TOP_LEVEL}/includes")
add_executable(includes_test
source/main.cpp
)
target_include_directories(includes_test PRIVATE include)
target_link_libraries(includes_test libpl)
set_target_properties(includes_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
foreach (include IN LISTS INCLUDES)
file(RELATIVE_PATH INCLUDE_NAME ${PATTERN_INCLUDES} ${include})
set(TEST_NAME "Includes/${INCLUDE_NAME}")
add_test(NAME ${TEST_NAME} COMMAND includes_test "${INCLUDE_NAME}" "${include}" "${PATTERN_INCLUDES}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77)
endforeach ()

View File

@@ -0,0 +1,76 @@
#include <pl.hpp>
#include <pl/helpers/file.hpp>
#include <pl/core/errors/preprocessor_errors.hpp>
#include <pl/core/errors/evaluator_errors.hpp>
#include <fmt/format.h>
#include <cstdlib>
#define EXIT_SKIP 77
int main(int argc, char **argv) {
// Any number of arguments other than 4 are invalid
if (argc != 4)
return EXIT_FAILURE;
// Extract command line arguments
const std::string includeName = argv[1];
const std::fs::path includeFilePath = argv[2];
const std::fs::path includePath = argv[3];
fmt::print("Running test {} on test file {}\n", includeName, includeFilePath.filename().string());
// Open pattern file
pl::hlp::fs::File patternFile(includeFilePath, pl::hlp::fs::File::Mode::Read);
if (!patternFile.isValid())
return EXIT_FAILURE;
// Setup Pattern Language Runtime
pl::PatternLanguage runtime;
{
constexpr auto DummyPragmaHandler = [](const auto&, const auto&){
pl::core::err::M0006.throwError("Include files should never use this pragma!");
return false;
};
runtime.setDataSource([&](pl::u64 address, pl::u8 *data, size_t size) {
pl::core::err::E0011.throwError("Include files should never read from memory directly!");
}, 0x00, 0x100000);
runtime.setDangerousFunctionCallHandler([]{ return true; });
runtime.setIncludePaths({ includePath });
runtime.addPragma("endian", DummyPragmaHandler);
runtime.addPragma("MIME", DummyPragmaHandler);
runtime.addPragma("base_address", DummyPragmaHandler);
runtime.addPragma("eval_depth", DummyPragmaHandler);
runtime.addPragma("array_limit", DummyPragmaHandler);
runtime.addPragma("pattern_limit", DummyPragmaHandler);
runtime.addDefine("__PL_UNIT_TESTS__");
}
// Execute pattern
if (!runtime.executeString(patternFile.readString())) {
fmt::print("Error during execution!\n");
if (const auto &hardError = runtime.getError(); hardError.has_value())
fmt::print("Hard error: {}:{} - {}\n\n", hardError->line, hardError->column, hardError->message);
for (const auto &[level, message] : runtime.getConsoleLog()) {
switch (level) {
using enum pl::core::LogConsole::Level;
case Debug: fmt::print(" [DEBUG] "); break;
case Info: fmt::print(" [INFO] "); break;
case Warning: fmt::print(" [WARN] "); break;
case Error: fmt::print(" [ERROR] "); break;
}
fmt::print("{}\n", message);
}
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

Submodule tests/lib/pl deleted from d399836b69

View File

@@ -0,0 +1,31 @@
cmake_minimum_required(VERSION 3.16)
project(magic_test)
set(TOP_LEVEL "${CMAKE_CURRENT_SOURCE_DIR}/../..")
set(MAGIC_FOLDER "${TOP_LEVEL}/magic")
file(GLOB MAGIC_FILES
"${MAGIC_FOLDER}/*"
)
add_executable(magic_test
source/main.cpp
)
find_package(PkgConfig REQUIRED)
pkg_search_module(MAGIC libmagic>=5.39)
target_include_directories(magic_test PRIVATE include)
target_link_libraries(magic_test libpl magic)
set_target_properties(magic_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
foreach (magic_file IN LISTS MAGIC_FILES)
file(RELATIVE_PATH MAGIC_NAME ${MAGIC_FOLDER} ${magic_file})
set(TEST_NAME "Magic/${MAGIC_NAME}")
add_test(NAME ${TEST_NAME} COMMAND magic_test "${MAGIC_NAME}" "${magic_file}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
set_tests_properties(${TEST_NAME} PROPERTIES SKIP_RETURN_CODE 77)
endforeach ()

View File

@@ -0,0 +1,34 @@
#include <pl/helpers/file.hpp>
#include <pl/helpers/guards.hpp>
#include <fmt/format.h>
#include <cstdlib>
#include <magic.h>
#define EXIT_SKIP 77
int main(int argc, char **argv) {
// Any number of arguments other than 3 are invalid
if (argc != 3)
return EXIT_FAILURE;
// Extract command line arguments
const std::string magicName = argv[1];
const std::fs::path magicFilePath = argv[2];
fmt::print("Running test {} on test file {}\n", magicName, magicFilePath.filename().string());
magic_t ctx = magic_open(MAGIC_NONE);
PL_ON_SCOPE_EXIT { magic_close(ctx); };
if (ctx == nullptr)
return EXIT_FAILURE;
if (magic_compile(ctx, magicFilePath.string().c_str()) != 0) {
fmt::print("Error during compilation: {}\n", magic_error(ctx));
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

View File

@@ -8,7 +8,7 @@ file(GLOB PATTERNS
"${TOP_LEVEL}/patterns/*.hexpat"
)
set(PATTERN_INCLUDES "${TOP_LEVEL}/includes/std")
set(PATTERN_INCLUDES "${TOP_LEVEL}/includes")
add_executable(patterns_tests
source/main.cpp
@@ -24,7 +24,6 @@ foreach (pattern IN LISTS PATTERNS)
file(GLOB TEST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/test_data/${PATTERN_NAME}.*")
message(STATUS ${CMAKE_CURRENT_SOURCE_DIR}/test_data/${PATTERN_NAME}.*)
if (TEST_FILES)
list(GET TEST_FILES 0 TEST_FILE)
else ()

View File

@@ -1,5 +1,5 @@
#include <pl.hpp>
#include <helpers/file.hpp>
#include <pl/helpers/file.hpp>
#include <fmt/format.h>
#include <cstdlib>
@@ -27,12 +27,12 @@ int main(int argc, char **argv) {
fmt::print("Running test {} on test file {}\n", patternName, testFilePath.stem().string());
// Open pattern file
pl::fs::File patternFile(patternFilePath, pl::fs::File::Mode::Read);
pl::hlp::fs::File patternFile(patternFilePath, pl::hlp::fs::File::Mode::Read);
if (!patternFile.isValid())
return EXIT_FAILURE;
// Open test file
pl::fs::File testFile(testFilePath, pl::fs::File::Mode::Read);
pl::hlp::fs::File testFile(testFilePath, pl::hlp::fs::File::Mode::Read);
if (!testFile.isValid())
return EXIT_FAILURE;
@@ -48,6 +48,7 @@ int main(int argc, char **argv) {
runtime.setDangerousFunctionCallHandler([]{ return true; });
runtime.setIncludePaths({ includePath });
runtime.addPragma("MIME", DummyPragmaHandler);
runtime.addDefine("__PL_UNIT_TESTS__");
}
// Execute pattern
@@ -55,14 +56,15 @@ int main(int argc, char **argv) {
fmt::print("Error during execution!\n");
if (const auto &hardError = runtime.getError(); hardError.has_value())
fmt::print("Hard error: {}\n\n", hardError.value().what());
fmt::print("Hard error: {}:{} - {}\n\n", hardError->line, hardError->column, hardError->message);
for (const auto &[level, message] : runtime.getConsoleLog()) {
switch (level) {
case pl::LogConsole::Level::Debug: fmt::print(" [DEBUG] "); break;
case pl::LogConsole::Level::Info: fmt::print(" [INFO] "); break;
case pl::LogConsole::Level::Warning: fmt::print(" [WARN] "); break;
case pl::LogConsole::Level::Error: fmt::print(" [ERROR] "); break;
using enum pl::core::LogConsole::Level;
case Debug: fmt::print(" [DEBUG] "); break;
case Info: fmt::print(" [INFO] "); break;
case Warning: fmt::print(" [WARN] "); break;
case Error: fmt::print(" [ERROR] "); break;
}
fmt::print("{}\n", message);

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More