#[non_exhaustive]pub enum OffsetSpec {
Absolute(i64),
Indirect {
base_offset: i64,
base_relative: bool,
pointer_type: TypeKind,
adjustment: i64,
adjustment_op: IndirectAdjustmentOp,
result_relative: bool,
endian: Endianness,
},
Relative(i64),
FromEnd(i64),
}Expand description
Offset specification for locating data in files
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Absolute(i64)
Absolute offset from file start (or from file end if negative)
Positive values are offsets from the start of the file.
Negative values are offsets from the end of the file (same as FromEnd).
§Examples
use libmagic_rs::parser::ast::OffsetSpec;
let offset = OffsetSpec::Absolute(0x10); // Read at byte 16 from start
let from_end = OffsetSpec::Absolute(-4); // 4 bytes before end of fileIndirect
Indirect offset through pointer dereferencing
Reads a pointer value at base_offset, interprets it according to pointer_type
and endian, then combines adjustment with the pointer value using
adjustment_op to get the final offset. The default adjustment_op
is IndirectAdjustmentOp::Add, so (base.type) and
(base.type+N) / (base.type-N) use addition (subtraction is
encoded as Add with a negative adjustment). magic(5) also
supports multiplicative and bitwise forms inside the parens, e.g.
(0x200.s*2) (IndirectAdjustmentOp::Mul).
§Examples
use libmagic_rs::parser::ast::{OffsetSpec, TypeKind, Endianness, IndirectAdjustmentOp};
let indirect = OffsetSpec::Indirect {
base_offset: 0x20,
base_relative: false,
pointer_type: TypeKind::Long { endian: Endianness::Little, signed: false },
adjustment: 4,
adjustment_op: IndirectAdjustmentOp::Add,
result_relative: false,
endian: Endianness::Little,
};Fields
base_offset: i64Base offset to read pointer from. When base_relative is
true, this value is added to the current anchor (last-match
position) rather than being treated as an absolute file
position.
base_relative: boolIf true, base_offset is relative to the current anchor
(i.e., (&N.X) syntax in magic files). Defaults to false
for backwards compatibility with existing AST snapshots; the
serde default attribute lets older serialized AST round-trip.
adjustment: i64Operand combined with the pointer value via adjustment_op.
For IndirectAdjustmentOp::Add, the operand is signed (negative
values encode subtraction). For multiplicative and bitwise ops
the operand is interpreted as i64 but typically magic files
supply non-negative literals.
adjustment_op: IndirectAdjustmentOpArithmetic operation applied to the pointer value with
adjustment as the operand. Defaults to
IndirectAdjustmentOp::Add for legacy AST consumers via
serde’s default attribute.
result_relative: boolIf true, the resolved offset is added to the current anchor
instead of being treated as an absolute file position. This
corresponds to magic-file &(...) syntax wrapping an indirect
spec, e.g., &(0x10.l).
endian: EndiannessEndianness for pointer reading
Relative(i64)
Relative offset from previous match position
§Examples
use libmagic_rs::parser::ast::OffsetSpec;
let relative = OffsetSpec::Relative(8); // 8 bytes after previous matchFromEnd(i64)
Offset from end of file (negative values move towards start)
§Examples
use libmagic_rs::parser::ast::OffsetSpec;
let from_end = OffsetSpec::FromEnd(-16); // 16 bytes before end of fileTrait Implementations§
Source§impl Clone for OffsetSpec
impl Clone for OffsetSpec
Source§fn clone(&self) -> OffsetSpec
fn clone(&self) -> OffsetSpec
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more