61
61
//! line (which it can't) and so naturally place the content on its own line to
62
62
//! avoid combining it with other lines and making matters even worse.
63
63
64
+ use std:: fmt;
64
65
use std:: io;
65
- use std:: string;
66
66
67
67
#[ derive( Clone , Copy , PartialEq ) ]
68
68
pub enum Breaks {
@@ -112,35 +112,30 @@ impl Token {
112
112
}
113
113
}
114
114
115
- pub fn tok_str ( token : & Token ) -> String {
116
- match * token {
117
- Token :: String ( ref s, len) => format ! ( "STR({},{})" , s, len) ,
118
- Token :: Break ( _) => "BREAK" . to_string ( ) ,
119
- Token :: Begin ( _) => "BEGIN" . to_string ( ) ,
120
- Token :: End => "END" . to_string ( ) ,
121
- Token :: Eof => "EOF" . to_string ( )
115
+ impl fmt:: Display for Token {
116
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
117
+ match * self {
118
+ Token :: String ( ref s, len) => write ! ( f, "STR({},{})" , s, len) ,
119
+ Token :: Break ( _) => f. write_str ( "BREAK" ) ,
120
+ Token :: Begin ( _) => f. write_str ( "BEGIN" ) ,
121
+ Token :: End => f. write_str ( "END" ) ,
122
+ Token :: Eof => f. write_str ( "EOF" ) ,
123
+ }
122
124
}
123
125
}
124
126
125
- pub fn buf_str ( toks : & [ Token ] ,
126
- szs : & [ isize ] ,
127
- left : usize ,
128
- right : usize ,
129
- lim : usize )
130
- -> String {
127
+ fn buf_str ( toks : & [ Token ] , szs : & [ isize ] , left : usize , right : usize , lim : usize ) -> String {
131
128
let n = toks. len ( ) ;
132
129
assert_eq ! ( n, szs. len( ) ) ;
133
130
let mut i = left;
134
131
let mut l = lim;
135
- let mut s = string :: String :: from ( "[" ) ;
132
+ let mut s = String :: from ( "[" ) ;
136
133
while i != right && l != 0 {
137
134
l -= 1 ;
138
135
if i != left {
139
136
s. push_str ( ", " ) ;
140
137
}
141
- s. push_str ( & format ! ( "{}={}" ,
142
- szs[ i] ,
143
- tok_str( & toks[ i] ) ) ) ;
138
+ s. push_str ( & format ! ( "{}={}" , szs[ i] , & toks[ i] ) ) ;
144
139
i += 1 ;
145
140
i %= n;
146
141
}
@@ -413,38 +408,38 @@ impl<'a> Printer<'a> {
413
408
} else {
414
409
self . top += 1 ;
415
410
self . top %= self . buf_len ;
416
- assert ! ( ( self . top != self . bottom) ) ;
411
+ assert ! ( self . top != self . bottom) ;
417
412
}
418
413
self . scan_stack [ self . top ] = x;
419
414
}
420
415
pub fn scan_pop ( & mut self ) -> usize {
421
- assert ! ( ( !self . scan_stack_empty) ) ;
416
+ assert ! ( !self . scan_stack_empty) ;
422
417
let x = self . scan_stack [ self . top ] ;
423
418
if self . top == self . bottom {
424
419
self . scan_stack_empty = true ;
425
420
} else {
426
421
self . top += self . buf_len - 1 ; self . top %= self . buf_len ;
427
422
}
428
- return x ;
423
+ x
429
424
}
430
425
pub fn scan_top ( & mut self ) -> usize {
431
- assert ! ( ( !self . scan_stack_empty) ) ;
432
- return self . scan_stack [ self . top ] ;
426
+ assert ! ( !self . scan_stack_empty) ;
427
+ self . scan_stack [ self . top ]
433
428
}
434
429
pub fn scan_pop_bottom ( & mut self ) -> usize {
435
- assert ! ( ( !self . scan_stack_empty) ) ;
430
+ assert ! ( !self . scan_stack_empty) ;
436
431
let x = self . scan_stack [ self . bottom ] ;
437
432
if self . top == self . bottom {
438
433
self . scan_stack_empty = true ;
439
434
} else {
440
435
self . bottom += 1 ; self . bottom %= self . buf_len ;
441
436
}
442
- return x ;
437
+ x
443
438
}
444
439
pub fn advance_right ( & mut self ) {
445
440
self . right += 1 ;
446
441
self . right %= self . buf_len ;
447
- assert ! ( ( self . right != self . left) ) ;
442
+ assert ! ( self . right != self . left) ;
448
443
}
449
444
pub fn advance_left ( & mut self ) -> io:: Result < ( ) > {
450
445
debug ! ( "advance_left Vec<{},{}>, sizeof({})={}" , self . left, self . right,
@@ -512,19 +507,16 @@ impl<'a> Printer<'a> {
512
507
let ret = write ! ( self . out, "\n " ) ;
513
508
self . pending_indentation = 0 ;
514
509
self . indent ( amount) ;
515
- return ret;
510
+ ret
516
511
}
517
512
pub fn indent ( & mut self , amount : isize ) {
518
513
debug ! ( "INDENT {}" , amount) ;
519
514
self . pending_indentation += amount;
520
515
}
521
516
pub fn get_top ( & mut self ) -> PrintStackElem {
522
- let print_stack = & mut self . print_stack ;
523
- let n = print_stack. len ( ) ;
524
- if n != 0 {
525
- ( * print_stack) [ n - 1 ]
526
- } else {
527
- PrintStackElem {
517
+ match self . print_stack . last ( ) {
518
+ Some ( el) => * el,
519
+ None => PrintStackElem {
528
520
offset : 0 ,
529
521
pbreak : PrintStackBreak :: Broken ( Breaks :: Inconsistent )
530
522
}
@@ -538,7 +530,7 @@ impl<'a> Printer<'a> {
538
530
write ! ( self . out, "{}" , s)
539
531
}
540
532
pub fn print ( & mut self , token : Token , l : isize ) -> io:: Result < ( ) > {
541
- debug ! ( "print {} {} (remaining line space={})" , tok_str ( & token) , l,
533
+ debug ! ( "print {} {} (remaining line space={})" , token, l,
542
534
self . space) ;
543
535
debug ! ( "{}" , buf_str( & self . token,
544
536
& self . size,
@@ -566,7 +558,7 @@ impl<'a> Printer<'a> {
566
558
Token :: End => {
567
559
debug ! ( "print End -> pop End" ) ;
568
560
let print_stack = & mut self . print_stack ;
569
- assert ! ( ( !print_stack. is_empty( ) ) ) ;
561
+ assert ! ( !print_stack. is_empty( ) ) ;
570
562
print_stack. pop ( ) . unwrap ( ) ;
571
563
Ok ( ( ) )
572
564
}
@@ -603,12 +595,12 @@ impl<'a> Printer<'a> {
603
595
}
604
596
}
605
597
}
606
- Token :: String ( s, len) => {
598
+ Token :: String ( ref s, len) => {
607
599
debug ! ( "print String({})" , s) ;
608
600
assert_eq ! ( l, len) ;
609
601
// assert!(l <= space);
610
602
self . space -= len;
611
- self . print_str ( & s [ .. ] )
603
+ self . print_str ( s )
612
604
}
613
605
Token :: Eof => {
614
606
// Eof should never get here.
@@ -652,15 +644,15 @@ pub fn eof(p: &mut Printer) -> io::Result<()> {
652
644
}
653
645
654
646
pub fn word ( p : & mut Printer , wrd : & str ) -> io:: Result < ( ) > {
655
- p. pretty_print ( Token :: String ( /* bad */ wrd. to_string ( ) , wrd. len ( ) as isize ) )
647
+ p. pretty_print ( Token :: String ( wrd. to_string ( ) , wrd. len ( ) as isize ) )
656
648
}
657
649
658
650
pub fn huge_word ( p : & mut Printer , wrd : & str ) -> io:: Result < ( ) > {
659
- p. pretty_print ( Token :: String ( /* bad */ wrd. to_string ( ) , SIZE_INFINITY ) )
651
+ p. pretty_print ( Token :: String ( wrd. to_string ( ) , SIZE_INFINITY ) )
660
652
}
661
653
662
654
pub fn zero_word ( p : & mut Printer , wrd : & str ) -> io:: Result < ( ) > {
663
- p. pretty_print ( Token :: String ( /* bad */ wrd. to_string ( ) , 0 ) )
655
+ p. pretty_print ( Token :: String ( wrd. to_string ( ) , 0 ) )
664
656
}
665
657
666
658
pub fn spaces ( p : & mut Printer , n : usize ) -> io:: Result < ( ) > {
0 commit comments