mirror of
https://github.com/sharkdp/hexyl.git
synced 2026-10-30 09:05:54 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
abc20a380c | ||
|
|
dd89c22327 | ||
|
|
45a557e0df | ||
|
|
73cfd05a10 | ||
|
|
37e9ef6a64 | ||
|
|
568f38ae77 | ||
|
|
6e0bff2cc5 | ||
|
|
1783fe6a9b | ||
|
|
733b9e12e4 | ||
|
|
19198c2aac | ||
|
|
c65b298e60 | ||
|
|
f986c196d2 | ||
|
|
dbed12e423 | ||
|
|
1927610953 | ||
|
|
f8531b3e44 | ||
|
|
427a5524e1 | ||
|
|
120cf29adf | ||
|
|
d2cc025c6f | ||
|
|
f8b87cc5e2 | ||
|
|
252a6dbef4 | ||
|
|
16cc5d9757 | ||
|
|
d51086e0da | ||
|
|
d8a26da964 | ||
|
|
dcce9e1011 | ||
|
|
651087ca9d | ||
|
|
3bd84fd5cb | ||
|
|
0634a06470 | ||
|
|
7a9234c182 | ||
|
|
45fa72ec3b | ||
|
|
711627bfe8 | ||
|
|
ba89e88dfd | ||
|
|
1792090799 | ||
|
|
33d5b4dbda | ||
|
|
921327f2ae | ||
|
|
4bf875095c | ||
|
|
a78c00b10d | ||
|
|
2bab0c769e | ||
|
|
1310b1d19e | ||
|
|
a56b3b0c46 | ||
|
|
7ca00279ed | ||
|
|
dfb5d57ee7 | ||
|
|
a0a7d6761f | ||
|
|
7ef8e5aae4 | ||
|
|
8d5b355b76 | ||
|
|
19f325a691 | ||
|
|
10ddbbad7d | ||
|
|
58c8c06317 | ||
|
|
78477a90c9 | ||
|
|
9362c2313a | ||
|
|
e363f2fdc4 | ||
|
|
29e3350e69 | ||
|
|
0c192e979b | ||
|
|
c4f91959ef | ||
|
|
4e66357618 | ||
|
|
6a230d34a4 | ||
|
|
663e4c19ff | ||
|
|
894ca71b40 | ||
|
|
e85953eeb5 | ||
|
|
f5ce9946f6 | ||
|
|
668054fe50 | ||
|
|
d6cb7af643 | ||
|
|
7b59a3f374 | ||
|
|
3c69797f23 | ||
|
|
7e9bc5138d | ||
|
|
ce70246f80 | ||
|
|
a306c82024 | ||
|
|
e1e53335d3 | ||
|
|
c9f113c8c4 | ||
|
|
59557bd433 | ||
|
|
39a94379c6 | ||
|
|
5981fc8725 | ||
|
|
f4515b0f14 | ||
|
|
e3d406dd95 | ||
|
|
b6b7e2c79a | ||
|
|
dfad7b3faf | ||
|
|
ef9b530d6a | ||
|
|
a3268b8791 | ||
|
|
2a534483c8 | ||
|
|
e6ba196bcb | ||
|
|
d0bd971382 | ||
|
|
8eed3cadbb | ||
|
|
38a9662ea5 | ||
|
|
e10136d203 | ||
|
|
5f0373184f | ||
|
|
57d18482ba | ||
|
|
816779e968 | ||
|
|
9be018fbb9 | ||
|
|
cba717b783 | ||
|
|
580f865c4a | ||
|
|
20450310c9 | ||
|
|
b251575d94 | ||
|
|
58b038af27 | ||
|
|
d703cdfd78 | ||
|
|
43f8b92502 | ||
|
|
a966896d3f | ||
|
|
08b903270f | ||
|
|
dd601e4792 | ||
|
|
564cf64b1b | ||
|
|
c24280620a | ||
|
|
bfa2726e05 | ||
|
|
d6af232691 | ||
|
|
cc6987e270 | ||
|
|
ee56a3396d | ||
|
|
4833c2afe4 | ||
|
|
dfd7bdef49 | ||
|
|
fd4aee2b85 | ||
|
|
cf8e7ec079 | ||
|
|
faa9866d11 | ||
|
|
1df35eeb63 | ||
|
|
437a15f3d6 | ||
|
|
70fa092df1 | ||
|
|
b2f0e75ed2 | ||
|
|
4fc0c1f1b0 | ||
|
|
4ce6e9d799 | ||
|
|
5bd76fd11b | ||
|
|
c7e2235293 | ||
|
|
421bd73ec1 | ||
|
|
e888021a48 | ||
|
|
7d38f70918 | ||
|
|
c6af2edda8 | ||
|
|
a7fadfaaf2 | ||
|
|
8577a17b14 | ||
|
|
2d8b600c48 | ||
|
|
f8601e5bc9 | ||
|
|
9770b89cf4 | ||
|
|
571312dd6e | ||
|
|
fcd09fffac | ||
|
|
188e753675 | ||
|
|
030235afb7 | ||
|
|
7847e8cd33 | ||
|
|
32f4ce9987 | ||
|
|
2a4b17a162 | ||
|
|
5e3c49f933 | ||
|
|
fc794b290c | ||
|
|
e6000a56f4 | ||
|
|
2861cd51ac | ||
|
|
a8cffbb6df | ||
|
|
7bb6343d2a | ||
|
|
7de17c4f35 | ||
|
|
ec61c2a789 | ||
|
|
7f7b88a914 | ||
|
|
85fa75ba67 | ||
|
|
d5d645fc48 | ||
|
|
8d3aa65134 | ||
|
|
252b4e84c3 | ||
|
|
3dc118d0ad | ||
|
|
b1ff8b6ce4 | ||
|
|
fe65792b96 | ||
|
|
31c0bcfeae | ||
|
|
c0f94ad6aa | ||
|
|
55fed5e3c0 | ||
|
|
aeee0a1033 | ||
|
|
179c8f40a2 | ||
|
|
fb2500d7d6 | ||
|
|
ad9ecda952 | ||
|
|
c43effefd6 | ||
|
|
0b6454ed9d | ||
|
|
557ae66ed5 | ||
|
|
df1afdc73f | ||
|
|
9106b899b2 | ||
|
|
df1c36e5a7 | ||
|
|
ac610f7bad | ||
|
|
767740865f | ||
|
|
1fb324f411 | ||
|
|
3d0bc3d0eb | ||
|
|
8a52261a50 | ||
|
|
ccc4fb9ba9 | ||
|
|
0baa22f152 | ||
|
|
165ced9307 | ||
|
|
3888a20dfe | ||
|
|
75b37fa125 | ||
|
|
794e1935e3 | ||
|
|
c49aa079b4 | ||
|
|
675ef6d4a8 | ||
|
|
eade38c94a | ||
|
|
98ceec18cd | ||
|
|
a49f295acc | ||
|
|
0caab15255 | ||
|
|
828fb210ce | ||
|
|
1e43783616 | ||
|
|
6b7cfefec6 | ||
|
|
5f82942f98 | ||
|
|
f6a1c4e8e3 | ||
|
|
b4fb1b079c | ||
|
|
f9f59d653d | ||
|
|
c82695f0a9 | ||
|
|
9d938b11ed | ||
|
|
d5982c0eb0 | ||
|
|
1502419ad4 | ||
|
|
f5be845d70 | ||
|
|
664025477b | ||
|
|
074bc791c2 | ||
|
|
77a4ad25f1 | ||
|
|
ca31d466ba | ||
|
|
945e7a3472 | ||
|
|
75d612ff11 | ||
|
|
15e8abfc9a | ||
|
|
b36d74ed9d | ||
|
|
094bf63f02 | ||
|
|
e0e870de27 | ||
|
|
966421c522 | ||
|
|
166c2cc46b | ||
|
|
74a5e4bc84 | ||
|
|
363ea0a586 | ||
|
|
1c4c7ed9a5 | ||
|
|
b5c224c119 | ||
|
|
d6e34d9dd2 | ||
|
|
1cb346bd13 | ||
|
|
daa40900bd | ||
|
|
d98c6edb55 | ||
|
|
73bfc68cd0 | ||
|
|
5d3f36d066 | ||
|
|
d214bc63f1 | ||
|
|
a6aeabfde4 | ||
|
|
9602667991 | ||
|
|
9ccf18f4c0 | ||
|
|
aa921ca184 | ||
|
|
4823523b7d | ||
|
|
4569c8f871 | ||
|
|
80163764c3 | ||
|
|
9bc81820e7 | ||
|
|
273ef0c045 | ||
|
|
ac1a67e90c | ||
|
|
12324d615a | ||
|
|
6b062ba127 | ||
|
|
8c7c3a073c | ||
|
|
0565901fad | ||
|
|
41b3241718 | ||
|
|
975a406d20 | ||
|
|
aa43c20f39 | ||
|
|
1fdd770093 | ||
|
|
a3fde45c18 | ||
|
|
85659a9cd6 | ||
|
|
2a4a22c9cb | ||
|
|
b820bdfeca | ||
|
|
b9348ffb1d | ||
|
|
55cf7b034c | ||
|
|
c622c8217f | ||
|
|
49484fa0f0 | ||
|
|
3661b06b60 | ||
|
|
f5814d4442 | ||
|
|
49ebf4771f | ||
|
|
4904a7e26f | ||
|
|
becc1b80f1 | ||
|
|
1fb5263c3b | ||
|
|
0ae89168ad | ||
|
|
6873867658 | ||
|
|
f15e049bf5 | ||
|
|
1d04cdf119 | ||
|
|
5d92f07e21 | ||
|
|
a4ed50e1f0 | ||
|
|
f7f7447994 | ||
|
|
e4f0e8a092 | ||
|
|
a23645ddfd | ||
|
|
7da04c6bff | ||
|
|
c497c1fac9 | ||
|
|
653cf02954 | ||
|
|
18cdbe02c5 | ||
|
|
d1ae68585f | ||
|
|
7a225fe732 | ||
|
|
1b33e516d9 | ||
|
|
55d02c933a | ||
|
|
b8ed8d5df9 | ||
|
|
641c32e395 | ||
|
|
51b28ed0b0 | ||
|
|
825100c6d6 | ||
|
|
1b1fc4b053 | ||
|
|
c3dd4e871e | ||
|
|
923bceffaa | ||
|
|
2942d2419f | ||
|
|
37d4180f9a | ||
|
|
99435cd215 | ||
|
|
27f039d72a | ||
|
|
e72422ecfb | ||
|
|
3c56ed2b0e | ||
|
|
a09ea8ee27 | ||
|
|
d6bdfe9897 | ||
|
|
7c9f7e1bd0 | ||
|
|
b1d2a47590 | ||
|
|
c3e9cb9518 | ||
|
|
3489998c67 | ||
|
|
4594d29f73 | ||
|
|
cc73f01c34 | ||
|
|
6da15cd1e9 | ||
|
|
c82ccd5a59 | ||
|
|
19d2805729 | ||
|
|
06387bba3e | ||
|
|
595803e5e2 | ||
|
|
3793559d6f | ||
|
|
71626c28e9 | ||
|
|
532eab762d | ||
|
|
642eff6061 | ||
|
|
15dc96a946 | ||
|
|
6b2cc80cc1 | ||
|
|
1db77094da | ||
|
|
8c3f2230c6 | ||
|
|
66f8508b57 | ||
|
|
afb249e854 | ||
|
|
9432677d3a | ||
|
|
524a6c607f | ||
|
|
d69a7d8e04 | ||
|
|
b1c8606918 | ||
|
|
d9723592bf | ||
|
|
23fbb5b027 | ||
|
|
4d7004f06b | ||
|
|
c4ed6d9936 | ||
|
|
aab0596ea9 | ||
|
|
7500efffa5 | ||
|
|
80e8026416 | ||
|
|
13452f5174 | ||
|
|
48ff6ff956 | ||
|
|
54cab89821 | ||
|
|
bb6a3c0650 | ||
|
|
09c22e09b9 | ||
|
|
cc5b308fc9 | ||
|
|
153b1cccdf | ||
|
|
7217a60e6e | ||
|
|
13aec946a3 | ||
|
|
e0da7b3f82 | ||
|
|
e29a63358d | ||
|
|
2bdf5d768f | ||
|
|
a7892881f3 | ||
|
|
921a138962 | ||
|
|
f8f410b8ee | ||
|
|
7307077a66 | ||
|
|
3ca002638c | ||
|
|
ccfceaf58c | ||
|
|
751b670d5b | ||
|
|
478cc25ffd | ||
|
|
b1c4b0bf2b | ||
|
|
1951c59b0c | ||
|
|
ddc3a5c04a | ||
|
|
6d5c61b671 | ||
|
|
c5c8d1190f | ||
|
|
1459616d27 | ||
|
|
8af8a94699 | ||
|
|
07cdc97e74 | ||
|
|
bcca1fae03 | ||
|
|
48ad95efe6 | ||
|
|
3b3889967c | ||
|
|
57f1fb4dc4 | ||
|
|
ef40be0d53 | ||
|
|
6b235b1d2e | ||
|
|
7cff10b274 | ||
|
|
5327b71215 | ||
|
|
c336259159 | ||
|
|
133fdd9156 | ||
|
|
244f71691d | ||
|
|
6f73f4c0f0 | ||
|
|
7843b2d038 | ||
|
|
692ff64e4b | ||
|
|
1d156282da | ||
|
|
b4bdf0f85e | ||
|
|
2bda250906 | ||
|
|
f32431e552 | ||
|
|
f9cb2bc872 | ||
|
|
f71ad1e00d | ||
|
|
3b01d0ce19 | ||
|
|
abc79396df | ||
|
|
67b6c2533d | ||
|
|
c75a882081 | ||
|
|
81787d0858 | ||
|
|
8e77507686 | ||
|
|
9c46ced572 | ||
|
|
161ddd7ea1 | ||
|
|
53110bac6f | ||
|
|
d64053771c | ||
|
|
23f199ffbd | ||
|
|
175847787d | ||
|
|
622a084ea6 | ||
|
|
4c48eedb18 | ||
|
|
ca8970b5cc | ||
|
|
fb49b633b2 |
No files matched your search
@@ -0,0 +1,335 @@
|
|||||||
|
name: CICD
|
||||||
|
|
||||||
|
env:
|
||||||
|
CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
|
||||||
|
MSRV_FEATURES: ""
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
crate_metadata:
|
||||||
|
name: Extract crate metadata
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Extract crate information
|
||||||
|
id: crate_metadata
|
||||||
|
run: |
|
||||||
|
cargo metadata --no-deps --format-version 1 | jq -r '"name=" + .packages[0].name' | tee -a $GITHUB_OUTPUT
|
||||||
|
cargo metadata --no-deps --format-version 1 | jq -r '"version=" + .packages[0].version' | tee -a $GITHUB_OUTPUT
|
||||||
|
cargo metadata --no-deps --format-version 1 | jq -r '"maintainer=" + .packages[0].authors[0]' | tee -a $GITHUB_OUTPUT
|
||||||
|
cargo metadata --no-deps --format-version 1 | jq -r '"homepage=" + .packages[0].homepage' | tee -a $GITHUB_OUTPUT
|
||||||
|
cargo metadata --no-deps --format-version 1 | jq -r '"msrv=" + .packages[0].rust_version' | tee -a $GITHUB_OUTPUT
|
||||||
|
outputs:
|
||||||
|
name: ${{ steps.crate_metadata.outputs.name }}
|
||||||
|
version: ${{ steps.crate_metadata.outputs.version }}
|
||||||
|
maintainer: ${{ steps.crate_metadata.outputs.maintainer }}
|
||||||
|
homepage: ${{ steps.crate_metadata.outputs.homepage }}
|
||||||
|
msrv: ${{ steps.crate_metadata.outputs.msrv }}
|
||||||
|
|
||||||
|
ensure_cargo_fmt:
|
||||||
|
name: Ensure 'cargo fmt' has been run
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
components: rustfmt
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- run: cargo fmt -- --check
|
||||||
|
|
||||||
|
min_version:
|
||||||
|
name: Minimum supported rust version
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
needs: crate_metadata
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install rust toolchain (v${{ needs.crate_metadata.outputs.msrv }})
|
||||||
|
uses: dtolnay/rust-toolchain@master
|
||||||
|
with:
|
||||||
|
toolchain: ${{ needs.crate_metadata.outputs.msrv }}
|
||||||
|
components: clippy
|
||||||
|
- name: Run clippy (on minimum supported rust version to prevent warnings we can't fix)
|
||||||
|
run: cargo clippy --locked --all-targets ${{ env.MSRV_FEATURES }}
|
||||||
|
- name: Run tests
|
||||||
|
run: cargo test --locked ${{ env.MSRV_FEATURES }}
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: ${{ matrix.job.target }} (${{ matrix.job.os }})
|
||||||
|
runs-on: ${{ matrix.job.os }}
|
||||||
|
needs: crate_metadata
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
job:
|
||||||
|
- { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
||||||
|
- { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true }
|
||||||
|
- { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true }
|
||||||
|
- { target: i686-pc-windows-msvc , os: windows-2019 }
|
||||||
|
- { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
||||||
|
- { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
||||||
|
- { target: x86_64-apple-darwin , os: macos-13 }
|
||||||
|
- { target: aarch64-apple-darwin , os: macos-15 }
|
||||||
|
- { target: x86_64-pc-windows-gnu , os: windows-2019 }
|
||||||
|
- { target: x86_64-pc-windows-msvc , os: windows-2019 }
|
||||||
|
- { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
||||||
|
- { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
||||||
|
env:
|
||||||
|
BUILD_CMD: cargo
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install prerequisites
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
case ${{ matrix.job.target }} in
|
||||||
|
arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
|
||||||
|
aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
- name: Install Rust toolchain
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
targets: ${{ matrix.job.target }}
|
||||||
|
|
||||||
|
- name: Install cross
|
||||||
|
if: matrix.job.use-cross
|
||||||
|
uses: taiki-e/install-action@v2
|
||||||
|
with:
|
||||||
|
tool: cross
|
||||||
|
|
||||||
|
- name: Overwrite build command env variable
|
||||||
|
if: matrix.job.use-cross
|
||||||
|
shell: bash
|
||||||
|
run: echo "BUILD_CMD=cross" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Show version information (Rust, cargo, GCC)
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
gcc --version || true
|
||||||
|
rustup -V
|
||||||
|
rustup toolchain list
|
||||||
|
rustup default
|
||||||
|
cargo -V
|
||||||
|
rustc -V
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
shell: bash
|
||||||
|
run: $BUILD_CMD build --locked --release --target=${{ matrix.job.target }}
|
||||||
|
|
||||||
|
- name: Run example
|
||||||
|
if: ${{ !matrix.job.use-cross }}
|
||||||
|
shell: bash
|
||||||
|
run: $BUILD_CMD run --release --target=${{ matrix.job.target }} --example=simple
|
||||||
|
|
||||||
|
- name: Set binary name & path
|
||||||
|
id: bin
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# Figure out suffix of binary
|
||||||
|
EXE_suffix=""
|
||||||
|
case ${{ matrix.job.target }} in
|
||||||
|
*-pc-windows-*) EXE_suffix=".exe" ;;
|
||||||
|
esac;
|
||||||
|
|
||||||
|
# Setup paths
|
||||||
|
BIN_NAME="${{ needs.crate_metadata.outputs.name }}${EXE_suffix}"
|
||||||
|
BIN_PATH="target/${{ matrix.job.target }}/release/${BIN_NAME}"
|
||||||
|
|
||||||
|
# Let subsequent steps know where to find the binary
|
||||||
|
echo "BIN_PATH=${BIN_PATH}" >> $GITHUB_OUTPUT
|
||||||
|
echo "BIN_NAME=${BIN_NAME}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Set testing options
|
||||||
|
id: test-options
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# test only library unit tests and binary for arm-type targets
|
||||||
|
unset CARGO_TEST_OPTIONS
|
||||||
|
unset CARGO_TEST_OPTIONS ; case ${{ matrix.job.target }} in arm-* | aarch64-*) CARGO_TEST_OPTIONS="--lib --bin ${{ needs.crate_metadata.outputs.name }}" ;; esac;
|
||||||
|
echo "CARGO_TEST_OPTIONS=${CARGO_TEST_OPTIONS}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
shell: bash
|
||||||
|
run: $BUILD_CMD test --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}}
|
||||||
|
|
||||||
|
- name: Setup Pandoc
|
||||||
|
uses: r-lib/actions/setup-pandoc@v2
|
||||||
|
|
||||||
|
- name: Generate man page
|
||||||
|
run: pandoc -s -f markdown -t man -o "doc/${{ needs.crate_metadata.outputs.name }}.1" "doc/${{ needs.crate_metadata.outputs.name }}.1.md"
|
||||||
|
|
||||||
|
- name: Create tarball
|
||||||
|
id: package
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac;
|
||||||
|
PKG_BASENAME=${{ needs.crate_metadata.outputs.name }}-v${{ needs.crate_metadata.outputs.version }}-${{ matrix.job.target }}
|
||||||
|
PKG_NAME=${PKG_BASENAME}${PKG_suffix}
|
||||||
|
echo "PKG_NAME=${PKG_NAME}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package"
|
||||||
|
ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/"
|
||||||
|
mkdir -p "${ARCHIVE_DIR}"
|
||||||
|
|
||||||
|
# Binary
|
||||||
|
cp "${{ steps.bin.outputs.BIN_PATH }}" "$ARCHIVE_DIR"
|
||||||
|
|
||||||
|
# README, LICENSE and CHANGELOG files
|
||||||
|
cp "README.md" "LICENSE-MIT" "LICENSE-APACHE" "CHANGELOG.md" "$ARCHIVE_DIR"
|
||||||
|
|
||||||
|
# Man page
|
||||||
|
cp "doc/${{ needs.crate_metadata.outputs.name }}.1" "$ARCHIVE_DIR"
|
||||||
|
|
||||||
|
# base compressed package
|
||||||
|
pushd "${PKG_STAGING}/" >/dev/null
|
||||||
|
case ${{ matrix.job.target }} in
|
||||||
|
*-pc-windows-*) 7z -y a "${PKG_NAME}" "${PKG_BASENAME}"/* | tail -2 ;;
|
||||||
|
*) tar czf "${PKG_NAME}" "${PKG_BASENAME}"/* ;;
|
||||||
|
esac;
|
||||||
|
popd >/dev/null
|
||||||
|
|
||||||
|
# Let subsequent steps know where to find the compressed package
|
||||||
|
echo "PKG_PATH=${PKG_STAGING}/${PKG_NAME}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Create Debian package
|
||||||
|
id: debian-package
|
||||||
|
shell: bash
|
||||||
|
if: startsWith(matrix.job.os, 'ubuntu')
|
||||||
|
run: |
|
||||||
|
COPYRIGHT_YEARS="2018 - "$(date "+%Y")
|
||||||
|
DPKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/debian-package"
|
||||||
|
DPKG_DIR="${DPKG_STAGING}/dpkg"
|
||||||
|
mkdir -p "${DPKG_DIR}"
|
||||||
|
|
||||||
|
DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }}
|
||||||
|
DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }}-musl
|
||||||
|
case ${{ matrix.job.target }} in *-musl*) DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }}-musl ; DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }} ;; esac;
|
||||||
|
DPKG_VERSION=${{ needs.crate_metadata.outputs.version }}
|
||||||
|
|
||||||
|
unset DPKG_ARCH
|
||||||
|
case ${{ matrix.job.target }} in
|
||||||
|
aarch64-*-linux-*) DPKG_ARCH=arm64 ;;
|
||||||
|
arm-*-linux-*hf) DPKG_ARCH=armhf ;;
|
||||||
|
i686-*-linux-*) DPKG_ARCH=i686 ;;
|
||||||
|
x86_64-*-linux-*) DPKG_ARCH=amd64 ;;
|
||||||
|
*) DPKG_ARCH=notset ;;
|
||||||
|
esac;
|
||||||
|
|
||||||
|
DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb"
|
||||||
|
echo "DPKG_NAME=${DPKG_NAME}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Binary
|
||||||
|
install -Dm755 "${{ steps.bin.outputs.BIN_PATH }}" "${DPKG_DIR}/usr/bin/${{ steps.bin.outputs.BIN_NAME }}"
|
||||||
|
|
||||||
|
# Man page
|
||||||
|
install -Dm644 'doc/${{ needs.crate_metadata.outputs.name }}.1' "${DPKG_DIR}/usr/share/man/man1/${{ needs.crate_metadata.outputs.name }}.1"
|
||||||
|
gzip -n --best "${DPKG_DIR}/usr/share/man/man1/${{ needs.crate_metadata.outputs.name }}.1"
|
||||||
|
|
||||||
|
# README and LICENSE
|
||||||
|
install -Dm644 "README.md" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/README.md"
|
||||||
|
install -Dm644 "LICENSE-MIT" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/LICENSE-MIT"
|
||||||
|
install -Dm644 "LICENSE-APACHE" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/LICENSE-APACHE"
|
||||||
|
install -Dm644 "CHANGELOG.md" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/changelog"
|
||||||
|
gzip -n --best "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/changelog"
|
||||||
|
|
||||||
|
cat > "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/copyright" <<EOF
|
||||||
|
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
|
Upstream-Name: ${{ needs.crate_metadata.outputs.name }}
|
||||||
|
Source: ${{ needs.crate_metadata.outputs.homepage }}
|
||||||
|
|
||||||
|
Files: *
|
||||||
|
Copyright: ${{ needs.crate_metadata.outputs.maintainer }}
|
||||||
|
Copyright: $COPYRIGHT_YEARS ${{ needs.crate_metadata.outputs.maintainer }}
|
||||||
|
License: Apache-2.0 or MIT
|
||||||
|
|
||||||
|
License: Apache-2.0
|
||||||
|
On Debian systems, the complete text of the Apache-2.0 can be found in the
|
||||||
|
file /usr/share/common-licenses/Apache-2.0.
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
Permission is hereby granted, free of charge, to any
|
||||||
|
person obtaining a copy of this software and associated
|
||||||
|
documentation files (the "Software"), to deal in the
|
||||||
|
Software without restriction, including without
|
||||||
|
limitation the rights to use, copy, modify, merge,
|
||||||
|
publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software
|
||||||
|
is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
.
|
||||||
|
The above copyright notice and this permission notice
|
||||||
|
shall be included in all copies or substantial portions
|
||||||
|
of the Software.
|
||||||
|
.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
||||||
|
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||||
|
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||||
|
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||||||
|
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
EOF
|
||||||
|
chmod 644 "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/copyright"
|
||||||
|
|
||||||
|
# control file
|
||||||
|
mkdir -p "${DPKG_DIR}/DEBIAN"
|
||||||
|
cat > "${DPKG_DIR}/DEBIAN/control" <<EOF
|
||||||
|
Package: ${DPKG_BASENAME}
|
||||||
|
Version: ${DPKG_VERSION}
|
||||||
|
Section: utils
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: ${{ needs.crate_metadata.outputs.maintainer }}
|
||||||
|
Homepage: ${{ needs.crate_metadata.outputs.homepage }}
|
||||||
|
Architecture: ${DPKG_ARCH}
|
||||||
|
Provides: ${{ needs.crate_metadata.outputs.name }}
|
||||||
|
Conflicts: ${DPKG_CONFLICTS}
|
||||||
|
Description: A command-line benchmarking tool
|
||||||
|
EOF
|
||||||
|
|
||||||
|
DPKG_PATH="${DPKG_STAGING}/${DPKG_NAME}"
|
||||||
|
echo "DPKG_PATH=${DPKG_PATH}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# build dpkg
|
||||||
|
fakeroot dpkg-deb --build "${DPKG_DIR}" "${DPKG_PATH}"
|
||||||
|
|
||||||
|
- name: "Artifact upload: tarball"
|
||||||
|
uses: actions/upload-artifact@main
|
||||||
|
with:
|
||||||
|
name: ${{ steps.package.outputs.PKG_NAME }}
|
||||||
|
path: ${{ steps.package.outputs.PKG_PATH }}
|
||||||
|
|
||||||
|
- name: "Artifact upload: Debian package"
|
||||||
|
uses: actions/upload-artifact@main
|
||||||
|
if: steps.debian-package.outputs.DPKG_NAME
|
||||||
|
with:
|
||||||
|
name: ${{ steps.debian-package.outputs.DPKG_NAME }}
|
||||||
|
path: ${{ steps.debian-package.outputs.DPKG_PATH }}
|
||||||
|
|
||||||
|
- name: Check for release
|
||||||
|
id: is-release
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
unset IS_RELEASE ; if [[ $GITHUB_REF =~ ^refs/tags/v[0-9].* ]]; then IS_RELEASE='true' ; fi
|
||||||
|
echo "IS_RELEASE=${IS_RELEASE}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Publish archives and packages
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
if: steps.is-release.outputs.IS_RELEASE
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
${{ steps.package.outputs.PKG_PATH }}
|
||||||
|
${{ steps.debian-package.outputs.DPKG_PATH }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -1,2 +1,5 @@
|
|||||||
/target
|
/target
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
hexyl.1
|
||||||
-79
@@ -1,79 +0,0 @@
|
|||||||
language: rust
|
|
||||||
cache: cargo
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
# Stable channel.
|
|
||||||
- os: linux
|
|
||||||
rust: stable
|
|
||||||
env: TARGET=x86_64-unknown-linux-gnu
|
|
||||||
- os: linux
|
|
||||||
rust: stable
|
|
||||||
env: TARGET=x86_64-unknown-linux-musl
|
|
||||||
- os: osx
|
|
||||||
rust: stable
|
|
||||||
env: TARGET=x86_64-apple-darwin
|
|
||||||
- os: windows
|
|
||||||
rust: stable
|
|
||||||
env: TARGET=x86_64-pc-windows-msvc
|
|
||||||
|
|
||||||
# Minimum Rust supported channel.
|
|
||||||
- os: linux
|
|
||||||
rust: 1.31.0
|
|
||||||
env: TARGET=x86_64-unknown-linux-gnu
|
|
||||||
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
# needed to build deb packages
|
|
||||||
- fakeroot
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
# Default target on travis-ci.
|
|
||||||
# Used as conditional check in the install stage
|
|
||||||
- HOST=x86_64-unknown-linux-gnu
|
|
||||||
# Used on the deployment script
|
|
||||||
- PROJECT_NAME=hexyl
|
|
||||||
|
|
||||||
install:
|
|
||||||
# prevent target re-add error from rustup
|
|
||||||
- if [[ $TRAVIS_OS_NAME = linux && $HOST != $TARGET ]]; then rustup target add $TARGET; fi
|
|
||||||
|
|
||||||
script:
|
|
||||||
# Incorporate TARGET env var to the build and test process
|
|
||||||
- cargo build --target $TARGET --verbose
|
|
||||||
#- cargo test --target $TARGET --verbose
|
|
||||||
|
|
||||||
before_deploy:
|
|
||||||
- bash ci/before_deploy.bash
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: releases
|
|
||||||
# NOTE updating the `api_key.secure`
|
|
||||||
# - go to: https://github.com/settings/tokens/new
|
|
||||||
# - generate new token using `public_repo` scope
|
|
||||||
# - encrypt it using: `travis encrypt API_KEY_HERE`
|
|
||||||
# - paste the output below
|
|
||||||
api_key:
|
|
||||||
secure: "XHpyp21JUWI6GkV7APTwPZiJQJkRJ13E/9VALuWvDrNYF00OE8m+T0ZbG+N1WCuwewa2QQChqd5yBDlwJn+LlDPqstie69xjCt7PEhvI5ERZlbT8KUtMLI4bFIudsaa6LS6phWi/6aKb4cfn0nEYmWhpqfVfsn4Hh4F9OyOFSRmMSSXziU3kxLdIBBO4jOfoDYz+4KUX48CtIhmFy6dSb4G22jzVXL3ixGq895lVFlUzfiGJhHXoS+6KsOx1q0eIEMPC6V0VTT1loBNxKpjBPQ1b0KysCim/jRnr9mB3ko/4yWcMtIvCaZxTaQXWsQn9wAEN62x3ruKugZh3LJbtaxSvnH9PMntXZliz1HJw3Hpmn+tGLxAOm+uwHRz2C/T2ibemgmw6F8KjsjdNv7Nc2//ErIbmMvV4OlJjJI2Q3LWjnYa2gqI0L0sMqUz9HAfiY/BXLSxp19LgSvZPuHNVzMfh9ovF+Rdk1I3TyoByS8ZUi2ngnra8bSjmjtWHmkntOksjWNG6iobpjz9UxdWXPWxNJHQbRfEyTJSISpClykcSZWj+E2+tfuB3YvuRUaVOIhA3THdOSsqEesl3jkUeIhQqgRhE+Uq/XqB7MdfZ9ZTX8ZgfGFL0gjygviuWznTb0q5i4t1SgEJ2ie+ykjVyqQWa0dePtaQp8yx2PtzchJs="
|
|
||||||
# for uploading multiple files
|
|
||||||
file_glob: true
|
|
||||||
# NOTE explanation on each env variable
|
|
||||||
# - PROJECT_NAME: name of the project, set on the `env.global` above
|
|
||||||
# - TRAVIS_TAG: tag name that the build is being deployed for, usually the version number
|
|
||||||
# - TARGET: target triple of the build
|
|
||||||
file:
|
|
||||||
- $PROJECT_NAME-$TRAVIS_TAG-$TARGET.*
|
|
||||||
- $PROJECT_NAME*.deb
|
|
||||||
# don't delete artifacts from previous stage
|
|
||||||
skip_cleanup: true
|
|
||||||
on:
|
|
||||||
# deploy only if we push a tag
|
|
||||||
tags: true
|
|
||||||
# deploy only on stable channel that has TARGET env variable sets
|
|
||||||
condition: $TRAVIS_RUST_VERSION = stable && $TARGET != "x86_64-pc-windows-msvc"
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email:
|
|
||||||
on_success: never
|
|
||||||
+263
@@ -0,0 +1,263 @@
|
|||||||
|
# unreleased
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
|
||||||
|
# v0.16.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* New `--print-color-table` option, see #229 (@sahinfalcon)
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
- Throw an error when try to view a directory, see #234 (@Integral-Tech)
|
||||||
|
|
||||||
|
|
||||||
|
# v0.15.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Add codepage 1047 for EBCDIC, see #226 (@v1gnesh)
|
||||||
|
|
||||||
|
## Other
|
||||||
|
|
||||||
|
- Rewrite CLI using the derive API, see #225 (@sorairolake)
|
||||||
|
|
||||||
|
|
||||||
|
# v0.14.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* New `--character-table` option, with the ability to use [codepage 437](https://www.azabani.com/2020/11/15/xd.html), see #194 and #195 (@sharifhsn)
|
||||||
|
* New `--character-table=ascii` option for a ASCII-only character table, see #212 and #36 (@sharkdp)
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
* Show output when doing `hexyl /dev/zero`, see #211 (@sharifhsn)
|
||||||
|
* Respect NO_COLOR environment variable, see #210 (@sharkdp)
|
||||||
|
|
||||||
|
|
||||||
|
# v0.13.1
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
- Correctly handle discontinuous input (stdin), see #196 and #197 (@sharifhsn)
|
||||||
|
|
||||||
|
# v0.13.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Support both little and big Endian dumps using `--endianness={little,big}`, see #189 and #104 (@RinHizakura)
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- **Breaking**: Changed the meaning of the short flag `-C` to be consistent with `hexdump -C`. Previously, this would *hide* the character panel, but now `-C` *shows* the character panel, in case it has been previously (e.g. in an `alias`) disabled with `--no-characters`, see #187 (@sharkdp)
|
||||||
|
|
||||||
|
## `hexyl` as a library
|
||||||
|
|
||||||
|
- New `endianness` method for `PrinterBuilder`
|
||||||
|
|
||||||
|
|
||||||
|
# v0.12.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Only show one panel by default if the terminal width is not wide enough for two panels, see #182 (@sharkdp)
|
||||||
|
- Respect the `NO_COLOR` environment variable, see #179 (@sharifhsn)
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
- Do not fail with an error if `--panels=auto` is used and the output is piped, see #184 (@sharkdp)
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- Breaking: For `xxd`-compatibility reasons, `--group_bytes` has been renamed to `--group-size` (with an `--groupsize` alias), see #121 (@sharkdp)
|
||||||
|
|
||||||
|
## `hexyl` as a library
|
||||||
|
|
||||||
|
- Breaking: `num_group_bytes` has been renamed to `group_size`.
|
||||||
|
|
||||||
|
|
||||||
|
# v0.11.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Significantly improved performance, see #173 and #176 (@sharifhsn)
|
||||||
|
- Added variable panels through the `--panels` and `--terminal-width` flags, see [#13](https://github.com/sharkdp/hexyl/issues/13) and [#164](https://github.com/sharkdp/hexyl/pull/164) (@sharifhsn)
|
||||||
|
- Added new `--group-bytes`/`-g` option, see #104 and #170 (@RinHizakura)
|
||||||
|
- Added new `--base B` option (where `B` can be `binary`, `octal`, `decimal` or `hexadecimal`), see #147 and #178 (@sharifhsn)
|
||||||
|
- Show actual zero bytes as `⋄` in the character panel (previously: `0`), in order not to confuse them with ASCII
|
||||||
|
`0` bytes if colors are deactivated. Closes #166 (@sharkdp)
|
||||||
|
|
||||||
|
## `hexyl` as a library
|
||||||
|
|
||||||
|
- Breaking change: `Printer::new` is deprecated as a part of the public API. Alternatively, you can now construct a `Printer` using the `PrinterBuilder` builder API, see [#168](https://github.com/sharkdp/hexyl/pull/168). (@sharifhsn)
|
||||||
|
|
||||||
|
## Other
|
||||||
|
|
||||||
|
- More tests for the squeezing feature, see #177 (@mkatychev)
|
||||||
|
|
||||||
|
## Thank you
|
||||||
|
|
||||||
|
Special thanks go to @sharifhsn, not just for the new features,
|
||||||
|
bugfixes and performance improvements. But also for many internal
|
||||||
|
improvements of the code base and other maintenance tasks.
|
||||||
|
|
||||||
|
|
||||||
|
# v0.10.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Added new `--plain`, `--no-characters`, and `--no-position` flags, see #154 (@mkatychev)
|
||||||
|
- Allow hex numbers and units for `--block-size` argument, see #111 and #144 (@merkrafter)
|
||||||
|
|
||||||
|
## Other
|
||||||
|
|
||||||
|
- Added a man page, see #151 (@sorairolake)
|
||||||
|
- Mention ability to specify length in hex, see #143 (@merkrafter)
|
||||||
|
- `--length` and `--bytes` are now marked as conflicting command-line options, see #152 (@sorairolake)
|
||||||
|
|
||||||
|
|
||||||
|
# v0.9.0
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- Breaking change (binary): setting the `-o/--display-offset` flag no longer overrides the value set by `--skip` [#115](https://github.com/sharkdp/hexyl/issues/115). The first displayed address is now the sum of the two values - this matches the behaviour of `xxd`.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Allow relative and negative byte offsets (e.g. `hexyl --skip=-1block`), see #99 (@ErichDonGubler)
|
||||||
|
- Added `-l` as another alias for '-n/--length' (`xxd` compatibility), see #121 and #135 (@TheDoctor314)
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
- Argument `--length` silently takes precedence over `--bytes`, see #105
|
||||||
|
- Print warning on empty content, see #107 and #108
|
||||||
|
- Disallow block sizes of zero, see #110
|
||||||
|
- Fix newline appearing in `--version` output, see #131 and #133 (@scimas)
|
||||||
|
|
||||||
|
## Other
|
||||||
|
|
||||||
|
- Better diagnostic messages, see #98 (@ErichDonGubler)
|
||||||
|
|
||||||
|
## Packaging
|
||||||
|
|
||||||
|
- `hexyl` is now available on snapstore, see #116 (@purveshpatel511)
|
||||||
|
|
||||||
|
|
||||||
|
# v0.8.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- A new `--skip <N>` / `-s <N>` option can be used to skip the first `N` bytes of the input, see #16, #88 (@Tarnadas, @MaxJohansen, @ErichDonGubler)
|
||||||
|
- The `--length`/`--bytes`/`--skip`/`--display-offset` options can now take units for their value argument, for example:
|
||||||
|
``` bash
|
||||||
|
hexyl /dev/random --length=1KiB
|
||||||
|
hexyl $(which hexyl) --skip=1MiB --length=10KiB
|
||||||
|
```
|
||||||
|
Both decimal SI prefixes (kB, MB, …) as well as binary IEC prefixes (KiB, MiB, …) are supported.
|
||||||
|
In addition, there is a new `--block-size <SIZE>` option that can be used to control the size of the `block`
|
||||||
|
unit:
|
||||||
|
``` bash
|
||||||
|
hexyl /dev/random --block-size=4kB --length=2block
|
||||||
|
```
|
||||||
|
See: #44 (@ErichDonGubler and @aswild)
|
||||||
|
|
||||||
|
## Other
|
||||||
|
|
||||||
|
- Various improvements throughout the code base by @ErichDonGubler
|
||||||
|
|
||||||
|
## Packaging
|
||||||
|
|
||||||
|
- `hexyl` is now available on Void Linux, see #91 (@notramo)
|
||||||
|
|
||||||
|
|
||||||
|
# v0.7.0
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
- hexyl can now be closed with `Ctrl-C` when reading input from STDIN, see #84
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- Breaking change (library): [`Printer::print_all`](https://docs.rs/hexyl/latest/hexyl/struct.Printer.html#method.print_all) does not take a second argument anymore.
|
||||||
|
- Added an example on how to use `hexyl` as a library: https://github.com/sharkdp/hexyl/blob/v0.7.0/examples/simple.rs
|
||||||
|
|
||||||
|
|
||||||
|
# v0.6.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- `hexyl` can now be used as a library, see #67 (@tommilligan)
|
||||||
|
|
||||||
|
- Added a new `-o`/`--display-offset` option to add a certain offset to the
|
||||||
|
reported file positions, see #57 (@tommilligan)
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
- Remove additional space on short input, see #69 (@nalshihabi)
|
||||||
|
|
||||||
|
## Other
|
||||||
|
|
||||||
|
- Performance improvements, see #73 and #66
|
||||||
|
|
||||||
|
|
||||||
|
# v0.5.1
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
- A bug in the squeezing logic caused a wrong hexdump, see #62 (@awidegreen)
|
||||||
|
- Some colors are printed even if they're disabled, see #64 (@awidegreen)
|
||||||
|
- Fixed build failure on OpenBSD 6.5, see #61
|
||||||
|
|
||||||
|
|
||||||
|
# v0.5.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Added support for squeezing where reoccurring lines are squashed together and visualized with an asterisk. A new `-v`/`--no-squeezing` option can be used to disable the feature. For details, see #59 (@awidegreen)
|
||||||
|
- Added a new `--border` option with support for various styles (Unicode, ASCII, None), see #54 (@dmke)
|
||||||
|
- The `--length`/`-n` argument can be passed as a hexadecimal number (`hexyl -n 0xff /dev/urandom`), see #45 (@Qyriad)
|
||||||
|
- Added `--bytes`/`-c` as an alias for `--length`/`-n`, see #48 (@selfup)
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- Print header immediately before the first line, see #51 (@mziter)
|
||||||
|
|
||||||
|
|
||||||
|
# v0.4.0
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Added a new `--color=always/auto/never` option which can be used
|
||||||
|
to control `hexyl`s color output, see #30 (@bennetthardwick)
|
||||||
|
- Use 16 colors instead of 256, see #38
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
- Various speed improvements, see #33 (@kballard)
|
||||||
|
|
||||||
|
## Bugfixes
|
||||||
|
|
||||||
|
- Proper Ctrl-C handling, see #35
|
||||||
|
- Proper handling of broken pipes (`hexyl … | head`)
|
||||||
|
|
||||||
|
|
||||||
|
# v0.3.1
|
||||||
|
|
||||||
|
- Various (huge) performance improvements, see #23 and #24 (@kballard)
|
||||||
|
- Replaced 24-bit truecolor ANSI codes by 8-bit codes to support
|
||||||
|
more terminal emulators, fixes #9
|
||||||
|
|
||||||
|
|
||||||
|
# v0.3.0
|
||||||
|
|
||||||
|
Windows support
|
||||||
|
|
||||||
|
|
||||||
|
# v0.2.0
|
||||||
|
|
||||||
|
Initial release
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Thank you for considering to contribute to `hexyl`!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Add an entry to the changelog
|
||||||
|
|
||||||
|
If your contribution changes the behavior of `hexyl` (as opposed to a typo-fix
|
||||||
|
in the documentation), please update the [`CHANGELOG.md`](CHANGELOG.md) file
|
||||||
|
and describe your changes. This makes the release process much easier and
|
||||||
|
therefore helps to get your changes into a new `hexyl` release faster.
|
||||||
|
|
||||||
|
The top of the `CHANGELOG` contains a *"unreleased"* section with a few
|
||||||
|
subsections (Features, Bugfixes, …). Please add your entry to the subsection
|
||||||
|
that best describes your change
|
||||||
|
|
||||||
|
Entries follow this format:
|
||||||
|
```
|
||||||
|
- Short description of what has been changed, see #123 (@user)
|
||||||
|
```
|
||||||
|
Here, `#123` is the number of the original issue and/or your pull request.
|
||||||
|
Please replace `@user` by your GitHub username.
|
||||||
|
|
||||||
|
|
||||||
|
## Adding a new feature
|
||||||
|
|
||||||
|
Please consider opening a [ticket](https://github.com/sharkdp/hexyl/issues/new)
|
||||||
|
first in order to give us a chance to discuss the feature first.
|
||||||
Generated
+505
-142
@@ -1,218 +1,581 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ansi_term"
|
name = "aho-corasick"
|
||||||
version = "0.11.0"
|
version = "1.1.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atty"
|
name = "anstream"
|
||||||
version = "0.2.11"
|
version = "0.6.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
"anstyle",
|
||||||
"termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"anstyle-parse",
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"anstyle-query",
|
||||||
|
"anstyle-wincon",
|
||||||
|
"colorchoice",
|
||||||
|
"is_terminal_polyfill",
|
||||||
|
"utf8parse",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle"
|
||||||
|
version = "1.0.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle-parse"
|
||||||
|
version = "0.2.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
|
||||||
|
dependencies = [
|
||||||
|
"utf8parse",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle-query"
|
||||||
|
version = "1.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
|
||||||
|
dependencies = [
|
||||||
|
"windows-sys 0.59.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle-wincon"
|
||||||
|
version = "3.0.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
|
||||||
|
dependencies = [
|
||||||
|
"anstyle",
|
||||||
|
"windows-sys 0.59.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anyhow"
|
||||||
|
version = "1.0.91"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "assert_cmd"
|
||||||
|
version = "2.0.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d"
|
||||||
|
dependencies = [
|
||||||
|
"anstyle",
|
||||||
|
"bstr",
|
||||||
|
"doc-comment",
|
||||||
|
"libc",
|
||||||
|
"predicates",
|
||||||
|
"predicates-core",
|
||||||
|
"predicates-tree",
|
||||||
|
"wait-timeout",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "autocfg"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "1.0.4"
|
version = "2.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "bstr"
|
||||||
version = "1.0.37"
|
version = "1.10.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cfg-if"
|
|
||||||
version = "0.1.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
"regex-automata",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "2.33.0"
|
version = "4.5.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap_builder",
|
||||||
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap_derive",
|
||||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"term_size 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ctrlc"
|
name = "clap_builder"
|
||||||
version = "3.1.2"
|
version = "4.5.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"anstream",
|
||||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"anstyle",
|
||||||
|
"clap_lex",
|
||||||
|
"strsim",
|
||||||
|
"terminal_size",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_derive"
|
||||||
|
version = "4.5.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab"
|
||||||
|
dependencies = [
|
||||||
|
"heck",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_lex"
|
||||||
|
version = "0.7.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "colorchoice"
|
||||||
|
version = "1.0.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "const_format"
|
||||||
|
version = "0.2.33"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b"
|
||||||
|
dependencies = [
|
||||||
|
"const_format_proc_macros",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "const_format_proc_macros"
|
||||||
|
version = "0.2.33"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-xid",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "diff"
|
||||||
|
version = "0.1.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "difflib"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "doc-comment"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "errno"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"windows-sys 0.52.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "float-cmp"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heck"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hexyl"
|
name = "hexyl"
|
||||||
version = "0.5.1"
|
version = "0.16.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"anyhow",
|
||||||
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"assert_cmd",
|
||||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap",
|
||||||
"ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"const_format",
|
||||||
|
"libc",
|
||||||
|
"owo-colors",
|
||||||
|
"predicates",
|
||||||
|
"pretty_assertions",
|
||||||
|
"supports-color",
|
||||||
|
"terminal_size",
|
||||||
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kernel32-sys"
|
name = "is_ci"
|
||||||
version = "0.2.2"
|
version = "1.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45"
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
[[package]]
|
||||||
]
|
name = "is_terminal_polyfill"
|
||||||
|
version = "1.70.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.55"
|
version = "0.2.161"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nix"
|
name = "linux-raw-sys"
|
||||||
version = "0.13.0"
|
version = "0.4.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.7.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "normalize-line-endings"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-traits"
|
||||||
|
version = "0.2.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"autocfg",
|
||||||
"cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "numtoa"
|
name = "owo-colors"
|
||||||
version = "0.1.0"
|
version = "4.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fb37767f6569cd834a413442455e0f066d0d522de8630436e2a1761d9726ba56"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "predicates"
|
||||||
version = "0.1.54"
|
version = "3.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "redox_termios"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
"anstyle",
|
||||||
|
"difflib",
|
||||||
|
"float-cmp",
|
||||||
|
"normalize-line-endings",
|
||||||
|
"predicates-core",
|
||||||
|
"regex",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "predicates-core"
|
||||||
|
version = "1.0.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "predicates-tree"
|
||||||
|
version = "1.0.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13"
|
||||||
|
dependencies = [
|
||||||
|
"predicates-core",
|
||||||
|
"termtree",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pretty_assertions"
|
||||||
|
version = "1.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d"
|
||||||
|
dependencies = [
|
||||||
|
"diff",
|
||||||
|
"yansi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.89"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.37"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "1.11.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-automata",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-automata"
|
||||||
|
version = "0.4.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustix"
|
||||||
|
version = "0.38.38"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"errno",
|
||||||
|
"libc",
|
||||||
|
"linux-raw-sys",
|
||||||
|
"windows-sys 0.52.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "1.0.214"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.214"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.8.0"
|
version = "0.11.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "term_size"
|
name = "supports-color"
|
||||||
version = "0.3.1"
|
version = "3.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8775305acf21c96926c900ad056abeef436701108518cf890020387236ac5a77"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"is_ci",
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "termion"
|
name = "syn"
|
||||||
version = "1.5.2"
|
version = "2.0.85"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
"proc-macro2",
|
||||||
"numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"quote",
|
||||||
"redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-ident",
|
||||||
"redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "textwrap"
|
name = "terminal_size"
|
||||||
version = "0.11.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"term_size 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-width"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "vec_map"
|
|
||||||
version = "0.8.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "void"
|
|
||||||
version = "1.0.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi"
|
|
||||||
version = "0.2.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi"
|
|
||||||
version = "0.3.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-build"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-i686-pc-windows-gnu"
|
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4f599bd7ca042cfdf8f4512b277c02ba102247820f9d9d4a9f521f496751a6ef"
|
||||||
|
dependencies = [
|
||||||
|
"rustix",
|
||||||
|
"windows-sys 0.59.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi-x86_64-pc-windows-gnu"
|
name = "termtree"
|
||||||
version = "0.4.0"
|
version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
|
||||||
|
|
||||||
[metadata]
|
[[package]]
|
||||||
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
name = "thiserror"
|
||||||
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
|
version = "1.0.65"
|
||||||
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d"
|
checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5"
|
||||||
"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
|
dependencies = [
|
||||||
"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
|
"thiserror-impl",
|
||||||
"checksum ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5531b7f0698d9220b4729f8811931dbe0e91a05be2f7b3245fdc50dd856bae26"
|
]
|
||||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
|
||||||
"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880"
|
[[package]]
|
||||||
"checksum nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46f0f3210768d796e8fa79ec70ee6af172dacbe7147f5e69be5240a47778302b"
|
name = "thiserror-impl"
|
||||||
"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
|
version = "1.0.65"
|
||||||
"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602"
|
||||||
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
dependencies = [
|
||||||
"checksum term_size 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e5b9a66db815dcfd2da92db471106457082577c3c278d4138ab3e3b4e189327"
|
"proc-macro2",
|
||||||
"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea"
|
"quote",
|
||||||
"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
|
"syn",
|
||||||
"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526"
|
]
|
||||||
"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
|
|
||||||
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
[[package]]
|
||||||
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
name = "unicode-ident"
|
||||||
"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
|
version = "1.0.13"
|
||||||
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||||
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-xid"
|
||||||
|
version = "0.2.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "utf8parse"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wait-timeout"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-sys"
|
||||||
|
version = "0.52.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-sys"
|
||||||
|
version = "0.59.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-targets"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
||||||
|
dependencies = [
|
||||||
|
"windows_aarch64_gnullvm",
|
||||||
|
"windows_aarch64_msvc",
|
||||||
|
"windows_i686_gnu",
|
||||||
|
"windows_i686_gnullvm",
|
||||||
|
"windows_i686_msvc",
|
||||||
|
"windows_x86_64_gnu",
|
||||||
|
"windows_x86_64_gnullvm",
|
||||||
|
"windows_x86_64_msvc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_gnullvm"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_msvc"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnu"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnullvm"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_msvc"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnu"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnullvm"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_msvc"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "yansi"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
|
||||||
+21
-7
@@ -7,14 +7,28 @@ license = "MIT/Apache-2.0"
|
|||||||
name = "hexyl"
|
name = "hexyl"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
repository = "https://github.com/sharkdp/hexyl"
|
repository = "https://github.com/sharkdp/hexyl"
|
||||||
version = "0.5.1"
|
version = "0.16.0"
|
||||||
edition = "2018"
|
edition = "2021"
|
||||||
|
rust-version = "1.74"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ansi_term = "0.11"
|
anyhow = "1.0"
|
||||||
atty = "0.2"
|
const_format = "0.2"
|
||||||
ctrlc = "3.1"
|
libc = "0.2"
|
||||||
|
owo-colors = "4"
|
||||||
|
supports-color = "3"
|
||||||
|
thiserror = "1.0"
|
||||||
|
terminal_size = "0.4"
|
||||||
|
|
||||||
[dependencies.clap]
|
[dependencies.clap]
|
||||||
version = "2"
|
version = "4"
|
||||||
features = ["suggestions", "color", "wrap_help"]
|
features = ["derive", "wrap_help"]
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
assert_cmd = "2.0"
|
||||||
|
predicates = "3.0"
|
||||||
|
pretty_assertions = "1.4.0"
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
lto = true
|
||||||
|
codegen-units = 1
|
||||||
@@ -1,10 +1,10 @@
|
|||||||

|

|
||||||
|
|
||||||
[](https://travis-ci.org/sharkdp/hexyl)
|
[](https://github.com/sharkdp/hexyl/actions/workflows/CICD.yml)
|
||||||
[](https://crates.io/crates/hexyl)
|
[](https://crates.io/crates/hexyl)
|
||||||

|

|
||||||
|
|
||||||
`hexyl` is a simple hex viewer for the terminal. It uses a colored output to distinguish different categories
|
`hexyl` is a hex viewer for the terminal. It uses a colored output to distinguish different categories
|
||||||
of bytes (NULL bytes, printable ASCII characters, ASCII whitespace characters, other ASCII characters and non-ASCII).
|
of bytes (NULL bytes, printable ASCII characters, ASCII whitespace characters, other ASCII characters and non-ASCII).
|
||||||
|
|
||||||
## Preview
|
## Preview
|
||||||
@@ -17,62 +17,175 @@ of bytes (NULL bytes, printable ASCII characters, ASCII whitespace characters, o
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### On Debian-based systems
|
### On Ubuntu
|
||||||
|
|
||||||
|
*... and other Debian-based Linux distributions.*
|
||||||
|
|
||||||
|
If you run Ubuntu 19.10 (Eoan Ermine) or newer, you can install the [officially maintained package](https://packages.ubuntu.com/search?keywords=hexyl):
|
||||||
|
```bash
|
||||||
|
sudo apt install hexyl
|
||||||
|
```
|
||||||
|
If you use an older version of Ubuntu, you can download
|
||||||
|
the latest `.deb` package from the release page and install it via:
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
wget "https://github.com/sharkdp/hexyl/releases/download/v0.5.1/hexyl_0.5.1_amd64.deb"
|
sudo dpkg -i hexyl_0.15.0_amd64.deb # adapt version number and architecture
|
||||||
sudo dpkg -i hexyl_0.5.1_amd64.deb
|
```
|
||||||
|
|
||||||
|
### On Debian
|
||||||
|
|
||||||
|
If you run Debian Buster or newer, you can install the [officially maintained Debian package](https://packages.debian.org/search?searchon=names&keywords=hexyl):
|
||||||
|
```bash
|
||||||
|
sudo apt-get install hexyl
|
||||||
|
```
|
||||||
|
|
||||||
|
If you run an older version of Debian, see above for instructions on how to
|
||||||
|
manually install `hexyl`.
|
||||||
|
|
||||||
|
### On Fedora
|
||||||
|
|
||||||
|
If you run Fedora 35 or newer, you can install the [officially maintained Fedora package](https://packages.fedoraproject.org/pkgs/rust-hexyl/hexyl):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo dnf install hexyl
|
||||||
```
|
```
|
||||||
|
|
||||||
### On Arch Linux
|
### On Arch Linux
|
||||||
|
|
||||||
You can install `hexyl` from [the official package repository](https://www.archlinux.org/packages/community/x86_64/hexyl/):
|
You can install `hexyl` from [the official package repository](https://archlinux.org/packages/extra/x86_64/hexyl/):
|
||||||
|
|
||||||
```
|
```
|
||||||
pacman -S hexyl
|
pacman -S hexyl
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### On Void Linux
|
||||||
|
|
||||||
|
```
|
||||||
|
xbps-install hexyl
|
||||||
|
```
|
||||||
|
|
||||||
|
### On Gentoo Linux
|
||||||
|
|
||||||
|
Available in [dm9pZCAq overlay](https://github.com/gentoo-mirror/dm9pZCAq)
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo eselect repository enable dm9pZCAq
|
||||||
|
sudo emerge --sync dm9pZCAq
|
||||||
|
sudo emerge sys-apps/hexyl::dm9pZCAq
|
||||||
|
```
|
||||||
|
|
||||||
### On macOS
|
### On macOS
|
||||||
|
|
||||||
|
Via [Homebrew](https://brew.sh):
|
||||||
|
|
||||||
```
|
```
|
||||||
brew install hexyl
|
brew install hexyl
|
||||||
```
|
```
|
||||||
|
|
||||||
|
...or via [MacPorts](https://www.macports.org):
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo port install hexyl
|
||||||
|
```
|
||||||
|
|
||||||
### On FreeBSD
|
### On FreeBSD
|
||||||
|
|
||||||
```
|
```
|
||||||
pkg install hexyl
|
pkg install hexyl
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### On NetBSD
|
||||||
|
|
||||||
|
```
|
||||||
|
pkgin install hexyl
|
||||||
|
```
|
||||||
|
|
||||||
|
### On OpenBSD
|
||||||
|
|
||||||
|
```
|
||||||
|
doas pkg_add hexyl
|
||||||
|
```
|
||||||
|
|
||||||
|
### on Termux
|
||||||
|
```
|
||||||
|
pkg install hexyl
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```
|
||||||
|
apt install hexyl
|
||||||
|
```
|
||||||
|
|
||||||
### Via Nix
|
### Via Nix
|
||||||
|
|
||||||
```
|
```
|
||||||
nix-env -i hexyl
|
nix-env -i hexyl
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Via Guix
|
||||||
|
|
||||||
|
```
|
||||||
|
guix package -i hexyl
|
||||||
|
```
|
||||||
|
|
||||||
|
Or add the `hexyl` package in the list of packages to be installed in your system configuration (e.g., `/etc/config.scm`).
|
||||||
|
|
||||||
### On other distributions
|
### On other distributions
|
||||||
|
|
||||||
Check out the [release page](https://github.com/sharkdp/hexyl/releases) for binary builds.
|
Check out the [release page](https://github.com/sharkdp/hexyl/releases) for binary builds.
|
||||||
|
|
||||||
### On Windows
|
### On Windows
|
||||||
|
|
||||||
For now, you will have to install from source via `cargo` (see below). Make sure that
|
Check out the [release page](https://github.com/sharkdp/hexyl/releases) for binary builds.
|
||||||
you use a terminal that supports ANSI escape sequences (like PowerShell on Windows 10).
|
Alternatively, install from source via `cargo`, `snap` or `scoop` (see below).
|
||||||
|
Make sure that you use a terminal that supports ANSI escape sequences (like ConHost v2 since Windows 10 1703
|
||||||
|
or Windows Terminal since Windows 10 1903).
|
||||||
|
|
||||||
### Via cargo
|
### Via cargo
|
||||||
|
|
||||||
If you have Rust 1.31 or higher, you can install `hexyl` from source via `cargo`:
|
If you have Rust 1.56 or higher, you can install `hexyl` from source via `cargo`:
|
||||||
```
|
```
|
||||||
cargo install hexyl
|
cargo install hexyl
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Alternatively, you can install `hexyl` directly from the repository by using:
|
||||||
|
```
|
||||||
|
git clone https://github.com/sharkdp/hexyl
|
||||||
|
cargo install --path ./hexyl
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: To convert the man page, you will need [Pandoc](https://pandoc.org/).
|
||||||
|
|
||||||
|
You can convert from Markdown by using (in the project root):
|
||||||
|
```
|
||||||
|
pandoc -s -f markdown -t man -o ./doc/hexyl.1 ./doc/hexyl.1.md
|
||||||
|
```
|
||||||
|
|
||||||
|
### Via snap package
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo snap install hexyl
|
||||||
|
```
|
||||||
|
[Get it from the Snap Store](https://snapcraft.io/hexyl)
|
||||||
|
|
||||||
|
|
||||||
|
### Via [Scoop](https://scoop.sh)
|
||||||
|
```
|
||||||
|
scoop install hexyl
|
||||||
|
```
|
||||||
|
|
||||||
|
### Via [X-CMD](https://x-cmd.com)
|
||||||
|
```
|
||||||
|
x env use hexyl
|
||||||
|
```
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Licensed under either of
|
Licensed under either of
|
||||||
|
|
||||||
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
|
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)
|
||||||
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
|
* MIT license ([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
at your option.
|
at your option.
|
||||||
@@ -1 +0,0 @@
|
|||||||
*.bash linguist-vendored
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Building and packaging for release
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
build() {
|
|
||||||
cargo build --target "$TARGET" --release --verbose
|
|
||||||
}
|
|
||||||
|
|
||||||
pack() {
|
|
||||||
local tempdir
|
|
||||||
local out_dir
|
|
||||||
local package_name
|
|
||||||
|
|
||||||
tempdir=$(mktemp -d 2>/dev/null || mktemp -d -t tmp)
|
|
||||||
out_dir=$(pwd)
|
|
||||||
package_name="$PROJECT_NAME-$TRAVIS_TAG-$TARGET"
|
|
||||||
|
|
||||||
# create a "staging" directory
|
|
||||||
mkdir "$tempdir/$package_name"
|
|
||||||
|
|
||||||
# copying the main binary
|
|
||||||
cp "target/$TARGET/release/$PROJECT_NAME" "$tempdir/$package_name/"
|
|
||||||
strip "$tempdir/$package_name/$PROJECT_NAME"
|
|
||||||
|
|
||||||
# readme and license
|
|
||||||
cp README.md "$tempdir/$package_name"
|
|
||||||
cp LICENSE-MIT "$tempdir/$package_name"
|
|
||||||
cp LICENSE-APACHE "$tempdir/$package_name"
|
|
||||||
|
|
||||||
# archiving
|
|
||||||
pushd "$tempdir"
|
|
||||||
tar czf "$out_dir/$package_name.tar.gz" "$package_name"/*
|
|
||||||
popd
|
|
||||||
rm -r "$tempdir"
|
|
||||||
}
|
|
||||||
|
|
||||||
make_deb() {
|
|
||||||
local tempdir
|
|
||||||
local architecture
|
|
||||||
local version
|
|
||||||
local dpkgname
|
|
||||||
local conflictname
|
|
||||||
|
|
||||||
case $TARGET in
|
|
||||||
x86_64*)
|
|
||||||
architecture=amd64
|
|
||||||
;;
|
|
||||||
i686*)
|
|
||||||
architecture=i386
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "ERROR: unknown target" >&2
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
version=${TRAVIS_TAG#v}
|
|
||||||
if [[ $TARGET = *musl* ]]; then
|
|
||||||
dpkgname=$PROJECT_NAME-musl
|
|
||||||
conflictname=$PROJECT_NAME
|
|
||||||
else
|
|
||||||
dpkgname=$PROJECT_NAME
|
|
||||||
conflictname=$PROJECT_NAME-musl
|
|
||||||
fi
|
|
||||||
|
|
||||||
tempdir=$(mktemp -d 2>/dev/null || mktemp -d -t tmp)
|
|
||||||
|
|
||||||
# copy the main binary
|
|
||||||
install -Dm755 "target/$TARGET/release/$PROJECT_NAME" "$tempdir/usr/bin/$PROJECT_NAME"
|
|
||||||
strip "$tempdir/usr/bin/$PROJECT_NAME"
|
|
||||||
|
|
||||||
# readme and license
|
|
||||||
install -Dm644 README.md "$tempdir/usr/share/doc/$PROJECT_NAME/README.md"
|
|
||||||
install -Dm644 LICENSE-MIT "$tempdir/usr/share/doc/$PROJECT_NAME/LICENSE-MIT"
|
|
||||||
install -Dm644 LICENSE-APACHE "$tempdir/usr/share/doc/$PROJECT_NAME/LICENSE-APACHE"
|
|
||||||
|
|
||||||
# Control file
|
|
||||||
mkdir "$tempdir/DEBIAN"
|
|
||||||
cat > "$tempdir/DEBIAN/control" <<EOF
|
|
||||||
Package: $dpkgname
|
|
||||||
Version: $version
|
|
||||||
Section: utils
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: David Peter <mail@david-peter.de>
|
|
||||||
Architecture: $architecture
|
|
||||||
Provides: $PROJECT_NAME
|
|
||||||
Conflicts: $conflictname
|
|
||||||
Description: A command-line hex viewer.
|
|
||||||
EOF
|
|
||||||
|
|
||||||
fakeroot dpkg-deb --build "$tempdir" "${dpkgname}_${version}_${architecture}.deb"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
main() {
|
|
||||||
build
|
|
||||||
pack
|
|
||||||
if [[ $TARGET = *linux* ]]; then
|
|
||||||
make_deb
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
main
|
|
||||||
+143
@@ -0,0 +1,143 @@
|
|||||||
|
% HEXYL(1) hexyl 0.12.0 | General Commands Manual
|
||||||
|
%
|
||||||
|
% 2022-12-05
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
hexyl - a command-line hex viewer
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
|
||||||
|
**hexyl** [_OPTIONS_] [_FILE_]
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
**hexyl** is a simple hex viewer for the terminal.
|
||||||
|
It uses a colored output to distinguish different categories of bytes (NULL
|
||||||
|
bytes, printable ASCII characters, ASCII whitespace characters, other ASCII
|
||||||
|
characters and non-ASCII).
|
||||||
|
|
||||||
|
# POSITIONAL ARGUMENTS
|
||||||
|
|
||||||
|
_FILE_
|
||||||
|
: The file to display.
|
||||||
|
If no _FILE_ argument is given, read from STDIN.
|
||||||
|
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
**-n**, **\--length** _N_
|
||||||
|
: Only read _N_ bytes from the input.
|
||||||
|
The _N_ argument can also include a unit with a decimal prefix (kB, MB, ..)
|
||||||
|
or binary prefix (kiB, MiB, ..), or can be specified using a hex number.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
:
|
||||||
|
|
||||||
|
Read the first 64 bytes:
|
||||||
|
: $ **hexyl \--length=64**
|
||||||
|
|
||||||
|
Read the first 4 kibibytes:
|
||||||
|
: $ **hexyl \--length=4KiB**
|
||||||
|
|
||||||
|
Read the first 255 bytes (specified using a hex number):
|
||||||
|
: $ **hexyl \--length=0xff**
|
||||||
|
|
||||||
|
**-c**, **\--bytes** _N_
|
||||||
|
: An alias for **-n**/**\--length**.
|
||||||
|
|
||||||
|
**-l** _N_
|
||||||
|
: Yet another alias for **-n**/**\--length**.
|
||||||
|
|
||||||
|
**-s**, **\--skip** _N_
|
||||||
|
: Skip the first _N_ bytes of the input.
|
||||||
|
The _N_ argument can also include a unit (see **\--length** for details).
|
||||||
|
A negative value is valid and will seek from the end of the file.
|
||||||
|
|
||||||
|
**\--block-size** _SIZE_
|
||||||
|
: Sets the size of the block unit to _SIZE_ (default is 512).
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
:
|
||||||
|
|
||||||
|
Sets the block size to 1024 bytes:
|
||||||
|
: $ **hexyl \--block-size=1024 \--length=5block**
|
||||||
|
|
||||||
|
Sets the block size to 4 kilobytes:
|
||||||
|
: $ **hexyl \--block-size=4kB \--length=2block**
|
||||||
|
|
||||||
|
**-v**, **\--no-squeezing**
|
||||||
|
: Displays all input data.
|
||||||
|
Otherwise any number of groups of output lines which would be identical to
|
||||||
|
the preceding group of lines, are replaced with a line comprised of a
|
||||||
|
single asterisk.
|
||||||
|
|
||||||
|
**\--color** _WHEN_
|
||||||
|
: When to use colors.
|
||||||
|
The auto-mode only displays colors if the output goes to an interactive
|
||||||
|
terminal.
|
||||||
|
|
||||||
|
Possible values:
|
||||||
|
|
||||||
|
: - **always** (default)
|
||||||
|
- **auto**
|
||||||
|
- **never**
|
||||||
|
|
||||||
|
**\--border** _STYLE_
|
||||||
|
: Whether to draw a border with Unicode characters, ASCII characters, or none
|
||||||
|
at all.
|
||||||
|
|
||||||
|
Possible values:
|
||||||
|
|
||||||
|
: - **unicode** (default)
|
||||||
|
- **ascii**
|
||||||
|
- **none**
|
||||||
|
|
||||||
|
**-o**, **\--display-offset** _N_
|
||||||
|
: Add _N_ bytes to the displayed file position.
|
||||||
|
The _N_ argument can also include a unit (see **\--length** for details).
|
||||||
|
A negative value is valid and calculates an offset relative to the end of
|
||||||
|
the file.
|
||||||
|
|
||||||
|
**-h**, **\--help**
|
||||||
|
: Prints help information.
|
||||||
|
|
||||||
|
**-V**, **\--version**
|
||||||
|
: Prints version information.
|
||||||
|
|
||||||
|
# NOTES
|
||||||
|
|
||||||
|
Source repository:
|
||||||
|
: <https://github.com/sharkdp/hexyl>
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
Print a given file:
|
||||||
|
: $ **hexyl small.png**
|
||||||
|
|
||||||
|
Print and view a given file in the terminal pager:
|
||||||
|
: $ **hexyl big.png | less -r**
|
||||||
|
|
||||||
|
Print the first 256 bytes of a given special file:
|
||||||
|
: $ **hexyl -n 256 /dev/urandom**
|
||||||
|
|
||||||
|
# AUTHORS
|
||||||
|
|
||||||
|
**hexyl** was written by David Peter <mail@david-peter.de>.
|
||||||
|
|
||||||
|
# REPORTING BUGS
|
||||||
|
|
||||||
|
Bugs can be reported on GitHub at:
|
||||||
|
: <https://github.com/sharkdp/hexyl/issues>
|
||||||
|
|
||||||
|
# COPYRIGHT
|
||||||
|
|
||||||
|
**hexyl** is dual-licensed under:
|
||||||
|
|
||||||
|
: - Apache License 2.0 (<https://www.apache.org/licenses/LICENSE-2.0>)
|
||||||
|
- MIT License (<https://opensource.org/licenses/MIT>)
|
||||||
|
|
||||||
|
# SEE ALSO
|
||||||
|
|
||||||
|
**hexdump**(1), **xxd**(1)
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
use std::io;
|
||||||
|
|
||||||
|
use hexyl::{BorderStyle, PrinterBuilder};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let input = vec![
|
||||||
|
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44,
|
||||||
|
0x52, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x08, 0x02, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
|
||||||
|
let stdout = io::stdout();
|
||||||
|
let mut handle = stdout.lock();
|
||||||
|
|
||||||
|
let mut printer = PrinterBuilder::new(&mut handle)
|
||||||
|
.show_color(true)
|
||||||
|
.show_char_panel(true)
|
||||||
|
.show_position_panel(true)
|
||||||
|
.with_border_style(BorderStyle::Unicode)
|
||||||
|
.enable_squeezing(false)
|
||||||
|
.num_panels(2)
|
||||||
|
.group_size(1)
|
||||||
|
.build();
|
||||||
|
printer.print_all(&input[..]).unwrap();
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
use owo_colors::{colors, Color};
|
||||||
|
|
||||||
|
pub const COLOR_NULL: &[u8] = colors::BrightBlack::ANSI_FG.as_bytes();
|
||||||
|
pub const COLOR_OFFSET: &[u8] = colors::BrightBlack::ANSI_FG.as_bytes();
|
||||||
|
pub const COLOR_ASCII_PRINTABLE: &[u8] = colors::Cyan::ANSI_FG.as_bytes();
|
||||||
|
pub const COLOR_ASCII_WHITESPACE: &[u8] = colors::Green::ANSI_FG.as_bytes();
|
||||||
|
pub const COLOR_ASCII_OTHER: &[u8] = colors::Green::ANSI_FG.as_bytes();
|
||||||
|
pub const COLOR_NONASCII: &[u8] = colors::Yellow::ANSI_FG.as_bytes();
|
||||||
|
pub const COLOR_RESET: &[u8] = colors::Default::ANSI_FG.as_bytes();
|
||||||
|
|
||||||
|
#[rustfmt::skip]
|
||||||
|
pub const CP437: [char; 256] = [
|
||||||
|
// Copyright (c) 2016, Delan Azabani <delan@azabani.com>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// modified to use the ⋄ character instead of ␀
|
||||||
|
|
||||||
|
// use https://en.wikipedia.org/w/index.php?title=Code_page_437&oldid=978947122
|
||||||
|
// not ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP437.TXT
|
||||||
|
// because we want the graphic versions of 01h–1Fh + 7Fh
|
||||||
|
'⋄','☺','☻','♥','♦','♣','♠','•','◘','○','◙','♂','♀','♪','♫','☼',
|
||||||
|
'►','◄','↕','‼','¶','§','▬','↨','↑','↓','→','←','∟','↔','▲','▼',
|
||||||
|
' ','!','"','#','$','%','&','\'','(',')','*','+',',','-','.','/',
|
||||||
|
'0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?',
|
||||||
|
'@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
|
||||||
|
'P','Q','R','S','T','U','V','W','X','Y','Z','[','\\',']','^','_',
|
||||||
|
'`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
|
||||||
|
'p','q','r','s','t','u','v','w','x','y','z','{','|','}','~','⌂',
|
||||||
|
'Ç','ü','é','â','ä','à','å','ç','ê','ë','è','ï','î','ì','Ä','Å',
|
||||||
|
'É','æ','Æ','ô','ö','ò','û','ù','ÿ','Ö','Ü','¢','£','¥','₧','ƒ',
|
||||||
|
'á','í','ó','ú','ñ','Ñ','ª','º','¿','⌐','¬','½','¼','¡','«','»',
|
||||||
|
'░','▒','▓','│','┤','╡','╢','╖','╕','╣','║','╗','╝','╜','╛','┐',
|
||||||
|
'└','┴','┬','├','─','┼','╞','╟','╚','╔','╩','╦','╠','═','╬','╧',
|
||||||
|
'╨','╤','╥','╙','╘','╒','╓','╫','╪','┘','┌','█','▄','▌','▐','▀',
|
||||||
|
'α','ß','Γ','π','Σ','σ','µ','τ','Φ','Θ','Ω','δ','∞','φ','ε','∩',
|
||||||
|
'≡','±','≥','≤','⌠','⌡','÷','≈','°','∙','·','√','ⁿ','²','■','ff',
|
||||||
|
];
|
||||||
|
|
||||||
|
#[rustfmt::skip]
|
||||||
|
pub const CP1047: [char; 256] = [
|
||||||
|
//
|
||||||
|
// Copyright (c) 2016,2024 IBM Corporation and other Contributors.
|
||||||
|
//
|
||||||
|
// All rights reserved. This program and the accompanying materials
|
||||||
|
// are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
// which accompanies this distribution, and is available at
|
||||||
|
// http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
//
|
||||||
|
// Contributors:
|
||||||
|
// Mark Taylor - Initial Contribution
|
||||||
|
//
|
||||||
|
|
||||||
|
// ref1 https://github.com/ibm-messaging/mq-smf-csv/blob/master/src/smfConv.c
|
||||||
|
// ref2 https://web.archive.org/web/20150607033635/http://www-01.ibm.com/software/globalization/cp/cp01047.html
|
||||||
|
'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',
|
||||||
|
'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',
|
||||||
|
'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',
|
||||||
|
'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.',
|
||||||
|
' ','.','.','.','.','.','.','.','.','.','$','.','<','(','+','|',
|
||||||
|
'&','.','.','.','.','.','.','.','.','.','!','$','*',')',';','.',
|
||||||
|
'-','/','.','.','.','.','.','.','.','.','.',',','%','_','>','?',
|
||||||
|
'.','.','.','.','.','.','.','.','.','.',':','#','@','\'','=','.',
|
||||||
|
'.','a','b','c','d','e','f','g','h','i','.','{','.','(','+','.',
|
||||||
|
'.','j','k','l','m','n','o','p','q','r','.','}','.',')','.','.',
|
||||||
|
'.','~','s','t','u','v','w','x','y','z','.','.','.','.','.','.',
|
||||||
|
'.','.','.','.','.','.','.','.','.','.','[',']','.','.','.','-',
|
||||||
|
'{','A','B','C','D','E','F','G','H','I','.','.','.','.','.','.',
|
||||||
|
'}','J','K','L','M','N','O','P','Q','R','.','.','.','.','.','.',
|
||||||
|
'.','.','S','T','U','V','W','X','Y','Z','.','.','.','.','.','.',
|
||||||
|
'0','1','2','3','4','5','6','7','8','9','.','.','.','.','.','.'
|
||||||
|
];
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
use std::fs;
|
||||||
|
use std::io::{self, copy, sink, Read, Seek, SeekFrom};
|
||||||
|
|
||||||
|
pub enum Input<'a> {
|
||||||
|
File(fs::File),
|
||||||
|
Stdin(io::StdinLock<'a>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Read for Input<'a> {
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||||
|
match *self {
|
||||||
|
Input::File(ref mut file) => file.read(buf),
|
||||||
|
Input::Stdin(ref mut stdin) => stdin.read(buf),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Seek for Input<'a> {
|
||||||
|
fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
|
||||||
|
fn try_skip<R>(reader: R, pos: SeekFrom, err_desc: &'static str) -> io::Result<u64>
|
||||||
|
where
|
||||||
|
R: Read,
|
||||||
|
{
|
||||||
|
let cant_seek_abs_err = || Err(io::Error::new(io::ErrorKind::Other, err_desc));
|
||||||
|
|
||||||
|
let offset = match pos {
|
||||||
|
SeekFrom::Current(o) => u64::try_from(o).or_else(|_e| cant_seek_abs_err())?,
|
||||||
|
SeekFrom::Start(_) | SeekFrom::End(_) => cant_seek_abs_err()?,
|
||||||
|
};
|
||||||
|
|
||||||
|
copy(&mut reader.take(offset), &mut sink())
|
||||||
|
}
|
||||||
|
|
||||||
|
match *self {
|
||||||
|
Input::File(ref mut file) => {
|
||||||
|
let seek_res = file.seek(pos);
|
||||||
|
if let Err(Some(libc::ESPIPE)) = seek_res.as_ref().map_err(|err| err.raw_os_error())
|
||||||
|
{
|
||||||
|
try_skip(
|
||||||
|
file,
|
||||||
|
pos,
|
||||||
|
"Pipes only support seeking forward with a relative offset",
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
seek_res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Input::Stdin(ref mut stdin) => try_skip(
|
||||||
|
stdin,
|
||||||
|
pos,
|
||||||
|
"STDIN only supports seeking forward with a relative offset",
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Input<'a> {
|
||||||
|
pub fn into_inner(self) -> Box<dyn Read + 'a> {
|
||||||
|
match self {
|
||||||
|
Input::File(file) => Box::new(file),
|
||||||
|
Input::Stdin(stdin) => Box::new(stdin),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+942
@@ -0,0 +1,942 @@
|
|||||||
|
pub(crate) mod colors;
|
||||||
|
pub(crate) mod input;
|
||||||
|
|
||||||
|
pub use colors::*;
|
||||||
|
pub use input::*;
|
||||||
|
|
||||||
|
use std::io::{self, BufReader, Read, Write};
|
||||||
|
|
||||||
|
use clap::ValueEnum;
|
||||||
|
|
||||||
|
pub enum Base {
|
||||||
|
Binary,
|
||||||
|
Octal,
|
||||||
|
Decimal,
|
||||||
|
Hexadecimal,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub enum ByteCategory {
|
||||||
|
Null,
|
||||||
|
AsciiPrintable,
|
||||||
|
AsciiWhitespace,
|
||||||
|
AsciiOther,
|
||||||
|
NonAscii,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug, Default, ValueEnum)]
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub enum CharacterTable {
|
||||||
|
/// Show printable ASCII characters as-is, '⋄' for NULL bytes, ' ' for
|
||||||
|
/// space, '_' for other ASCII whitespace, '•' for other ASCII characters,
|
||||||
|
/// and '×' for non-ASCII bytes.
|
||||||
|
#[default]
|
||||||
|
Default,
|
||||||
|
|
||||||
|
/// Show printable ASCII as-is, ' ' for space, '.' for everything else.
|
||||||
|
Ascii,
|
||||||
|
|
||||||
|
/// Show printable EBCDIC as-is, ' ' for space, '.' for everything else.
|
||||||
|
#[value(name = "codepage-1047")]
|
||||||
|
CP1047,
|
||||||
|
|
||||||
|
/// Uses code page 437 (for non-ASCII bytes).
|
||||||
|
#[value(name = "codepage-437")]
|
||||||
|
CP437,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug, Default, ValueEnum)]
|
||||||
|
pub enum Endianness {
|
||||||
|
/// Print out groups in little-endian format.
|
||||||
|
Little,
|
||||||
|
|
||||||
|
/// Print out groups in big-endian format.
|
||||||
|
#[default]
|
||||||
|
Big,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq)]
|
||||||
|
enum Squeezer {
|
||||||
|
Print,
|
||||||
|
Delete,
|
||||||
|
Ignore,
|
||||||
|
Disabled,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
struct Byte(u8);
|
||||||
|
|
||||||
|
impl Byte {
|
||||||
|
fn category(self) -> ByteCategory {
|
||||||
|
if self.0 == 0x00 {
|
||||||
|
ByteCategory::Null
|
||||||
|
} else if self.0.is_ascii_graphic() {
|
||||||
|
ByteCategory::AsciiPrintable
|
||||||
|
} else if self.0.is_ascii_whitespace() {
|
||||||
|
ByteCategory::AsciiWhitespace
|
||||||
|
} else if self.0.is_ascii() {
|
||||||
|
ByteCategory::AsciiOther
|
||||||
|
} else {
|
||||||
|
ByteCategory::NonAscii
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn color(self) -> &'static [u8] {
|
||||||
|
use crate::ByteCategory::*;
|
||||||
|
match self.category() {
|
||||||
|
Null => COLOR_NULL,
|
||||||
|
AsciiPrintable => COLOR_ASCII_PRINTABLE,
|
||||||
|
AsciiWhitespace => COLOR_ASCII_WHITESPACE,
|
||||||
|
AsciiOther => COLOR_ASCII_OTHER,
|
||||||
|
NonAscii => COLOR_NONASCII,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_char(self, character_table: CharacterTable) -> char {
|
||||||
|
use crate::ByteCategory::*;
|
||||||
|
match character_table {
|
||||||
|
CharacterTable::Default => match self.category() {
|
||||||
|
Null => '⋄',
|
||||||
|
AsciiPrintable => self.0 as char,
|
||||||
|
AsciiWhitespace if self.0 == 0x20 => ' ',
|
||||||
|
AsciiWhitespace => '_',
|
||||||
|
AsciiOther => '•',
|
||||||
|
NonAscii => '×',
|
||||||
|
},
|
||||||
|
CharacterTable::Ascii => match self.category() {
|
||||||
|
Null => '.',
|
||||||
|
AsciiPrintable => self.0 as char,
|
||||||
|
AsciiWhitespace if self.0 == 0x20 => ' ',
|
||||||
|
AsciiWhitespace => '.',
|
||||||
|
AsciiOther => '.',
|
||||||
|
NonAscii => '.',
|
||||||
|
},
|
||||||
|
CharacterTable::CP1047 => CP1047[self.0 as usize],
|
||||||
|
CharacterTable::CP437 => CP437[self.0 as usize],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct BorderElements {
|
||||||
|
left_corner: char,
|
||||||
|
horizontal_line: char,
|
||||||
|
column_separator: char,
|
||||||
|
right_corner: char,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, Default, ValueEnum)]
|
||||||
|
pub enum BorderStyle {
|
||||||
|
/// Draw a border with Unicode characters.
|
||||||
|
#[default]
|
||||||
|
Unicode,
|
||||||
|
|
||||||
|
/// Draw a border with ASCII characters.
|
||||||
|
Ascii,
|
||||||
|
|
||||||
|
/// Do not draw a border at all.
|
||||||
|
None,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BorderStyle {
|
||||||
|
fn header_elems(&self) -> Option<BorderElements> {
|
||||||
|
match self {
|
||||||
|
BorderStyle::Unicode => Some(BorderElements {
|
||||||
|
left_corner: '┌',
|
||||||
|
horizontal_line: '─',
|
||||||
|
column_separator: '┬',
|
||||||
|
right_corner: '┐',
|
||||||
|
}),
|
||||||
|
BorderStyle::Ascii => Some(BorderElements {
|
||||||
|
left_corner: '+',
|
||||||
|
horizontal_line: '-',
|
||||||
|
column_separator: '+',
|
||||||
|
right_corner: '+',
|
||||||
|
}),
|
||||||
|
BorderStyle::None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn footer_elems(&self) -> Option<BorderElements> {
|
||||||
|
match self {
|
||||||
|
BorderStyle::Unicode => Some(BorderElements {
|
||||||
|
left_corner: '└',
|
||||||
|
horizontal_line: '─',
|
||||||
|
column_separator: '┴',
|
||||||
|
right_corner: '┘',
|
||||||
|
}),
|
||||||
|
BorderStyle::Ascii => Some(BorderElements {
|
||||||
|
left_corner: '+',
|
||||||
|
horizontal_line: '-',
|
||||||
|
column_separator: '+',
|
||||||
|
right_corner: '+',
|
||||||
|
}),
|
||||||
|
BorderStyle::None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn outer_sep(&self) -> char {
|
||||||
|
match self {
|
||||||
|
BorderStyle::Unicode => '│',
|
||||||
|
BorderStyle::Ascii => '|',
|
||||||
|
BorderStyle::None => ' ',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn inner_sep(&self) -> char {
|
||||||
|
match self {
|
||||||
|
BorderStyle::Unicode => '┊',
|
||||||
|
BorderStyle::Ascii => '|',
|
||||||
|
BorderStyle::None => ' ',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct PrinterBuilder<'a, Writer: Write> {
|
||||||
|
writer: &'a mut Writer,
|
||||||
|
show_color: bool,
|
||||||
|
show_char_panel: bool,
|
||||||
|
show_position_panel: bool,
|
||||||
|
border_style: BorderStyle,
|
||||||
|
use_squeeze: bool,
|
||||||
|
panels: u64,
|
||||||
|
group_size: u8,
|
||||||
|
base: Base,
|
||||||
|
endianness: Endianness,
|
||||||
|
character_table: CharacterTable,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, Writer: Write> PrinterBuilder<'a, Writer> {
|
||||||
|
pub fn new(writer: &'a mut Writer) -> Self {
|
||||||
|
PrinterBuilder {
|
||||||
|
writer,
|
||||||
|
show_color: true,
|
||||||
|
show_char_panel: true,
|
||||||
|
show_position_panel: true,
|
||||||
|
border_style: BorderStyle::Unicode,
|
||||||
|
use_squeeze: true,
|
||||||
|
panels: 2,
|
||||||
|
group_size: 1,
|
||||||
|
base: Base::Hexadecimal,
|
||||||
|
endianness: Endianness::Big,
|
||||||
|
character_table: CharacterTable::Default,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn show_color(mut self, show_color: bool) -> Self {
|
||||||
|
self.show_color = show_color;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn show_char_panel(mut self, show_char_panel: bool) -> Self {
|
||||||
|
self.show_char_panel = show_char_panel;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn show_position_panel(mut self, show_position_panel: bool) -> Self {
|
||||||
|
self.show_position_panel = show_position_panel;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_border_style(mut self, border_style: BorderStyle) -> Self {
|
||||||
|
self.border_style = border_style;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn enable_squeezing(mut self, enable: bool) -> Self {
|
||||||
|
self.use_squeeze = enable;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn num_panels(mut self, num: u64) -> Self {
|
||||||
|
self.panels = num;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn group_size(mut self, num: u8) -> Self {
|
||||||
|
self.group_size = num;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_base(mut self, base: Base) -> Self {
|
||||||
|
self.base = base;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn endianness(mut self, endianness: Endianness) -> Self {
|
||||||
|
self.endianness = endianness;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn character_table(mut self, character_table: CharacterTable) -> Self {
|
||||||
|
self.character_table = character_table;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build(self) -> Printer<'a, Writer> {
|
||||||
|
Printer::new(
|
||||||
|
self.writer,
|
||||||
|
self.show_color,
|
||||||
|
self.show_char_panel,
|
||||||
|
self.show_position_panel,
|
||||||
|
self.border_style,
|
||||||
|
self.use_squeeze,
|
||||||
|
self.panels,
|
||||||
|
self.group_size,
|
||||||
|
self.base,
|
||||||
|
self.endianness,
|
||||||
|
self.character_table,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Printer<'a, Writer: Write> {
|
||||||
|
idx: u64,
|
||||||
|
/// the buffer containing all the bytes in a line for character printing
|
||||||
|
line_buf: Vec<u8>,
|
||||||
|
writer: &'a mut Writer,
|
||||||
|
show_char_panel: bool,
|
||||||
|
show_position_panel: bool,
|
||||||
|
show_color: bool,
|
||||||
|
curr_color: Option<&'static [u8]>,
|
||||||
|
border_style: BorderStyle,
|
||||||
|
byte_hex_panel: Vec<String>,
|
||||||
|
byte_char_panel: Vec<String>,
|
||||||
|
// same as previous but in Fixed(242) gray color, for position panel
|
||||||
|
byte_hex_panel_g: Vec<String>,
|
||||||
|
squeezer: Squeezer,
|
||||||
|
display_offset: u64,
|
||||||
|
/// The number of panels to draw.
|
||||||
|
panels: u64,
|
||||||
|
squeeze_byte: usize,
|
||||||
|
/// The number of octets per group.
|
||||||
|
group_size: u8,
|
||||||
|
/// The number of digits used to write the base.
|
||||||
|
base_digits: u8,
|
||||||
|
/// Whether to show groups in little or big endian format.
|
||||||
|
endianness: Endianness,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, Writer: Write> Printer<'a, Writer> {
|
||||||
|
fn new(
|
||||||
|
writer: &'a mut Writer,
|
||||||
|
show_color: bool,
|
||||||
|
show_char_panel: bool,
|
||||||
|
show_position_panel: bool,
|
||||||
|
border_style: BorderStyle,
|
||||||
|
use_squeeze: bool,
|
||||||
|
panels: u64,
|
||||||
|
group_size: u8,
|
||||||
|
base: Base,
|
||||||
|
endianness: Endianness,
|
||||||
|
character_table: CharacterTable,
|
||||||
|
) -> Printer<'a, Writer> {
|
||||||
|
Printer {
|
||||||
|
idx: 0,
|
||||||
|
line_buf: vec![0x0; 8 * panels as usize],
|
||||||
|
writer,
|
||||||
|
show_char_panel,
|
||||||
|
show_position_panel,
|
||||||
|
show_color,
|
||||||
|
curr_color: None,
|
||||||
|
border_style,
|
||||||
|
byte_hex_panel: (0u8..=u8::MAX)
|
||||||
|
.map(|i| match base {
|
||||||
|
Base::Binary => format!("{i:08b}"),
|
||||||
|
Base::Octal => format!("{i:03o}"),
|
||||||
|
Base::Decimal => format!("{i:03}"),
|
||||||
|
Base::Hexadecimal => format!("{i:02x}"),
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
|
byte_char_panel: (0u8..=u8::MAX)
|
||||||
|
.map(|i| format!("{}", Byte(i).as_char(character_table)))
|
||||||
|
.collect(),
|
||||||
|
byte_hex_panel_g: (0u8..=u8::MAX).map(|i| format!("{i:02x}")).collect(),
|
||||||
|
squeezer: if use_squeeze {
|
||||||
|
Squeezer::Ignore
|
||||||
|
} else {
|
||||||
|
Squeezer::Disabled
|
||||||
|
},
|
||||||
|
display_offset: 0,
|
||||||
|
panels,
|
||||||
|
squeeze_byte: 0x00,
|
||||||
|
group_size,
|
||||||
|
base_digits: match base {
|
||||||
|
Base::Binary => 8,
|
||||||
|
Base::Octal => 3,
|
||||||
|
Base::Decimal => 3,
|
||||||
|
Base::Hexadecimal => 2,
|
||||||
|
},
|
||||||
|
endianness,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn display_offset(&mut self, display_offset: u64) -> &mut Self {
|
||||||
|
self.display_offset = display_offset;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn panel_sz(&self) -> usize {
|
||||||
|
// add one to include the trailing space of a group
|
||||||
|
let group_sz = self.base_digits as usize * self.group_size as usize + 1;
|
||||||
|
let group_per_panel = 8 / self.group_size as usize;
|
||||||
|
// add one to include the leading space
|
||||||
|
1 + group_sz * group_per_panel
|
||||||
|
}
|
||||||
|
|
||||||
|
fn write_border(&mut self, border_elements: BorderElements) -> io::Result<()> {
|
||||||
|
let h = border_elements.horizontal_line;
|
||||||
|
let c = border_elements.column_separator;
|
||||||
|
let l = border_elements.left_corner;
|
||||||
|
let r = border_elements.right_corner;
|
||||||
|
let h8 = h.to_string().repeat(8);
|
||||||
|
let h_repeat = h.to_string().repeat(self.panel_sz());
|
||||||
|
|
||||||
|
if self.show_position_panel {
|
||||||
|
write!(self.writer, "{l}{h8}{c}")?;
|
||||||
|
} else {
|
||||||
|
write!(self.writer, "{l}")?;
|
||||||
|
}
|
||||||
|
|
||||||
|
for _ in 0..self.panels - 1 {
|
||||||
|
write!(self.writer, "{h_repeat}{c}")?;
|
||||||
|
}
|
||||||
|
if self.show_char_panel {
|
||||||
|
write!(self.writer, "{h_repeat}{c}")?;
|
||||||
|
} else {
|
||||||
|
write!(self.writer, "{h_repeat}")?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.show_char_panel {
|
||||||
|
for _ in 0..self.panels - 1 {
|
||||||
|
write!(self.writer, "{h8}{c}")?;
|
||||||
|
}
|
||||||
|
writeln!(self.writer, "{h8}{r}")?;
|
||||||
|
} else {
|
||||||
|
writeln!(self.writer, "{r}")?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn print_header(&mut self) -> io::Result<()> {
|
||||||
|
if let Some(e) = self.border_style.header_elems() {
|
||||||
|
self.write_border(e)?
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn print_footer(&mut self) -> io::Result<()> {
|
||||||
|
if let Some(e) = self.border_style.footer_elems() {
|
||||||
|
self.write_border(e)?
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_position_panel(&mut self) -> io::Result<()> {
|
||||||
|
self.writer.write_all(
|
||||||
|
self.border_style
|
||||||
|
.outer_sep()
|
||||||
|
.encode_utf8(&mut [0; 4])
|
||||||
|
.as_bytes(),
|
||||||
|
)?;
|
||||||
|
if self.show_color {
|
||||||
|
self.writer.write_all(COLOR_OFFSET)?;
|
||||||
|
}
|
||||||
|
if self.show_position_panel {
|
||||||
|
match self.squeezer {
|
||||||
|
Squeezer::Print => {
|
||||||
|
self.writer.write_all(&[b'*'])?;
|
||||||
|
if self.show_color {
|
||||||
|
self.writer.write_all(COLOR_RESET)?;
|
||||||
|
}
|
||||||
|
self.writer.write_all(b" ")?;
|
||||||
|
}
|
||||||
|
Squeezer::Ignore | Squeezer::Disabled | Squeezer::Delete => {
|
||||||
|
let byte_index: [u8; 8] = (self.idx + self.display_offset).to_be_bytes();
|
||||||
|
let mut i = 0;
|
||||||
|
while byte_index[i] == 0x0 && i < 4 {
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
for &byte in byte_index.iter().skip(i) {
|
||||||
|
self.writer
|
||||||
|
.write_all(self.byte_hex_panel_g[byte as usize].as_bytes())?;
|
||||||
|
}
|
||||||
|
if self.show_color {
|
||||||
|
self.writer.write_all(COLOR_RESET)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.writer.write_all(
|
||||||
|
self.border_style
|
||||||
|
.outer_sep()
|
||||||
|
.encode_utf8(&mut [0; 4])
|
||||||
|
.as_bytes(),
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_char(&mut self, i: u64) -> io::Result<()> {
|
||||||
|
match self.squeezer {
|
||||||
|
Squeezer::Print | Squeezer::Delete => self.writer.write_all(b" ")?,
|
||||||
|
Squeezer::Ignore | Squeezer::Disabled => {
|
||||||
|
if let Some(&b) = self.line_buf.get(i as usize) {
|
||||||
|
if self.show_color && self.curr_color != Some(Byte(b).color()) {
|
||||||
|
self.writer.write_all(Byte(b).color())?;
|
||||||
|
self.curr_color = Some(Byte(b).color());
|
||||||
|
}
|
||||||
|
self.writer
|
||||||
|
.write_all(self.byte_char_panel[b as usize].as_bytes())?;
|
||||||
|
} else {
|
||||||
|
self.squeezer = Squeezer::Print;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if i == 8 * self.panels - 1 {
|
||||||
|
if self.show_color {
|
||||||
|
self.writer.write_all(COLOR_RESET)?;
|
||||||
|
self.curr_color = None;
|
||||||
|
}
|
||||||
|
self.writer.write_all(
|
||||||
|
self.border_style
|
||||||
|
.outer_sep()
|
||||||
|
.encode_utf8(&mut [0; 4])
|
||||||
|
.as_bytes(),
|
||||||
|
)?;
|
||||||
|
} else if i % 8 == 7 {
|
||||||
|
if self.show_color {
|
||||||
|
self.writer.write_all(COLOR_RESET)?;
|
||||||
|
self.curr_color = None;
|
||||||
|
}
|
||||||
|
self.writer.write_all(
|
||||||
|
self.border_style
|
||||||
|
.inner_sep()
|
||||||
|
.encode_utf8(&mut [0; 4])
|
||||||
|
.as_bytes(),
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn print_char_panel(&mut self) -> io::Result<()> {
|
||||||
|
for i in 0..self.line_buf.len() {
|
||||||
|
self.print_char(i as u64)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_byte(&mut self, i: usize, b: u8) -> io::Result<()> {
|
||||||
|
match self.squeezer {
|
||||||
|
Squeezer::Print => {
|
||||||
|
if !self.show_position_panel && i == 0 {
|
||||||
|
if self.show_color {
|
||||||
|
self.writer.write_all(COLOR_OFFSET)?;
|
||||||
|
}
|
||||||
|
self.writer
|
||||||
|
.write_all(self.byte_char_panel[b'*' as usize].as_bytes())?;
|
||||||
|
if self.show_color {
|
||||||
|
self.writer.write_all(COLOR_RESET)?;
|
||||||
|
}
|
||||||
|
} else if i % (self.group_size as usize) == 0 {
|
||||||
|
self.writer.write_all(b" ")?;
|
||||||
|
}
|
||||||
|
for _ in 0..self.base_digits {
|
||||||
|
self.writer.write_all(b" ")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Squeezer::Delete => self.writer.write_all(b" ")?,
|
||||||
|
Squeezer::Ignore | Squeezer::Disabled => {
|
||||||
|
if i % (self.group_size as usize) == 0 {
|
||||||
|
self.writer.write_all(b" ")?;
|
||||||
|
}
|
||||||
|
if self.show_color && self.curr_color != Some(Byte(b).color()) {
|
||||||
|
self.writer.write_all(Byte(b).color())?;
|
||||||
|
self.curr_color = Some(Byte(b).color());
|
||||||
|
}
|
||||||
|
self.writer
|
||||||
|
.write_all(self.byte_hex_panel[b as usize].as_bytes())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// byte is last in panel
|
||||||
|
if i % 8 == 7 {
|
||||||
|
if self.show_color {
|
||||||
|
self.curr_color = None;
|
||||||
|
self.writer.write_all(COLOR_RESET)?;
|
||||||
|
}
|
||||||
|
self.writer.write_all(b" ")?;
|
||||||
|
// byte is last in last panel
|
||||||
|
if i as u64 % (8 * self.panels) == 8 * self.panels - 1 {
|
||||||
|
self.writer.write_all(
|
||||||
|
self.border_style
|
||||||
|
.outer_sep()
|
||||||
|
.encode_utf8(&mut [0; 4])
|
||||||
|
.as_bytes(),
|
||||||
|
)?;
|
||||||
|
} else {
|
||||||
|
self.writer.write_all(
|
||||||
|
self.border_style
|
||||||
|
.inner_sep()
|
||||||
|
.encode_utf8(&mut [0; 4])
|
||||||
|
.as_bytes(),
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reorder_buffer_to_little_endian(&self, buf: &mut Vec<u8>) {
|
||||||
|
let n = buf.len();
|
||||||
|
let group_sz = self.group_size as usize;
|
||||||
|
|
||||||
|
for idx in (0..n).step_by(group_sz) {
|
||||||
|
let remaining = n - idx;
|
||||||
|
let total = remaining.min(group_sz);
|
||||||
|
|
||||||
|
buf[idx..idx + total].reverse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn print_bytes(&mut self) -> io::Result<()> {
|
||||||
|
let mut buf = self.line_buf.clone();
|
||||||
|
|
||||||
|
if matches!(self.endianness, Endianness::Little) {
|
||||||
|
self.reorder_buffer_to_little_endian(&mut buf);
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i, &b) in buf.iter().enumerate() {
|
||||||
|
self.print_byte(i, b)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Loop through the given `Reader`, printing until the `Reader` buffer
|
||||||
|
/// is exhausted.
|
||||||
|
pub fn print_all<Reader: Read>(&mut self, reader: Reader) -> io::Result<()> {
|
||||||
|
let mut is_empty = true;
|
||||||
|
|
||||||
|
let mut buf = BufReader::new(reader);
|
||||||
|
|
||||||
|
let leftover = loop {
|
||||||
|
// read a maximum of 8 * self.panels bytes from the reader
|
||||||
|
if let Ok(n) = buf.read(&mut self.line_buf) {
|
||||||
|
if n > 0 && n < 8 * self.panels as usize {
|
||||||
|
// if less are read, that indicates end of file after
|
||||||
|
if is_empty {
|
||||||
|
self.print_header()?;
|
||||||
|
is_empty = false;
|
||||||
|
}
|
||||||
|
let mut leftover = n;
|
||||||
|
// loop until input is ceased
|
||||||
|
if let Some(s) = loop {
|
||||||
|
if let Ok(n) = buf.read(&mut self.line_buf[leftover..]) {
|
||||||
|
leftover += n;
|
||||||
|
// there is no more input being read
|
||||||
|
if n == 0 {
|
||||||
|
self.line_buf.resize(leftover, 0);
|
||||||
|
break Some(leftover);
|
||||||
|
}
|
||||||
|
// amount read has exceeded line buffer
|
||||||
|
if leftover >= 8 * self.panels as usize {
|
||||||
|
break None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} {
|
||||||
|
break Some(s);
|
||||||
|
};
|
||||||
|
} else if n == 0 {
|
||||||
|
// if no bytes are read, that indicates end of file
|
||||||
|
if self.squeezer == Squeezer::Delete {
|
||||||
|
// empty the last line when ending is squeezed
|
||||||
|
self.line_buf.clear();
|
||||||
|
break Some(0);
|
||||||
|
}
|
||||||
|
break None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if is_empty {
|
||||||
|
self.print_header()?;
|
||||||
|
}
|
||||||
|
|
||||||
|
// squeeze is active, check if the line is the same
|
||||||
|
// skip print if still squeezed, otherwise print and deactivate squeeze
|
||||||
|
if matches!(self.squeezer, Squeezer::Print | Squeezer::Delete) {
|
||||||
|
if self
|
||||||
|
.line_buf
|
||||||
|
.chunks_exact(std::mem::size_of::<usize>())
|
||||||
|
.all(|w| usize::from_ne_bytes(w.try_into().unwrap()) == self.squeeze_byte)
|
||||||
|
{
|
||||||
|
if self.squeezer == Squeezer::Delete {
|
||||||
|
self.idx += 8 * self.panels;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.squeezer = Squeezer::Ignore;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// print the line
|
||||||
|
self.print_position_panel()?;
|
||||||
|
self.print_bytes()?;
|
||||||
|
if self.show_char_panel {
|
||||||
|
self.print_char_panel()?;
|
||||||
|
}
|
||||||
|
self.writer.write_all(b"\n")?;
|
||||||
|
|
||||||
|
if is_empty {
|
||||||
|
self.writer.flush()?;
|
||||||
|
is_empty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// increment index to next line
|
||||||
|
self.idx += 8 * self.panels;
|
||||||
|
|
||||||
|
// change from print to delete if squeeze is still active
|
||||||
|
if self.squeezer == Squeezer::Print {
|
||||||
|
self.squeezer = Squeezer::Delete;
|
||||||
|
}
|
||||||
|
|
||||||
|
// repeat the first byte in the line until it's a usize
|
||||||
|
// compare that usize with each usize chunk in the line
|
||||||
|
// if they are all the same, change squeezer to print
|
||||||
|
let repeat_byte = (self.line_buf[0] as usize) * (usize::MAX / 255);
|
||||||
|
if !matches!(self.squeezer, Squeezer::Disabled | Squeezer::Delete)
|
||||||
|
&& self
|
||||||
|
.line_buf
|
||||||
|
.chunks_exact(std::mem::size_of::<usize>())
|
||||||
|
.all(|w| usize::from_ne_bytes(w.try_into().unwrap()) == repeat_byte)
|
||||||
|
{
|
||||||
|
self.squeezer = Squeezer::Print;
|
||||||
|
self.squeeze_byte = repeat_byte;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// special ending
|
||||||
|
|
||||||
|
if is_empty {
|
||||||
|
self.base_digits = 2;
|
||||||
|
self.print_header()?;
|
||||||
|
if self.show_position_panel {
|
||||||
|
write!(self.writer, "{0:9}", "│")?;
|
||||||
|
}
|
||||||
|
write!(
|
||||||
|
self.writer,
|
||||||
|
"{0:2}{1:2$}{0}{0:>3$}",
|
||||||
|
"│",
|
||||||
|
"No content",
|
||||||
|
self.panel_sz() - 1,
|
||||||
|
self.panel_sz() + 1,
|
||||||
|
)?;
|
||||||
|
if self.show_char_panel {
|
||||||
|
write!(self.writer, "{0:>9}{0:>9}", "│")?;
|
||||||
|
}
|
||||||
|
writeln!(self.writer)?;
|
||||||
|
} else if let Some(n) = leftover {
|
||||||
|
// last line is incomplete
|
||||||
|
self.print_position_panel()?;
|
||||||
|
self.squeezer = Squeezer::Ignore;
|
||||||
|
self.print_bytes()?;
|
||||||
|
self.squeezer = Squeezer::Print;
|
||||||
|
for i in n..8 * self.panels as usize {
|
||||||
|
self.print_byte(i, 0)?;
|
||||||
|
}
|
||||||
|
if self.show_char_panel {
|
||||||
|
self.squeezer = Squeezer::Ignore;
|
||||||
|
self.print_char_panel()?;
|
||||||
|
self.squeezer = Squeezer::Print;
|
||||||
|
for i in n..8 * self.panels as usize {
|
||||||
|
self.print_char(i as u64)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.writer.write_all(b"\n")?;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.print_footer()?;
|
||||||
|
|
||||||
|
self.writer.flush()?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::io;
|
||||||
|
use std::str;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn assert_print_all_output<Reader: Read>(input: Reader, expected_string: String) {
|
||||||
|
let mut output = vec![];
|
||||||
|
let mut printer = Printer::new(
|
||||||
|
&mut output,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
BorderStyle::Unicode,
|
||||||
|
true,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
Base::Hexadecimal,
|
||||||
|
Endianness::Big,
|
||||||
|
CharacterTable::Default,
|
||||||
|
);
|
||||||
|
|
||||||
|
printer.print_all(input).unwrap();
|
||||||
|
|
||||||
|
let actual_string: &str = str::from_utf8(&output).unwrap();
|
||||||
|
assert_eq!(actual_string, expected_string,)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn empty_file_passes() {
|
||||||
|
let input = io::empty();
|
||||||
|
let expected_string = "\
|
||||||
|
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
|
||||||
|
│ │ No content │ │ │ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
|
||||||
|
"
|
||||||
|
.to_owned();
|
||||||
|
assert_print_all_output(input, expected_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn short_input_passes() {
|
||||||
|
let input = io::Cursor::new(b"spam");
|
||||||
|
let expected_string = "\
|
||||||
|
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
|
||||||
|
│00000000│ 73 70 61 6d ┊ │spam ┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
|
||||||
|
"
|
||||||
|
.to_owned();
|
||||||
|
assert_print_all_output(input, expected_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn display_offset() {
|
||||||
|
let input = io::Cursor::new(b"spamspamspamspamspam");
|
||||||
|
let expected_string = "\
|
||||||
|
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
|
||||||
|
│deadbeef│ 73 70 61 6d 73 70 61 6d ┊ 73 70 61 6d 73 70 61 6d │spamspam┊spamspam│
|
||||||
|
│deadbeff│ 73 70 61 6d ┊ │spam ┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
|
||||||
|
"
|
||||||
|
.to_owned();
|
||||||
|
|
||||||
|
let mut output = vec![];
|
||||||
|
let mut printer: Printer<Vec<u8>> = Printer::new(
|
||||||
|
&mut output,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
BorderStyle::Unicode,
|
||||||
|
true,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
Base::Hexadecimal,
|
||||||
|
Endianness::Big,
|
||||||
|
CharacterTable::Default,
|
||||||
|
);
|
||||||
|
printer.display_offset(0xdeadbeef);
|
||||||
|
|
||||||
|
printer.print_all(input).unwrap();
|
||||||
|
|
||||||
|
let actual_string: &str = str::from_utf8(&output).unwrap();
|
||||||
|
assert_eq!(actual_string, expected_string)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn multiple_panels() {
|
||||||
|
let input = io::Cursor::new(b"supercalifragilisticexpialidocioussupercalifragilisticexpialidocioussupercalifragilisticexpialidocious");
|
||||||
|
let expected_string = "\
|
||||||
|
┌────────┬─────────────────────────┬─────────────────────────┬─────────────────────────┬─────────────────────────┬────────┬────────┬────────┬────────┐
|
||||||
|
│00000000│ 73 75 70 65 72 63 61 6c ┊ 69 66 72 61 67 69 6c 69 ┊ 73 74 69 63 65 78 70 69 ┊ 61 6c 69 64 6f 63 69 6f │supercal┊ifragili┊sticexpi┊alidocio│
|
||||||
|
│00000020│ 75 73 73 75 70 65 72 63 ┊ 61 6c 69 66 72 61 67 69 ┊ 6c 69 73 74 69 63 65 78 ┊ 70 69 61 6c 69 64 6f 63 │ussuperc┊alifragi┊listicex┊pialidoc│
|
||||||
|
│00000040│ 69 6f 75 73 73 75 70 65 ┊ 72 63 61 6c 69 66 72 61 ┊ 67 69 6c 69 73 74 69 63 ┊ 65 78 70 69 61 6c 69 64 │ioussupe┊rcalifra┊gilistic┊expialid│
|
||||||
|
│00000060│ 6f 63 69 6f 75 73 ┊ ┊ ┊ │ocious ┊ ┊ ┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴─────────────────────────┴─────────────────────────┴────────┴────────┴────────┴────────┘
|
||||||
|
"
|
||||||
|
.to_owned();
|
||||||
|
|
||||||
|
let mut output = vec![];
|
||||||
|
let mut printer: Printer<Vec<u8>> = Printer::new(
|
||||||
|
&mut output,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
BorderStyle::Unicode,
|
||||||
|
true,
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
Base::Hexadecimal,
|
||||||
|
Endianness::Big,
|
||||||
|
CharacterTable::Default,
|
||||||
|
);
|
||||||
|
|
||||||
|
printer.print_all(input).unwrap();
|
||||||
|
|
||||||
|
let actual_string: &str = str::from_utf8(&output).unwrap();
|
||||||
|
assert_eq!(actual_string, expected_string)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn squeeze_works() {
|
||||||
|
let input = io::Cursor::new(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00");
|
||||||
|
let expected_string = "\
|
||||||
|
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
|
||||||
|
│00000000│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00000020│ 00 ┊ │⋄ ┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
|
||||||
|
"
|
||||||
|
.to_owned();
|
||||||
|
assert_print_all_output(input, expected_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn squeeze_nonzero() {
|
||||||
|
let input = io::Cursor::new(b"000000000000000000000000000000000");
|
||||||
|
let expected_string = "\
|
||||||
|
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
|
||||||
|
│00000000│ 30 30 30 30 30 30 30 30 ┊ 30 30 30 30 30 30 30 30 │00000000┊00000000│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00000020│ 30 ┊ │0 ┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
|
||||||
|
"
|
||||||
|
.to_owned();
|
||||||
|
assert_print_all_output(input, expected_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn squeeze_multiple_panels() {
|
||||||
|
let input = io::Cursor::new(b"0000000000000000000000000000000000000000000000000");
|
||||||
|
let expected_string = "\
|
||||||
|
┌────────┬─────────────────────────┬─────────────────────────┬─────────────────────────┬────────┬────────┬────────┐
|
||||||
|
│00000000│ 30 30 30 30 30 30 30 30 ┊ 30 30 30 30 30 30 30 30 ┊ 30 30 30 30 30 30 30 30 │00000000┊00000000┊00000000│
|
||||||
|
│* │ ┊ ┊ │ ┊ ┊ │
|
||||||
|
│00000030│ 30 ┊ ┊ │0 ┊ ┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴─────────────────────────┴────────┴────────┴────────┘
|
||||||
|
"
|
||||||
|
.to_owned();
|
||||||
|
|
||||||
|
let mut output = vec![];
|
||||||
|
let mut printer: Printer<Vec<u8>> = Printer::new(
|
||||||
|
&mut output,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
BorderStyle::Unicode,
|
||||||
|
true,
|
||||||
|
3,
|
||||||
|
1,
|
||||||
|
Base::Hexadecimal,
|
||||||
|
Endianness::Big,
|
||||||
|
CharacterTable::Default,
|
||||||
|
);
|
||||||
|
|
||||||
|
printer.print_all(input).unwrap();
|
||||||
|
|
||||||
|
let actual_string: &str = str::from_utf8(&output).unwrap();
|
||||||
|
assert_eq!(actual_string, expected_string)
|
||||||
|
}
|
||||||
|
}
|
||||||
+718
-512
File diff suppressed because it is too large.
Load diff
-399
@@ -1,399 +0,0 @@
|
|||||||
#[derive(Debug, PartialEq)]
|
|
||||||
enum SqueezeState {
|
|
||||||
/// not enabled
|
|
||||||
Disabled,
|
|
||||||
/// Will be set from all states if equal condition can't be hold up.
|
|
||||||
/// Set if previous byte is not equal the current processed byte.
|
|
||||||
NoSqueeze,
|
|
||||||
/// Valid for a whole line to identify if it is candidate for squeezing
|
|
||||||
Probe,
|
|
||||||
/// Squeeze line parsing is active, but EOL is not reached yet
|
|
||||||
SqueezeActive,
|
|
||||||
/// Squeeze line, EOL is reached, will influence the action
|
|
||||||
Squeeze,
|
|
||||||
/// same as Squeeze, however this is only for the first line after
|
|
||||||
/// the squeeze candidate has been set.
|
|
||||||
SqueezeFirstLine,
|
|
||||||
/// same as SqueezeActive, however this is only for the first line after
|
|
||||||
/// the squeeze candidate has been set.
|
|
||||||
SqueezeActiveFirstLine,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Squeezer {
|
|
||||||
state: SqueezeState,
|
|
||||||
byte: u8,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
|
||||||
pub enum SqueezeAction {
|
|
||||||
Ignore,
|
|
||||||
Print,
|
|
||||||
Delete,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// line size
|
|
||||||
const LSIZE: usize = 16;
|
|
||||||
|
|
||||||
impl Squeezer {
|
|
||||||
pub fn new(enabled: bool) -> Squeezer {
|
|
||||||
Squeezer {
|
|
||||||
state: if enabled {
|
|
||||||
SqueezeState::Probe
|
|
||||||
} else {
|
|
||||||
SqueezeState::Disabled
|
|
||||||
},
|
|
||||||
byte: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn process(&mut self, b: u8, i: usize) {
|
|
||||||
use self::SqueezeState::*;
|
|
||||||
if self.state == Disabled {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let eq = b == self.byte;
|
|
||||||
|
|
||||||
if i % LSIZE == 0 {
|
|
||||||
if !eq {
|
|
||||||
self.state = Probe;
|
|
||||||
} else {
|
|
||||||
self.state = match self.state {
|
|
||||||
NoSqueeze => Probe,
|
|
||||||
Probe => SqueezeActiveFirstLine,
|
|
||||||
SqueezeActiveFirstLine => SqueezeFirstLine,
|
|
||||||
SqueezeFirstLine => SqueezeActive,
|
|
||||||
SqueezeActive => Squeeze,
|
|
||||||
Squeeze => SqueezeActive,
|
|
||||||
Disabled => Disabled,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
} else if !eq {
|
|
||||||
if i % LSIZE == 1 {
|
|
||||||
self.state = Probe;
|
|
||||||
} else if i % LSIZE != 1 {
|
|
||||||
self.state = NoSqueeze;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.byte = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn active(&self) -> bool {
|
|
||||||
use self::SqueezeState::*;
|
|
||||||
match self.state {
|
|
||||||
Squeeze | SqueezeActive | SqueezeFirstLine | SqueezeActiveFirstLine => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn action(&mut self) -> SqueezeAction {
|
|
||||||
match self.state {
|
|
||||||
SqueezeState::SqueezeFirstLine => {
|
|
||||||
self.state = SqueezeState::SqueezeActive;
|
|
||||||
SqueezeAction::Print
|
|
||||||
}
|
|
||||||
SqueezeState::Squeeze => {
|
|
||||||
self.state = SqueezeState::SqueezeActive;
|
|
||||||
SqueezeAction::Delete
|
|
||||||
}
|
|
||||||
_ => SqueezeAction::Ignore,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn three_same_lines() {
|
|
||||||
const LINES: usize = 3;
|
|
||||||
let v = vec![0u8; LINES * LSIZE];
|
|
||||||
let mut s = Squeezer::new(true);
|
|
||||||
// just initialized
|
|
||||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
|
||||||
|
|
||||||
let exp = vec![
|
|
||||||
SqueezeAction::Ignore, // first line, print as is
|
|
||||||
SqueezeAction::Print, // print squeeze symbol
|
|
||||||
SqueezeAction::Delete, // delete reoccurring line
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut line = 0;
|
|
||||||
let mut idx = 1;
|
|
||||||
for z in v.chunks(LSIZE) {
|
|
||||||
for i in z {
|
|
||||||
s.process(*i, idx);
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
let action = s.action();
|
|
||||||
assert_eq!(action, exp[line]);
|
|
||||||
line += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn incomplete_while_squeeze() {
|
|
||||||
// fourth line only has 12 bytes and should be printed
|
|
||||||
let v = vec![0u8; 3 * LSIZE + 12];
|
|
||||||
let mut s = Squeezer::new(true);
|
|
||||||
// just initialized
|
|
||||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
|
||||||
|
|
||||||
let exp = vec![
|
|
||||||
SqueezeAction::Ignore, // first line, print as is
|
|
||||||
SqueezeAction::Print, // print squeeze symbol
|
|
||||||
SqueezeAction::Delete, // delete reoccurring line
|
|
||||||
SqueezeAction::Ignore, // last line only 12 bytes, print it
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut line = 0;
|
|
||||||
let mut idx = 1;
|
|
||||||
for z in v.chunks(LSIZE) {
|
|
||||||
for i in z {
|
|
||||||
s.process(*i, idx);
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
assert_eq!(s.action(), exp[line]);
|
|
||||||
line += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
/// all three lines are different, print all
|
|
||||||
fn three_different_lines() {
|
|
||||||
let mut v: Vec<u8> = vec![];
|
|
||||||
v.extend(vec![0u8; 16]);
|
|
||||||
v.extend(vec![1u8; 16]);
|
|
||||||
v.extend(vec![2u8; 16]);
|
|
||||||
|
|
||||||
let mut s = Squeezer::new(true);
|
|
||||||
// just initialized
|
|
||||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
|
||||||
|
|
||||||
let exp = vec![
|
|
||||||
SqueezeAction::Ignore, // first line, print as is
|
|
||||||
SqueezeAction::Ignore, // different
|
|
||||||
SqueezeAction::Ignore, // different
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut line = 0;
|
|
||||||
let mut idx = 1;
|
|
||||||
for z in v.chunks(LSIZE) {
|
|
||||||
for i in z {
|
|
||||||
s.process(*i, idx);
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
let action = s.action();
|
|
||||||
assert_eq!(action, exp[line]);
|
|
||||||
line += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
/// first two lines same, hence squeeze symbol, third line diff, hence
|
|
||||||
/// print
|
|
||||||
fn one_squeeze_no_delete() {
|
|
||||||
const LINES: usize = 3;
|
|
||||||
let mut v = vec![0u8; (LINES - 1) * LSIZE];
|
|
||||||
v.extend(vec![1u8; 16]);
|
|
||||||
|
|
||||||
let mut s = Squeezer::new(true);
|
|
||||||
// just initialized
|
|
||||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
|
||||||
|
|
||||||
let exp = vec![
|
|
||||||
SqueezeAction::Ignore, // first line, print as is
|
|
||||||
SqueezeAction::Print, // print squeeze symbol
|
|
||||||
SqueezeAction::Ignore, // different lines, print again
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut line = 0;
|
|
||||||
let mut idx = 1;
|
|
||||||
for z in v.chunks(LSIZE) {
|
|
||||||
for i in z {
|
|
||||||
s.process(*i, idx);
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
let action = s.action();
|
|
||||||
assert_eq!(action, exp[line]);
|
|
||||||
line += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
/// First line all eq, 2nd half eq with first line, then change
|
|
||||||
fn second_line_different() {
|
|
||||||
const LINES: usize = 2;
|
|
||||||
let mut v = vec![0u8; (LINES - 1) * LSIZE];
|
|
||||||
v.extend(vec![0u8; 8]);
|
|
||||||
v.extend(vec![1u8; 8]);
|
|
||||||
|
|
||||||
let mut s = Squeezer::new(true);
|
|
||||||
// just initialized
|
|
||||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
|
||||||
|
|
||||||
let exp = vec![
|
|
||||||
SqueezeAction::Ignore, // first line, print as is
|
|
||||||
SqueezeAction::Ignore, // print squeeze symbol
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut line = 0;
|
|
||||||
let mut idx = 1;
|
|
||||||
for z in v.chunks(LSIZE) {
|
|
||||||
for i in z {
|
|
||||||
s.process(*i, idx);
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
let action = s.action();
|
|
||||||
assert_eq!(action, exp[line]);
|
|
||||||
line += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
/// all three lines never become squeeze candidate (diff within line)
|
|
||||||
fn never_squeeze_candidate() {
|
|
||||||
let mut v = vec![];
|
|
||||||
v.extend(vec![0u8; 8]);
|
|
||||||
v.extend(vec![1u8; 8]);
|
|
||||||
v.extend(vec![0u8; 8]);
|
|
||||||
v.extend(vec![1u8; 8]);
|
|
||||||
v.extend(vec![0u8; 8]);
|
|
||||||
v.extend(vec![1u8; 8]);
|
|
||||||
|
|
||||||
let mut s = Squeezer::new(true);
|
|
||||||
// just initialized
|
|
||||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
|
||||||
|
|
||||||
let exp = vec![
|
|
||||||
SqueezeAction::Ignore, // first line, print as is
|
|
||||||
SqueezeAction::Ignore, // print squeeze symbol
|
|
||||||
SqueezeAction::Ignore, // print squeeze symbol
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut line = 0;
|
|
||||||
let mut idx = 1;
|
|
||||||
for z in v.chunks(LSIZE) {
|
|
||||||
for i in z {
|
|
||||||
s.process(*i, idx);
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
let action = s.action();
|
|
||||||
assert_eq!(action, exp[line]);
|
|
||||||
line += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn mix_everything() {
|
|
||||||
let mut v = vec![];
|
|
||||||
v.extend(vec![10u8; 16]); // print
|
|
||||||
v.extend(vec![20u8; 16]); // print
|
|
||||||
v.extend(vec![0u8; 16]); // print
|
|
||||||
v.extend(vec![0u8; 16]); // *
|
|
||||||
v.extend(vec![10u8; 16]); // print
|
|
||||||
v.extend(vec![20u8; 16]); // print
|
|
||||||
v.extend(vec![0u8; 16]); // print
|
|
||||||
v.extend(vec![0u8; 16]); // *
|
|
||||||
v.extend(vec![0u8; 16]); // delete
|
|
||||||
v.extend(vec![0u8; 16]); // delete*
|
|
||||||
v.extend(vec![20u8; 16]); // print
|
|
||||||
v.extend(vec![0u8; 12]); // print, only 12 bytes
|
|
||||||
|
|
||||||
let mut s = Squeezer::new(true);
|
|
||||||
// just initialized
|
|
||||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
|
||||||
|
|
||||||
let exp = vec![
|
|
||||||
SqueezeAction::Ignore,
|
|
||||||
SqueezeAction::Ignore,
|
|
||||||
SqueezeAction::Ignore,
|
|
||||||
SqueezeAction::Print,
|
|
||||||
SqueezeAction::Ignore,
|
|
||||||
SqueezeAction::Ignore,
|
|
||||||
SqueezeAction::Ignore,
|
|
||||||
SqueezeAction::Print,
|
|
||||||
SqueezeAction::Delete,
|
|
||||||
SqueezeAction::Delete,
|
|
||||||
SqueezeAction::Ignore,
|
|
||||||
SqueezeAction::Ignore,
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut line = 0;
|
|
||||||
let mut idx = 1;
|
|
||||||
for z in v.chunks(LSIZE) {
|
|
||||||
for i in z {
|
|
||||||
s.process(*i, idx);
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
let action = s.action();
|
|
||||||
assert_eq!(action, exp[line]);
|
|
||||||
line += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn last_char_diff() {
|
|
||||||
// see issue #62
|
|
||||||
let mut v = vec![];
|
|
||||||
v.extend(vec![20u8; 16]);
|
|
||||||
v.extend(vec![20u8; 15]);
|
|
||||||
v.push(61);
|
|
||||||
v.extend(vec![20u8; 16]);
|
|
||||||
v.extend(vec![20u8; 16]);
|
|
||||||
|
|
||||||
let mut s = Squeezer::new(true);
|
|
||||||
// just initialized
|
|
||||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
|
||||||
|
|
||||||
let exp = vec![
|
|
||||||
SqueezeAction::Ignore, // print as is
|
|
||||||
SqueezeAction::Ignore, // print as is
|
|
||||||
SqueezeAction::Ignore, // print as is
|
|
||||||
SqueezeAction::Print, // print '*' char
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut line = 0;
|
|
||||||
let mut idx = 1;
|
|
||||||
for z in v.chunks(LSIZE) {
|
|
||||||
for i in z {
|
|
||||||
s.process(*i, idx);
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
assert_eq!(s.action(), exp[line]);
|
|
||||||
line += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn first_char_diff() {
|
|
||||||
// see issue #62
|
|
||||||
let mut v = vec![];
|
|
||||||
v.extend(vec![20u8; 16]);
|
|
||||||
v.push(61);
|
|
||||||
v.extend(vec![20u8; 15]);
|
|
||||||
v.extend(vec![20u8; 16]);
|
|
||||||
|
|
||||||
let mut s = Squeezer::new(true);
|
|
||||||
// just initialized
|
|
||||||
assert_eq!(s.action(), SqueezeAction::Ignore);
|
|
||||||
|
|
||||||
let exp = vec![
|
|
||||||
SqueezeAction::Ignore, // print as is
|
|
||||||
SqueezeAction::Ignore, // print as is
|
|
||||||
SqueezeAction::Ignore, // print as is
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut line = 0;
|
|
||||||
let mut idx = 1;
|
|
||||||
for z in v.chunks(LSIZE) {
|
|
||||||
for i in z {
|
|
||||||
s.process(*i, idx);
|
|
||||||
idx += 1;
|
|
||||||
}
|
|
||||||
assert_eq!(s.action(), exp[line]);
|
|
||||||
line += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+156
@@ -0,0 +1,156 @@
|
|||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unit_multipliers() {
|
||||||
|
use Unit::*;
|
||||||
|
assert_eq!(Kilobyte.get_multiplier(), 1000 * Byte.get_multiplier());
|
||||||
|
assert_eq!(Megabyte.get_multiplier(), 1000 * Kilobyte.get_multiplier());
|
||||||
|
assert_eq!(Gigabyte.get_multiplier(), 1000 * Megabyte.get_multiplier());
|
||||||
|
assert_eq!(Terabyte.get_multiplier(), 1000 * Gigabyte.get_multiplier());
|
||||||
|
|
||||||
|
assert_eq!(Kibibyte.get_multiplier(), 1024 * Byte.get_multiplier());
|
||||||
|
assert_eq!(Mebibyte.get_multiplier(), 1024 * Kibibyte.get_multiplier());
|
||||||
|
assert_eq!(Gibibyte.get_multiplier(), 1024 * Mebibyte.get_multiplier());
|
||||||
|
assert_eq!(Tebibyte.get_multiplier(), 1024 * Gibibyte.get_multiplier());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_process_sign() {
|
||||||
|
use ByteOffsetKind::*;
|
||||||
|
use ByteOffsetParseError::*;
|
||||||
|
assert_eq!(process_sign_of("123"), Ok(("123", ForwardFromBeginning)));
|
||||||
|
assert_eq!(process_sign_of("+123"), Ok(("123", ForwardFromLastOffset)));
|
||||||
|
assert_eq!(process_sign_of("-123"), Ok(("123", BackwardFromEnd)));
|
||||||
|
assert_eq!(process_sign_of("-"), Err(EmptyAfterSign));
|
||||||
|
assert_eq!(process_sign_of("+"), Err(EmptyAfterSign));
|
||||||
|
assert_eq!(process_sign_of(""), Err(Empty));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_as_hex() {
|
||||||
|
assert_eq!(try_parse_as_hex_number("73"), None);
|
||||||
|
assert_eq!(try_parse_as_hex_number("0x1337"), Some(Ok(0x1337)));
|
||||||
|
assert!(matches!(try_parse_as_hex_number("0xnope"), Some(Err(_))));
|
||||||
|
assert!(matches!(try_parse_as_hex_number("0x-1"), Some(Err(_))));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn extract_num_and_unit() {
|
||||||
|
use ByteOffsetParseError::*;
|
||||||
|
use Unit::*;
|
||||||
|
// byte is default unit
|
||||||
|
assert_eq!(extract_num_and_unit_from("4"), Ok((4, Byte)));
|
||||||
|
// blocks are returned without customization
|
||||||
|
assert_eq!(
|
||||||
|
extract_num_and_unit_from("2blocks"),
|
||||||
|
Ok((2, Block { custom_size: None }))
|
||||||
|
);
|
||||||
|
// no normalization is performed
|
||||||
|
assert_eq!(extract_num_and_unit_from("1024kb"), Ok((1024, Kilobyte)));
|
||||||
|
|
||||||
|
// unit without number results in error
|
||||||
|
assert_eq!(
|
||||||
|
extract_num_and_unit_from("gib"),
|
||||||
|
Err(EmptyWithUnit("gib".to_string()))
|
||||||
|
);
|
||||||
|
// empty string results in error
|
||||||
|
assert_eq!(extract_num_and_unit_from(""), Err(Empty));
|
||||||
|
// an invalid unit results in an error
|
||||||
|
assert_eq!(
|
||||||
|
extract_num_and_unit_from("25litres"),
|
||||||
|
Err(InvalidUnit("litres".to_string()))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_byte_offset() {
|
||||||
|
use ByteOffsetParseError::*;
|
||||||
|
|
||||||
|
macro_rules! success {
|
||||||
|
($input: expr, $expected_kind: ident $expected_value: expr) => {
|
||||||
|
success!($input, $expected_kind $expected_value; block_size: DEFAULT_BLOCK_SIZE)
|
||||||
|
};
|
||||||
|
($input: expr, $expected_kind: ident $expected_value: expr; block_size: $block_size: expr) => {
|
||||||
|
assert_eq!(
|
||||||
|
parse_byte_offset($input, PositiveI64::new($block_size).unwrap()),
|
||||||
|
Ok(
|
||||||
|
ByteOffset {
|
||||||
|
value: NonNegativeI64::new($expected_value).unwrap(),
|
||||||
|
kind: ByteOffsetKind::$expected_kind,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! error {
|
||||||
|
($input: expr, $expected_err: expr) => {
|
||||||
|
assert_eq!(
|
||||||
|
parse_byte_offset($input, PositiveI64::new(DEFAULT_BLOCK_SIZE).unwrap()),
|
||||||
|
Err($expected_err),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
success!("0", ForwardFromBeginning 0);
|
||||||
|
success!("1", ForwardFromBeginning 1);
|
||||||
|
success!("1", ForwardFromBeginning 1);
|
||||||
|
success!("100", ForwardFromBeginning 100);
|
||||||
|
success!("+100", ForwardFromLastOffset 100);
|
||||||
|
|
||||||
|
success!("0x0", ForwardFromBeginning 0);
|
||||||
|
success!("0xf", ForwardFromBeginning 15);
|
||||||
|
success!("0xdeadbeef", ForwardFromBeginning 3_735_928_559);
|
||||||
|
|
||||||
|
success!("1KB", ForwardFromBeginning 1000);
|
||||||
|
success!("2MB", ForwardFromBeginning 2000000);
|
||||||
|
success!("3GB", ForwardFromBeginning 3000000000);
|
||||||
|
success!("4TB", ForwardFromBeginning 4000000000000);
|
||||||
|
success!("+4TB", ForwardFromLastOffset 4000000000000);
|
||||||
|
|
||||||
|
success!("1GiB", ForwardFromBeginning 1073741824);
|
||||||
|
success!("2TiB", ForwardFromBeginning 2199023255552);
|
||||||
|
success!("+2TiB", ForwardFromLastOffset 2199023255552);
|
||||||
|
|
||||||
|
success!("0xff", ForwardFromBeginning 255);
|
||||||
|
success!("0xEE", ForwardFromBeginning 238);
|
||||||
|
success!("+0xFF", ForwardFromLastOffset 255);
|
||||||
|
|
||||||
|
success!("1block", ForwardFromBeginning 512; block_size: 512);
|
||||||
|
success!("2block", ForwardFromBeginning 1024; block_size: 512);
|
||||||
|
success!("1block", ForwardFromBeginning 4; block_size: 4);
|
||||||
|
success!("2block", ForwardFromBeginning 8; block_size: 4);
|
||||||
|
|
||||||
|
// empty string is invalid
|
||||||
|
error!("", Empty);
|
||||||
|
// These are also bad.
|
||||||
|
error!("+", EmptyAfterSign);
|
||||||
|
error!("-", EmptyAfterSign);
|
||||||
|
error!("K", InvalidNumAndUnit("K".to_owned()));
|
||||||
|
error!("k", InvalidNumAndUnit("k".to_owned()));
|
||||||
|
error!("m", InvalidNumAndUnit("m".to_owned()));
|
||||||
|
error!("block", EmptyWithUnit("block".to_owned()));
|
||||||
|
// leading/trailing space is invalid
|
||||||
|
error!(" 0", InvalidNumAndUnit(" 0".to_owned()));
|
||||||
|
error!("0 ", InvalidUnit(" ".to_owned()));
|
||||||
|
// Signs after the hex prefix make no sense
|
||||||
|
error!("0x-12", SignFoundAfterHexPrefix('-'));
|
||||||
|
// This was previously accepted but shouldn't be.
|
||||||
|
error!("0x+12", SignFoundAfterHexPrefix('+'));
|
||||||
|
// invalid suffix
|
||||||
|
error!("1234asdf", InvalidUnit("asdf".to_owned()));
|
||||||
|
// bad numbers
|
||||||
|
error!("asdf1234", InvalidNumAndUnit("asdf1234".to_owned()));
|
||||||
|
error!("a1s2d3f4", InvalidNumAndUnit("a1s2d3f4".to_owned()));
|
||||||
|
// multiplication overflows u64
|
||||||
|
error!("20000000TiB", UnitMultiplicationOverflow);
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
match parse_byte_offset("99999999999999999999", PositiveI64::new(512).unwrap()) {
|
||||||
|
// We can't check against the kind of the `ParseIntError`, so we'll just make sure it's the
|
||||||
|
// same as trying to do the parse directly.
|
||||||
|
Err(ParseNum(e)) => e == "99999999999999999999".parse::<i64>().unwrap_err(),
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
ascii text eol=lf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
0123456789abcde
|
||||||
Whitespace-only changes.
Executable
BIN
Binary file not shown.
@@ -0,0 +1,787 @@
|
|||||||
|
use assert_cmd::Command;
|
||||||
|
|
||||||
|
fn hexyl() -> Command {
|
||||||
|
let mut cmd = Command::cargo_bin("hexyl").unwrap();
|
||||||
|
cmd.current_dir("tests/examples");
|
||||||
|
cmd
|
||||||
|
}
|
||||||
|
trait PrettyAssert<S>
|
||||||
|
where
|
||||||
|
S: AsRef<str>,
|
||||||
|
{
|
||||||
|
fn pretty_stdout(self, other: S);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/assert-rs/assert_cmd/issues/121#issuecomment-849937376
|
||||||
|
//
|
||||||
|
impl<S> PrettyAssert<S> for assert_cmd::assert::Assert
|
||||||
|
where
|
||||||
|
S: AsRef<str>,
|
||||||
|
{
|
||||||
|
fn pretty_stdout(self, other: S) {
|
||||||
|
println!("{}", other.as_ref().len());
|
||||||
|
let self_str = String::from_utf8(self.get_output().stdout.clone()).unwrap();
|
||||||
|
println!("{}", self_str.len());
|
||||||
|
pretty_assertions::assert_eq!(self_str, other.as_ref());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod basic {
|
||||||
|
use super::hexyl;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn can_print_simple_ascii_file() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 30 31 32 33 34 35 36 37 ┊ 38 39 61 62 63 64 65 0a │01234567┊89abcde_│\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn can_read_input_from_stdin() {
|
||||||
|
hexyl()
|
||||||
|
.arg("--color=never")
|
||||||
|
.write_stdin("abc")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 61 62 63 ┊ │abc ┊ │\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn fails_on_non_existing_input() {
|
||||||
|
hexyl().arg("non-existing").assert().failure();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn prints_warning_on_empty_content() {
|
||||||
|
hexyl()
|
||||||
|
.arg("empty")
|
||||||
|
.arg("--color=never")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│ │ No content │ │ │ │\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod length {
|
||||||
|
use super::hexyl;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn length_restricts_output_size() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--length=32")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 7f 45 4c 46 02 01 01 00 ┊ 00 00 00 00 00 00 00 00 │•ELF•••⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│\n\
|
||||||
|
│00000010│ 02 00 3e 00 01 00 00 00 ┊ 00 10 40 00 00 00 00 00 │•⋄>⋄•⋄⋄⋄┊⋄•@⋄⋄⋄⋄⋄│\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn fail_if_length_and_bytes_options_are_used_simultaneously() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--length=32")
|
||||||
|
.arg("--bytes=10")
|
||||||
|
.assert()
|
||||||
|
.failure();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn fail_if_length_and_count_options_are_used_simultaneously() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--length=32")
|
||||||
|
.arg("-l=10")
|
||||||
|
.assert()
|
||||||
|
.failure();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod bytes {
|
||||||
|
use super::hexyl;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn fail_if_bytes_and_count_options_are_used_simultaneously() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--bytes=32")
|
||||||
|
.arg("-l=10")
|
||||||
|
.assert()
|
||||||
|
.failure();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod skip {
|
||||||
|
use super::hexyl;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn basic() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=2")
|
||||||
|
.arg("--length=4")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│00000002│ 32 33 34 35 ┊ │2345 ┊ │\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn prints_warning_when_skipping_past_the_end() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=1000")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│ │ No content │ │ │ │\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn negative_offset() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=-4")
|
||||||
|
.arg("--length=3")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│0000000c│ 63 64 65 ┊ │cde ┊ │\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn fails_if_negative_offset_is_too_large() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=-1MiB")
|
||||||
|
.assert()
|
||||||
|
.failure()
|
||||||
|
.stderr(predicates::str::contains("Failed to jump"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod display_offset {
|
||||||
|
use super::hexyl;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn basic() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--display-offset=0xc0ffee")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│00c0ffee│ 30 31 32 33 34 35 36 37 ┊ 38 39 61 62 63 64 65 0a │01234567┊89abcde_│\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn display_offset_and_skip() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--display-offset=0x20")
|
||||||
|
.arg("--skip=0x10")
|
||||||
|
.arg("--length=0x10")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│00000030│ 02 00 3e 00 01 00 00 00 ┊ 00 10 40 00 00 00 00 00 │•⋄>⋄•⋄⋄⋄┊⋄•@⋄⋄⋄⋄⋄│\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod blocksize {
|
||||||
|
use super::hexyl;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn fails_for_zero_or_negative_blocksize() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--block-size=0")
|
||||||
|
.assert()
|
||||||
|
.failure();
|
||||||
|
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--block-size=-16")
|
||||||
|
.assert()
|
||||||
|
.failure();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod display_settings {
|
||||||
|
use super::hexyl;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn plain() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--plain")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(" 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 0a \n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn no_chars() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--no-characters")
|
||||||
|
.arg("--color=never")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┐\n\
|
||||||
|
│00000000│ 30 31 32 33 34 35 36 37 ┊ 38 39 61 62 63 64 65 0a │\n\
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn no_position() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--no-position")
|
||||||
|
.arg("--color=never")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌─────────────────────────┬─────────────────────────┬────────┬────────┐\n\
|
||||||
|
│ 30 31 32 33 34 35 36 37 ┊ 38 39 61 62 63 64 65 0a │01234567┊89abcde_│\n\
|
||||||
|
└─────────────────────────┴─────────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod group_and_endianness {
|
||||||
|
use super::hexyl;
|
||||||
|
use super::PrettyAssert;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn group_2_bytes_be() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--group-size=2")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────┬─────────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 3031 3233 3435 3637 ┊ 3839 6162 6364 650a │01234567┊89abcde_│\n\
|
||||||
|
└────────┴─────────────────────┴─────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn group_2_bytes_le() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--group-size=2")
|
||||||
|
.arg("--endianness=little")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────┬─────────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 3130 3332 3534 3736 ┊ 3938 6261 6463 0a65 │01234567┊89abcde_│\n\
|
||||||
|
└────────┴─────────────────────┴─────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn group_4_bytes_be() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--group-size=4")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬───────────────────┬───────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 30313233 34353637 ┊ 38396162 6364650a │01234567┊89abcde_│\n\
|
||||||
|
└────────┴───────────────────┴───────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn group_4_bytes_le() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--group-size=4")
|
||||||
|
.arg("--endianness=little")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬───────────────────┬───────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 33323130 37363534 ┊ 62613938 0a656463 │01234567┊89abcde_│\n\
|
||||||
|
└────────┴───────────────────┴───────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn group_8_bytes_be() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--group-size=8")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬──────────────────┬──────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 3031323334353637 ┊ 383961626364650a │01234567┊89abcde_│\n\
|
||||||
|
└────────┴──────────────────┴──────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn group_8_bytes_le() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--group-size=8")
|
||||||
|
.arg("--endianness=little")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬──────────────────┬──────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 3736353433323130 ┊ 0a65646362613938 │01234567┊89abcde_│\n\
|
||||||
|
└────────┴──────────────────┴──────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn group_size_plain() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--plain")
|
||||||
|
.arg("--group-size=2")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(" 3031 3233 3435 3637 3839 6162 6364 650a \n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn group_size_fill_space() {
|
||||||
|
hexyl()
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--group-size=2")
|
||||||
|
.write_stdin("abc")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(
|
||||||
|
"┌────────┬─────────────────────┬─────────────────────┬────────┬────────┐\n\
|
||||||
|
│00000000│ 6162 63 ┊ │abc ┊ │\n\
|
||||||
|
└────────┴─────────────────────┴─────────────────────┴────────┴────────┘\n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn group_size_invalid() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--plain")
|
||||||
|
.arg("--group-size=3")
|
||||||
|
.assert()
|
||||||
|
.failure();
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn squeeze_no_chars() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=1024")
|
||||||
|
.arg("--length=4096")
|
||||||
|
.arg("--no-characters")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
"\
|
||||||
|
┌────────┬─────────────────────────┬─────────────────────────┐
|
||||||
|
│00000400│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │
|
||||||
|
│* │ ┊ │
|
||||||
|
│00001000│ ba 0e 00 00 00 b9 00 20 ┊ 40 00 bb 01 00 00 00 b8 │
|
||||||
|
│00001010│ 04 00 00 00 cd 80 b8 01 ┊ 00 00 00 cd 80 00 00 00 │
|
||||||
|
│00001020│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │
|
||||||
|
│* │ ┊ │
|
||||||
|
│00001400│ ┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┘
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn squeeze_no_chars_one_panel() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=1024")
|
||||||
|
.arg("--length=4096")
|
||||||
|
.arg("--no-characters")
|
||||||
|
.arg("--panels=1")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
"\
|
||||||
|
┌────────┬─────────────────────────┐
|
||||||
|
│00000400│ 00 00 00 00 00 00 00 00 │
|
||||||
|
│* │ │
|
||||||
|
│00001000│ ba 0e 00 00 00 b9 00 20 │
|
||||||
|
│00001008│ 40 00 bb 01 00 00 00 b8 │
|
||||||
|
│00001010│ 04 00 00 00 cd 80 b8 01 │
|
||||||
|
│00001018│ 00 00 00 cd 80 00 00 00 │
|
||||||
|
│00001020│ 00 00 00 00 00 00 00 00 │
|
||||||
|
│* │ │
|
||||||
|
│00001400│ │
|
||||||
|
└────────┴─────────────────────────┘
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn squeeze_no_position() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=1024")
|
||||||
|
.arg("--length=4096")
|
||||||
|
.arg("--no-position")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
"\
|
||||||
|
┌─────────────────────────┬─────────────────────────┬────────┬────────┐
|
||||||
|
│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* ┊ │ ┊ │
|
||||||
|
│ ba 0e 00 00 00 b9 00 20 ┊ 40 00 bb 01 00 00 00 b8 │ו⋄⋄⋄×⋄ ┊@⋄ו⋄⋄⋄×│
|
||||||
|
│ 04 00 00 00 cd 80 b8 01 ┊ 00 00 00 cd 80 00 00 00 │•⋄⋄⋄××ו┊⋄⋄⋄××⋄⋄⋄│
|
||||||
|
│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* ┊ │ ┊ │
|
||||||
|
│* ┊ │ ┊ │
|
||||||
|
└─────────────────────────┴─────────────────────────┴────────┴────────┘
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn squeeze_no_position_one_panel() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=1024")
|
||||||
|
.arg("--length=4096")
|
||||||
|
.arg("--no-position")
|
||||||
|
.arg("--panels=1")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
"\
|
||||||
|
┌─────────────────────────┬────────┐
|
||||||
|
│ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* │ │
|
||||||
|
│ ba 0e 00 00 00 b9 00 20 │ו⋄⋄⋄×⋄ │
|
||||||
|
│ 40 00 bb 01 00 00 00 b8 │@⋄ו⋄⋄⋄×│
|
||||||
|
│ 04 00 00 00 cd 80 b8 01 │•⋄⋄⋄××ו│
|
||||||
|
│ 00 00 00 cd 80 00 00 00 │⋄⋄⋄××⋄⋄⋄│
|
||||||
|
│ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* │ │
|
||||||
|
│* │ │
|
||||||
|
└─────────────────────────┴────────┘
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn squeeze_odd_panels_remainder_bytes() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=1024")
|
||||||
|
.arg("--length=4092") // 4 byte remainder
|
||||||
|
.arg("--panels=3")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
"\
|
||||||
|
┌────────┬─────────────────────────┬─────────────────────────┬─────────────────────────┬────────┬────────┬────────┐
|
||||||
|
│00000400│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* │ ┊ ┊ │ ┊ ┊ │
|
||||||
|
│00001000│ ba 0e 00 00 00 b9 00 20 ┊ 40 00 bb 01 00 00 00 b8 ┊ 04 00 00 00 cd 80 b8 01 │ו⋄⋄⋄×⋄ ┊@⋄ו⋄⋄⋄×┊•⋄⋄⋄××ו│
|
||||||
|
│00001018│ 00 00 00 cd 80 00 00 00 ┊ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄××⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00001030│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* │ ┊ ┊ │ ┊ ┊ │
|
||||||
|
│000013f0│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 ┊ │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄ ┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴─────────────────────────┴────────┴────────┴────────┘
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn squeeze_plain() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=1024")
|
||||||
|
.arg("--length=4096")
|
||||||
|
.arg("--plain")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
" \
|
||||||
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
|
*
|
||||||
|
ba 0e 00 00 00 b9 00 20 40 00 bb 01 00 00 00 b8
|
||||||
|
04 00 00 00 cd 80 b8 01 00 00 00 cd 80 00 00 00
|
||||||
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
|
*
|
||||||
|
*
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn squeeze_plain_remainder() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--skip=1024")
|
||||||
|
.arg("--length=4092") // 4 byte remainder
|
||||||
|
.arg("--plain")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
" \
|
||||||
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
|
*
|
||||||
|
ba 0e 00 00 00 b9 00 20 40 00 bb 01 00 00 00 b8
|
||||||
|
04 00 00 00 cd 80 b8 01 00 00 00 cd 80 00 00 00
|
||||||
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
|
*
|
||||||
|
00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod base {
|
||||||
|
use super::hexyl;
|
||||||
|
use super::PrettyAssert;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn base2() {
|
||||||
|
hexyl()
|
||||||
|
.arg("ascii")
|
||||||
|
.arg("--plain")
|
||||||
|
.arg("--base=binary")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
" 00110000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 \n \
|
||||||
|
00111000 00111001 01100001 01100010 01100011 01100100 01100101 00001010 \n",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod character_table {
|
||||||
|
use super::hexyl;
|
||||||
|
use super::PrettyAssert;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ascii() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--character-table=ascii")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
|
||||||
|
│00000000│ 7f 45 4c 46 02 01 01 00 ┊ 00 00 00 00 00 00 00 00 │.ELF....┊........│
|
||||||
|
│00000010│ 02 00 3e 00 01 00 00 00 ┊ 00 10 40 00 00 00 00 00 │..>.....┊..@.....│
|
||||||
|
│00000020│ 40 00 00 00 00 00 00 00 ┊ 28 20 00 00 00 00 00 00 │@.......┊( ......│
|
||||||
|
│00000030│ 00 00 00 00 40 00 38 00 ┊ 03 00 40 00 04 00 03 00 │....@.8.┊..@.....│
|
||||||
|
│00000040│ 01 00 00 00 04 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00000050│ 00 00 40 00 00 00 00 00 ┊ 00 00 40 00 00 00 00 00 │..@.....┊..@.....│
|
||||||
|
│00000060│ e8 00 00 00 00 00 00 00 ┊ e8 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00000070│ 00 10 00 00 00 00 00 00 ┊ 01 00 00 00 05 00 00 00 │........┊........│
|
||||||
|
│00000080│ 00 10 00 00 00 00 00 00 ┊ 00 10 40 00 00 00 00 00 │........┊..@.....│
|
||||||
|
│00000090│ 00 10 40 00 00 00 00 00 ┊ 1d 00 00 00 00 00 00 00 │..@.....┊........│
|
||||||
|
│000000a0│ 1d 00 00 00 00 00 00 00 ┊ 00 10 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000000b0│ 01 00 00 00 06 00 00 00 ┊ 00 20 00 00 00 00 00 00 │........┊. ......│
|
||||||
|
│000000c0│ 00 20 40 00 00 00 00 00 ┊ 00 20 40 00 00 00 00 00 │. @.....┊. @.....│
|
||||||
|
│000000d0│ 0e 00 00 00 00 00 00 00 ┊ 0e 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000000e0│ 00 10 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000000f0│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00001000│ ba 0e 00 00 00 b9 00 20 ┊ 40 00 bb 01 00 00 00 b8 │....... ┊@.......│
|
||||||
|
│00001010│ 04 00 00 00 cd 80 b8 01 ┊ 00 00 00 cd 80 00 00 00 │........┊........│
|
||||||
|
│00001020│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00002000│ 48 65 6c 6c 6f 2c 20 77 ┊ 6f 72 6c 64 21 0a 00 2e │Hello, w┊orld!...│
|
||||||
|
│00002010│ 73 68 73 74 72 74 61 62 ┊ 00 2e 74 65 78 74 00 2e │shstrtab┊..text..│
|
||||||
|
│00002020│ 64 61 74 61 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │data....┊........│
|
||||||
|
│00002030│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00002060│ 00 00 00 00 00 00 00 00 ┊ 0b 00 00 00 01 00 00 00 │........┊........│
|
||||||
|
│00002070│ 06 00 00 00 00 00 00 00 ┊ 00 10 40 00 00 00 00 00 │........┊..@.....│
|
||||||
|
│00002080│ 00 10 00 00 00 00 00 00 ┊ 1d 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00002090│ 00 00 00 00 00 00 00 00 ┊ 10 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000020a0│ 00 00 00 00 00 00 00 00 ┊ 11 00 00 00 01 00 00 00 │........┊........│
|
||||||
|
│000020b0│ 03 00 00 00 00 00 00 00 ┊ 00 20 40 00 00 00 00 00 │........┊. @.....│
|
||||||
|
│000020c0│ 00 20 00 00 00 00 00 00 ┊ 0e 00 00 00 00 00 00 00 │. ......┊........│
|
||||||
|
│000020d0│ 00 00 00 00 00 00 00 00 ┊ 04 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000020e0│ 00 00 00 00 00 00 00 00 ┊ 01 00 00 00 03 00 00 00 │........┊........│
|
||||||
|
│000020f0│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00002100│ 0e 20 00 00 00 00 00 00 ┊ 17 00 00 00 00 00 00 00 │. ......┊........│
|
||||||
|
│00002110│ 00 00 00 00 00 00 00 00 ┊ 01 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00002120│ 00 00 00 00 00 00 00 00 ┊ │........┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn codepage_437() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--character-table=codepage-437")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
|
||||||
|
│00000000│ 7f 45 4c 46 02 01 01 00 ┊ 00 00 00 00 00 00 00 00 │⌂ELF☻☺☺⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00000010│ 02 00 3e 00 01 00 00 00 ┊ 00 10 40 00 00 00 00 00 │☻⋄>⋄☺⋄⋄⋄┊⋄►@⋄⋄⋄⋄⋄│
|
||||||
|
│00000020│ 40 00 00 00 00 00 00 00 ┊ 28 20 00 00 00 00 00 00 │@⋄⋄⋄⋄⋄⋄⋄┊( ⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00000030│ 00 00 00 00 40 00 38 00 ┊ 03 00 40 00 04 00 03 00 │⋄⋄⋄⋄@⋄8⋄┊♥⋄@⋄♦⋄♥⋄│
|
||||||
|
│00000040│ 01 00 00 00 04 00 00 00 ┊ 00 00 00 00 00 00 00 00 │☺⋄⋄⋄♦⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00000050│ 00 00 40 00 00 00 00 00 ┊ 00 00 40 00 00 00 00 00 │⋄⋄@⋄⋄⋄⋄⋄┊⋄⋄@⋄⋄⋄⋄⋄│
|
||||||
|
│00000060│ e8 00 00 00 00 00 00 00 ┊ e8 00 00 00 00 00 00 00 │Φ⋄⋄⋄⋄⋄⋄⋄┊Φ⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00000070│ 00 10 00 00 00 00 00 00 ┊ 01 00 00 00 05 00 00 00 │⋄►⋄⋄⋄⋄⋄⋄┊☺⋄⋄⋄♣⋄⋄⋄│
|
||||||
|
│00000080│ 00 10 00 00 00 00 00 00 ┊ 00 10 40 00 00 00 00 00 │⋄►⋄⋄⋄⋄⋄⋄┊⋄►@⋄⋄⋄⋄⋄│
|
||||||
|
│00000090│ 00 10 40 00 00 00 00 00 ┊ 1d 00 00 00 00 00 00 00 │⋄►@⋄⋄⋄⋄⋄┊↔⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│000000a0│ 1d 00 00 00 00 00 00 00 ┊ 00 10 00 00 00 00 00 00 │↔⋄⋄⋄⋄⋄⋄⋄┊⋄►⋄⋄⋄⋄⋄⋄│
|
||||||
|
│000000b0│ 01 00 00 00 06 00 00 00 ┊ 00 20 00 00 00 00 00 00 │☺⋄⋄⋄♠⋄⋄⋄┊⋄ ⋄⋄⋄⋄⋄⋄│
|
||||||
|
│000000c0│ 00 20 40 00 00 00 00 00 ┊ 00 20 40 00 00 00 00 00 │⋄ @⋄⋄⋄⋄⋄┊⋄ @⋄⋄⋄⋄⋄│
|
||||||
|
│000000d0│ 0e 00 00 00 00 00 00 00 ┊ 0e 00 00 00 00 00 00 00 │♫⋄⋄⋄⋄⋄⋄⋄┊♫⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│000000e0│ 00 10 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄►⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│000000f0│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00001000│ ba 0e 00 00 00 b9 00 20 ┊ 40 00 bb 01 00 00 00 b8 │║♫⋄⋄⋄╣⋄ ┊@⋄╗☺⋄⋄⋄╕│
|
||||||
|
│00001010│ 04 00 00 00 cd 80 b8 01 ┊ 00 00 00 cd 80 00 00 00 │♦⋄⋄⋄═Ç╕☺┊⋄⋄⋄═Ç⋄⋄⋄│
|
||||||
|
│00001020│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00002000│ 48 65 6c 6c 6f 2c 20 77 ┊ 6f 72 6c 64 21 0a 00 2e │Hello, w┊orld!◙⋄.│
|
||||||
|
│00002010│ 73 68 73 74 72 74 61 62 ┊ 00 2e 74 65 78 74 00 2e │shstrtab┊⋄.text⋄.│
|
||||||
|
│00002020│ 64 61 74 61 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │data⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00002030│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00002060│ 00 00 00 00 00 00 00 00 ┊ 0b 00 00 00 01 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊♂⋄⋄⋄☺⋄⋄⋄│
|
||||||
|
│00002070│ 06 00 00 00 00 00 00 00 ┊ 00 10 40 00 00 00 00 00 │♠⋄⋄⋄⋄⋄⋄⋄┊⋄►@⋄⋄⋄⋄⋄│
|
||||||
|
│00002080│ 00 10 00 00 00 00 00 00 ┊ 1d 00 00 00 00 00 00 00 │⋄►⋄⋄⋄⋄⋄⋄┊↔⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00002090│ 00 00 00 00 00 00 00 00 ┊ 10 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊►⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│000020a0│ 00 00 00 00 00 00 00 00 ┊ 11 00 00 00 01 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊◄⋄⋄⋄☺⋄⋄⋄│
|
||||||
|
│000020b0│ 03 00 00 00 00 00 00 00 ┊ 00 20 40 00 00 00 00 00 │♥⋄⋄⋄⋄⋄⋄⋄┊⋄ @⋄⋄⋄⋄⋄│
|
||||||
|
│000020c0│ 00 20 00 00 00 00 00 00 ┊ 0e 00 00 00 00 00 00 00 │⋄ ⋄⋄⋄⋄⋄⋄┊♫⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│000020d0│ 00 00 00 00 00 00 00 00 ┊ 04 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊♦⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│000020e0│ 00 00 00 00 00 00 00 00 ┊ 01 00 00 00 03 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊☺⋄⋄⋄♥⋄⋄⋄│
|
||||||
|
│000020f0│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00002100│ 0e 20 00 00 00 00 00 00 ┊ 17 00 00 00 00 00 00 00 │♫ ⋄⋄⋄⋄⋄⋄┊↨⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00002110│ 00 00 00 00 00 00 00 00 ┊ 01 00 00 00 00 00 00 00 │⋄⋄⋄⋄⋄⋄⋄⋄┊☺⋄⋄⋄⋄⋄⋄⋄│
|
||||||
|
│00002120│ 00 00 00 00 00 00 00 00 ┊ │⋄⋄⋄⋄⋄⋄⋄⋄┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn codepage_1047() {
|
||||||
|
hexyl()
|
||||||
|
.arg("hello_world_elf64")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--character-table=codepage-1047")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.pretty_stdout(
|
||||||
|
"┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
|
||||||
|
│00000000│ 7f 45 4c 46 02 01 01 00 ┊ 00 00 00 00 00 00 00 00 │..<.....┊........│
|
||||||
|
│00000010│ 02 00 3e 00 01 00 00 00 ┊ 00 10 40 00 00 00 00 00 │........┊.. .....│
|
||||||
|
│00000020│ 40 00 00 00 00 00 00 00 ┊ 28 20 00 00 00 00 00 00 │ .......┊........│
|
||||||
|
│00000030│ 00 00 00 00 40 00 38 00 ┊ 03 00 40 00 04 00 03 00 │.... ...┊.. .....│
|
||||||
|
│00000040│ 01 00 00 00 04 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00000050│ 00 00 40 00 00 00 00 00 ┊ 00 00 40 00 00 00 00 00 │.. .....┊.. .....│
|
||||||
|
│00000060│ e8 00 00 00 00 00 00 00 ┊ e8 00 00 00 00 00 00 00 │Y.......┊Y.......│
|
||||||
|
│00000070│ 00 10 00 00 00 00 00 00 ┊ 01 00 00 00 05 00 00 00 │........┊........│
|
||||||
|
│00000080│ 00 10 00 00 00 00 00 00 ┊ 00 10 40 00 00 00 00 00 │........┊.. .....│
|
||||||
|
│00000090│ 00 10 40 00 00 00 00 00 ┊ 1d 00 00 00 00 00 00 00 │.. .....┊........│
|
||||||
|
│000000a0│ 1d 00 00 00 00 00 00 00 ┊ 00 10 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000000b0│ 01 00 00 00 06 00 00 00 ┊ 00 20 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000000c0│ 00 20 40 00 00 00 00 00 ┊ 00 20 40 00 00 00 00 00 │.. .....┊.. .....│
|
||||||
|
│000000d0│ 0e 00 00 00 00 00 00 00 ┊ 0e 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000000e0│ 00 10 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000000f0│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00001000│ ba 0e 00 00 00 b9 00 20 ┊ 40 00 bb 01 00 00 00 b8 │[.......┊ .].....│
|
||||||
|
│00001010│ 04 00 00 00 cd 80 b8 01 ┊ 00 00 00 cd 80 00 00 00 │........┊........│
|
||||||
|
│00001020│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00002000│ 48 65 6c 6c 6f 2c 20 77 ┊ 6f 72 6c 64 21 0a 00 2e │..%%?...┊?.%.....│
|
||||||
|
│00002010│ 73 68 73 74 72 74 61 62 ┊ 00 2e 74 65 78 74 00 2e │....../.┊........│
|
||||||
|
│00002020│ 64 61 74 61 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │././....┊........│
|
||||||
|
│00002030│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│* │ ┊ │ ┊ │
|
||||||
|
│00002060│ 00 00 00 00 00 00 00 00 ┊ 0b 00 00 00 01 00 00 00 │........┊........│
|
||||||
|
│00002070│ 06 00 00 00 00 00 00 00 ┊ 00 10 40 00 00 00 00 00 │........┊.. .....│
|
||||||
|
│00002080│ 00 10 00 00 00 00 00 00 ┊ 1d 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00002090│ 00 00 00 00 00 00 00 00 ┊ 10 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000020a0│ 00 00 00 00 00 00 00 00 ┊ 11 00 00 00 01 00 00 00 │........┊........│
|
||||||
|
│000020b0│ 03 00 00 00 00 00 00 00 ┊ 00 20 40 00 00 00 00 00 │........┊.. .....│
|
||||||
|
│000020c0│ 00 20 00 00 00 00 00 00 ┊ 0e 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000020d0│ 00 00 00 00 00 00 00 00 ┊ 04 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│000020e0│ 00 00 00 00 00 00 00 00 ┊ 01 00 00 00 03 00 00 00 │........┊........│
|
||||||
|
│000020f0│ 00 00 00 00 00 00 00 00 ┊ 00 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00002100│ 0e 20 00 00 00 00 00 00 ┊ 17 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00002110│ 00 00 00 00 00 00 00 00 ┊ 01 00 00 00 00 00 00 00 │........┊........│
|
||||||
|
│00002120│ 00 00 00 00 00 00 00 00 ┊ │........┊ │
|
||||||
|
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user