Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
2b0396c3
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2b0396c3
编写于
2月 06, 2012
作者:
K
Kevin Cantu
提交者:
Brian Anderson
2月 07, 2012
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
core: make str::substr use char positions (and replace other uses)
上级
a3f5626a
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
45 addition
and
40 deletion
+45
-40
src/comp/back/link.rs
src/comp/back/link.rs
+5
-4
src/comp/util/ppaux.rs
src/comp/util/ppaux.rs
+2
-2
src/libcore/extfmt.rs
src/libcore/extfmt.rs
+9
-9
src/libcore/str.rs
src/libcore/str.rs
+20
-18
src/libstd/fs.rs
src/libstd/fs.rs
+2
-2
src/libstd/rope.rs
src/libstd/rope.rs
+4
-3
src/libstd/sha1.rs
src/libstd/sha1.rs
+3
-2
未找到文件。
src/comp/back/link.rs
浏览文件 @
2b0396c3
...
...
@@ -113,12 +113,13 @@ fn is_object_or_assembly_or_exe(ot: output_type) -> bool {
// Decides what to call an intermediate file, given the name of the output
// and the extension to use.
fn
mk_intermediate_name
(
output_path
:
str
,
extension
:
str
)
->
str
{
fn
mk_intermediate_name
(
output_path
:
str
,
extension
:
str
)
->
str
unsafe
{
let
dot_pos
=
str
::
index
(
output_path
,
'.'
as
u8
);
let
stem
;
if
dot_pos
<
0
{
stem
=
output_path
;
}
else
{
stem
=
str
::
substr
(
output_path
,
0u
,
dot_pos
as
uint
);
}
}
else
{
stem
=
str
::
unsafe
::
slice_bytes
(
output_path
,
0u
,
dot_pos
as
uint
);
}
ret
stem
+
"."
+
extension
;
}
fn
run_passes
(
sess
:
session
,
llmod
:
ModuleRef
,
output
:
str
)
{
...
...
@@ -480,8 +481,8 @@ fn crate_meta_vers(sess: session, _crate: ast::crate,
ret
{
name
:
name
,
vers
:
vers
,
extras_hash
:
extras_hash
};
}
fn
truncated_sha1_result
(
sha
:
sha1
)
->
str
{
ret
str
::
substr
(
sha
.result_str
(),
0u
,
16u
);
fn
truncated_sha1_result
(
sha
:
sha1
)
->
str
unsafe
{
ret
str
::
unsafe
::
slice_bytes
(
sha
.result_str
(),
0u
,
16u
);
}
...
...
src/comp/util/ppaux.rs
浏览文件 @
2b0396c3
...
...
@@ -116,9 +116,9 @@ fn mt_to_str(cx: ctxt, m: mt) -> str {
}
}
fn
ty_to_short_str
(
cx
:
ctxt
,
typ
:
t
)
->
str
{
fn
ty_to_short_str
(
cx
:
ctxt
,
typ
:
t
)
->
str
unsafe
{
let
s
=
encoder
::
encoded_ty
(
cx
,
typ
);
if
str
::
byte_len
(
s
)
>=
32u
{
s
=
str
::
substr
(
s
,
0u
,
32u
);
}
if
str
::
byte_len
(
s
)
>=
32u
{
s
=
str
::
unsafe
::
slice_bytes
(
s
,
0u
,
32u
);
}
ret
s
;
}
...
...
src/libcore/extfmt.rs
浏览文件 @
2b0396c3
...
...
@@ -80,7 +80,7 @@ enum count {
enum
piece
{
piece_string
(
str
),
piece_conv
(
conv
),
}
type
error_fn
=
fn
@
(
str
)
->
!
;
fn
parse_fmt_string
(
s
:
str
,
error
:
error_fn
)
->
[
piece
]
{
fn
parse_fmt_string
(
s
:
str
,
error
:
error_fn
)
->
[
piece
]
unsafe
{
let
pieces
:
[
piece
]
=
[];
let
lim
=
str
::
byte_len
(
s
);
let
buf
=
""
;
...
...
@@ -93,13 +93,13 @@ fn flush_buf(buf: str, &pieces: [piece]) -> str {
}
let
i
=
0u
;
while
i
<
lim
{
let
curr
=
str
::
substr
(
s
,
i
,
1u
);
let
curr
=
str
::
unsafe
::
slice_bytes
(
s
,
i
,
i
+
1u
);
if
str
::
eq
(
curr
,
"%"
)
{
i
+=
1u
;
if
i
>=
lim
{
error
(
"unterminated conversion at end of string"
);
}
let
curr2
=
str
::
substr
(
s
,
i
,
1u
);
let
curr2
=
str
::
unsafe
::
slice_bytes
(
s
,
i
,
i
+
1u
);
if
str
::
eq
(
curr2
,
"%"
)
{
buf
+=
curr2
;
i
+=
1u
;
...
...
@@ -223,9 +223,9 @@ fn parse_precision(s: str, i: uint, lim: uint) ->
}
else
{
{
count
:
count_implied
,
next
:
i
}
};
}
fn
parse_type
(
s
:
str
,
i
:
uint
,
lim
:
uint
,
error
:
error_fn
)
->
{
ty
:
ty
,
next
:
uint
}
{
{
ty
:
ty
,
next
:
uint
}
unsafe
{
if
i
>=
lim
{
error
(
"missing type in conversion"
);
}
let
tstr
=
str
::
substr
(
s
,
i
,
1u
);
let
tstr
=
str
::
unsafe
::
slice_bytes
(
s
,
i
,
i
+
1u
);
// TODO: Do we really want two signed types here?
// How important is it to be printf compatible?
let
t
=
...
...
@@ -317,7 +317,7 @@ fn conv_bool(cv: conv, b: bool) -> str {
fn
conv_char
(
cv
:
conv
,
c
:
char
)
->
str
{
ret
pad
(
cv
,
str
::
from_char
(
c
),
pad_nozero
);
}
fn
conv_str
(
cv
:
conv
,
s
:
str
)
->
str
{
fn
conv_str
(
cv
:
conv
,
s
:
str
)
->
str
unsafe
{
// For strings, precision is the maximum characters
// displayed
...
...
@@ -327,7 +327,7 @@ fn conv_str(cv: conv, s: str) -> str {
count_implied
{
s
}
count_is
(
max
)
{
if
max
as
uint
<
str
::
char_len
(
s
)
{
str
::
substr
(
s
,
0u
,
max
as
uint
)
str
::
unsafe
::
slice_bytes
(
s
,
0u
,
max
as
uint
)
}
else
{
s
}
}
};
...
...
@@ -391,7 +391,7 @@ fn str_init_elt(n_elts: uint, c: char) -> str {
ret
str
::
from_bytes
(
svec
);
}
enum
pad_mode
{
pad_signed
,
pad_unsigned
,
pad_nozero
,
}
fn
pad
(
cv
:
conv
,
s
:
str
,
mode
:
pad_mode
)
->
str
{
fn
pad
(
cv
:
conv
,
s
:
str
,
mode
:
pad_mode
)
->
str
unsafe
{
let
uwidth
;
alt
cv
.width
{
count_implied
{
ret
s
;
}
...
...
@@ -440,7 +440,7 @@ fn have_precision(cv: conv) -> bool {
let
headstr
=
str
::
from_bytes
([
head
]);
// FIXME: not UTF-8 safe
let
bytelen
=
str
::
byte_len
(
s
);
let
numpart
=
str
::
substr
(
s
,
1u
,
bytelen
-
1u
);
let
numpart
=
str
::
unsafe
::
slice_bytes
(
s
,
1u
,
bytelen
);
ret
headstr
+
padstr
+
numpart
;
}
}
...
...
src/libcore/str.rs
浏览文件 @
2b0396c3
...
...
@@ -249,12 +249,12 @@ fn connect(v: [str], sep: str) -> str {
If the string does not contain any characters.
*/
fn
pop_char
(
&
s
:
str
)
->
char
{
fn
pop_char
(
&
s
:
str
)
->
char
unsafe
{
let
end
=
byte_len
(
s
);
while
end
>
0u
&&
s
[
end
-
1u
]
&
192u8
==
tag_cont_u8
{
end
-=
1u
;
}
assert
(
end
>
0u
);
let
ch
=
char_at
(
s
,
end
-
1u
);
s
=
substr
(
s
,
0u
,
end
-
1u
);
s
=
unsafe
::
slice_bytes
(
s
,
0u
,
end
-
1u
);
ret
ch
;
}
...
...
@@ -267,9 +267,9 @@ fn pop_char(&s: str) -> char {
If the string does not contain any characters.
*/
fn
shift_char
(
&
s
:
str
)
->
char
{
fn
shift_char
(
&
s
:
str
)
->
char
unsafe
{
let
r
=
char_range_at
(
s
,
0u
);
s
=
substr
(
s
,
r
.next
,
byte_len
(
s
)
-
r
.next
);
s
=
unsafe
::
slice_bytes
(
s
,
r
.next
,
byte_len
(
s
)
);
ret
r
.ch
;
}
...
...
@@ -306,12 +306,13 @@ fn push_bytes(&s: str, bytes: [u8]) {
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
{
fn
pop_byte
(
&
s
:
str
)
->
u8
unsafe
{
let
len
=
byte_len
(
s
);
assert
(
len
>
0u
);
let
b
=
s
[
len
-
1u
];
s
=
substr
(
s
,
0u
,
len
-
1u
);
s
=
unsafe
::
slice_bytes
(
s
,
0u
,
len
-
1u
);
ret
b
;
}
...
...
@@ -321,12 +322,13 @@ fn pop_byte(&s: str) -> u8 {
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
{
fn
shift_byte
(
&
s
:
str
)
->
u8
unsafe
{
let
len
=
byte_len
(
s
);
assert
(
len
>
0u
);
let
b
=
s
[
0
];
s
=
substr
(
s
,
1u
,
len
-
1u
);
s
=
unsafe
::
slice_bytes
(
s
,
1u
,
len
);
ret
b
;
}
...
...
@@ -413,17 +415,15 @@ fn chars(s: str) -> [char] {
/*
Function: substr
Take a substring of another. Returns a string containing `len` bytes
starting at byte offset `begin`.
FIXME: This function is not unicode-safe.
Take a substring of another. Returns a string containing `len` chars
starting at char offset `begin`.
Failure:
If `begin` + `len` is is greater than the
byte
length of the string
If `begin` + `len` is is greater than the
char
length of the string
*/
fn
substr
(
s
:
str
,
begin
:
uint
,
len
:
uint
)
->
str
unsafe
{
ret
unsafe
::
slice_bytes
(
s
,
begin
,
begin
+
len
);
fn
substr
(
s
:
str
,
begin
:
uint
,
len
:
uint
)
->
str
{
ret
slice
(
s
,
begin
,
begin
+
len
);
}
/*
...
...
@@ -941,8 +941,8 @@ fn starts_with(haystack: str, needle: str) -> bool {
needle - The string to look for
*/
fn
ends_with
(
haystack
:
str
,
needle
:
str
)
->
bool
{
let
haystack_len
:
uint
=
byte
_len
(
haystack
);
let
needle_len
:
uint
=
byte
_len
(
needle
);
let
haystack_len
:
uint
=
char
_len
(
haystack
);
let
needle_len
:
uint
=
char
_len
(
needle
);
ret
if
needle_len
==
0u
{
true
}
else
if
needle_len
>
haystack_len
{
...
...
@@ -1598,7 +1598,9 @@ fn t(a: str, b: str, start: int) {
}
t
(
"hello"
,
"llo"
,
2
);
t
(
"hello"
,
"el"
,
1
);
t
(
"substr should not be a challenge"
,
"not"
,
14
);
assert
"ะเทศไท"
==
substr
(
"ประเทศไทย中华Việt Nam"
,
2u
,
6u
);
}
#[test]
...
...
src/libstd/fs.rs
浏览文件 @
2b0396c3
...
...
@@ -43,13 +43,13 @@
If the path is not prefixed with a directory, then "." is returned.
*/
fn
dirname
(
p
:
path
)
->
path
{
fn
dirname
(
p
:
path
)
->
path
unsafe
{
let
i
:
int
=
str
::
rindex
(
p
,
os_fs
::
path_sep
as
u8
);
if
i
==
-
1
{
i
=
str
::
rindex
(
p
,
os_fs
::
alt_path_sep
as
u8
);
if
i
==
-
1
{
ret
"."
;
}
}
ret
str
::
substr
(
p
,
0u
,
i
as
uint
);
ret
str
::
unsafe
::
slice_bytes
(
p
,
0u
,
i
as
uint
);
}
/*
...
...
src/libstd/rope.rs
浏览文件 @
2b0396c3
...
...
@@ -1341,11 +1341,12 @@ fn rope_to_string(r: rope) -> str {
node
::
empty
{
ret
""
}
node
::
content
(
x
)
{
let
str
=
@
mutable
""
;
fn
aux
(
str
:
@
mutable
str
,
node
:
@
node
::
node
)
{
fn
aux
(
str
:
@
mutable
str
,
node
:
@
node
::
node
)
unsafe
{
alt
(
*
node
)
{
node
::
leaf
(
x
)
{
*
str
+=
str
::
substr
(
*
x
.content
,
x
.byte_offset
,
x
.byte_len
);
*
str
+=
str
::
unsafe
::
slice_bytes
(
*
x
.content
,
x
.byte_offset
,
x
.byte_offset
+
x
.byte_len
);
}
node
::
concat
(
x
)
{
aux
(
str
,
x
.left
);
...
...
src/libstd/sha1.rs
浏览文件 @
2b0396c3
...
...
@@ -291,7 +291,7 @@ fn result_str() -> str {
mod
tests
{
#[test]
fn
test
()
{
fn
test
()
unsafe
{
type
test
=
{
input
:
str
,
output
:
[
u8
]};
fn
a_million_letter_a
()
->
str
{
...
...
@@ -372,7 +372,8 @@ fn check_vec_eq(v0: [u8], v1: [u8]) {
let
left
=
len
;
while
left
>
0u
{
let
take
=
(
left
+
1u
)
/
2u
;
sh
.input_str
(
str
::
substr
(
t
.input
,
len
-
left
,
take
));
sh
.input_str
(
str
::
unsafe
::
slice_bytes
(
t
.input
,
len
-
left
,
take
+
len
-
left
));
left
=
left
-
take
;
}
let
out
=
sh
.result
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录