Hexa bindings: first commit.
This commit is contained in:
commit
c829cfcd59
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/docs/
|
||||||
|
/lib/
|
||||||
|
/bin/
|
||||||
|
/.shards/
|
||||||
|
/examples/example
|
||||||
|
*.dwarf
|
||||||
|
|
||||||
|
# Libraries don't need dependency lock
|
||||||
|
# Dependencies will be locked in applications that use them
|
||||||
|
/shard.lock
|
37
README.md
Normal file
37
README.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# hexa
|
||||||
|
|
||||||
|
Bindings to `libhexa` to produce hexadecimal dumps of arbitrary input bytes.
|
||||||
|
This prints debug info in a pretty way.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Add the dependency to your `shard.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
dependencies:
|
||||||
|
hexa:
|
||||||
|
branch: master
|
||||||
|
git: https://git.baguette.netlib.re/Baguette/hexa.cr.git
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Run `shards install`
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```crystal
|
||||||
|
require "hexa"
|
||||||
|
|
||||||
|
h = Hexa.new 5_000 # Size of the output buffer.
|
||||||
|
|
||||||
|
# First, an hexadecimal dump of a small text.
|
||||||
|
text = "hello this is some text" # could be Bytes
|
||||||
|
puts h.dump text
|
||||||
|
|
||||||
|
# With a centered title on the first line.
|
||||||
|
title = "itz mai title lul"
|
||||||
|
puts h.dump title, text
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
- [Philippe PITTOLI](https://github.com/your-github-user) - creator and maintainer
|
12
examples/example.cr
Normal file
12
examples/example.cr
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
require "../src/hexa.cr"
|
||||||
|
|
||||||
|
h = Hexa.new 2_000
|
||||||
|
|
||||||
|
text = "hello this is some text I want to show"
|
||||||
|
puts h.dump text
|
||||||
|
|
||||||
|
puts ""
|
||||||
|
puts "with a title:"
|
||||||
|
|
||||||
|
title = "some text"
|
||||||
|
puts h.dump title, text
|
13
examples/makefile
Normal file
13
examples/makefile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
all: build
|
||||||
|
|
||||||
|
include makefile.local
|
||||||
|
|
||||||
|
SOURCE_FILES = ../src/bindings.cr ../src/hexa.cr ../src/high-level-bindings.cr
|
||||||
|
|
||||||
|
example: $(SOURCE_FILES) example.cr
|
||||||
|
crystal build --progress $(LD_FLAGS) example.cr
|
||||||
|
|
||||||
|
build: example
|
||||||
|
|
||||||
|
run: build
|
||||||
|
$(LIB_PATH) ./example
|
9
examples/makefile.local
Normal file
9
examples/makefile.local
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
ifdef DEV
|
||||||
|
# Use ABSOLUTE paths for linker parameters (-L path) to avoid errors.
|
||||||
|
LIB_HEXA_REPOS ?= /tmp/prog/libhexa/zig-out/lib
|
||||||
|
LIB_PATH = LD_LIBRARY_PATH=$(LIB_HEXA_REPOS)
|
||||||
|
endif
|
||||||
|
ifdef LIB_HEXA_REPOS
|
||||||
|
# This is an example on how to use link flags with Crystal.
|
||||||
|
LD_FLAGS ?= --link-flags "-L$(LIB_HEXA_REPOS)"
|
||||||
|
endif
|
11
makefile
Normal file
11
makefile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
SOURCE_FILES = src/bindings.cr src/hexa.cr src/high-level-bindings.cr
|
||||||
|
|
||||||
|
doc:
|
||||||
|
crystal docs $(SOURCE_FILES)
|
||||||
|
|
||||||
|
HTTPD_ACCESS_LOGS ?= /tmp/access-hexa.cr-docs.log
|
||||||
|
HTTPD_ADDR ?= 127.0.0.1
|
||||||
|
HTTPD_PORT ?= 9002
|
||||||
|
DIR ?= docs
|
||||||
|
serve-doc:
|
||||||
|
darkhttpd $(DIR) --addr $(HTTPD_ADDR) --port $(HTTPD_PORT) --log $(HTTPD_ACCESS_LOGS)
|
15
shard.yml
Normal file
15
shard.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
name: hexa
|
||||||
|
version: 0.1.0
|
||||||
|
|
||||||
|
authors:
|
||||||
|
- Philippe PITTOLI <karchnu@karchnu.fr>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
High-level Crystal bindings to libhexa.
|
||||||
|
|
||||||
|
crystal: '>= 1.12.2'
|
||||||
|
|
||||||
|
libraries:
|
||||||
|
libhexa: ">= 0.1.0"
|
||||||
|
|
||||||
|
license: ISC
|
5
src/bindings.cr
Normal file
5
src/bindings.cr
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
@[Link("hexa")]
|
||||||
|
lib LibHexa
|
||||||
|
# title & title_len, input & input len, buffer & pointer on buffer len -> int
|
||||||
|
fun dump = hexdump(LibC::Char*, UInt32, LibC::Char*, UInt32, LibC::Char*, UInt32*) : LibC::Int
|
||||||
|
end
|
2
src/hexa.cr
Normal file
2
src/hexa.cr
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
require "./bindings.cr"
|
||||||
|
require "./high-level-bindings.cr"
|
57
src/high-level-bindings.cr
Normal file
57
src/high-level-bindings.cr
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# The `Hexa` class is a high-level binding to `libhexa`, producing hexadecimal dumps of arbitrary input bytes.
|
||||||
|
# Used to print debug info in a pretty way.
|
||||||
|
#
|
||||||
|
# This library can be used with either raw Bytes or strings for the input buffer.
|
||||||
|
# A title can be given to the dump.
|
||||||
|
#
|
||||||
|
# ```
|
||||||
|
# require "hexa"
|
||||||
|
#
|
||||||
|
# h = Hexa.new 2_000 # Size of the output buffer.
|
||||||
|
#
|
||||||
|
# text = "hello this is some text I want to show"
|
||||||
|
# puts h.dump text
|
||||||
|
#
|
||||||
|
# puts ""
|
||||||
|
# puts "same thing with a title:"
|
||||||
|
#
|
||||||
|
# title = "some text"
|
||||||
|
# puts h.dump title, text
|
||||||
|
# ```
|
||||||
|
class Hexa
|
||||||
|
property buffer_size : UInt32 = 200_000
|
||||||
|
def initialize(buffer_size : UInt32?)
|
||||||
|
@buffer_size = buffer_size if buffer_size
|
||||||
|
@output_buffer = Array(UInt8).new @buffer_size
|
||||||
|
end
|
||||||
|
|
||||||
|
# Hexdump with a title and an input string.
|
||||||
|
def dump(title : String, buffer : String) : String
|
||||||
|
dump title, buffer.to_slice
|
||||||
|
end
|
||||||
|
|
||||||
|
# Hexdump with a title and raw bytes as input.
|
||||||
|
def dump(title : String, buffer : Bytes) : String
|
||||||
|
buflen : UInt32 = @buffer_size
|
||||||
|
ret = LibHexa.dump title, title.size, buffer.to_unsafe, buffer.size, @output_buffer.to_unsafe, pointerof(buflen)
|
||||||
|
if ret != 0
|
||||||
|
raise "oh noes, 'dump' iz brkn"
|
||||||
|
end
|
||||||
|
String.new @output_buffer.to_unsafe.to_slice(buflen)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Hexdump a string (no title).
|
||||||
|
def dump(buffer : String) : String
|
||||||
|
dump buffer.to_slice
|
||||||
|
end
|
||||||
|
|
||||||
|
# Hexdump raw bytes (no title).
|
||||||
|
def dump(buffer : Bytes) : String
|
||||||
|
buflen : UInt32 = @buffer_size
|
||||||
|
ret = LibHexa.dump "", 0, buffer.to_unsafe, buffer.size, @output_buffer.to_unsafe, pointerof(buflen)
|
||||||
|
if ret != 0
|
||||||
|
raise "oh noes, 'dump' iz brkn"
|
||||||
|
end
|
||||||
|
String.new @output_buffer.to_unsafe.to_slice(buflen)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user