@@ -3,119 +3,119 @@ extern crate libc;
33extern crate ncurses;
44extern crate getopts;
55
6- use getopts:: { optflag , getopts } ;
7- use std:: os ;
6+ use getopts:: Options ;
7+ use std:: env ;
88
9- use sl:: { Train } ;
9+ use sl:: Train ;
1010use sl:: d51:: SL ;
1111use sl:: c51:: C51 ;
1212use sl:: logo:: Logo ;
1313
14- trait Render : Train + Copy {
15- fn render ( & self , x : i32 ) {
16- let mut len = 0 as i32 ;
17- let y = ncurses:: LINES / 2 ;
18- let body_iter = self . body ( ) . iter ( ) ;
19- let wheelset_iter = self . wheelset ( x as uint ) . iter ( ) ;
20- let iter = body_iter. chain ( wheelset_iter) ;
21- let ( _, hint) = iter. size_hint ( ) ;
22- let height = match hint {
23- Some ( s) => s,
24- None => panic ! ( "this really shouldn't happen" )
25- } ;
26- let offset = ( height / 2 ) as i32 ;
27- for ( index, line) in iter. rev ( ) . enumerate ( ) {
28- if line. len ( ) as i32 > len {
29- len = line. len ( ) as i32 ;
30- }
31- self . render_line ( ( y + offset) - index as i32 , x, * line) ;
32- }
33- if let Some ( tender) = self . tender ( ) {
34- let mut new_len = 0 as i32 ;
35- for ( index, line) in tender. iter ( ) . rev ( ) . enumerate ( ) {
36- if len + line. len ( ) as i32 > new_len {
37- new_len = len + line. len ( ) as i32 ;
14+ trait Render : Train + Copy {
15+ fn render ( & self , x : i32 ) {
16+ let mut len = 0 as i32 ;
17+ let y = ncurses:: LINES / 2 ;
18+ let body_iter = self . body ( ) . iter ( ) ;
19+ let wheelset_iter = self . wheelset ( x as usize ) . iter ( ) ;
20+ let iter = body_iter. chain ( wheelset_iter) ;
21+ let ( _, hint) = iter. size_hint ( ) ;
22+ let height = match hint {
23+ Some ( s) => s,
24+ None => panic ! ( "this really shouldn't happen" ) ,
25+ } ;
26+ let offset = ( height / 2 ) as i32 ;
27+ for ( index, line) in iter. rev ( ) . enumerate ( ) {
28+ if line. len ( ) as i32 > len {
29+ len = line. len ( ) as i32 ;
30+ }
31+ self . render_line ( ( y + offset) - index as i32 , x, * line) ;
3832 }
39- self . render_line ( ( y + offset) - index as i32 , x + len, * line) ;
40- }
41- len = new_len;
42- }
43- if let Some ( wagon) = self . wagon ( ) {
44- for _ in range ( 0 , self . wagons ( ) ) {
45- let mut new_len = 0 as i32 ;
46- for ( index, line) in wagon. iter ( ) . rev ( ) . enumerate ( ) {
47- if len + line. len ( ) as i32 > new_len {
48- new_len = len + line. len ( ) as i32 ;
49- }
50- self . render_line ( ( y + offset) - index as i32 , x + len, * line) ;
33+ if let Some ( tender) = self . tender ( ) {
34+ let mut new_len = 0 as i32 ;
35+ for ( index, line) in tender. iter ( ) . rev ( ) . enumerate ( ) {
36+ if len + line. len ( ) as i32 > new_len {
37+ new_len = len + line. len ( ) as i32 ;
38+ }
39+ self . render_line ( ( y + offset) - index as i32 , x + len, * line) ;
40+ }
41+ len = new_len;
42+ }
43+ if let Some ( wagon) = self . wagon ( ) {
44+ for _ in 0 ..self . wagons ( ) {
45+ let mut new_len = 0 as i32 ;
46+ for ( index, line) in wagon. iter ( ) . rev ( ) . enumerate ( ) {
47+ if len + line. len ( ) as i32 > new_len {
48+ new_len = len + line. len ( ) as i32 ;
49+ }
50+ self . render_line ( ( y + offset) - index as i32 , x + len, * line) ;
51+ }
52+ len = new_len;
53+ }
5154 }
52- len = new_len;
53- }
5455 }
55- }
5656
57- fn render_line ( & self , y : i32 , x : i32 , line : & str ) {
58- let paint_len = ( ncurses:: COLS - x) as uint ;
59- if paint_len < line. len ( ) {
60- ncurses:: mvaddstr ( y, x, & line[ 0 ..paint_len] ) ;
61- } else if x < 0 {
62- if -x < line. len ( ) as i32 {
63- ncurses:: mvaddstr ( y, 0 , & line[ -x as uint ..line. len ( ) ] ) ;
64- }
65- } else {
66- ncurses:: mvaddstr ( y, x, line) ;
57+ fn render_line ( & self , y : i32 , x : i32 , line : & str ) {
58+ let paint_len = ( ncurses:: COLS - x) as usize ;
59+ if paint_len < line. len ( ) {
60+ ncurses:: mvaddstr ( y, x, & line[ 0 ..paint_len] ) ;
61+ } else if x < 0 {
62+ if -x < line. len ( ) as i32 {
63+ ncurses:: mvaddstr ( y, 0 , & line[ -x as usize ..line. len ( ) ] ) ;
64+ }
65+ } else {
66+ ncurses:: mvaddstr ( y, x, line) ;
67+ }
6768 }
68- }
6969}
7070
71- impl Render for SL { }
72- impl Render for C51 { }
73- impl Render for Logo { }
71+ impl Render for SL { }
72+ impl Render for C51 { }
73+ impl Render for Logo { }
7474
7575fn main ( ) {
76- use libc:: funcs:: posix01:: signal:: signal;
77- use libc:: funcs:: posix88:: unistd:: usleep;
78- use libc:: SIGINT ;
79- use libc:: consts:: os:: posix01:: SIG_IGN ;
80-
81- let args: Vec < String > = os:: args ( ) ;
76+ use libc:: signal;
77+ use libc:: usleep;
78+ use libc:: SIGINT ;
79+ use libc:: SIG_IGN ;
8280
83- let opts = [
84- optflag ( "l" , "" , "logo" ) ,
85- optflag ( "c" , "" , "C51" ) ,
86- optflag ( "a" , "" , "reserved for future use" ) ,
87- optflag ( "f" , "" , "reserved for future use" ) ,
88- ] ;
81+ let args: Vec < String > = env:: args ( ) . collect ( ) ;
8982
90- let matches = match getopts ( args. tail ( ) , & opts) {
91- Ok ( m) => { m }
92- Err ( f) => { panic ! ( f. to_string( ) ) }
93- } ;
94-
95- let train: Box < Render > = if matches. opt_present ( "l" ) {
96- Box :: new ( Logo )
97- } else if matches. opt_present ( "c" ) {
98- Box :: new ( C51 )
99- } else {
100- Box :: new ( SL )
101- } ;
83+ let mut opts = Options :: new ( ) ;
84+ opts. optflag ( "l" , "" , "logo" ) ;
85+ opts. optflag ( "c" , "" , "C51" ) ;
86+ opts. optflag ( "a" , "" , "reserved for future use" ) ;
87+ opts. optflag ( "f" , "" , "reserved for future use" ) ;
10288
89+ let matches = match opts. parse ( & args[ 1 ..] ) {
90+ Ok ( m) => m,
91+ Err ( f) => panic ! ( f. to_string( ) ) ,
92+ } ;
10393
104- ncurses:: initscr ( ) ;
105- unsafe { signal ( SIGINT , SIG_IGN ) ; }
94+ ncurses:: initscr ( ) ;
95+ unsafe {
96+ signal ( SIGINT , SIG_IGN ) ;
97+ }
10698
107- ncurses:: noecho ( ) ;
108- ncurses:: curs_set ( ncurses:: CURSOR_VISIBILITY :: CURSOR_INVISIBLE ) ;
109- ncurses:: nodelay ( ncurses:: stdscr, true ) ;
110- ncurses:: leaveok ( ncurses:: stdscr, true ) ;
111- ncurses:: scrollok ( ncurses:: stdscr, false ) ;
99+ ncurses:: noecho ( ) ;
100+ ncurses:: curs_set ( ncurses:: CURSOR_VISIBILITY :: CURSOR_INVISIBLE ) ;
101+ ncurses:: nodelay ( ncurses:: stdscr, true ) ;
102+ ncurses:: leaveok ( ncurses:: stdscr, true ) ;
103+ ncurses:: scrollok ( ncurses:: stdscr, false ) ;
112104
113- for x in range ( -85 , ncurses:: COLS ) . rev ( ) {
114- ncurses:: clear ( ) ;
115- train. render ( x) ;
116- ncurses:: getch ( ) ;
117- ncurses:: refresh ( ) ;
118- unsafe { usleep ( 40000 ) ; }
119- }
120- ncurses:: endwin ( ) ;
105+ for x in ( -85 ..ncurses:: COLS ) . rev ( ) {
106+ ncurses:: clear ( ) ;
107+ if matches. opt_present ( "l" ) {
108+ Logo . render ( x)
109+ } else if matches. opt_present ( "c" ) {
110+ C51 . render ( x)
111+ } else {
112+ SL . render ( x)
113+ } ;
114+ ncurses:: getch ( ) ;
115+ ncurses:: refresh ( ) ;
116+ unsafe {
117+ usleep ( 40000 ) ;
118+ }
119+ }
120+ ncurses:: endwin ( ) ;
121121}
0 commit comments