Skip to content

Commit 51227c1

Browse files
committed
Merge pull request #1389 from erickt/master
misc standard library additions
2 parents 9236fdf + b6cecdd commit 51227c1

File tree

4 files changed

+49
-13
lines changed

4 files changed

+49
-13
lines changed

src/comp/syntax/ext/fmt.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ fn expand_syntax_ext(cx: ext_ctxt, sp: span, arg: @ast::expr,
2626
}
2727
let fmt =
2828
expr_to_str(cx, args[0],
29-
"first argument to #fmt must be a " + "string literal.");
29+
"first argument to #fmt must be a string literal.");
3030
let fmtspan = args[0].span;
3131
#debug("Format string:");
3232
log(debug, fmt);

src/libcore/u64.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Convert to a string
6565
fn str(n: u64) -> str { ret to_str(n, 10u); }
6666

6767
/*
68-
Function: parse_buf
68+
Function: from_str
6969
7070
Parse a string as an unsigned integer.
7171
*/

src/libstd/io.rs

+30-11
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,10 @@ fn new_byte_buf_reader(buf: [u8]) -> buf_reader {
242242
ret byte_buf_reader(@{buf: buf, mutable pos: 0u});
243243
}
244244

245+
fn bytes_reader(bytes: [u8]) -> reader {
246+
ret new_reader(new_byte_buf_reader(bytes));
247+
}
248+
245249
fn string_reader(s: str) -> reader {
246250
ret new_reader(new_byte_buf_reader(str::bytes(s)));
247251
}
@@ -256,15 +260,15 @@ type buf_writer =
256260
// FIXME: eventually u64
257261

258262
obj {
259-
fn write([u8]);
263+
fn write([const u8]);
260264
fn seek(int, seek_style);
261265
fn tell() -> uint;
262266
fn flush() -> int;
263267
fn fsync(level: fsync::level) -> int;
264268
};
265269

266270
obj FILE_writer(f: os::libc::FILE, res: option::t<@FILE_res>) {
267-
fn write(v: [u8]) unsafe {
271+
fn write(v: [const u8]) unsafe {
268272
let len = vec::len::<u8>(v);
269273
let vbuf = vec::unsafe::to_ptr::<u8>(v);
270274
let nout = os::libc::fwrite(vbuf, len, 1u, f);
@@ -283,7 +287,7 @@ obj FILE_writer(f: os::libc::FILE, res: option::t<@FILE_res>) {
283287
resource fd_res(fd: fd_t) { os::libc::close(fd); }
284288

285289
obj fd_buf_writer(fd: fd_t, res: option::t<@fd_res>) {
286-
fn write(v: [u8]) unsafe {
290+
fn write(v: [const u8]) unsafe {
287291
let len = vec::len::<u8>(v);
288292
let count = 0u;
289293
let vbuf;
@@ -351,7 +355,7 @@ type writer =
351355
fn write_char(char);
352356
fn write_int(int);
353357
fn write_uint(uint);
354-
fn write_bytes([u8]);
358+
fn write_bytes([const u8]);
355359
fn write_le_uint(uint, uint);
356360
fn write_le_int(int, uint);
357361
fn write_be_uint(uint, uint);
@@ -384,7 +388,7 @@ obj new_writer(out: buf_writer) {
384388
}
385389
fn write_int(n: int) { out.write(str::bytes(int::to_str(n, 10u))); }
386390
fn write_uint(n: uint) { out.write(str::bytes(uint::to_str(n, 10u))); }
387-
fn write_bytes(bytes: [u8]) { out.write(bytes); }
391+
fn write_bytes(bytes: [const u8]) { out.write(bytes); }
388392
fn write_le_uint(n: uint, size: uint) {
389393
out.write(uint_to_le_bytes(n, size));
390394
}
@@ -426,6 +430,12 @@ fn stderr() -> writer { ret new_writer(fd_buf_writer(2i32, option::none)); }
426430
fn print(s: str) { stdout().write_str(s); }
427431
fn println(s: str) { stdout().write_str(s + "\n"); }
428432

433+
type bytes_writer =
434+
obj {
435+
fn get_writer() -> writer;
436+
fn get_bytes() -> [mutable u8];
437+
};
438+
429439
type str_writer =
430440
obj {
431441
fn get_writer() -> writer;
@@ -435,7 +445,7 @@ type str_writer =
435445
type mutable_byte_buf = @{mutable buf: [mutable u8], mutable pos: uint};
436446

437447
obj byte_buf_writer(buf: mutable_byte_buf) {
438-
fn write(v: [u8]) {
448+
fn write(v: [const u8]) {
439449
// Fast path.
440450

441451
if buf.pos == vec::len(buf.buf) {
@@ -466,17 +476,26 @@ obj byte_buf_writer(buf: mutable_byte_buf) {
466476
fn fsync(_level: fsync::level) -> int { ret 0; }
467477
}
468478

469-
fn string_writer() -> str_writer {
479+
fn bytes_writer() -> bytes_writer {
470480
// FIXME: yikes, this is bad. Needs fixing of mutable syntax.
471481

472482
let b: [mutable u8] = [mutable 0u8];
473483
vec::pop(b);
474-
let buf: mutable_byte_buf = @{mutable buf: b, mutable pos: 0u};
475-
obj str_writer_wrap(wr: writer, buf: mutable_byte_buf) {
484+
let buf = @{mutable buf: b, mutable pos: 0u};
485+
obj byte_buf_writer_wrap(wr: writer, buf: mutable_byte_buf) {
476486
fn get_writer() -> writer { ret wr; }
477-
fn get_str() -> str { ret str::unsafe_from_bytes(buf.buf); }
487+
fn get_bytes() -> [mutable u8] { ret buf.buf; }
488+
}
489+
ret byte_buf_writer_wrap(new_writer(byte_buf_writer(buf)), buf);
490+
}
491+
492+
fn string_writer() -> str_writer {
493+
let writer = bytes_writer();
494+
obj str_writer_wrap(wr: bytes_writer) {
495+
fn get_writer() -> writer { wr.get_writer() }
496+
fn get_str() -> str { str::unsafe_from_bytes(wr.get_bytes()) }
478497
}
479-
ret str_writer_wrap(new_writer(byte_buf_writer(buf)), buf);
498+
str_writer_wrap(writer)
480499
}
481500

482501

src/libstd/rand.rs

+17
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ type rng = obj {
3939
Return a random string composed of A-Z, a-z, 0-9.
4040
*/
4141
fn gen_str(len: uint) -> str;
42+
43+
/*
44+
Method: gen_bytes
45+
46+
Return a random byte string.
47+
*/
48+
fn gen_bytes(len: uint) -> [u8];
4249
};
4350

4451
resource rand_res(c: rustrt::rctx) { rustrt::rand_free(c); }
@@ -74,6 +81,16 @@ fn mk_rng() -> rng {
7481
}
7582
s
7683
}
84+
fn gen_bytes(len: uint) -> [u8] {
85+
let v = [];
86+
let i = 0u;
87+
while i < len {
88+
let n = rustrt::rand_next(**c) as uint;
89+
v += [(n % (u8::max_value as uint)) as u8];
90+
i += 1u;
91+
}
92+
v
93+
}
7794
}
7895
ret rt_rng(@rand_res(rustrt::rand_new()));
7996
}

0 commit comments

Comments
 (0)