From 718c0b5963e6513337e4fee003b34423397c2d14 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Wed, 4 Aug 2010 23:09:25 -0700 Subject: Add to std._io some formatter/type-specific-writer mechanism. Make a few type-specific buffered writers as wrappers of buf_writer. --- src/lib/_io.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src/lib/_io.rs') diff --git a/src/lib/_io.rs b/src/lib/_io.rs index 142f808a..b0b0c313 100644 --- a/src/lib/_io.rs +++ b/src/lib/_io.rs @@ -1,3 +1,7 @@ +import std.os; +import std._str; +import std._vec; + type buf_reader = unsafe obj { fn read() -> vec[u8]; }; @@ -107,3 +111,50 @@ fn new_buf_writer(str path, vec[fileflag] flags) -> buf_writer { } ret fd_buf_writer(fd); } + +type formatter[T] = fn(&T x) -> vec[u8]; + +type writer[T] = unsafe obj { fn write(&T x); }; + +fn mk_writer[T](str path, + vec[fileflag] flags, + &formatter[T] fmt) + -> writer[T] +{ + unsafe obj w[T](buf_writer out, formatter[T] fmt) { + fn write(&T x) { + out.write(fmt(x)); + } + } + ret w[T](new_buf_writer(path, flags), fmt); +} + +/* TODO: int_writer, uint_writer, ... */ + +fn str_writer(str path, vec[fileflag] flags) -> writer[str] { + auto fmt = _str.bytes; // FIXME (issue #90) + ret mk_writer[str](path, flags, fmt); +} + +fn vec_writer[T](str path, + vec[fileflag] flags, + &formatter[T] inner) + -> writer[vec[T]] +{ + fn fmt[T](&vec[T] v, &formatter[T] inner) -> vec[u8] { + let vec[u8] res = _str.bytes("vec("); + auto first = true; + for (T x in v) { + if (!first) { + res += _str.bytes(", "); + } else { + first = false; + } + res += inner(x); + } + res += _str.bytes(")\n"); + ret res; + } + + ret mk_writer[vec[T]](path, flags, bind fmt[T](_, inner)); +} -- cgit v1.2.3 From 80a1cd3d1e5e39db00a68ad6c1dc5686b775a4ad Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Fri, 6 Aug 2010 15:48:23 -0700 Subject: Redo yesterday's buf_writer-wrapper in a less silly and convoluted way. Add integer stringifying functions to _int module. --- src/lib/_io.rs | 58 +++++++++++++++------------------------------------------- 1 file changed, 15 insertions(+), 43 deletions(-) (limited to 'src/lib/_io.rs') diff --git a/src/lib/_io.rs b/src/lib/_io.rs index b0b0c313..dbd60e63 100644 --- a/src/lib/_io.rs +++ b/src/lib/_io.rs @@ -112,49 +112,21 @@ fn new_buf_writer(str path, vec[fileflag] flags) -> buf_writer { ret fd_buf_writer(fd); } -type formatter[T] = fn(&T x) -> vec[u8]; - -type writer[T] = unsafe obj { fn write(&T x); }; - -fn mk_writer[T](str path, - vec[fileflag] flags, - &formatter[T] fmt) - -> writer[T] -{ - unsafe obj w[T](buf_writer out, formatter[T] fmt) { - fn write(&T x) { - out.write(fmt(x)); - } - } - ret w[T](new_buf_writer(path, flags), fmt); -} - -/* TODO: int_writer, uint_writer, ... */ - -fn str_writer(str path, vec[fileflag] flags) -> writer[str] { - auto fmt = _str.bytes; // FIXME (issue #90) - ret mk_writer[str](path, flags, fmt); -} - -fn vec_writer[T](str path, - vec[fileflag] flags, - &formatter[T] inner) - -> writer[vec[T]] +type writer = + unsafe obj { + fn write_str(str s); + fn write_int(int n); + fn write_uint(uint n); + }; + +fn file_writer(str path, + vec[fileflag] flags) + -> writer { - fn fmt[T](&vec[T] v, &formatter[T] inner) -> vec[u8] { - let vec[u8] res = _str.bytes("vec("); - auto first = true; - for (T x in v) { - if (!first) { - res += _str.bytes(", "); - } else { - first = false; - } - res += inner(x); - } - res += _str.bytes(")\n"); - ret res; + unsafe obj fw(buf_writer out) { + fn write_str(str s) { out.write(_str.bytes(s)); } + fn write_int(int n) { out.write(_str.bytes(_int.to_string(n, 10u))); } + fn write_uint(uint n) { out.write(_str.bytes(_int.uto_string(n, 10u))); } } - - ret mk_writer[vec[T]](path, flags, bind fmt[T](_, inner)); + ret fw(new_buf_writer(path, flags)); } -- cgit v1.2.3 From 581a95a804f77259153c030d39f861282b468612 Mon Sep 17 00:00:00 2001 From: Jeffrey Yasskin Date: Sat, 24 Jul 2010 16:01:34 -0700 Subject: Add an int->str conversion function. The test currently fails because string equality isn't implemented. --- src/lib/_io.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib/_io.rs') diff --git a/src/lib/_io.rs b/src/lib/_io.rs index dbd60e63..93d06d41 100644 --- a/src/lib/_io.rs +++ b/src/lib/_io.rs @@ -125,8 +125,8 @@ fn file_writer(str path, { unsafe obj fw(buf_writer out) { fn write_str(str s) { out.write(_str.bytes(s)); } - fn write_int(int n) { out.write(_str.bytes(_int.to_string(n, 10u))); } - fn write_uint(uint n) { out.write(_str.bytes(_int.uto_string(n, 10u))); } + fn write_int(int n) { out.write(_str.bytes(_int.to_str(n, 10u))); } + fn write_uint(uint n) { out.write(_str.bytes(_int.uto_str(n, 10u))); } } ret fw(new_buf_writer(path, flags)); } -- cgit v1.2.3