mirror of https://github.com/WerWolv/ImHex.git
Added using, pointers and mathematical expressions
parent
7d5b1be975
commit
307b13b38c
|
@ -4,6 +4,15 @@ The Pattern Language is ImHex custom built programming language used to create b
|
|||
This document is meant as an overview of all the features the Pattern Language has.
|
||||
|
||||
## Table of Contents
|
||||
- [Built-in Types](#built-in-types)
|
||||
- [Variable Placements](#variable-placements)
|
||||
- [Arrays](#arrays)
|
||||
- [Structs](#structs)
|
||||
- [Unions](#unions)
|
||||
- [Pointers](#pointers)
|
||||
- [Enums](#enums)
|
||||
- [Bitfields](#bitfields)
|
||||
- [Mathematical Expressions](#mathematical-expressions)
|
||||
|
||||
## Built-in Types
|
||||
|
||||
|
@ -93,6 +102,28 @@ Color color @ 0x100;
|
|||
|
||||
![Union](https://puu.sh/H4LY2/0d40d2ac34.png)
|
||||
|
||||
## Pointers
|
||||
|
||||
A pointer is a member that points to another place in memory. It uses the value at its address as an offset from the start of the current data to find the location of the value that it points to.
|
||||
To define a pointer, first the type of the value being pointed to is specified followed by a `*` star and the name of the variable. After the `:` colon, the size of the pointer is required. This needs to be an integral, built-in type which specifies what data gets interpreted as an offset.
|
||||
|
||||
```
|
||||
<typeName> *<pointerName> : <builtinTypeName>;
|
||||
|
||||
//Example
|
||||
struct Child {
|
||||
u32 value;
|
||||
};
|
||||
|
||||
struct Parent {
|
||||
Child *child : u16;
|
||||
};
|
||||
|
||||
Parent parent @ 0x200;
|
||||
```
|
||||
|
||||
![Pointer](https://puu.sh/H4Nau/cc4b8bb2a3.png)
|
||||
|
||||
## Enums
|
||||
|
||||
Enums are types whose value is restricted to a distinct number of values. When placed in memory, the Pattern Data View will show the relevant enum entry name instead of the numerical value.
|
||||
|
@ -142,4 +173,70 @@ bitfield Permission {
|
|||
Permission perm @ 0x20;
|
||||
```
|
||||
|
||||
![Bitfields](https://puu.sh/H4MC9/24980dcaae.png)
|
||||
![Bitfields](https://puu.sh/H4MC9/24980dcaae.png)
|
||||
|
||||
## Type Aliasing
|
||||
|
||||
To give an existing type a new name, a `using` declaration can be used. This will not replace the old name of the type with a new one, it will create a new type with a new name that is the same as the old type. Therefore both can be used afterwards.
|
||||
|
||||
```cpp
|
||||
using <newTypeName> = <oldTypeName>;
|
||||
|
||||
// Example
|
||||
using uint32_t = u32;
|
||||
using Header = ElfHeader;
|
||||
```
|
||||
|
||||
## Mathematical Expressions
|
||||
|
||||
In any place where a numeric value is required, a mathematical expression can be inserted. This can be as easy as `1 + 1` but can get much more complex as well by accessing values within structs or enum constants. These expressions work the same as in basically every other language as well with the following operators being supported:
|
||||
|
||||
- `a + b` : Addition
|
||||
- `a - b` : Subtraction
|
||||
- `a * b` : Multiplication
|
||||
- `a / b` : Division
|
||||
- `a >> b` : Bit shift left
|
||||
- `a << b` : Bit shift right
|
||||
- `a & b` : Bitwise AND
|
||||
- `a | b` : Bitwise OR
|
||||
- `a ^ b` : Bitwise XOR
|
||||
- `a == b` : Equality comparison
|
||||
- `a != b` : Inequality comparison
|
||||
- `a > b` : Greater-than comparison
|
||||
- `a >= b` : Greater-than-or-equals comparison
|
||||
- `a < b` : Less-than comparison
|
||||
- `a <= b` : Less-than-or-equals comparison
|
||||
- `a && b` : Boolean AND
|
||||
- `a || b` : Boolean OR
|
||||
- `a ^^ b` : Boolean XOR
|
||||
- `a ? b : c` : Ternary comparison
|
||||
|
||||
Additionally, variable names and the dot `.` operator may be used access the value of variables in these expressions.
|
||||
```cpp
|
||||
struct SubHeader {
|
||||
u16 numEntries;
|
||||
};
|
||||
|
||||
struct Entry {
|
||||
// ...
|
||||
};
|
||||
|
||||
struct Header {
|
||||
u32 magic;
|
||||
SubHeader subHeader;
|
||||
Entry entries[subHeader.numEntries + 5];
|
||||
};
|
||||
```
|
||||
|
||||
To use constants in an expression, the `::` scope resolution operator can be used.
|
||||
```cpp
|
||||
enum Offsets {
|
||||
Header = 0x00,
|
||||
SectionList = 0x1000,
|
||||
StringList = 0x5000
|
||||
};
|
||||
|
||||
Section sections[10] @ Offsets::SectionList;
|
||||
```
|
||||
|
||||
As seen above, this may be used to create arrays whose size depends on the value of other members and similar things.
|
Loading…
Reference in New Issue