(core::str) move push_byte, push_bytes, pop_byte, and shift_byte into str::unsafe
This commit is contained in:
parent
5fb0906f43
commit
944f5a6598
7 changed files with 70 additions and 85 deletions
|
@ -149,11 +149,11 @@ fn scan_exponent(rdr: reader) -> option<str> {
|
||||||
let c = rdr.curr;
|
let c = rdr.curr;
|
||||||
let rslt = "";
|
let rslt = "";
|
||||||
if c == 'e' || c == 'E' {
|
if c == 'e' || c == 'E' {
|
||||||
str::push_byte(rslt, c as u8);
|
str::push_char(rslt, c);
|
||||||
rdr.bump();
|
rdr.bump();
|
||||||
c = rdr.curr;
|
c = rdr.curr;
|
||||||
if c == '-' || c == '+' {
|
if c == '-' || c == '+' {
|
||||||
str::push_byte(rslt, c as u8);
|
str::push_char(rslt, c);
|
||||||
rdr.bump();
|
rdr.bump();
|
||||||
}
|
}
|
||||||
let exponent = scan_digits(rdr, 10u);
|
let exponent = scan_digits(rdr, 10u);
|
||||||
|
@ -170,7 +170,7 @@ fn scan_digits(rdr: reader, radix: uint) -> str {
|
||||||
if c == '_' { rdr.bump(); cont; }
|
if c == '_' { rdr.bump(); cont; }
|
||||||
alt char::maybe_digit(c) {
|
alt char::maybe_digit(c) {
|
||||||
some(d) if (d as uint) < radix {
|
some(d) if (d as uint) < radix {
|
||||||
str::push_byte(rslt, c as u8);
|
str::push_char(rslt, c);
|
||||||
rdr.bump();
|
rdr.bump();
|
||||||
}
|
}
|
||||||
_ { break; }
|
_ { break; }
|
||||||
|
@ -472,11 +472,11 @@ fn next_token_inner(rdr: reader) -> token::token {
|
||||||
let escaped = rdr.curr;
|
let escaped = rdr.curr;
|
||||||
rdr.bump();
|
rdr.bump();
|
||||||
alt escaped {
|
alt escaped {
|
||||||
'n' { str::push_byte(accum_str, '\n' as u8); }
|
'n' { str::push_char(accum_str, '\n'); }
|
||||||
'r' { str::push_byte(accum_str, '\r' as u8); }
|
'r' { str::push_char(accum_str, '\r'); }
|
||||||
't' { str::push_byte(accum_str, '\t' as u8); }
|
't' { str::push_char(accum_str, '\t'); }
|
||||||
'\\' { str::push_byte(accum_str, '\\' as u8); }
|
'\\' { str::push_char(accum_str, '\\'); }
|
||||||
'"' { str::push_byte(accum_str, '"' as u8); }
|
'"' { str::push_char(accum_str, '"'); }
|
||||||
'\n' { consume_whitespace(rdr); }
|
'\n' { consume_whitespace(rdr); }
|
||||||
'x' {
|
'x' {
|
||||||
str::push_char(accum_str, scan_numeric_escape(rdr, 2u));
|
str::push_char(accum_str, scan_numeric_escape(rdr, 2u));
|
||||||
|
|
|
@ -139,7 +139,7 @@ fn to_str(r: reader, t: token) -> str {
|
||||||
// FIXME: escape.
|
// FIXME: escape.
|
||||||
let tmp = "'";
|
let tmp = "'";
|
||||||
str::push_char(tmp, c as char);
|
str::push_char(tmp, c as char);
|
||||||
str::push_byte(tmp, '\'' as u8);
|
str::push_char(tmp, '\'');
|
||||||
ret tmp;
|
ret tmp;
|
||||||
}
|
}
|
||||||
LIT_INT(i, t) {
|
LIT_INT(i, t) {
|
||||||
|
|
|
@ -26,10 +26,6 @@ export
|
||||||
pop_char,
|
pop_char,
|
||||||
shift_char,
|
shift_char,
|
||||||
unshift_char,
|
unshift_char,
|
||||||
push_byte,
|
|
||||||
//push_bytes,
|
|
||||||
pop_byte,
|
|
||||||
shift_byte,
|
|
||||||
trim_left,
|
trim_left,
|
||||||
trim_right,
|
trim_right,
|
||||||
trim,
|
trim,
|
||||||
|
@ -137,7 +133,7 @@ fn from_byte(uu: u8) -> str {
|
||||||
from_bytes([uu])
|
from_bytes([uu])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_utf8_bytes(&s: str, ch: char) {
|
fn push_utf8_bytes(&s: str, ch: char) unsafe {
|
||||||
let code = ch as uint;
|
let code = ch as uint;
|
||||||
let bytes =
|
let bytes =
|
||||||
if code < max_one_b {
|
if code < max_one_b {
|
||||||
|
@ -168,7 +164,7 @@ fn push_utf8_bytes(&s: str, ch: char) {
|
||||||
(code >> 6u & 63u | tag_cont) as u8,
|
(code >> 6u & 63u | tag_cont) as u8,
|
||||||
(code & 63u | tag_cont) as u8]
|
(code & 63u | tag_cont) as u8]
|
||||||
};
|
};
|
||||||
push_bytes(s, bytes);
|
unsafe::push_bytes(s, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -303,58 +299,6 @@ Prepend a char to a string
|
||||||
*/
|
*/
|
||||||
fn unshift_char(&s: str, ch: char) { s = from_char(ch) + s; }
|
fn unshift_char(&s: str, ch: char) { s = from_char(ch) + s; }
|
||||||
|
|
||||||
/*
|
|
||||||
Function: push_byte
|
|
||||||
|
|
||||||
Appends a byte to a string.
|
|
||||||
|
|
||||||
This function is not unicode-safe.
|
|
||||||
*/
|
|
||||||
fn push_byte(&s: str, b: u8) { rustrt::rust_str_push(s, b); }
|
|
||||||
|
|
||||||
/*
|
|
||||||
Function: push_bytes
|
|
||||||
|
|
||||||
Appends a vector of bytes to a string.
|
|
||||||
|
|
||||||
This function is not unicode-safe.
|
|
||||||
*/
|
|
||||||
fn push_bytes(&s: str, bytes: [u8]) {
|
|
||||||
for byte in bytes { rustrt::rust_str_push(s, byte); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Function: pop_byte
|
|
||||||
|
|
||||||
Removes the last byte from a string and returns it.
|
|
||||||
|
|
||||||
This function is not unicode-safe.
|
|
||||||
FIXME: move to unsafe?
|
|
||||||
*/
|
|
||||||
fn pop_byte(&s: str) -> u8 unsafe {
|
|
||||||
let len = byte_len(s);
|
|
||||||
assert (len > 0u);
|
|
||||||
let b = s[len - 1u];
|
|
||||||
s = unsafe::slice_bytes(s, 0u, len - 1u);
|
|
||||||
ret b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Function: shift_byte
|
|
||||||
|
|
||||||
Removes the first byte from a string and returns it.
|
|
||||||
|
|
||||||
This function is not unicode-safe.
|
|
||||||
FIXME: move to unsafe?
|
|
||||||
*/
|
|
||||||
fn shift_byte(&s: str) -> u8 unsafe {
|
|
||||||
let len = byte_len(s);
|
|
||||||
assert (len > 0u);
|
|
||||||
let b = s[0];
|
|
||||||
s = unsafe::slice_bytes(s, 1u, len);
|
|
||||||
ret b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Function: trim_left
|
Function: trim_left
|
||||||
|
|
||||||
|
@ -592,8 +536,6 @@ fn split(ss: str, sepfn: fn(cc: char)->bool) -> [str] {
|
||||||
Function: split_char
|
Function: split_char
|
||||||
|
|
||||||
Splits a string into a vector of the substrings separated by a given character
|
Splits a string into a vector of the substrings separated by a given character
|
||||||
|
|
||||||
FIXME: also add splitn_char
|
|
||||||
*/
|
*/
|
||||||
fn split_char(ss: str, cc: char) -> [str] {
|
fn split_char(ss: str, cc: char) -> [str] {
|
||||||
split(ss, {|kk| kk == cc})
|
split(ss, {|kk| kk == cc})
|
||||||
|
@ -1409,7 +1351,11 @@ mod unsafe {
|
||||||
from_bytes,
|
from_bytes,
|
||||||
from_byte,
|
from_byte,
|
||||||
slice_bytes,
|
slice_bytes,
|
||||||
slice_bytes_safe_range;
|
slice_bytes_safe_range,
|
||||||
|
push_byte,
|
||||||
|
push_bytes, // note: wasn't exported
|
||||||
|
pop_byte,
|
||||||
|
shift_byte;
|
||||||
|
|
||||||
// Function: unsafe::from_bytes
|
// Function: unsafe::from_bytes
|
||||||
//
|
//
|
||||||
|
@ -1462,6 +1408,43 @@ mod unsafe {
|
||||||
assert (end <= byte_len(s));
|
assert (end <= byte_len(s));
|
||||||
ret slice_bytes(s, begin, end);
|
ret slice_bytes(s, begin, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function: push_byte
|
||||||
|
//
|
||||||
|
// Appends a byte to a string. (Not UTF-8 safe).
|
||||||
|
unsafe fn push_byte(&s: str, b: u8) {
|
||||||
|
rustrt::rust_str_push(s, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function: push_bytes
|
||||||
|
//
|
||||||
|
// Appends a vector of bytes to a string. (Not UTF-8 safe).
|
||||||
|
unsafe fn push_bytes(&s: str, bytes: [u8]) {
|
||||||
|
for byte in bytes { rustrt::rust_str_push(s, byte); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function: pop_byte
|
||||||
|
//
|
||||||
|
// Removes the last byte from a string and returns it. (Not UTF-8 safe).
|
||||||
|
unsafe fn pop_byte(&s: str) -> u8 unsafe {
|
||||||
|
let len = byte_len(s);
|
||||||
|
assert (len > 0u);
|
||||||
|
let b = s[len - 1u];
|
||||||
|
s = unsafe::slice_bytes(s, 0u, len - 1u);
|
||||||
|
ret b;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function: shift_byte
|
||||||
|
//
|
||||||
|
// Removes the first byte from a string and returns it. (Not UTF-8 safe).
|
||||||
|
unsafe fn shift_byte(&s: str) -> u8 unsafe {
|
||||||
|
let len = byte_len(s);
|
||||||
|
assert (len > 0u);
|
||||||
|
let b = s[0];
|
||||||
|
s = unsafe::slice_bytes(s, 1u, len);
|
||||||
|
ret b;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1914,17 +1897,17 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_shift_byte() {
|
fn test_shift_byte() unsafe {
|
||||||
let s = "ABC";
|
let s = "ABC";
|
||||||
let b = shift_byte(s);
|
let b = unsafe::shift_byte(s);
|
||||||
assert (s == "BC");
|
assert (s == "BC");
|
||||||
assert (b == 65u8);
|
assert (b == 65u8);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_pop_byte() {
|
fn test_pop_byte() unsafe {
|
||||||
let s = "ABC";
|
let s = "ABC";
|
||||||
let b = pop_byte(s);
|
let b = unsafe::pop_byte(s);
|
||||||
assert (s == "AB");
|
assert (s == "AB");
|
||||||
assert (b == 67u8);
|
assert (b == 67u8);
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,14 +89,14 @@ any leading path separator on `post`, and returns the concatenation of the two
|
||||||
with a single path separator between them.
|
with a single path separator between them.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fn connect(pre: path, post: path) -> path {
|
fn connect(pre: path, post: path) -> path unsafe {
|
||||||
let pre_ = pre;
|
let pre_ = pre;
|
||||||
let post_ = post;
|
let post_ = post;
|
||||||
let sep = os_fs::path_sep as u8;
|
let sep = os_fs::path_sep as u8;
|
||||||
let pre_len = str::byte_len(pre);
|
let pre_len = str::byte_len(pre);
|
||||||
let post_len = str::byte_len(post);
|
let post_len = str::byte_len(post);
|
||||||
if pre_len > 1u && pre[pre_len-1u] == sep { str::pop_byte(pre_); }
|
if pre_len > 1u && pre[pre_len-1u] == sep { str::unsafe::pop_byte(pre_); }
|
||||||
if post_len > 1u && post[0] == sep { str::shift_byte(post_); }
|
if post_len > 1u && post[0] == sep { str::unsafe::shift_byte(post_); }
|
||||||
ret pre_ + path_sep() + post_;
|
ret pre_ + path_sep() + post_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ fn b8() -> str {
|
||||||
ret "Go to the store and buy some more, # of beer on the wall.";
|
ret "Go to the store and buy some more, # of beer on the wall.";
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sub(t: str, n: int) -> str {
|
fn sub(t: str, n: int) -> str unsafe {
|
||||||
let b: str = "";
|
let b: str = "";
|
||||||
let i: uint = 0u;
|
let i: uint = 0u;
|
||||||
let ns: str;
|
let ns: str;
|
||||||
|
@ -32,7 +32,8 @@ fn sub(t: str, n: int) -> str {
|
||||||
_ { ns = int::to_str(n, 10u) + " bottles"; }
|
_ { ns = int::to_str(n, 10u) + " bottles"; }
|
||||||
}
|
}
|
||||||
while i < str::byte_len(t) {
|
while i < str::byte_len(t) {
|
||||||
if t[i] == '#' as u8 { b += ns; } else { str::push_byte(b, t[i]); }
|
if t[i] == '#' as u8 { b += ns; }
|
||||||
|
else { str::unsafe::push_byte(b, t[i]); }
|
||||||
i += 1u;
|
i += 1u;
|
||||||
}
|
}
|
||||||
ret b;
|
ret b;
|
||||||
|
|
|
@ -22,7 +22,7 @@ fn b8() -> str {
|
||||||
ret "Go to the store and buy some more, # of beer on the wall.";
|
ret "Go to the store and buy some more, # of beer on the wall.";
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sub(t: str, n: int) -> str {
|
fn sub(t: str, n: int) -> str unsafe {
|
||||||
let b: str = "";
|
let b: str = "";
|
||||||
let i: uint = 0u;
|
let i: uint = 0u;
|
||||||
let ns: str;
|
let ns: str;
|
||||||
|
@ -32,7 +32,8 @@ fn sub(t: str, n: int) -> str {
|
||||||
_ { ns = int::to_str(n, 10u) + " bottles"; }
|
_ { ns = int::to_str(n, 10u) + " bottles"; }
|
||||||
}
|
}
|
||||||
while i < str::byte_len(t) {
|
while i < str::byte_len(t) {
|
||||||
if t[i] == '#' as u8 { b += ns; } else { str::push_byte(b, t[i]); }
|
if t[i] == '#' as u8 { b += ns; }
|
||||||
|
else { str::unsafe::push_byte(b, t[i]); }
|
||||||
i += 1u;
|
i += 1u;
|
||||||
}
|
}
|
||||||
ret b;
|
ret b;
|
||||||
|
|
|
@ -47,8 +47,8 @@ fn make_random_fasta(id: str, desc: str, genelist: [aminoacids], n: int) {
|
||||||
let rng = @{mutable last: std::rand::mk_rng().next()};
|
let rng = @{mutable last: std::rand::mk_rng().next()};
|
||||||
let op: str = "";
|
let op: str = "";
|
||||||
uint::range(0u, n as uint) {|_i|
|
uint::range(0u, n as uint) {|_i|
|
||||||
str::push_byte(op, select_random(myrandom_next(rng, 100u32),
|
str::push_char(op, select_random(myrandom_next(rng, 100u32),
|
||||||
genelist) as u8);
|
genelist));
|
||||||
if str::byte_len(op) >= LINE_LENGTH() {
|
if str::byte_len(op) >= LINE_LENGTH() {
|
||||||
log(debug, op);
|
log(debug, op);
|
||||||
op = "";
|
op = "";
|
||||||
|
@ -57,12 +57,12 @@ fn make_random_fasta(id: str, desc: str, genelist: [aminoacids], n: int) {
|
||||||
if str::byte_len(op) > 0u { log(debug, op); }
|
if str::byte_len(op) > 0u { log(debug, op); }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_repeat_fasta(id: str, desc: str, s: str, n: int) {
|
fn make_repeat_fasta(id: str, desc: str, s: str, n: int) unsafe {
|
||||||
log(debug, ">" + id + " " + desc);
|
log(debug, ">" + id + " " + desc);
|
||||||
let op: str = "";
|
let op: str = "";
|
||||||
let sl: uint = str::byte_len(s);
|
let sl: uint = str::byte_len(s);
|
||||||
uint::range(0u, n as uint) {|i|
|
uint::range(0u, n as uint) {|i|
|
||||||
str::push_byte(op, s[i % sl]);
|
str::unsafe::push_byte(op, s[i % sl]);
|
||||||
if str::byte_len(op) >= LINE_LENGTH() {
|
if str::byte_len(op) >= LINE_LENGTH() {
|
||||||
log(debug, op);
|
log(debug, op);
|
||||||
op = "";
|
op = "";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue