#binary #command-line-tool #simple

app hexo

Tiny binary writer utility, just enough for you

17 releases (6 breaking)

new 0.7.5 Jun 12, 2024
0.7.4 Jun 6, 2024
0.6.2 Apr 18, 2024
0.5.0 Apr 12, 2024
0.1.4 Apr 10, 2024

#176 in Command line utilities

Download history 436/week @ 2024-04-05 468/week @ 2024-04-12 91/week @ 2024-04-19 4/week @ 2024-05-17 1/week @ 2024-05-24 355/week @ 2024-05-31 210/week @ 2024-06-07

570 downloads per month

Apache-2.0

57KB
1.5K SLoC

Hexo | 10110

Crates.io Total Downloads Crates.io Total Downloads GitHub top language

Crates.io License GitHub commit activity

Tiny binary writer utility, just enough for you

Installation

cargo install hexo

CLI

build

Takes source file in hexo format and compiles it to binary file output

hexo build --source <path to source> --output <path to output>

watch

Takes source file in hexo format and compiles it to binary file output. Will recompile on source file change

hexo watch --source <path to source> --output <path to output>

Syntax

Emitter

To emit a byte use glyph '>' fallowed by byte value:

> 0a // by default numbers are interpreted as hexadecimal, will emit decimal 10
> 'HelloWorld' // will emit utf-8 bytes of 'HelloWorld' string
> 10x22 // you can specifiy arbitrary radix in range 2..36, will emit decimal 22

Constants

To declare a constant use glyph '$' fallowed by constant name and value:

$ class_name 'HelloWorld'

Then you can use it as if you used hex or binary string by prefixing it with '$':

> $class_name

Declaring Functions

You can declare arbitrary functions using glyph '#' fallowed by function name and body:

# class_declaration {
  > 0100
  > #len($0)
  > $0
}

Function arguments are referenced by their index: $0, $1, $2, ...

Calling Functions

To call a function use glyph '#' fallowed by function name and arguments:

// String functions
> #len('HelloWorld') // will emit length of 'HelloWorld' in bytes (0a)

// OS functions
> #cmd(`ls`) // will emit result of command line 'ls' command
> #read_file('file.txt') // will emit content of 'file.txt'

// Padding functions
> #pad_left(AA, 4) // will emit '00 00 00 AA'
> #pad_right(AA, 4) // will emit 'AA 00 00 00'
> #pad('AA', left: 10x4, right: 10x8) // wil pad left by 4 bytes and right by 8 bytes

Example

Let's write 'HelloWorld' Java class bytecode:

$ class_name 'HelloWorld'
$ object_superclass_name 'java/lang/Object'

# class_declaration {
  > 0100
  > #len($0)
  > $0
}

> cafe babe // Magic number

> 0000 0034 // Java Bytecode version
> 0005 // Constant pool size
> 0700 02 // Class at index 2

> #class_declaration($class_name)
> 0700 04 // Class at index 4
> #class_declaration($object_superclass_name)

> 0021 // Supper public
> 0001 0003 // Class pointers
> 0000 0000 0000 0000 // No interfaces, fields, methods, attributes

Q/A

Does Hexo support small endian?

No, Hexo only supports big endian currently. But we are currently investigating ability to support both big and small endian.

Can I use Hexo as a library?

Not currently, but this is planned for future releases.

Isn't cmd function highly unsafe?

Yes, safety is no goal of Hexo, please don't run untrusted code with it. Safe mode might be implemented in the future is there is enough demand for it.

Dependencies

~4–13MB
~139K SLoC