@@ -5,150 +5,154 @@ import std._vec;
5
5
6
6
type stdio_reader = unsafe obj {
7
7
fn getc( ) -> int ;
8
+ fn ungetc ( int i) ;
8
9
} ;
9
10
10
11
fn new_stdio_reader ( str path ) -> stdio_reader {
11
- unsafe obj stdio_FILE_reader ( os. libc . FILE f) {
12
- fn getc ( ) -> int {
13
- ret os. libc . fgetc ( f) ;
14
- }
15
- drop {
16
- os. libc . fclose ( f) ;
12
+ unsafe obj stdio_FILE_reader ( os. libc . FILE f) {
13
+ fn getc ( ) -> int {
14
+ ret os. libc . fgetc ( f) ;
15
+ }
16
+ fn ungetc ( int i) {
17
+ os. libc . ungetc ( i, f) ;
18
+ }
19
+ drop {
20
+ os. libc . fclose ( f) ;
21
+ }
17
22
}
18
- }
19
- ret stdio_FILE_reader ( os. libc . fopen ( _str. buf ( path) ,
20
- _str. buf ( "r" ) ) ) ;
23
+ ret stdio_FILE_reader ( os. libc . fopen ( _str. buf ( path) ,
24
+ _str. buf ( "r" ) ) ) ;
21
25
}
22
26
23
27
24
28
type buf_reader = unsafe obj {
25
- fn read ( ) -> vec[ u8 ] ;
29
+ fn read ( ) -> vec[ u8 ] ;
26
30
} ;
27
31
28
32
type buf_writer = unsafe obj {
29
- fn write( vec[ u8] v ) ;
33
+ fn write( vec[ u8] v ) ;
30
34
} ;
31
35
32
36
fn default_bufsz ( ) -> uint {
33
- ret 4096 u;
37
+ ret 4096 u;
34
38
}
35
39
36
40
fn new_buf ( ) -> vec[ u8 ] {
37
- ret _vec. alloc [ u8] ( default_bufsz ( ) ) ;
41
+ ret _vec. alloc [ u8] ( default_bufsz ( ) ) ;
38
42
}
39
43
40
44
fn new_buf_reader ( str path ) -> buf_reader {
41
45
42
- unsafe obj fd_buf_reader ( int fd, mutable vec[ u8] buf) {
46
+ unsafe obj fd_buf_reader ( int fd, mutable vec[ u8] buf) {
43
47
44
- fn read ( ) -> vec[ u8 ] {
48
+ fn read ( ) -> vec[ u8 ] {
45
49
46
- // Ensure our buf is singly-referenced.
47
- if ( _vec. rustrt . refcount [ u8] ( buf) != 1 u) {
48
- buf = new_buf ( ) ;
49
- }
50
+ // Ensure our buf is singly-referenced.
51
+ if ( _vec. rustrt . refcount [ u8] ( buf) != 1 u) {
52
+ buf = new_buf ( ) ;
53
+ }
50
54
51
- auto len = default_bufsz ( ) ;
52
- auto vbuf = _vec. buf [ u8] ( buf) ;
53
- auto count = os. libc . read ( fd, vbuf, len) ;
55
+ auto len = default_bufsz ( ) ;
56
+ auto vbuf = _vec. buf [ u8] ( buf) ;
57
+ auto count = os. libc . read ( fd, vbuf, len) ;
54
58
55
- if ( count < 0 ) {
56
- log "error filling buffer" ;
57
- log sys. rustrt . last_os_error ( ) ;
58
- fail;
59
- }
59
+ if ( count < 0 ) {
60
+ log "error filling buffer" ;
61
+ log sys. rustrt . last_os_error ( ) ;
62
+ fail;
63
+ }
64
+
65
+ _vec. len_set [ u8] ( buf, count as uint ) ;
66
+ ret buf;
67
+ }
60
68
61
- _vec. len_set [ u8] ( buf, count as uint ) ;
62
- ret buf;
69
+ drop {
70
+ os. libc . close ( fd) ;
71
+ }
63
72
}
64
73
65
- drop {
66
- os. libc . close ( fd) ;
74
+ auto fd = os. libc . open ( _str. buf ( path) ,
75
+ os. libc_constants . O_RDONLY ( ) |
76
+ os. libc_constants . O_BINARY ( ) ,
77
+ 0 u) ;
78
+
79
+ if ( fd < 0 ) {
80
+ log "error opening file for reading" ;
81
+ log sys. rustrt . last_os_error ( ) ;
82
+ fail;
67
83
}
68
- }
69
-
70
- auto fd = os. libc . open ( _str. buf ( path) ,
71
- os. libc_constants . O_RDONLY ( ) |
72
- os. libc_constants . O_BINARY ( ) ,
73
- 0 u) ;
74
-
75
- if ( fd < 0 ) {
76
- log "error opening file for reading" ;
77
- log sys. rustrt . last_os_error ( ) ;
78
- fail;
79
- }
80
- ret fd_buf_reader ( fd, new_buf ( ) ) ;
84
+ ret fd_buf_reader ( fd, new_buf ( ) ) ;
81
85
}
82
86
83
87
type fileflag = tag ( append ( ) , create ( ) , truncate ( ) ) ;
84
88
85
89
fn new_buf_writer ( str path , vec[ fileflag] flags ) -> buf_writer {
86
90
87
- unsafe obj fd_buf_writer ( int fd) {
88
-
89
- fn write ( vec[ u8] v ) {
90
- auto len = _vec. len [ u8] ( v) ;
91
- auto count = 0 u;
92
- auto vbuf;
93
- while ( count < len) {
94
- vbuf = _vec. buf_off [ u8] ( v, count) ;
95
- auto nout = os. libc . write ( fd, vbuf, len) ;
96
- if ( nout < 0 ) {
97
- log "error dumping buffer" ;
98
- log sys. rustrt . last_os_error ( ) ;
99
- fail;
91
+ unsafe obj fd_buf_writer ( int fd) {
92
+
93
+ fn write ( vec[ u8] v ) {
94
+ auto len = _vec. len [ u8] ( v) ;
95
+ auto count = 0 u;
96
+ auto vbuf;
97
+ while ( count < len) {
98
+ vbuf = _vec. buf_off [ u8] ( v, count) ;
99
+ auto nout = os. libc . write ( fd, vbuf, len) ;
100
+ if ( nout < 0 ) {
101
+ log "error dumping buffer" ;
102
+ log sys. rustrt . last_os_error ( ) ;
103
+ fail;
104
+ }
105
+ count += nout as uint ;
106
+ }
107
+ }
108
+
109
+ drop {
110
+ os. libc . close ( fd) ;
100
111
}
101
- count += nout as uint ;
102
- }
103
112
}
104
113
105
- drop {
106
- os. libc . close ( fd) ;
114
+ let int fflags =
115
+ os. libc_constants . O_WRONLY ( ) |
116
+ os. libc_constants . O_BINARY ( ) ;
117
+
118
+ for ( fileflag f in flags) {
119
+ alt ( f) {
120
+ case ( append( ) ) { fflags |= os. libc_constants. O_APPEND ( ) ; }
121
+ case ( create( ) ) { fflags |= os. libc_constants. O_CREAT ( ) ; }
122
+ case ( truncate( ) ) { fflags |= os. libc_constants. O_TRUNC ( ) ; }
123
+ }
107
124
}
108
- }
109
125
110
- let int fflags =
111
- os. libc_constants . O_WRONLY ( ) |
112
- os. libc_constants . O_BINARY ( ) ;
126
+ auto fd = os. libc. open( _str. buf( path) ,
127
+ fflags,
128
+ os. libc_constants. S_IRUSR ( ) |
129
+ os. libc_constants. S_IWUSR ( ) ) ;
113
130
114
- for ( fileflag f in flags) {
115
- alt ( f) {
116
- case ( append( ) ) { fflags |= os. libc_constants. O_APPEND ( ) ; }
117
- case ( create( ) ) { fflags |= os. libc_constants. O_CREAT ( ) ; }
118
- case ( truncate( ) ) { fflags |= os. libc_constants. O_TRUNC ( ) ; }
131
+ if ( fd < 0 ) {
132
+ log "error opening file for writing" ;
133
+ log sys. rustrt . last_os_error ( ) ;
134
+ fail;
119
135
}
120
- }
121
-
122
- auto fd = os. libc. open( _str. buf( path) ,
123
- fflags,
124
- os. libc_constants. S_IRUSR ( ) |
125
- os. libc_constants. S_IWUSR ( ) ) ;
126
-
127
- if ( fd < 0 ) {
128
- log "error opening file for writing" ;
129
- log sys. rustrt . last_os_error ( ) ;
130
- fail;
131
- }
132
- ret fd_buf_writer ( fd) ;
136
+ ret fd_buf_writer ( fd) ;
133
137
}
134
138
135
139
type writer =
136
- unsafe obj {
137
- fn write_str ( str s) ;
138
- fn write_int ( int n) ;
139
- fn write_uint ( uint n) ;
140
- } ;
140
+ unsafe obj {
141
+ fn write_str ( str s) ;
142
+ fn write_int ( int n) ;
143
+ fn write_uint ( uint n) ;
144
+ } ;
141
145
142
146
fn file_writer ( str path ,
143
147
vec[ fileflag] flags )
144
- -> writer
148
+ -> writer
145
149
{
146
- unsafe obj fw ( buf_writer out) {
147
- fn write_str ( str s) { out. write ( _str. bytes ( s) ) ; }
148
- fn write_int ( int n) { out. write ( _str. bytes ( _int. to_str ( n, 10 u) ) ) ; }
149
- fn write_uint ( uint n) { out. write ( _str. bytes ( _uint. to_str ( n, 10 u) ) ) ; }
150
- }
151
- ret fw ( new_buf_writer ( path, flags) ) ;
150
+ unsafe obj fw ( buf_writer out) {
151
+ fn write_str ( str s) { out. write ( _str. bytes ( s) ) ; }
152
+ fn write_int ( int n) { out. write ( _str. bytes ( _int. to_str ( n, 10 u) ) ) ; }
153
+ fn write_uint ( uint n) { out. write ( _str. bytes ( _uint. to_str ( n, 10 u) ) ) ; }
154
+ }
155
+ ret fw ( new_buf_writer ( path, flags) ) ;
152
156
}
153
157
154
158
//
0 commit comments