Redo yesterday's buf_writer-wrapper in a less silly and convoluted way. Add integer stringifying functions to _int module.

This commit is contained in:
Roy Frostig 2010-08-06 15:48:23 -07:00
parent 514fb4b321
commit 80a1cd3d1e
2 changed files with 58 additions and 42 deletions

View file

@ -44,3 +44,47 @@ fn next_power_of_two(uint n) -> uint {
}
ret tmp + 1u;
}
fn uto_string(mutable uint n, uint radix) -> str
{
check (0u < radix && radix <= 16u);
fn digit(uint n) -> str {
alt (n) {
case (0u) { ret "0"; }
case (1u) { ret "1"; }
case (2u) { ret "2"; }
case (3u) { ret "3"; }
case (4u) { ret "4"; }
case (5u) { ret "5"; }
case (6u) { ret "6"; }
case (7u) { ret "7"; }
case (8u) { ret "8"; }
case (9u) { ret "9"; }
case (10u) { ret "A"; }
case (11u) { ret "B"; }
case (12u) { ret "C"; }
case (13u) { ret "D"; }
case (14u) { ret "E"; }
case (15u) { ret "F"; }
}
}
if (n == 0u) { ret "0"; }
let str s = "";
while (n > 0u) {
s = digit(n % radix) + s;
n /= radix;
}
ret s;
}
fn to_string(mutable int n, uint radix) -> str
{
check (0u < radix && radix <= 16u);
if (n < 0) {
ret "-" + uto_string((-n) as uint, radix);
} else {
ret uto_string(n as uint, radix);
}
}

View file

@ -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 =
unsafe obj {
fn write_str(str s);
fn write_int(int n);
fn write_uint(uint n);
};
type writer[T] = unsafe obj { fn write(&T x); };
fn mk_writer[T](str path,
vec[fileflag] flags,
&formatter[T] fmt)
-> writer[T]
fn file_writer(str path,
vec[fileflag] flags)
-> writer
{
unsafe obj w[T](buf_writer out, formatter[T] fmt) {
fn write(&T x) {
out.write(fmt(x));
}
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 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));
ret fw(new_buf_writer(path, flags));
}