@@ -15,6 +15,7 @@ tag seek_style {seek_set; seek_end; seek_cur;}
15
15
type buf_reader =
16
16
state obj {
17
17
impure fn read( uint len) -> vec[ u8] ;
18
+ impure fn read_byte ( ) -> int ;
18
19
impure fn unread_byte ( int byte ) ;
19
20
impure fn eof ( ) -> bool ;
20
21
@@ -60,6 +61,9 @@ state obj FILE_buf_reader(os.libc.FILE f, bool must_close) {
60
61
_vec. len_set [ u8] ( buf, read) ;
61
62
ret buf;
62
63
}
64
+ impure fn read_byte ( ) -> int {
65
+ ret os. libc . fgetc ( f) ;
66
+ }
63
67
impure fn unread_byte ( int byte ) {
64
68
os. libc . ungetc ( byte, f) ;
65
69
}
@@ -77,25 +81,13 @@ state obj FILE_buf_reader(os.libc.FILE f, bool must_close) {
77
81
}
78
82
}
79
83
80
- // FIXME: When we have a "self" keyword, move this into read_byte(). This is
81
- // only here so that multiple method implementations below can use it.
82
- //
83
- // FIXME: Return value should be option[u8], not int.
84
- impure fn read_byte_from_buf_reader( buf_reader rdr) -> int {
85
- auto buf = rdr. read ( 1 u) ;
86
- if ( _vec. len [ u8] ( buf) == 0 u) {
87
- ret -1 ;
88
- }
89
- ret buf. ( 0 ) as int ;
90
- }
91
-
92
84
// FIXME: Convert this into pseudomethods on buf_reader.
93
85
state obj new_reader( buf_reader rdr) {
94
86
impure fn get_buf_reader( ) -> buf_reader {
95
87
ret rdr;
96
88
}
97
89
impure fn read_byte ( ) -> int {
98
- ret read_byte_from_buf_reader ( rdr) ;
90
+ ret rdr. read_byte ( ) ;
99
91
}
100
92
impure fn unread_byte ( int byte) {
101
93
ret rdr. unread_byte ( byte) ;
@@ -104,7 +96,7 @@ state obj new_reader(buf_reader rdr) {
104
96
ret rdr. read ( len) ;
105
97
}
106
98
impure fn read_char ( ) -> char {
107
- auto c0 = read_byte_from_buf_reader ( rdr) ;
99
+ auto c0 = rdr. read_byte ( ) ;
108
100
if ( c0 == -1 ) { ret -1 as char ; } // FIXME will this stay valid?
109
101
auto b0 = c0 as u8 ;
110
102
auto w = _str. utf8_char_width ( b0) ;
@@ -113,7 +105,7 @@ state obj new_reader(buf_reader rdr) {
113
105
auto val = 0 u;
114
106
while ( w > 1 u) {
115
107
w -= 1 u;
116
- auto next = read_byte_from_buf_reader ( rdr) ;
108
+ auto next = rdr. read_byte ( ) ;
117
109
check ( next > -1 ) ;
118
110
check ( next & 0xc0 == 0x80 ) ;
119
111
val <<= 6 u;
@@ -131,7 +123,7 @@ state obj new_reader(buf_reader rdr) {
131
123
// No break yet in rustc
132
124
auto go_on = true ;
133
125
while ( go_on) {
134
- auto ch = read_byte_from_buf_reader ( rdr) ;
126
+ auto ch = rdr. read_byte ( ) ;
135
127
if ( ch == -1 || ch == 10 ) { go_on = false ; }
136
128
else { _vec. push [ u8] ( buf, ch as u8 ) ; }
137
129
}
@@ -141,7 +133,7 @@ state obj new_reader(buf_reader rdr) {
141
133
let vec[ u8] buf = vec ( ) ;
142
134
auto go_on = true ;
143
135
while ( go_on) {
144
- auto ch = read_byte_from_buf_reader ( rdr) ;
136
+ auto ch = rdr. read_byte ( ) ;
145
137
if ( ch < 1 ) { go_on = false ; }
146
138
else { _vec. push [ u8] ( buf, ch as u8 ) ; }
147
139
}
@@ -152,7 +144,7 @@ state obj new_reader(buf_reader rdr) {
152
144
auto val = 0 u;
153
145
auto pos = 0 u;
154
146
while ( size > 0 u) {
155
- val += ( read_byte_from_buf_reader ( rdr) as uint ) << pos;
147
+ val += ( rdr. read_byte ( ) as uint ) << pos;
156
148
pos += 8 u;
157
149
size -= 1 u;
158
150
}
@@ -162,7 +154,7 @@ state obj new_reader(buf_reader rdr) {
162
154
auto val = 0 u;
163
155
auto pos = 0 u;
164
156
while ( size > 0 u) {
165
- val += ( read_byte_from_buf_reader ( rdr) as uint ) << pos;
157
+ val += ( rdr. read_byte ( ) as uint ) << pos;
166
158
pos += 8 u;
167
159
size -= 1 u;
168
160
}
@@ -174,7 +166,7 @@ state obj new_reader(buf_reader rdr) {
174
166
auto sz = size; // FIXME: trans.ml bug workaround
175
167
while ( sz > 0 u) {
176
168
sz -= 1 u;
177
- val += ( read_byte_from_buf_reader ( rdr) as uint ) << ( sz * 8 u) ;
169
+ val += ( rdr. read_byte ( ) as uint ) << ( sz * 8 u) ;
178
170
}
179
171
ret val;
180
172
}
@@ -221,6 +213,12 @@ state obj byte_buf_reader(byte_buf bbuf) {
221
213
bbuf. pos += to_read;
222
214
ret range;
223
215
}
216
+ impure fn read_byte ( ) -> int {
217
+ if ( bbuf. pos == _vec. len [ u8] ( bbuf. buf ) ) { ret -1 ; }
218
+ auto b = bbuf. buf . ( bbuf. pos ) ;
219
+ bbuf. pos += 1 u;
220
+ ret b as int ;
221
+ }
224
222
225
223
impure fn unread_byte ( int byte ) {
226
224
log "TODO: unread_byte" ;
0 commit comments