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