strlen/
lib.rs

1#![no_std]
2#![allow(dead_code)]
3#![allow(unused)]
4#![allow(internal_features)]
5#![allow(stable_features)]
6#![feature(core_intrinsics)]
7#![feature(const_eval_select)]
8#![feature(const_mut_refs)]
9#![feature(const_ptr_is_null)]
10#![feature(const_ptr_write)]
11
12
13#[macro_use]
14extern crate core;
15
16#[macro_use]
17extern crate libc;
18
19#[cfg(feature = "std")]
20extern crate std;
21
22use ::libc::c_char;
23use ::libc::size_t;
24use ::core::intrinsics::const_eval_select;
25use ::core::ffi::c_void;
26
27pub const unsafe fn strlen(ptr: *const c_char) -> size_t {
28
29    const fn strlen_ct(s: *const c_char) -> size_t {
30        let mut len = 0usize;
31
32        while unsafe { *s.add(len) != 0 } {
33            len += 1usize;
34        }
35
36        len as size_t
37    }
38
39    fn strlen_rt(s: *const c_char) -> size_t {
40        extern "C" {
41            fn strlen(s: *const c_char) -> size_t;
42        }
43
44        unsafe { strlen(s) }
45    }
46    
47    const_eval_select((ptr,), strlen_ct, strlen_rt)
48}
49
50pub const unsafe fn strcpy(dest: *mut c_char, source: *const c_char) -> *mut c_char {
51
52    const fn strcpy_ct(dst: *mut u8, src: *const u8) -> *mut u8 {
53        unsafe {
54            if !dst.is_null() && !src.is_null() {
55                dst.write(src.read());
56                dst
57            } else {
58                dst
59            }
60        }
61    }
62
63    fn strcpy_rt(dst: *mut c_char, src: *const c_char) -> *mut c_char {
64        extern "C" {
65            fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char;
66        }
67
68        unsafe { strcpy(dst, src) }
69    }
70
71    const_eval_select((dest,source,), strcpy_ct, strcpy_rt)
72}