Skip to content

Commit 9c9f95c

Browse files
committed
trpl: get all examples in ffi.md compiling
1 parent b8eaa16 commit 9c9f95c

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

src/doc/trpl/ffi.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ compile if snappy is installed:
1616
extern crate libc;
1717
use libc::size_t;
1818
19+
#[cfg(nope)]
1920
#[link(name = "snappy")]
2021
extern {
2122
fn snappy_max_compressed_length(source_length: size_t) -> size_t;
2223
}
2324
25+
# #[cfg(not(nope))] unsafe fn snappy_max_compressed_length(_: size_t) -> size_t { 0 }
26+
2427
fn main() {
2528
let x = unsafe { snappy_max_compressed_length(100) };
2629
println!("max compressed length of a 100 byte buffer: {}", x);
@@ -50,6 +53,7 @@ The `extern` block can be extended to cover the entire snappy API:
5053
extern crate libc;
5154
use libc::{c_int, size_t};
5255
56+
# #[cfg(nope)]
5357
#[link(name = "snappy")]
5458
extern {
5559
fn snappy_compress(input: *const u8,
@@ -67,6 +71,7 @@ extern {
6771
fn snappy_validate_compressed_buffer(compressed: *const u8,
6872
compressed_length: size_t) -> c_int;
6973
}
74+
7075
# fn main() {}
7176
```
7277

@@ -85,8 +90,11 @@ the allocated memory. The length is less than or equal to the capacity.
8590
# #![feature(libc)]
8691
# extern crate libc;
8792
# use libc::{c_int, size_t};
93+
#
8894
# unsafe fn snappy_validate_compressed_buffer(_: *const u8, _: size_t) -> c_int { 0 }
95+
#
8996
# fn main() {}
97+
#
9098
pub fn validate_compressed_buffer(src: &[u8]) -> bool {
9199
unsafe {
92100
snappy_validate_compressed_buffer(src.as_ptr(), src.len() as size_t) == 0
@@ -110,10 +118,13 @@ the true length after compression for setting the length.
110118
# #![feature(libc)]
111119
# extern crate libc;
112120
# use libc::{size_t, c_int};
121+
#
113122
# unsafe fn snappy_compress(a: *const u8, b: size_t, c: *mut u8,
114123
# d: *mut size_t) -> c_int { 0 }
115124
# unsafe fn snappy_max_compressed_length(a: size_t) -> size_t { a }
125+
#
116126
# fn main() {}
127+
#
117128
pub fn compress(src: &[u8]) -> Vec<u8> {
118129
unsafe {
119130
let srclen = src.len() as size_t;
@@ -137,6 +148,7 @@ format and `snappy_uncompressed_length` will retrieve the exact buffer size requ
137148
# #![feature(libc)]
138149
# extern crate libc;
139150
# use libc::{size_t, c_int};
151+
#
140152
# unsafe fn snappy_uncompress(compressed: *const u8,
141153
# compressed_length: size_t,
142154
# uncompressed: *mut u8,
@@ -145,6 +157,7 @@ format and `snappy_uncompressed_length` will retrieve the exact buffer size requ
145157
# compressed_length: size_t,
146158
# result: *mut size_t) -> c_int { 0 }
147159
# fn main() {}
160+
#
148161
pub fn uncompress(src: &[u8]) -> Option<Vec<u8>> {
149162
unsafe {
150163
let srclen = src.len() as size_t;
@@ -197,11 +210,16 @@ extern fn callback(a: i32) {
197210
println!("I'm called from C with value {0}", a);
198211
}
199212
213+
# #[cfg(nope)]
200214
#[link(name = "extlib")]
201215
extern {
202216
fn register_callback(cb: extern fn(i32)) -> i32;
203217
fn trigger_callback();
204218
}
219+
#
220+
# #[cfg(not(nope))] static mut CALLBACK: Option<extern fn(i32)> = None;
221+
# #[cfg(not(nope))] unsafe fn register_callback(cb: extern fn(i32)) -> i32 { CALLBACK = Some(cb); 1 }
222+
# #[cfg(not(nope))] unsafe fn trigger_callback() { CALLBACK.unwrap()(7); }
205223
206224
fn main() {
207225
unsafe {
@@ -260,12 +278,17 @@ extern "C" fn callback(target: *mut RustObject, a: i32) {
260278
}
261279
}
262280
281+
# #[cfg(nope)]
263282
#[link(name = "extlib")]
264283
extern {
265284
fn register_callback(target: *mut RustObject,
266285
cb: extern fn(*mut RustObject, i32)) -> i32;
267286
fn trigger_callback();
268287
}
288+
#
289+
# #[cfg(not(nope))] static mut CALLBACK: Option<(*mut RustObject, extern fn(*mut RustObject, i32))> = None;
290+
# #[cfg(not(nope))] unsafe fn register_callback(target: *mut RustObject, cb: extern fn(*mut RustObject, i32)) -> i32 { CALLBACK = Some((target, cb)); 1 }
291+
# #[cfg(not(nope))] unsafe fn trigger_callback() { let (target, cb) = CALLBACK.unwrap(); cb(target, 7); }
269292
270293
fn main() {
271294
// Create the object that will be referenced in the callback
@@ -379,6 +402,8 @@ this:
379402
380403
```rust
381404
unsafe fn kaboom(ptr: *const i32) -> i32 { *ptr }
405+
406+
# fn main() {}
382407
```
383408

384409
This function can only be called from an `unsafe` block or another `unsafe` function.
@@ -451,6 +476,7 @@ extern crate libc;
451476
extern "stdcall" {
452477
fn SetEnvironmentVariableA(n: *const u8, v: *const u8) -> libc::c_int;
453478
}
479+
454480
# fn main() { }
455481
```
456482

@@ -525,6 +551,7 @@ fairly easy, but requires a few things:
525551
pub extern fn hello_rust() -> *const u8 {
526552
"Hello, world!\0".as_ptr()
527553
}
554+
528555
# fn main() {}
529556
```
530557

@@ -554,6 +581,7 @@ pub extern fn oh_no() -> i32 {
554581
Err(_) => 0,
555582
}
556583
}
584+
557585
# fn main() {}
558586
```
559587

@@ -578,6 +606,7 @@ extern "C" {
578606
pub fn foo(arg: *mut libc::c_void);
579607
pub fn bar(arg: *mut libc::c_void);
580608
}
609+
581610
# fn main() {}
582611
```
583612

@@ -603,6 +632,7 @@ extern "C" {
603632
pub fn foo(arg: *mut Foo);
604633
pub fn bar(arg: *mut Bar);
605634
}
635+
606636
# fn main() {}
607637
```
608638

0 commit comments

Comments
 (0)