File tree 3 files changed +75
-1
lines changed
3 files changed +75
-1
lines changed Original file line number Diff line number Diff line change
1
+ import std. os ;
2
+ import std. _str ;
3
+ import std. _vec ;
4
+
1
5
type buf_reader = unsafe obj {
2
6
fn read( ) -> vec[ u8 ] ;
3
7
} ;
@@ -107,3 +111,50 @@ fn new_buf_writer(str path, vec[fileflag] flags) -> buf_writer {
107
111
}
108
112
ret fd_buf_writer ( fd) ;
109
113
}
114
+
115
+ type formatter[ T ] = fn ( & T x) -> vec[ u8] ;
116
+
117
+ type writer [ T ] = unsafe obj { fn write ( & T x) ; } ;
118
+
119
+ fn mk_writer[ T ] ( str path,
120
+ vec[ fileflag] flags,
121
+ & formatter[ T ] fmt)
122
+ -> writer[ T ]
123
+ {
124
+ unsafe obj w[ T ] ( buf_writer out, formatter[ T ] fmt) {
125
+ fn write ( & T x) {
126
+ out. write ( fmt ( x) ) ;
127
+ }
128
+ }
129
+ ret w[ T ] ( new_buf_writer ( path, flags) , fmt) ;
130
+ }
131
+
132
+ /* TODO: int_writer, uint_writer, ... */
133
+
134
+ fn str_writer ( str path , vec[ fileflag] flags ) -> writer[ str ] {
135
+ auto fmt = _str. bytes ; // FIXME (issue #90)
136
+ ret mk_writer[ str] ( path, flags, fmt) ;
137
+ }
138
+
139
+ fn vec_writer[ T ] ( str path,
140
+ vec[ fileflag] flags,
141
+ & formatter[ T ] inner)
142
+ -> writer[ vec[ T ] ]
143
+ {
144
+ fn fmt[ T ] ( & vec[ T ] v, & formatter[ T ] inner) -> vec[ u8] {
145
+ let vec[ u8] res = _str. bytes ( "vec(" ) ;
146
+ auto first = true ;
147
+ for ( T x in v) {
148
+ if ( !first) {
149
+ res += _str. bytes ( ", " ) ;
150
+ } else {
151
+ first = false ;
152
+ }
153
+ res += inner ( x) ;
154
+ }
155
+ res += _str. bytes ( ")\n " ) ;
156
+ ret res;
157
+ }
158
+
159
+ ret mk_writer[ vec[ T ] ] ( path, flags, bind fmt[ T ] ( _, inner) ) ;
160
+ }
Original file line number Diff line number Diff line change @@ -12,6 +12,18 @@ fn is_utf8(vec[u8] v) -> bool {
12
12
fail; // FIXME
13
13
}
14
14
15
+ fn is_ascii ( str s) -> bool {
16
+ let uint i = len ( s) ;
17
+ while ( i > 0 u) {
18
+ i -= 1 u;
19
+ // FIXME (issue #94)
20
+ if ( ( s. ( i as int ) & 0x80u8 ) != 0u8 ) {
21
+ ret false ;
22
+ }
23
+ }
24
+ ret true;
25
+ }
26
+
15
27
fn alloc ( uint n_bytes ) -> str {
16
28
ret rustrt. str_alloc ( n_bytes) ;
17
29
}
@@ -23,3 +35,10 @@ fn len(str s) -> uint {
23
35
fn buf ( str s) -> sbuf {
24
36
ret rustrt. str_buf ( s) ;
25
37
}
38
+
39
+ fn bytes ( & str s) -> vec[ u8 ] {
40
+ fn ith ( str s, uint i) -> u8 {
41
+ ret s. ( i as int ) ; // FIXME (issue #94)
42
+ }
43
+ ret _vec. init_fn [ u8] ( bind ith( s, _) , _str. len ( s) ) ;
44
+ }
Original file line number Diff line number Diff line change @@ -4,13 +4,17 @@ use std;
4
4
import std. map ;
5
5
6
6
fn test_simple ( ) {
7
+ log "*** starting test_simple" ;
8
+
7
9
fn eq ( & uint x, & uint y) -> bool { ret x == y; }
8
10
9
11
let map. hashfn[ uint] hasher = std. util . id [ uint] ;
10
12
let map. eqfn[ uint] eqer = eq;
11
13
let map. hashmap[ uint, uint] hm = map. mk_hashmap [ uint, uint] ( hasher, eqer) ;
14
+
15
+ log "*** finished test_simple" ;
12
16
}
13
17
14
18
fn main ( ) {
15
19
test_simple ( ) ;
16
- }
20
+ }
You can’t perform that action at this time.
0 commit comments