@@ -12,12 +12,12 @@ argument, which it then converts to a hexadecimal string and prints to
12
12
standard output. If you have the OpenSSL libraries installed, it
13
13
should compile and run without any extra effort.
14
14
15
- ~~~~ {.xfail-test}
15
+ ~~~~
16
16
extern mod std;
17
- use libc::c_uint ;
17
+ use libc::size_t ;
18
18
19
19
extern mod crypto {
20
- fn SHA1(src: *u8, sz: c_uint , out: *u8) -> *u8;
20
+ fn SHA1(src: *u8, sz: size_t , out: *u8) -> *u8;
21
21
}
22
22
23
23
fn as_hex(data: ~[u8]) -> ~str {
@@ -29,7 +29,7 @@ fn as_hex(data: ~[u8]) -> ~str {
29
29
fn sha1(data: ~str) -> ~str unsafe {
30
30
let bytes = str::to_bytes(data);
31
31
let hash = crypto::SHA1(vec::raw::to_ptr(bytes),
32
- vec::len(bytes) as c_uint , ptr::null());
32
+ vec::len(bytes) as size_t , ptr::null());
33
33
return as_hex(vec::from_buf(hash, 20));
34
34
}
35
35
@@ -43,9 +43,11 @@ fn main() {
43
43
Before we can call the ` SHA1 ` function defined in the OpenSSL library, we have
44
44
to declare it. That is what this part of the program does:
45
45
46
- ~~~~ {.xfail-test}
46
+ ~~~~
47
+ # use libc::size_t;
47
48
extern mod crypto {
48
- fn SHA1(src: *u8, sz: uint, out: *u8) -> *u8; }
49
+ fn SHA1(src: *u8, sz: size_t, out: *u8) -> *u8;
50
+ }
49
51
~~~~
50
52
51
53
An ` extern ` module declaration containing function signatures introduces the
@@ -62,10 +64,11 @@ searches for the shared library with that name, and links the library into the
62
64
program. If you want the module to have a different name from the actual
63
65
library, you can use the ` "link_name" ` attribute, like:
64
66
65
- ~~~~ {.xfail-test}
67
+ ~~~~
68
+ # use libc::size_t;
66
69
#[link_name = "crypto"]
67
70
extern mod something {
68
- fn SHA1(src: *u8, sz: uint , out: *u8) -> *u8;
71
+ fn SHA1(src: *u8, sz: size_t , out: *u8) -> *u8;
69
72
}
70
73
~~~~
71
74
@@ -94,9 +97,10 @@ calling conventions.
94
97
95
98
The foreign ` SHA1 ` function takes three arguments, and returns a pointer.
96
99
97
- ~~~~ {.xfail-test}
100
+ ~~~~
101
+ # use libc::size_t;
98
102
# extern mod crypto {
99
- fn SHA1(src: *u8, sz: libc::c_uint , out: *u8) -> *u8;
103
+ fn SHA1(src: *u8, sz: size_t , out: *u8) -> *u8;
100
104
# }
101
105
~~~~
102
106
@@ -108,8 +112,8 @@ probably even worse, your code will work on one platform, but break on
108
112
another.
109
113
110
114
In this case, we declare that ` SHA1 ` takes two ` unsigned char* `
111
- arguments and one ` unsigned long ` . The Rust equivalents are ` *u8 `
112
- unsafe pointers and an ` uint ` (which, like ` unsigned long ` , is a
115
+ arguments and one ` size_t ` . The Rust equivalents are ` *u8 `
116
+ unsafe pointers and an ` libc::size_t ` (which, like ` unsigned long ` , is a
113
117
machine-word-sized type).
114
118
115
119
The standard library provides various functions to create unsafe pointers,
@@ -124,14 +128,16 @@ The `sha1` function is the most obscure part of the program.
124
128
125
129
~~~~
126
130
# pub mod crypto {
127
- # pub fn SHA1(src: *u8, sz: uint, out: *u8) -> *u8 { out }
131
+ # use libc::size_t;
132
+ # pub fn SHA1(src: *u8, sz: size_t, out: *u8) -> *u8 { out }
128
133
# }
134
+ # use libc::size_t;
129
135
# fn as_hex(data: ~[u8]) -> ~str { ~"hi" }
130
136
fn sha1(data: ~str) -> ~str {
131
137
unsafe {
132
138
let bytes = str::to_bytes(data);
133
139
let hash = crypto::SHA1(vec::raw::to_ptr(bytes),
134
- vec::len(bytes), ptr::null());
140
+ vec::len(bytes) as size_t , ptr::null());
135
141
return as_hex(vec::from_buf(hash, 20));
136
142
}
137
143
}
@@ -169,14 +175,16 @@ Let's look at our `sha1` function again.
169
175
170
176
~~~~
171
177
# pub mod crypto {
172
- # pub fn SHA1(src: *u8, sz: uint, out: *u8) -> *u8 { out }
178
+ # use libc::size_t;
179
+ # pub fn SHA1(src: *u8, sz: size_t, out: *u8) -> *u8 { out }
173
180
# }
181
+ # use libc::size_t;
174
182
# fn as_hex(data: ~[u8]) -> ~str { ~"hi" }
175
183
# fn x(data: ~str) -> ~str {
176
184
# unsafe {
177
185
let bytes = str::to_bytes(data);
178
186
let hash = crypto::SHA1(vec::raw::to_ptr(bytes),
179
- vec::len(bytes), ptr::null());
187
+ vec::len(bytes) as size_t , ptr::null());
180
188
return as_hex(vec::from_buf(hash, 20));
181
189
# }
182
190
# }
0 commit comments