fd 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +1 -1
- data/README.md +13 -20
- data/lib/fd/version.rb +1 -1
- data/lib/fd.rb +40 -25
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67057a4915f19574440eb06dbfd3c3ebd6f59a8246d7a7760698e36781ea1162
|
4
|
+
data.tar.gz: 5b145d3b97f0172cf9c30b7e074c4329455c2153350964bcbacce2f190de7508
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 988fb2280aa7ba07a6881055a753b9fbc2fc911ed72e78497c64720306af54d95b07fabab67e8b6ed7fd101c83922fc7170bc02099e08a36e0a5e23bf35ae13e
|
7
|
+
data.tar.gz: 28b4fc04117655e26e73a9a6d3e24ebfc104feb9d09b611dfbddcb76c4602cd356a449db5bbc58e7fb36b44d4bc1d2a1c07605fddb5d8f6bc2792b52eb09d9d5
|
data/.github/workflows/main.yml
CHANGED
data/README.md
CHANGED
@@ -1,28 +1,30 @@
|
|
1
1
|
# fd - A simple file dumping tool
|
2
2
|
|
3
|
-
##
|
3
|
+
## Badges!
|
4
4
|
|
5
|
-
[](https://github.com/s2k/fd/actions) <sup style="font-size:125%;">᛫</sup> [](https://github.com/s2k/fd/actions/workflows/codeql-analysis.yml)
|
5
|
+
[](https://github.com/s2k/fd/actions) <sup style="font-size:125%;">᛫</sup> [](https://github.com/s2k/fd/actions/workflows/codeql-analysis.yml) <sup style="font-size:125%;">᛫</sup> [](https://badge.fury.io/rb/fd) <sup style="font-size:125%;">᛫</sup> [](https://codeclimate.com/github/s2k/fd/maintainability)
|
6
6
|
|
7
7
|
## TL;DR
|
8
8
|
|
9
|
-
`fd` reads
|
9
|
+
`fd` reads files _as a sequence of (UTF-8) characters_ and dumps the content to _STDOUT_, thus the name `fd`. It does so in two columns, the left one will display the hex values of the bytes in the file, the right one will display the characters.
|
10
10
|
|
11
|
-
##
|
11
|
+
## History
|
12
|
+
|
13
|
+
I created this tool **back in 2004**. It was programmed in a different world: On another operating system, using another file system (which most notably didn't have the concept of case-sensitive file names). This version originally used ISO-8859-1 as the default (and only) encoding, while it now assumes UTF-8.
|
12
14
|
|
13
|
-
|
15
|
+
The early versions had it easy: Each character was assumed to use one byte in the file. This made displaying it in rows with a constant number of characters easy. Nowadays, however, a singe character may be composed of a (varying) number of bytes, making it impossible to always display the same number of characters in each row.
|
16
|
+
This is just a small aspect of how character encoding is more complicated (and more complex).
|
14
17
|
|
15
|
-
In other words: It's a work in progress.
|
16
18
|
|
17
19
|
## Installation
|
18
20
|
|
19
|
-
|
21
|
+
If you're using a `Gemfile`, add this line to make the tool available in your project:
|
20
22
|
|
21
23
|
```ruby
|
22
24
|
gem 'fd'
|
23
25
|
```
|
24
26
|
|
25
|
-
|
27
|
+
Then execute:
|
26
28
|
|
27
29
|
$ bundle install
|
28
30
|
|
@@ -30,24 +32,15 @@ Or install it yourself as:
|
|
30
32
|
|
31
33
|
$ gem install fd
|
32
34
|
|
33
|
-
|
34
35
|
## Usage
|
35
36
|
|
36
37
|
```
|
37
|
-
fd
|
38
|
-
```
|
39
|
-
|
40
|
-
Depending on your operating system, you may have to type a bit more...
|
41
|
-
|
42
|
-
```
|
43
|
-
ruby fd.rb [-w _number_] file_name(s)
|
38
|
+
fd [-w _number_] file_name [file_name]
|
44
39
|
```
|
45
40
|
|
46
41
|
## Development
|
47
42
|
|
48
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
49
|
-
|
50
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
43
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
51
44
|
|
52
45
|
## Contributing
|
53
46
|
|
@@ -55,4 +48,4 @@ Bug reports and pull requests are welcome on GitHub at <https://github.com/s2k/f
|
|
55
48
|
|
56
49
|
## License
|
57
50
|
|
58
|
-
The gem is available
|
51
|
+
The gem is available under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/lib/fd/version.rb
CHANGED
data/lib/fd.rb
CHANGED
@@ -9,7 +9,7 @@ class Fd
|
|
9
9
|
|
10
10
|
attr_reader :line_length, :char_table
|
11
11
|
|
12
|
-
# _line_length_ sets how many characters are displayed per line.
|
12
|
+
# _line_length_ sets how many characters are displayed per @line.
|
13
13
|
# Some <i>special non-printable/invisible characters</i> are displayed as their names.
|
14
14
|
#
|
15
15
|
# Name :: Char val
|
@@ -50,39 +50,54 @@ class Fd
|
|
50
50
|
content = File.read(file_name)
|
51
51
|
raise "Not the expected encoding of UFT-8, got #{content.encoding}" unless content.encoding == Encoding::UTF_8
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
hex_values = []
|
57
|
-
char_index = 0
|
58
|
-
while char_index < chars.size
|
59
|
-
char = chars[char_index]
|
60
|
-
bytes = char.bytes
|
61
|
-
if enough_space_in_line?(byte_count_in_line, bytes)
|
62
|
-
# Next char fits in line => Add hex values & character to line
|
63
|
-
byte_count_in_line += bytes.size
|
64
|
-
bytes.each { |bt| hex_values << format('%02x', bt) }
|
65
|
-
line += format('%5s', (char_table[char.ord] || char))
|
66
|
-
char_index += 1
|
67
|
-
else
|
68
|
-
# Print a new line…
|
69
|
-
print_single_line(hex_values, line)
|
70
|
-
# …and reset line internal values
|
71
|
-
byte_count_in_line = 0
|
72
|
-
hex_values.clear
|
73
|
-
line = ''
|
74
|
-
end
|
53
|
+
initialize_fields(content)
|
54
|
+
while @char_index < @chars.size
|
55
|
+
process_current_character
|
75
56
|
end
|
76
|
-
print_single_line
|
57
|
+
print_single_line unless line.empty?
|
77
58
|
end
|
78
59
|
|
79
60
|
private
|
80
61
|
|
62
|
+
def process_current_character
|
63
|
+
char = @chars[@char_index]
|
64
|
+
bytes = char.bytes
|
65
|
+
if enough_space_in_line?(@byte_count_in_line, bytes)
|
66
|
+
append_to_line(bytes, char)
|
67
|
+
else
|
68
|
+
print_single_line
|
69
|
+
reset_line
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def initialize_fields(content)
|
74
|
+
@chars = content.chars
|
75
|
+
@byte_count_in_line = 0
|
76
|
+
@line = ''
|
77
|
+
@hex_values = []
|
78
|
+
@char_index = 0
|
79
|
+
end
|
80
|
+
|
81
|
+
attr_reader :hex_values, :line
|
82
|
+
|
83
|
+
def reset_line
|
84
|
+
@byte_count_in_line = 0
|
85
|
+
@hex_values.clear
|
86
|
+
@line = ''
|
87
|
+
end
|
88
|
+
|
89
|
+
def append_to_line(bytes, char)
|
90
|
+
@byte_count_in_line += bytes.size
|
91
|
+
bytes.each { |bt| @hex_values << format('%02x', bt) }
|
92
|
+
@line += format('%5s', (char_table[char.ord] || char))
|
93
|
+
@char_index += 1
|
94
|
+
end
|
95
|
+
|
81
96
|
def enough_space_in_line?(byte_count_in_line, bytes)
|
82
97
|
byte_count_in_line + bytes.size <= line_length
|
83
98
|
end
|
84
99
|
|
85
|
-
def print_single_line
|
100
|
+
def print_single_line
|
86
101
|
puts("#{format("%#{(3 * line_length) - 1}s", hex_values.join(' '))} |#{format("%#{5 * line_length}s", line)}")
|
87
102
|
end
|
88
103
|
end
|