bindef syntax

As mentioned in the README, bindef has two primary expressions: commands and pragmas.

This page documents the default commands and all pragmas.

Commands

bindef has commands for emitting integers, floating-point numbers, and strings.

All commands take a value. That value can be literal or a Ruby expression.

Integers

The integer commands map directly to their stdint.h types: a u8 is a uint8_t, an i64 is an int64_t, and so on.

# Emits a uint8_t with the value 127.
u8 127

# Emits a int32_t with the value 0.
i32 0

# Produces a warning (negative value used with unsigned command), but still works.
u16 -100

# Produces an error (value too large for command).
i16 (2**32) - 1

Floating-point numbers

There are two floating-point commands: f32 for single-precision, and f64 for double-precision.

# Transparent promotion of an integer to a float.
f32 0

# Ruby floating-point constants work..
f64 Math::PI
f64 Float::INFINITY

Strings

There is only one string command: str. str does not add a terminating NUL, a newline, or anything else to the specified string.

str "hello world!"

# Add a terminating NUL.
str "look ma, a C-string!\x00"

# Ruby's string interpolation works.
foo = "bar baz quux"
str "#{foo}!\n"

Pragmas

Pragmas tell bindef how to emit commands. They tell commands what endianness they should use, what encoding strings are in, and how loud to be about warnings and informational messages.

Pragmas are global settings, meaning that setting one will cause it to remain set until explicitly changed to another value. This can be tedious to keep track of (and makes it easy to introduce transposition bugs), so the pragma expression provides a block form:

# Changes the verbosity setting to true, but only for the duration of the block.
pragma verbose: true do
  str "foo"
end

verbose

Default: false.

Tells bindef how verbose to be. Verbose messages are prefixed with V: and are logged to stderr.

warnings

Default: true.

Tells bindef whether or not to emit warnings, which are nonfatal (unlike errors). Warning messages are prefixed with W: and are logged to stderr.

# Or use the block form above.
pragma warnings: false
u8 -127
pragma warnings: true

endian

Default: :little.

Tells bindef which endianness to use when emitting integers and floats.

pragma endian: :big
u16 0x00FF
u16 0xFF00

encoding

Default: "utf-8"

Tells bindef how to encode the strings it emits via str.

pragma encoding: "ascii"
str "this is a plain old ASCII string"

pragma encoding: "utf-8"
str "this👏is👏a👏utf-8👏string"

pragma encoding: "utf-32"
str "this is a waste of space"

encoding expects a lowercase string, and can take any of the encodings supported by Ruby.