1 // This module defines safe wrappers around memchr (POSIX) and memrchr (GNU
2 // extension).
3
4 #![allow(dead_code)]
5
6 extern crate libc;
7
8 use self::libc::{c_int, c_void, size_t};
9
memchr(needle: u8, haystack: &[u8]) -> Option<usize>10 pub fn memchr(needle: u8, haystack: &[u8]) -> Option<usize> {
11 let p = unsafe {
12 libc::memchr(
13 haystack.as_ptr() as *const c_void,
14 needle as c_int,
15 haystack.len() as size_t,
16 )
17 };
18 if p.is_null() {
19 None
20 } else {
21 Some(p as usize - (haystack.as_ptr() as usize))
22 }
23 }
24
25 // memrchr is a GNU extension. We know it's available on Linux, so start there.
26 #[cfg(target_os = "linux")]
memrchr(needle: u8, haystack: &[u8]) -> Option<usize>27 pub fn memrchr(needle: u8, haystack: &[u8]) -> Option<usize> {
28 // GNU's memrchr() will - unlike memchr() - error if haystack is empty.
29 if haystack.is_empty() {
30 return None;
31 }
32 let p = unsafe {
33 libc::memrchr(
34 haystack.as_ptr() as *const c_void,
35 needle as c_int,
36 haystack.len() as size_t,
37 )
38 };
39 if p.is_null() {
40 None
41 } else {
42 Some(p as usize - (haystack.as_ptr() as usize))
43 }
44 }
45