@@ -5,23 +5,111 @@ import front.token;
5
5
import middle. trans ;
6
6
import middle. resolve ;
7
7
8
- io fn main ( vec[ str] args) {
8
+ import std. util . option ;
9
+ import std. util . some ;
10
+ import std. util . none ;
11
+ import std. _str ;
12
+ import std. _vec ;
13
+
14
+ io fn compile_input ( session. session sess, str input, str output) {
15
+ auto p = parser. new_parser ( sess, 0 , input) ;
16
+ auto crate = parser. parse_crate ( p) ;
17
+ crate = resolve. resolve_crate ( sess, crate ) ;
18
+ trans. trans_crate ( sess, crate , output) ;
19
+ }
9
20
21
+ fn warn_wrong_compiler ( ) {
10
22
log "This is the rust 'self-hosted' compiler." ;
11
23
log "The one written in rust." ;
12
24
log "It does nothing yet, it's a placeholder." ;
13
25
log "You want rustboot, the compiler next door." ;
26
+ }
27
+
28
+ fn usage ( session . session sess, str argv0 ) {
29
+ log #fmt( "usage: %s [options] <input>" , argv0) ;
30
+ log "options:" ;
31
+ log "" ;
32
+ log " -o <filename> write output to <filename>" ;
33
+ log " -nowarn suppress wrong-compiler warning" ;
34
+ log " -h display this message" ;
35
+ log "" ;
36
+ log "" ;
37
+ }
38
+
39
+ io fn main ( vec[ str] args) {
14
40
15
- auto i = 0 ;
16
41
auto sess = session. session ( ) ;
17
- for ( str filename in args) {
18
- if ( i > 0 ) {
19
- auto p = parser. new_parser ( sess, 0 , filename) ;
20
- auto crate = parser. parse_crate ( p) ;
21
- crate = resolve. resolve_crate ( sess, crate ) ;
22
- trans. trans_crate ( sess, crate ) ;
42
+ let option[ str] input_file = none[ str] ;
43
+ let option[ str] output_file = none[ str] ;
44
+ let bool do_warn = true ;
45
+
46
+ auto i = 1 u;
47
+ auto len = _vec. len [ str] ( args) ;
48
+
49
+ // FIXME: a getopt module would be nice.
50
+ while ( i < len) {
51
+ auto arg = args. ( i) ;
52
+ if ( _str. byte_len ( arg) > 0 u && arg. ( 0 ) == '-' as u8 ) {
53
+ if ( _str. eq ( arg, "-nowarn" ) ) {
54
+ do_warn = false ;
55
+ } else {
56
+ // FIXME: rust could use an elif construct.
57
+ if ( _str. eq ( arg, "-o" ) ) {
58
+ if ( i+1 u < len) {
59
+ output_file = some ( args. ( i +1 u) ) ;
60
+ i += 1 u;
61
+ } else {
62
+ usage ( sess, args. ( 0 ) ) ;
63
+ sess. err ( "-o requires an argument" ) ;
64
+ }
65
+ } else {
66
+ if ( _str. eq ( arg, "-h" ) ) {
67
+ usage ( sess, args. ( 0 ) ) ;
68
+ } else {
69
+ usage ( sess, args. ( 0 ) ) ;
70
+ sess. err ( "unrecognized option: " + arg) ;
71
+ }
72
+ }
73
+ }
74
+ } else {
75
+ alt ( input_file) {
76
+ case ( some[ str] ( _) ) {
77
+ usage ( sess, args. ( 0 ) ) ;
78
+ sess. err ( "multiple inputs provided" ) ;
79
+ }
80
+ case ( none[ str] ) {
81
+ input_file = some[ str] ( arg) ;
82
+ }
83
+ }
84
+ // FIXME: dummy node to work around typestate mis-wiring bug.
85
+ i = i;
86
+ }
87
+ i += 1 u;
88
+ }
89
+
90
+ if ( do_warn) {
91
+ warn_wrong_compiler ( ) ;
92
+ }
93
+
94
+ alt ( input_file) {
95
+ case ( none[ str] ) {
96
+ usage ( sess, args. ( 0 ) ) ;
97
+ sess. err ( "no input filename" ) ;
98
+ }
99
+ case ( some[ str] ( ?ifile) ) {
100
+ alt ( output_file) {
101
+ case ( none[ str] ) {
102
+ let vec[ str] parts = _str. split ( ifile, '.' as u8 ) ;
103
+ parts = _vec. pop [ str] ( parts) ;
104
+ parts += ".bc" ;
105
+ auto ofile = _str. concat ( parts) ;
106
+ compile_input ( sess, ifile, ofile) ;
107
+ }
108
+ case ( some[ str] ( ?ofile) ) {
109
+ compile_input ( sess, ifile, ofile) ;
110
+ }
111
+ }
23
112
}
24
- i += 1 ;
25
113
}
26
114
}
27
115
0 commit comments