hexdump 0.2.4 → 0.3.0
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/ruby.yml +3 -5
- data/ChangeLog.md +11 -0
- data/LICENSE.txt +1 -1
- data/README.md +99 -78
- data/benchmark.rb +47 -0
- data/gemspec.yml +8 -2
- data/hexdump.gemspec +1 -0
- data/lib/hexdump.rb +1 -1
- data/lib/hexdump/core_ext.rb +4 -0
- data/lib/hexdump/{extensions → core_ext}/file.rb +0 -0
- data/lib/hexdump/{extensions → core_ext}/io.rb +0 -0
- data/lib/hexdump/{extensions → core_ext}/string.rb +0 -0
- data/lib/hexdump/{extensions → core_ext}/string_io.rb +0 -0
- data/lib/hexdump/dumper.rb +61 -91
- data/lib/hexdump/extensions.rb +2 -4
- data/lib/hexdump/hexdump.rb +12 -21
- data/lib/hexdump/version.rb +1 -1
- data/spec/{extensions_spec.rb → core_ext_spec.rb} +2 -2
- data/spec/dumper_spec.rb +176 -107
- data/spec/hexdump_spec.rb +0 -1
- metadata +17 -12
- data/benchmarks/hexdump.rb +0 -45
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: fc17566453285686c384ffb48945dfa526b3d4ea24a3edec8b193540ec40fead
         | 
| 4 | 
            +
              data.tar.gz: cfd9d433a9d11d85b43cd98a46e4b8c1aa67dcc572bd0ebfd7771469bbc315ed
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: bcc397a847ff0d4b9cfef884d6c8c97ed344cbded5242cfeccd2e6e61dc755a4dfb3ac20ddfc65d66f1428dce3ba36ab46858c9c2fdb2e43905b73c4f39e0c10
         | 
| 7 | 
            +
              data.tar.gz: 3917cbf496621c7ddd8e9aec840be04b1836145f082fa0eefe016438cba570cda39013becd7a07fefdb8e4a0c1e9a13b17690f238da468ed528792c043e1c1f4
         | 
    
        data/.github/workflows/ruby.yml
    CHANGED
    
    | @@ -1,10 +1,6 @@ | |
| 1 1 | 
             
            name: CI
         | 
| 2 2 |  | 
| 3 | 
            -
            on:
         | 
| 4 | 
            -
              push:
         | 
| 5 | 
            -
                branches: [ master ]
         | 
| 6 | 
            -
              pull_request:
         | 
| 7 | 
            -
                branches: ['**']
         | 
| 3 | 
            +
            on: [ push, pull_request ]
         | 
| 8 4 |  | 
| 9 5 | 
             
            jobs:
         | 
| 10 6 | 
             
              tests:
         | 
| @@ -17,7 +13,9 @@ jobs: | |
| 17 13 | 
             
                      - 2.5
         | 
| 18 14 | 
             
                      - 2.6
         | 
| 19 15 | 
             
                      - 2.7
         | 
| 16 | 
            +
                      - 3.0
         | 
| 20 17 | 
             
                      - jruby
         | 
| 18 | 
            +
                      - truffleruby
         | 
| 21 19 | 
             
                name: Ruby ${{ matrix.ruby }}
         | 
| 22 20 | 
             
                steps:
         | 
| 23 21 | 
             
                  - uses: actions/checkout@v2
         | 
    
        data/ChangeLog.md
    CHANGED
    
    | @@ -1,3 +1,14 @@ | |
| 1 | 
            +
            ### 0.3.0 / 2021-04-10
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Require Ruby >= 2.0.0.
         | 
| 4 | 
            +
            * Added support for Ruby 3.0.
         | 
