Skip to content

Commit 718c0b5

Browse files
committed
Add to std._io some formatter/type-specific-writer mechanism. Make a few type-specific buffered writers as wrappers of buf_writer.
1 parent 6e98a3b commit 718c0b5

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed

src/lib/_io.rs

+51
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import std.os;
2+
import std._str;
3+
import std._vec;
4+
15
type buf_reader = unsafe obj {
26
fn read() -> vec[u8];
37
};
@@ -107,3 +111,50 @@ fn new_buf_writer(str path, vec[fileflag] flags) -> buf_writer {
107111
}
108112
ret fd_buf_writer(fd);
109113
}
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+
}

src/lib/_str.rs

+19
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@ fn is_utf8(vec[u8] v) -> bool {
1212
fail; // FIXME
1313
}
1414

15+
fn is_ascii(str s) -> bool {
16+
let uint i = len(s);
17+
while (i > 0u) {
18+
i -= 1u;
19+
// FIXME (issue #94)
20+
if ((s.(i as int) & 0x80u8) != 0u8) {
21+
ret false;
22+
}
23+
}
24+
ret true;
25+
}
26+
1527
fn alloc(uint n_bytes) -> str {
1628
ret rustrt.str_alloc(n_bytes);
1729
}
@@ -23,3 +35,10 @@ fn len(str s) -> uint {
2335
fn buf(str s) -> sbuf {
2436
ret rustrt.str_buf(s);
2537
}
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+
}

src/test/run-pass/lib-map.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@ use std;
44
import std.map;
55

66
fn test_simple() {
7+
log "*** starting test_simple";
8+
79
fn eq(&uint x, &uint y) -> bool { ret x == y; }
810

911
let map.hashfn[uint] hasher = std.util.id[uint];
1012
let map.eqfn[uint] eqer = eq;
1113
let map.hashmap[uint, uint] hm = map.mk_hashmap[uint, uint](hasher, eqer);
14+
15+
log "*** finished test_simple";
1216
}
1317

1418
fn main() {
1519
test_simple();
16-
}
20+
}

0 commit comments

Comments
 (0)