Skip to main content

OffsetSpec

Enum OffsetSpec 

Source
#[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
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

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 file
§

Indirect

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: i64

Base 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: bool

If 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.

§pointer_type: TypeKind

Type of pointer value

§adjustment: i64

Operand 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: IndirectAdjustmentOp

Arithmetic 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: bool

If 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: Endianness

Endianness 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 match
§

FromEnd(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 file

Trait Implementations§

Source§

impl Clone for OffsetSpec

Source§

fn clone(&self) -> OffsetSpec

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for OffsetSpec

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for OffsetSpec

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for OffsetSpec

Source§

fn eq(&self, other: &OffsetSpec) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for OffsetSpec

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for OffsetSpec

Source§

impl StructuralPartialEq for OffsetSpec

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,