| 5 | 
            +
            * {Hexdump.dump}, {Hexdump#dump}, and {Hexdump::Dumper#initialize} now accept
         | 
| 6 | 
            +
              keyword arguments.
         | 
| 7 | 
            +
            * {Hexdump::Dumper#each} now returns the total number of bytes read.
         | 
| 8 | 
            +
            * {Hexdump::Dumper#dump} now prints the final number of bytes read on the last
         | 
| 9 | 
            +
              line.
         | 
| 10 | 
            +
            * Micro-optimizations to improve performance on JRuby and TruffleRuby.
         | 
| 11 | 
            +
             | 
| 1 12 | 
             
            ### 0.2.4 / 2020-09-26
         | 
| 2 13 |  | 
| 3 14 | 
             
            * Default the `:output` option of {Hexdump.dump} to `$stdout` instead of
         | 
    
        data/LICENSE.txt
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,7 +1,9 @@ | |
| 1 | 
            -
            # hexdump
         | 
| 1 | 
            +
            # hexdump.rb
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 3 | 
            +
            [](https://github.com/postmodern/hexdump.rb/actions/workflows/ruby.yml)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * [Source](https://github.com/postmodern/hexdump.rb)
         | 
| 6 | 
            +
            * [Issues](https://github.com/postmodern/hexdump.rb/issues)
         | 
| 5 7 | 
             
            * [Documentation](http://rubydoc.info/gems/hexdump/frames)
         | 
| 6 8 | 
             
            * [Email](mailto:postmodern.mod3 at gmail.com)
         | 
| 7 9 |  | 
| @@ -15,8 +17,9 @@ Simple and Fast hexdumping for Ruby. | |
| 15 17 | 
             
            * Can send the hexdump output to any Object supporting the `<<` method.
         | 
| 16 18 | 
             
            * Can yield each line of hexdump, instead of printing the output.
         | 
| 17 19 | 
             
            * Supports printing ASCII, hexadecimal, decimal, octal and binary bytes.
         | 
| 18 | 
            -
            * Supports hexdumping  | 
| 19 | 
            -
             | 
| 20 | 
            +
            * Supports hexdumping bytes (8bit), words (16bit), double-words (32bit), and
         | 
| 21 | 
            +
              quad-words (64bit).
         | 
| 22 | 
            +
            * Supports Little Endian and Big Endian modes.
         | 
| 20 23 | 
             
            * Makes {String}, {StringIO}, {IO}, {File} objects hexdumpable.
         | 
| 21 24 | 
             
            * Fast-ish.
         | 
| 22 25 |  | 
| @@ -28,9 +31,11 @@ Simple and Fast hexdumping for Ruby. | |
| 28 31 |  | 
| 29 32 | 
             
                Hexdump.dump(data)
         | 
| 30 33 | 
             
                # 00000000  68 65 6c 6c 6f 00                                |hello.|
         | 
| 34 | 
            +
                # 00000006
         | 
| 31 35 |  | 
| 32 36 | 
             
                data.hexdump
         | 
| 33 37 | 
             
                # 00000000  68 65 6c 6c 6f 00                                |hello.|
         | 
| 38 | 
            +
                # 00000006
         | 
| 34 39 |  | 
| 35 40 | 
             
                File.open('dump.txt','w') do |file|
         | 
| 36 41 | 
             
                  data.hexdump(:output => file)
         | 
| @@ -42,31 +47,39 @@ Simple and Fast hexdumping for Ruby. | |
| 42 47 | 
             
                  hex       # => ["68", "65", "6c", "6c", "6f", "00"]
         | 
| 43 48 | 
             
                  printable # => ["h", "e", "l", "l", "o", "."]
         | 
| 44 49 | 
             
                end
         | 
| 50 | 
            +
                # => 6
         | 
| 45 51 |  | 
| 46 52 | 
             
                # configure the width of the hexdump
         | 
| 47 | 
            -
                Hexdump.dump('A' * 30, : | 
| 53 | 
            +
                Hexdump.dump('A' * 30, width: 10)
         | 
| 48 54 | 
             
                # 00000000  41 41 41 41 41 41 41 41 41 41  |AAAAAAAAAA|
         | 
| 49 55 | 
             
                # 0000000a  41 41 41 41 41 41 41 41 41 41  |AAAAAAAAAA|
         | 
| 50 56 | 
             
                # 00000014  41 41 41 41 41 41 41 41 41 41  |AAAAAAAAAA|
         | 
| 57 | 
            +
                # 0000001e
         | 
| 51 58 |  | 
| 52 | 
            -
                Hexdump.dump(data, : | 
| 59 | 
            +
                Hexdump.dump(data, ascii: true)
         | 
| 53 60 | 
             
                # 00000000  h e l l o 00                                     |hello.|
         | 
| 61 | 
            +
                # 00000006
         | 
| 54 62 |  | 
| 55 | 
            -
                Hexdump.dump(data, : | 
| 63 | 
            +
                Hexdump.dump(data, base: 16)
         | 
| 56 64 | 
             
                # 00000000  68 65 6c 6c 6f 00                                |hello.|
         | 
| 65 | 
            +
                # 00000006
         | 
| 57 66 |  | 
| 58 | 
            -
                Hexdump.dump(data, : | 
| 67 | 
            +
                Hexdump.dump(data, base: :decimal)
         | 
| 59 68 | 
             
                # 00000000  104 101 108 108 111   0                                          |hello.|
         | 
| 69 | 
            +
                # 00000006
         | 
| 60 70 |  | 
| 61 | 
            -
                Hexdump.dump(data, : | 
| 71 | 
            +
                Hexdump.dump(data, base: :octal)
         | 
| 62 72 | 
             
                # 00000000  0150 0145 0154 0154 0157 0000                                                    |hello.|
         | 
| 73 | 
            +
                # 00000006
         | 
| 63 74 |  | 
| 64 | 
            -
                Hexdump.dump(data, : | 
| 75 | 
            +
                Hexdump.dump(data, base: :binary)
         | 
| 65 76 | 
             
                # 00000000  01101000 01100101 01101100 01101100 01101111 00000000                                                                                            |hello.|
         | 
| 77 | 
            +
                # 00000006
         | 
| 66 78 |  | 
| 67 | 
            -
                ("ABC" * 10).hexdump(: | 
| 79 | 
            +
                ("ABC" * 10).hexdump(word_size: 2)
         | 
| 68 80 | 
             
                # 00000000  4241 4143 4342 4241 4143 4342 4241 4143  |䉁䅃䍂䉁䅃䍂䉁䅃|
         | 
| 69 81 | 
             
                # 00000010  4342 4241 4143 4342 4241 4143 4342       |䍂䉁䅃䍂䉁䅃䍂|
         | 
| 82 | 
            +
                # 0000001e
         | 
| 70 83 |  | 
| 71 84 | 
             
            ## Install
         | 
| 72 85 |  | 
| @@ -74,74 +87,82 @@ Simple and Fast hexdumping for Ruby. | |
| 74 87 |  | 
| 75 88 | 
             
            ## Benchmarks
         | 
| 76 89 |  | 
| 77 | 
            -
            Benchmarks show {Hexdump.dump} processing  | 
| 78 | 
            -
             | 
| 79 | 
            -
            ### Ruby  | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 116 | 
            -
             | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 119 | 
            -
             | 
| 120 | 
            -
             | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 139 | 
            -
             | 
| 140 | 
            -
             | 
| 141 | 
            -
             | 
| 90 | 
            +
            Benchmarks show {Hexdump.dump} processing 25M of data.
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            ### Ruby 2.7.3
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            ```
         | 
| 95 | 
            +
                                                    user     system      total        real
         | 
| 96 | 
            +
            Hexdump.dump (output)              10.283433   0.000748  10.284181 ( 10.328899)
         | 
| 97 | 
            +
            Hexdump.dump width=256 (output)     8.803228   0.005973   8.809201 (  8.838375)
         | 
| 98 | 
            +
            Hexdump.dump ascii=true (output)   10.740975   0.001903  10.742878 ( 10.779777)
         | 
| 99 | 
            +
            Hexdump.dump word_size=2 (output)  15.163195   0.000989  15.164184 ( 15.220481)
         | 
| 100 | 
            +
            Hexdump.dump word_size=4 (output)  14.279406   0.003840  14.283246 ( 14.345357)
         | 
| 101 | 
            +
            Hexdump.dump word_size=8 (output)   7.715803   0.002879   7.718682 (  7.746389)
         | 
| 102 | 
            +
            Hexdump.dump (block)                5.543268   0.000980   5.544248 (  5.561494)
         | 
| 103 | 
            +
            Hexdump.dump width=256 (block)      5.438946   0.000000   5.438946 (  5.455742)
         | 
| 104 | 
            +
            Hexdump.dump ascii=true (block)     6.082787   0.000924   6.083711 (  6.106234)
         | 
| 105 | 
            +
            Hexdump.dump word_size=2 (block)   11.439610   0.000983  11.440593 ( 11.483788)
         | 
| 106 | 
            +
            Hexdump.dump word_size=4 (block)   11.111633   0.000954  11.112587 ( 11.158416)
         | 
| 107 | 
            +
            Hexdump.dump word_size=8 (block)    5.397569   0.002896   5.400465 (  5.426971)
         | 
| 108 | 
            +
            ```
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            ### Ruby 3.0.1
         | 
| 111 | 
            +
             | 
| 112 | 
            +
            ```
         | 
| 113 | 
            +
                                                    user     system      total        real
         | 
| 114 | 
            +
            Hexdump.dump (output)              12.064022   0.001165  12.065187 ( 12.118272)
         | 
| 115 | 
            +
            Hexdump.dump width=256 (output)    10.228743   0.009920  10.238663 ( 10.279783)
         | 
| 116 | 
            +
            Hexdump.dump ascii=true (output)   12.532913   0.000000  12.532913 ( 12.582665)
         | 
| 117 | 
            +
            Hexdump.dump word_size=2 (output)  17.685782   0.000000  17.685782 ( 17.770686)
         | 
| 118 | 
            +
            Hexdump.dump word_size=4 (output)  15.835564   0.000000  15.835564 ( 15.917552)
         | 
| 119 | 
            +
            Hexdump.dump word_size=8 (output)   8.436831   0.000000   8.436831 (  8.473445)
         | 
| 120 | 
            +
            Hexdump.dump (block)                6.482589   0.000000   6.482589 (  6.504816)
         | 
| 121 | 
            +
            Hexdump.dump width=256 (block)      6.360828   0.000000   6.360828 (  6.383705)
         | 
| 122 | 
            +
            Hexdump.dump ascii=true (block)     6.911868   0.000000   6.911868 (  6.936795)
         | 
| 123 | 
            +
            Hexdump.dump word_size=2 (block)   13.120488   0.000000  13.120488 ( 13.179957)
         | 
| 124 | 
            +
            Hexdump.dump word_size=4 (block)   12.349516   0.000000  12.349516 ( 12.412972)
         | 
| 125 | 
            +
            Hexdump.dump word_size=8 (block)    5.814830   0.000000   5.814830 (  5.837822)
         | 
| 126 | 
            +
            ```
         | 
| 127 | 
            +
             | 
| 128 | 
            +
            ### JRuby 9.2.16.0
         | 
| 129 | 
            +
             | 
| 130 | 
            +
            ```
         | 
| 131 | 
            +
                                                    user     system      total        real
         | 
| 132 | 
            +
            Hexdump.dump (output)              13.090000   0.240000  13.330000 ( 11.226466)
         | 
| 133 | 
            +
            Hexdump.dump width=256 (output)     9.350000   0.030000   9.380000 (  9.165070)
         | 
| 134 | 
            +
            Hexdump.dump ascii=true (output)   10.910000   0.050000  10.960000 ( 10.665791)
         | 
| 135 | 
            +
            Hexdump.dump word_size=2 (output)  13.760000   0.150000  13.910000 ( 12.268307)
         | 
| 136 | 
            +
            Hexdump.dump word_size=4 (output)  11.940000   0.090000  12.030000 ( 11.107564)
         | 
| 137 | 
            +
            Hexdump.dump word_size=8 (output)   8.170000   0.040000   8.210000 (  7.419708)
         | 
| 138 | 
            +
            Hexdump.dump (block)                7.840000   0.020000   7.860000 (  7.777749)
         | 
| 139 | 
            +
            Hexdump.dump width=256 (block)      7.540000   0.000000   7.540000 (  7.466315)
         | 
| 140 | 
            +
            Hexdump.dump ascii=true (block)     7.680000   0.010000   7.690000 (  7.622393)
         | 
| 141 | 
            +
            Hexdump.dump word_size=2 (block)    9.830000   0.020000   9.850000 (  9.693596)
         | 
| 142 | 
            +
            Hexdump.dump word_size=4 (block)    9.010000   0.020000   9.030000 (  8.998687)
         | 
| 143 | 
            +
            Hexdump.dump word_size=8 (block)    5.740000   0.030000   5.770000 (  5.709127)
         | 
| 144 | 
            +
            ```
         | 
| 145 | 
            +
             | 
| 146 | 
            +
            ### TruffleRuby 21.0.0
         | 
| 147 | 
            +
             | 
| 148 | 
            +
            ```
         | 
| 149 | 
            +
                                                    user     system      total        real
         | 
| 150 | 
            +
            Hexdump.dump (output)              25.818995   0.855689  26.674684 ( 22.376015)
         | 
| 151 | 
            +
            Hexdump.dump width=256 (output)    20.489077   0.125966  20.615043 ( 18.301748)
         | 
| 152 | 
            +
            Hexdump.dump ascii=true (output)   25.214678   0.098018  25.312696 ( 21.714985)
         | 
| 153 | 
            +
            Hexdump.dump word_size=2 (output)  28.380387   0.192277  28.572664 ( 23.736887)
         | 
| 154 | 
            +
            Hexdump.dump word_size=4 (output)  31.348977   0.134854  31.483831 ( 27.710968)
         | 
| 155 | 
            +
            Hexdump.dump word_size=8 (output)  18.850093   0.100256  18.950349 ( 13.921720)
         | 
| 156 | 
            +
            Hexdump.dump (block)                7.792878   0.050542   7.843420 (  6.003789)
         | 
| 157 | 
            +
            Hexdump.dump width=256 (block)      6.526531   0.015898   6.542429 (  5.777169)
         | 
| 158 | 
            +
            Hexdump.dump ascii=true (block)     7.425399   0.030799   7.456198 (  5.705369)
         | 
| 159 | 
            +
            Hexdump.dump word_size=2 (block)   12.629775   0.028653  12.658428 ( 11.115049)
         | 
| 160 | 
            +
            Hexdump.dump word_size=4 (block)   20.372094   0.010807  20.382901 ( 19.758073)
         | 
| 161 | 
            +
            Hexdump.dump word_size=8 (block)    8.828653   0.010889   8.839542 (  8.017241)
         | 
| 162 | 
            +
            ```
         | 
| 142 163 |  | 
| 143 164 | 
             
            ## Copyright
         | 
| 144 165 |  | 
| 145 | 
            -
            Copyright (c) 2011- | 
| 166 | 
            +
            Copyright (c) 2011-2021 Hal Brodigan
         | 
| 146 167 |  | 
| 147 168 | 
             
            See {file:LICENSE.txt} for details.
         | 
    
        data/benchmark.rb
    ADDED
    
    | @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            $LOAD_PATH.unshift(File.expand_path('../lib',__FILE__))
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require 'hexdump'
         | 
| 6 | 
            +
            require 'benchmark'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            DATA = ((0..255).map { |b| b.chr }.join) * (1024 * 100)
         | 
| 9 | 
            +
            OUTPUT = Class.new { def <<(data); end }.new
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            Benchmark.bm(33) do |b|
         | 
| 12 | 
            +
              b.report('Hexdump.dump (output)') do
         | 
| 13 | 
            +
                Hexdump.dump(DATA, :output => OUTPUT)
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              b.report('Hexdump.dump width=256 (output)') do
         | 
| 17 | 
            +
                Hexdump.dump(DATA, width: 256, output: OUTPUT)
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              b.report('Hexdump.dump ascii=true (output)') do
         | 
| 21 | 
            +
                Hexdump.dump(DATA, ascii: true, output: OUTPUT)
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              [2, 4, 8].each do |word_size|
         | 
| 25 | 
            +
                b.report("Hexdump.dump word_size=#{word_size} (output)") do
         | 
| 26 | 
            +
                  Hexdump.dump(DATA, word_size: word_size, output: OUTPUT)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              b.report('Hexdump.dump (block)') do
         | 
| 31 | 
            +
                Hexdump.dump(DATA) { |index,hex,print| }
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              b.report('Hexdump.dump width=256 (block)') do
         | 
| 35 | 
            +
                Hexdump.dump(DATA, width: 256) { |index,hex,print| }
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              b.report('Hexdump.dump ascii=true (block)') do
         | 
| 39 | 
            +
                Hexdump.dump(DATA, ascii: true) { |index,hex,print| }
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              [2, 4, 8].each do |word_size|
         | 
| 43 | 
            +
                b.report("Hexdump.dump word_size=#{word_size} (block)") do
         | 
| 44 | 
            +
                  Hexdump.dump(DATA, word_size: word_size) { |index,hex,print| }
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
            end
         | 
    
        data/gemspec.yml
    CHANGED
    
    | @@ -4,10 +4,16 @@ description: Simple and Fast hexdumping for Ruby. | |
| 4 4 | 
             
            license: MIT
         | 
| 5 5 | 
             
            authors: Postmodern
         | 
| 6 6 | 
             
            email: postmodern.mod3@gmail.com
         | 
| 7 | 
            -
            homepage: https://github.com/postmodern/hexdump#readme
         | 
| 7 | 
            +
            homepage: https://github.com/postmodern/hexdump.rb#readme
         | 
| 8 8 | 
             
            has_yard: true
         | 
| 9 9 |  | 
| 10 | 
            -
             | 
| 10 | 
            +
            metadata:
         | 
| 11 | 
            +
              documentation_uri: https://rubydoc.info/gems/hexdump
         | 
| 12 | 
            +
              source_code_uri:   https://github.com/postmodern/hexdump.rb
         | 
| 13 | 
            +
              bug_tracker_uri:   https://github.com/postmodern/hexdump.rb/issues
         | 
| 14 | 
            +
              changelog_uri:     https://github.com/postmodern/hexdump.rb/blob/master/ChangeLog.md
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            required_ruby_version: ">= 2.0.0"
         | 
| 11 17 |  | 
| 12 18 | 
             
            development_dependencies:
         | 
| 13 19 | 
             
              bundler: ~> 2.0
         | 
    
        data/hexdump.gemspec
    CHANGED
    
    | @@ -20,6 +20,7 @@ Gem::Specification.new do |gem| | |
| 20 20 | 
             
              gem.authors     = Array(gemspec['authors'])
         | 
| 21 21 | 
             
              gem.email       = gemspec['email']
         | 
| 22 22 | 
             
              gem.homepage    = gemspec['homepage']
         | 
| 23 | 
            +
              gem.metadata    = gemspec['metadata'] if gemspec['metadata']
         | 
| 23 24 |  | 
| 24 25 | 
             
              glob = lambda { |patterns| gem.files & Dir[*patterns] }
         | 
| 25 26 |  | 
    
        data/lib/hexdump.rb
    CHANGED
    
    
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
    
        data/lib/hexdump/dumper.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Hexdump
         | 
| 2 4 | 
             
              #
         | 
| 3 5 | 
             
              # Handles the parsing of data and formatting of the hexdump.
         | 
| @@ -8,28 +10,28 @@ module Hexdump | |
| 8 10 |  | 
| 9 11 | 
             
                # Widths for formatted numbers
         | 
| 10 12 | 
             
                WIDTHS = {
         | 
| 11 | 
            -
                  : | 
| 12 | 
            -
                  : | 
| 13 | 
            +
                  hexadecimal: ->(word_size) { word_size * 2 },
         | 
| 14 | 
            +
                  decimal: {
         | 
| 13 15 | 
             
                    1 => 3,
         | 
| 14 16 | 
             
                    2 => 5,
         | 
| 15 17 | 
             
                    4 => 10,
         | 
| 16 18 | 
             
                    8 => 20
         | 
| 17 19 | 
             
                  },
         | 
| 18 | 
            -
                  : | 
| 20 | 
            +
                  octal: {
         | 
| 19 21 | 
             
                    1 => 3,
         | 
| 20 22 | 
             
                    2 => 6,
         | 
| 21 23 | 
             
                    4 => 11,
         | 
| 22 24 | 
             
                    8 => 22
         | 
| 23 25 | 
             
                  },
         | 
| 24 | 
            -
                  : | 
| 26 | 
            +
                  binary: ->(word_size) { word_size * 8 }
         | 
| 25 27 | 
             
                }
         | 
| 26 28 |  | 
| 27 29 | 
             
                # Format Strings for the various bases
         | 
| 28 30 | 
             
                FORMATS = {
         | 
| 29 | 
            -
                  : | 
| 30 | 
            -
                  : | 
| 31 | 
            -
                  : | 
| 32 | 
            -
                  : | 
| 31 | 
            +
                  hexadecimal: ->(width) { "%.#{width}x" },
         | 
| 32 | 
            +
                  decimal:     ->(width) { "%#{width}.d" },
         | 
| 33 | 
            +
                  octal:       ->(width) { "%.#{width}o" },
         | 
| 34 | 
            +
                  binary:      ->(width) { "%.#{width}b" }
         | 
| 33 35 | 
             
                }
         | 
| 34 36 |  | 
| 35 37 | 
             
                # Character to represent unprintable characters
         | 
| @@ -154,25 +156,22 @@ module Hexdump | |
| 154 156 | 
             
                #
         | 
| 155 157 | 
             
                # Creates a new Hexdump dumper.
         | 
| 156 158 | 
             
                #
         | 
| 157 | 
            -
                # @param [ | 
| 158 | 
            -
                #   Additional options.
         | 
| 159 | 
            -
                #
         | 
| 160 | 
            -
                # @option options [Integer] :width (16)
         | 
| 159 | 
            +
                # @param [Integer] width (16)
         | 
| 161 160 | 
             
                #   The number of bytes to dump for each line.
         | 
| 162 161 | 
             
                #
         | 
| 163 | 
            -
                # @ | 
| 162 | 
            +
                # @param [Integer] endian (:little)
         | 
| 164 163 | 
             
                #   The endianness that the bytes are organized in. Supported endianness
         | 
| 165 164 | 
             
                #   include `:little` and `:big`.
         | 
| 166 165 | 
             
                #
         | 
| 167 | 
            -
                # @ | 
| 166 | 
            +
                # @param [Integer] word_size (1)
         | 
| 168 167 | 
             
                #   The number of bytes within a word.
         | 
| 169 168 | 
             
                #
         | 
| 170 | 
            -
                # @ | 
| 169 | 
            +
                # @param [Symbol, Integer] base (:hexadecimal)
         | 
| 171 170 | 
             
                #   The base to print bytes in. Supported bases include, `:hexadecimal`,
         | 
| 172 171 | 
             
                #   `:hex`, `16, `:decimal`, `:dec`, `10, `:octal`, `:oct`, `8`,
         | 
| 173 172 | 
             
                #   `:binary`, `:bin` and `2`.
         | 
| 174 173 | 
             
                #
         | 
| 175 | 
            -
                # @ | 
| 174 | 
            +
                # @param [Boolean] ascii (false)
         | 
| 176 175 | 
             
                #   Print ascii characters when possible.
         | 
| 177 176 | 
             
                #
         | 
| 178 177 | 
             
                # @raise [ArgumentError]
         | 
| @@ -180,36 +179,33 @@ module Hexdump | |
| 180 179 | 
             
                #
         | 
| 181 180 | 
             
                # @since 0.2.0
         | 
| 182 181 | 
             
                #
         | 
| 183 | 
            -
                def initialize( | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 186 | 
            -
             | 
| 187 | 
            -
             | 
| 188 | 
            -
             | 
| 189 | 
            -
             | 
| 190 | 
            -
             | 
| 191 | 
            -
                          when : | 
| 192 | 
            -
             | 
| 193 | 
            -
                          when  | 
| 194 | 
            -
             | 
| 182 | 
            +
                def initialize(width:     16,
         | 
| 183 | 
            +
                               endian:    :little,
         | 
| 184 | 
            +
                               word_size: 1,
         | 
| 185 | 
            +
                               base:      :hexadecimal,
         | 
| 186 | 
            +
                               ascii:     false)
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                  @base = case base
         | 
| 189 | 
            +
                          when :hexadecimal, :hex, 16 then :hexadecimal
         | 
| 190 | 
            +
                          when :decimal, :dec, 10     then :decimal
         | 
| 191 | 
            +
                          when :octal, :oct, 8        then :octal
         | 
| 192 | 
            +
                          when :binary, :bin, 2       then :binary
         | 
| 193 | 
            +
                          when nil                    then :hexadecimal
         | 
| 195 194 | 
             
                          else
         | 
| 196 | 
            -
                            raise(ArgumentError,"unknown base #{ | 
| 195 | 
            +
                            raise(ArgumentError,"unknown base #{base.inspect}")
         | 
| 197 196 | 
             
                          end
         | 
| 198 197 |  | 
| 199 | 
            -
                  @word_size =  | 
| 200 | 
            -
                  @endian = case  | 
| 201 | 
            -
                            when 'little', :little
         | 
| 202 | 
            -
             | 
| 203 | 
            -
                            when  | 
| 204 | 
            -
                              :big
         | 
| 205 | 
            -
                            when nil
         | 
| 206 | 
            -
                              :little
         | 
| 198 | 
            +
                  @word_size = word_size
         | 
| 199 | 
            +
                  @endian = case endian
         | 
| 200 | 
            +
                            when 'little', :little then :little
         | 
| 201 | 
            +
                            when 'big', :big       then :big
         | 
| 202 | 
            +
                            when nil               then :little
         | 
| 207 203 | 
             
                            else
         | 
| 208 | 
            -
                              raise(ArgumentError,"unknown endian: #{ | 
| 204 | 
            +
                              raise(ArgumentError,"unknown endian: #{endian.inspect}")
         | 
| 209 205 | 
             
                            end
         | 
| 210 206 |  | 
| 211 | 
            -
                  @width = ( | 
| 212 | 
            -
                  @ascii =  | 
| 207 | 
            +
                  @width = (width / @word_size)
         | 
| 208 | 
            +
                  @ascii = ascii
         | 
| 213 209 |  | 
| 214 210 | 
             
                  @format_width = (WIDTHS[@base][@word_size] || 1)
         | 
| 215 211 | 
             
                  @format = FORMATS[@base][@format_width]
         | 
| @@ -252,20 +248,16 @@ module Hexdump | |
| 252 248 | 
             
                    word  = 0
         | 
| 253 249 | 
             
                    count = 0
         | 
| 254 250 |  | 
| 255 | 
            -
                    init_shift = if @endian == :big
         | 
| 256 | 
            -
             | 
| 257 | 
            -
                                 else
         | 
| 258 | 
            -
                                   0
         | 
| 251 | 
            +
                    init_shift = if @endian == :big then ((@word_size - 1) * 8)
         | 
| 252 | 
            +
                                 else                    0
         | 
| 259 253 | 
             
                                 end
         | 
| 260 254 | 
             
                    shift = init_shift
         | 
| 261 255 |  | 
| 262 256 | 
             
                    data.each_byte do |b|
         | 
| 263 257 | 
             
                      word |= (b << shift)
         | 
| 264 258 |  | 
| 265 | 
            -
                      if @endian == :big
         | 
| 266 | 
            -
             | 
| 267 | 
            -
                      else
         | 
| 268 | 
            -
                        shift += 8
         | 
| 259 | 
            +
                      if @endian == :big then shift -= 8
         | 
| 260 | 
            +
                      else                    shift += 8
         | 
| 269 261 | 
             
                      end
         | 
| 270 262 |  | 
| 271 263 | 
             
                      count += 1
         | 
| @@ -305,7 +297,8 @@ module Hexdump | |
| 305 297 | 
             
                # @yieldparam [Array<String>] printable
         | 
| 306 298 | 
             
                #   The printable representation of the segment.
         | 
| 307 299 | 
             
                #
         | 
| 308 | 
            -
                # @return [Enumerator]
         | 
| 300 | 
            +
                # @return [Integer, Enumerator]
         | 
| 301 | 
            +
                #   If a block is given, then the final number of bytes read is returned.
         | 
| 309 302 | 
             
                #   If no block is given, an Enumerator will be returned.
         | 
| 310 303 | 
             
                #
         | 
| 311 304 | 
             
                # @since 0.2.0
         | 
| @@ -316,21 +309,18 @@ module Hexdump | |
| 316 309 | 
             
                  index = 0
         | 
| 317 310 | 
             
                  count = 0
         | 
| 318 311 |  | 
| 319 | 
            -
                  numeric | 
| 320 | 
            -
                  printable =  | 
| 312 | 
            +
                  numeric   = Array.new(@width)
         | 
| 313 | 
            +
                  printable = Array.new(@width)
         | 
| 321 314 |  | 
| 322 315 | 
             
                  each_word(data) do |word|
         | 
| 323 | 
            -
                    numeric    | 
| 324 | 
            -
                    printable  | 
| 316 | 
            +
                    numeric[count]   = format_numeric(word)
         | 
| 317 | 
            +
                    printable[count] = format_printable(word)
         | 
| 325 318 |  | 
| 326 319 | 
             
                    count += 1
         | 
| 327 320 |  | 
| 328 321 | 
             
                    if count >= @width
         | 
| 329 322 | 
             
                      yield index, numeric, printable
         | 
| 330 323 |  | 
| 331 | 
            -
                      numeric.clear
         | 
| 332 | 
            -
                      printable.clear
         | 
| 333 | 
            -
             | 
| 334 324 | 
             
                      index += (@width * @word_size)
         | 
| 335 325 | 
             
                      count = 0
         | 
| 336 326 | 
             
                    end
         | 
| @@ -338,8 +328,12 @@ module Hexdump | |
| 338 328 |  | 
| 339 329 | 
             
                  if count > 0
         | 
| 340 330 | 
             
                    # yield the remaining data
         | 
| 341 | 
            -
                    yield index, numeric, printable
         | 
| 331 | 
            +
                    yield index, numeric[0,count], printable[0,count]
         | 
| 332 | 
            +
             | 
| 333 | 
            +
                    index += (count * @word_size)
         | 
| 342 334 | 
             
                  end
         | 
| 335 | 
            +
             | 
| 336 | 
            +
                  return index
         | 
| 343 337 | 
             
                end
         | 
| 344 338 |  | 
| 345 339 | 
             
                #
         | 
| @@ -364,39 +358,17 @@ module Hexdump | |
| 364 358 | 
             
                  end
         | 
| 365 359 |  | 
| 366 360 | 
             
                  bytes_segment_width = ((@width * @format_width) + @width)
         | 
| 367 | 
            -
                   | 
| 368 | 
            -
             | 
| 369 | 
            -
                  index = 0
         | 
| 370 | 
            -
                  count = 0
         | 
| 371 | 
            -
             | 
| 372 | 
            -
                  numeric   = ''
         | 
| 373 | 
            -
                  printable = ''
         | 
| 374 | 
            -
             | 
| 375 | 
            -
                  each_word(data) do |word|
         | 
| 376 | 
            -
                    numeric   << format_numeric(word) << ' '
         | 
| 377 | 
            -
                    printable << format_printable(word)
         | 
| 361 | 
            +
                  index_format = "%.8x"
         | 
| 362 | 
            +
                  line_format = "#{index_format}  %-#{bytes_segment_width}s |%s|#{$/}"
         | 
| 378 363 |  | 
| 379 | 
            -
             | 
| 380 | 
            -
             | 
| 381 | 
            -
                    if count >= @width
         | 
| 382 | 
            -
                      output << sprintf(line_format,index,numeric,printable)
         | 
| 383 | 
            -
             | 
| 384 | 
            -
                      numeric   = ''
         | 
| 385 | 
            -
                      printable = ''
         | 
| 386 | 
            -
             | 
| 387 | 
            -
                      index += (@width * @word_size)
         | 
| 388 | 
            -
                      count  = 0
         | 
| 389 | 
            -
                    end
         | 
| 364 | 
            +
                  length = each(data) do |index,numeric,printable|
         | 
| 365 | 
            +
                    output << sprintf(line_format,index,numeric.join(' '),printable.join)
         | 
| 390 366 | 
             
                  end
         | 
| 391 367 |  | 
| 392 | 
            -
                   | 
| 393 | 
            -
             | 
| 394 | 
            -
                    output << sprintf(line_format,index,numeric,printable)
         | 
| 395 | 
            -
                  end
         | 
| 368 | 
            +
                  output << sprintf("#{index_format}#{$/}",length)
         | 
| 369 | 
            +
                  return nil
         | 
| 396 370 | 
             
                end
         | 
| 397 371 |  | 
| 398 | 
            -
                protected
         | 
| 399 | 
            -
             | 
| 400 372 | 
             
                #
         | 
| 401 373 | 
             
                # Converts the word into a numeric String.
         | 
| 402 374 | 
             
                #
         | 
| @@ -434,12 +406,10 @@ module Hexdump | |
| 434 406 | 
             
                def format_printable(word)
         | 
| 435 407 | 
             
                  if @word_size == 1
         | 
| 436 408 | 
             
                    PRINTABLE[word]
         | 
| 437 | 
            -
                  elsif  | 
| 438 | 
            -
                     | 
| 439 | 
            -
             | 
| 440 | 
            -
                     | 
| 441 | 
            -
                      UNPRINTABLE
         | 
| 442 | 
            -
                    end
         | 
| 409 | 
            +
                  elsif word >= 0 && word <= 0x7fffffff
         | 
| 410 | 
            +
                    # XXX: https://github.com/jruby/jruby/issues/6652
         | 
| 411 | 
            +
                    char = word.chr(Encoding::UTF_8) rescue nil
         | 
| 412 | 
            +
                    char || UNPRINTABLE
         | 
| 443 413 | 
             
                  else
         | 
| 444 414 | 
             
                    UNPRINTABLE
         | 
| 445 415 | 
             
                  end
         |