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}