@@ -154,6 +154,8 @@ pub struct Printer<'a, Writer: Write> {
154
154
byte_char_panel : Vec < String > ,
155
155
squeezer : Squeezer ,
156
156
display_offset : u64 ,
157
+ /// The number of panels to draw.
158
+ columns : u8 ,
157
159
}
158
160
159
161
impl < ' a , Writer : Write > Printer < ' a , Writer > {
@@ -164,6 +166,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
164
166
show_position_panel : bool ,
165
167
border_style : BorderStyle ,
166
168
use_squeeze : bool ,
169
+ columns : u8 ,
167
170
) -> Printer < ' a , Writer > {
168
171
Printer {
169
172
idx : 1 ,
@@ -175,7 +178,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
175
178
show_position_panel,
176
179
border_style,
177
180
header_was_printed : false ,
178
- byte_hex_panel : ( 0u8 ..=u8:: max_value ( ) )
181
+ byte_hex_panel : ( 0u8 ..=u8:: MAX )
179
182
. map ( |i| {
180
183
let byte_hex = format ! ( "{:02x} " , i) ;
181
184
if show_color {
@@ -187,7 +190,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
187
190
. collect ( ) ,
188
191
byte_char_panel : show_char_panel
189
192
. then ( || {
190
- ( 0u8 ..=u8:: max_value ( ) )
193
+ ( 0u8 ..=u8:: MAX )
191
194
. map ( |i| {
192
195
let byte_char = format ! ( "{}" , Byte ( i) . as_char( ) ) ;
193
196
if show_color {
@@ -199,8 +202,9 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
199
202
. collect ( )
200
203
} )
201
204
. unwrap_or_default ( ) ,
202
- squeezer : Squeezer :: new ( use_squeeze) ,
205
+ squeezer : Squeezer :: new ( use_squeeze, 8 * columns as u64 ) ,
203
206
display_offset : 0 ,
207
+ columns,
204
208
}
205
209
}
206
210
@@ -223,10 +227,20 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
223
227
write ! ( self . writer, "{}" , l) . ok ( ) ;
224
228
}
225
229
226
- write ! ( self . writer, "{h25}{c}{h25}" , c = c, h25 = h25) . ok ( ) ;
230
+ for _ in 0 ..self . columns - 1 {
231
+ write ! ( self . writer, "{h25}{c}" , h25 = h25, c = c) . ok ( ) ;
232
+ }
233
+ if self . show_char_panel {
234
+ write ! ( self . writer, "{h25}{c}" , h25 = h25, c = c) . ok ( ) ;
235
+ } else {
236
+ write ! ( self . writer, "{h25}" , h25 = h25) . ok ( ) ;
237
+ }
227
238
228
239
if self . show_char_panel {
229
- writeln ! ( self . writer, "{c}{h8}{c}{h8}{r}" , c = c, h8 = h8, r = r) . ok ( ) ;
240
+ for _ in 0 ..self . columns - 1 {
241
+ write ! ( self . writer, "{h8}{c}" , h8 = h8, c = c) . ok ( ) ;
242
+ }
243
+ writeln ! ( self . writer, "{h8}{r}" , h8 = h8, r = r) . ok ( ) ;
230
244
} else {
231
245
writeln ! ( self . writer, "{r}" , r = r) . ok ( ) ;
232
246
}
@@ -287,36 +301,25 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
287
301
self . byte_char_panel[ b as usize ]
288
302
) ;
289
303
290
- if idx == 8 {
304
+ if idx % 8 == 0 && idx % ( u64 :: from ( self . columns * 8 ) ) != 0 {
291
305
let _ = write ! ( & mut self . buffer_line, "{}" , self . border_style. inner_sep( ) ) ;
292
306
}
293
307
294
308
idx += 1 ;
295
309
}
296
310
297
- if len < 8 {
298
- let _ = writeln ! (
299
- & mut self . buffer_line,
300
- "{0:1$}{3}{0:2$}{4}" ,
301
- "" ,
302
- 8 - len,
303
- 8 ,
304
- self . border_style. inner_sep( ) ,
305
- self . border_style. outer_sep( ) ,
306
- ) ;
307
- } else {
308
- let _ = writeln ! (
309
- & mut self . buffer_line,
310
- "{0:1$}{2}" ,
311
- "" ,
312
- 16 - len,
313
- self . border_style. outer_sep( )
314
- ) ;
311
+ if len < usize:: from ( 8 * self . columns ) {
312
+ let _ = write ! ( & mut self . buffer_line, "{0:1$}" , "" , 8 - len % 8 ) ;
313
+ for _ in 0 ..( usize:: from ( 8 * self . columns ) - ( len + ( 8 - len % 8 ) ) ) / 8 {
314
+ let _ = write ! ( & mut self . buffer_line, "{2}{0:1$}" , "" , 8 , self . border_style. inner_sep( ) ) ;
315
+ }
315
316
}
317
+ let _ = writeln ! ( & mut self . buffer_line, "{}" , self . border_style. outer_sep( ) ) ;
318
+
316
319
}
317
320
318
321
pub fn print_byte ( & mut self , b : u8 ) -> io:: Result < ( ) > {
319
- if self . idx % 16 == 1 {
322
+ if self . idx % u64 :: from ( self . columns * 8 ) == 1 {
320
323
self . print_header ( ) ;
321
324
self . print_position_panel ( ) ;
322
325
}
@@ -326,14 +329,10 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
326
329
327
330
self . squeezer . process ( b, self . idx ) ;
328
331
329
- match self . idx % 16 {
330
- 8 => {
331
- let _ = write ! ( & mut self . buffer_line, "{} " , self . border_style. inner_sep( ) ) ;
332
- }
333
- 0 => {
334
- self . print_textline ( ) ?;
335
- }
336
- _ => { }
332
+ if self . idx % u64:: from ( self . columns * 8 ) == 0 {
333
+ self . print_textline ( ) ?;
334
+ } else if self . idx % 8 == 0 {
335
+ let _ = write ! ( & mut self . buffer_line, "{} " , self . border_style. inner_sep( ) ) ;
337
336
}
338
337
339
338
self . idx += 1 ;
@@ -347,45 +346,33 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
347
346
if len == 0 {
348
347
if self . squeezer . active ( ) {
349
348
self . print_position_panel ( ) ;
350
- let _ = writeln ! (
351
- & mut self . buffer_line,
352
- "{0:1$}{4}{0:2$}{5}{0:3$}{4}{0:3$}{5}" ,
353
- "" ,
354
- 24 ,
355
- 25 ,
356
- 8 ,
357
- self . border_style. inner_sep( ) ,
358
- self . border_style. outer_sep( ) ,
359
- ) ;
349
+ write ! ( & mut self . buffer_line, "{0:1$}" , "" , 24 ) ?;
350
+ for _ in 0 ..self . columns - 1 {
351
+ write ! ( & mut self . buffer_line, "{2}{0:1$}" , "" , 25 , self . border_style. inner_sep( ) ) ?;
352
+ }
353
+ write ! ( & mut self . buffer_line, "{2}{0:1$}" , "" , 8 , self . border_style. outer_sep( ) ) ?;
354
+ for _ in 0 ..self . columns - 1 {
355
+ write ! ( & mut self . buffer_line, "{2}{0:1$}" , "" , 8 , self . border_style. inner_sep( ) ) ?;
356
+ }
357
+ writeln ! ( & mut self . buffer_line, "{}" , self . border_style. outer_sep( ) ) ?;
360
358
self . writer . write_all ( & self . buffer_line ) ?;
361
359
}
362
360
return Ok ( ( ) ) ;
363
361
}
364
362
365
363
let squeeze_action = self . squeezer . action ( ) ;
366
364
365
+ // print empty space on last line
367
366
if squeeze_action != SqueezeAction :: Delete {
368
- if len < 8 {
369
- let _ = write ! (
370
- & mut self . buffer_line,
371
- "{0:1$}{3}{0:2$}{4}" ,
372
- "" ,
373
- 3 * ( 8 - len) ,
374
- 1 + 3 * 8 ,
375
- self . border_style. inner_sep( ) ,
376
- self . border_style. outer_sep( ) ,
377
- ) ;
378
- } else {
379
- let _ = write ! (
380
- & mut self . buffer_line,
381
- "{0:1$}{2}" ,
382
- "" ,
383
- 3 * ( 16 - len) ,
384
- self . border_style. outer_sep( )
385
- ) ;
367
+ if len < usize:: from ( 8 * self . columns ) {
368
+ write ! ( & mut self . buffer_line, "{0:1$}" , "" , 3 * ( 8 - len % 8 ) ) ?;
369
+ // dbg!(usize::from(8 * self.columns) - (len + (8 - len % 8)));
370
+ for _ in 0 ..( usize:: from ( 8 * self . columns ) - ( len + ( 8 - len % 8 ) ) ) / 8 {
371
+ write ! ( & mut self . buffer_line, "{2}{0:1$}" , "" , 1 + 3 * 8 , self . border_style. inner_sep( ) ) ?;
372
+ }
386
373
}
374
+ write ! ( & mut self . buffer_line, "{}" , self . border_style. outer_sep( ) ) ?;
387
375
}
388
-
389
376
self . print_char_panel ( ) ;
390
377
391
378
match squeeze_action {
@@ -397,17 +384,26 @@ impl<'a, Writer: Write> Printer<'a, Writer> {
397
384
} else {
398
385
String :: from ( "*" )
399
386
} ;
400
- let _ = writeln ! (
401
- & mut self . buffer_line,
402
- "{5}{0}{1:2$}{5}{1:3$}{6}{1:3$}{5}{1:4$}{6}{1:4$}{5}" ,
403
- asterisk,
404
- "" ,
405
- 7 ,
406
- 25 ,
407
- 8 ,
408
- self . border_style. outer_sep( ) ,
409
- self . border_style. inner_sep( ) ,
410
- ) ;
387
+
388
+ write ! ( & mut self . buffer_line, "{3}{0}{1:2$}{3}" , asterisk, "" , 7 , self . border_style. outer_sep( ) ) ?;
389
+
390
+ for i in 0 ..self . columns {
391
+ write ! ( & mut self . buffer_line, "{0:1$}" , "" , 25 ) ?;
392
+ if i != self . columns - 1 {
393
+ write ! ( & mut self . buffer_line, "{}" , self . border_style. inner_sep( ) ) ?;
394
+ } else {
395
+ write ! ( & mut self . buffer_line, "{}" , self . border_style. outer_sep( ) ) ?;
396
+ }
397
+ }
398
+
399
+ for i in 0 ..self . columns {
400
+ write ! ( & mut self . buffer_line, "{0:1$}" , "" , 8 ) ?;
401
+ if i != self . columns - 1 {
402
+ write ! ( & mut self . buffer_line, "{}" , self . border_style. inner_sep( ) ) ?;
403
+ } else {
404
+ writeln ! ( & mut self . buffer_line, "{}" , self . border_style. outer_sep( ) ) ?;
405
+ }
406
+ }
411
407
}
412
408
SqueezeAction :: Delete => self . buffer_line . clear ( ) ,
413
409
SqueezeAction :: Ignore => ( ) ,
@@ -484,7 +480,7 @@ mod tests {
484
480
485
481
fn assert_print_all_output < Reader : Read > ( input : Reader , expected_string : String ) {
486
482
let mut output = vec ! [ ] ;
487
- let mut printer = Printer :: new ( & mut output, false , true , true , BorderStyle :: Unicode , true ) ;
483
+ let mut printer = Printer :: new ( & mut output, false , true , true , BorderStyle :: Unicode , true , 2 ) ;
488
484
489
485
printer. print_all ( input) . unwrap ( ) ;
490
486
@@ -529,7 +525,7 @@ mod tests {
529
525
530
526
let mut output = vec ! [ ] ;
531
527
let mut printer: Printer < Vec < u8 > > =
532
- Printer :: new ( & mut output, false , true , true , BorderStyle :: Unicode , true ) ;
528
+ Printer :: new ( & mut output, false , true , true , BorderStyle :: Unicode , true , 2 ) ;
533
529
printer. display_offset ( 0xdeadbeef ) ;
534
530
535
531
printer. print_all ( input) . unwrap ( ) ;
0 commit comments