mirror of
https://github.com/esp-rs/esp-hal.git
synced 2025-10-02 14:44:42 +00:00
Prefer ROM-fns over custom impl (#2462)
* Prefer ROM-fns over custom impl * PR number
This commit is contained in:
parent
1e6820d1a7
commit
ca9ee23b5e
@ -9,3 +9,12 @@ PROVIDE ( strncpy = 0x400015d4 );
|
|||||||
PROVIDE ( strncmp = 0x4000c5f4 );
|
PROVIDE ( strncmp = 0x4000c5f4 );
|
||||||
|
|
||||||
PROVIDE ( bzero = 0x4000c1f4 );
|
PROVIDE ( bzero = 0x4000c1f4 );
|
||||||
|
|
||||||
|
PROVIDE ( strcat = 0x4000c518 );
|
||||||
|
PROVIDE ( strcmp = 0x40001274 );
|
||||||
|
PROVIDE ( strchr = 0x4000c53c );
|
||||||
|
PROVIDE ( strlcpy = 0x4000c584 );
|
||||||
|
PROVIDE ( strstr = 0x4000c674 );
|
||||||
|
PROVIDE ( strcasecmp = 0x400011cc );
|
||||||
|
PROVIDE ( strdup = 0x4000143c );
|
||||||
|
PROVIDE ( atoi = 0x400566c4 );
|
@ -6,3 +6,12 @@ memcmp = 0x40000494;
|
|||||||
strcpy = 0x40000498;
|
strcpy = 0x40000498;
|
||||||
strncpy = 0x4000049c;
|
strncpy = 0x4000049c;
|
||||||
strncmp = 0x400004a4;
|
strncmp = 0x400004a4;
|
||||||
|
|
||||||
|
PROVIDE ( strcat = 0x4000050c );
|
||||||
|
PROVIDE ( strcmp = 0x400004a0 );
|
||||||
|
PROVIDE ( strchr = 0x40000514 );
|
||||||
|
PROVIDE ( strlcpy = 0x40000524 );
|
||||||
|
PROVIDE ( strstr = 0x400004ac );
|
||||||
|
PROVIDE ( strcasecmp = 0x40000504 );
|
||||||
|
PROVIDE ( strdup = 0x40000510 );
|
||||||
|
PROVIDE ( atoi = 0x40000580 );
|
||||||
|
@ -10,3 +10,12 @@ strcpy = 0x40000364;
|
|||||||
abs = 0x40000424;
|
abs = 0x40000424;
|
||||||
|
|
||||||
PROVIDE(cache_dbus_mmu_set = 0x40000564);
|
PROVIDE(cache_dbus_mmu_set = 0x40000564);
|
||||||
|
|
||||||
|
PROVIDE( strcat = 0x400003d8 );
|
||||||
|
PROVIDE( strcmp = 0x4000036c );
|
||||||
|
PROVIDE( strchr = 0x400003e0 );
|
||||||
|
PROVIDE( strlcpy = 0x400003f0 );
|
||||||
|
PROVIDE( strstr = 0x40000378 );
|
||||||
|
PROVIDE( strcasecmp = 0x400003d0 );
|
||||||
|
PROVIDE( strdup = 0x400003dc );
|
||||||
|
PROVIDE( atoi = 0x4000044c );
|
@ -8,3 +8,12 @@ strncpy = 0x400004bc;
|
|||||||
strcpy = 0x400004b8;
|
strcpy = 0x400004b8;
|
||||||
|
|
||||||
abs = 0x40000578;
|
abs = 0x40000578;
|
||||||
|
|
||||||
|
PROVIDE(strcat = 0x4000052c);
|
||||||
|
PROVIDE(strcmp = 0x400004c0);
|
||||||
|
PROVIDE(strchr = 0x40000534);
|
||||||
|
PROVIDE(strlcpy = 0x40000544);
|
||||||
|
PROVIDE(strstr = 0x400004cc);
|
||||||
|
PROVIDE(strcasecmp = 0x40000524);
|
||||||
|
PROVIDE(strdup = 0x40000530);
|
||||||
|
PROVIDE(atoi = 0x400005a0);
|
||||||
|
@ -8,3 +8,12 @@ strncpy = 0x400004b4;
|
|||||||
strcpy = 0x400004b0;
|
strcpy = 0x400004b0;
|
||||||
|
|
||||||
abs = 0x40000570;
|
abs = 0x40000570;
|
||||||
|
|
||||||
|
PROVIDE( strcat = 0x40000524 );
|
||||||
|
PROVIDE( strcmp = 0x400004b8 );
|
||||||
|
PROVIDE( strchr = 0x4000052c );
|
||||||
|
PROVIDE( strlcpy = 0x4000053c );
|
||||||
|
PROVIDE( strstr = 0x400004c4 );
|
||||||
|
PROVIDE( strcasecmp = 0x4000051c );
|
||||||
|
PROVIDE( strdup = 0x40000528 );
|
||||||
|
PROVIDE( atoi = 0x40000598 );
|
||||||
|
@ -10,3 +10,11 @@ strncmp = 0x4001ae64;
|
|||||||
bzero = 0x400078c8;
|
bzero = 0x400078c8;
|
||||||
|
|
||||||
PROVIDE ( cache_dbus_mmu_set = 0x40018eb0 );
|
PROVIDE ( cache_dbus_mmu_set = 0x40018eb0 );
|
||||||
|
|
||||||
|
PROVIDE ( strcat = 0x4001ad90 );
|
||||||
|
PROVIDE ( strcmp = 0x40007be4 );
|
||||||
|
PROVIDE ( strchr = 0x4001adb0 );
|
||||||
|
PROVIDE ( strlcpy = 0x4001adf8 );
|
||||||
|
PROVIDE ( strstr = 0x4001aee8 );
|
||||||
|
PROVIDE ( strcasecmp = 0x40007b38 );
|
||||||
|
PROVIDE ( strdup = 0x40007d84 );
|
||||||
|
@ -12,3 +12,12 @@ bzero = 0x40001260;
|
|||||||
PROVIDE(cache_dbus_mmu_set = 0x400019b0);
|
PROVIDE(cache_dbus_mmu_set = 0x400019b0);
|
||||||
PROVIDE( Cache_Suspend_DCache_Autoload = 0x40001734 );
|
PROVIDE( Cache_Suspend_DCache_Autoload = 0x40001734 );
|
||||||
PROVIDE( Cache_Suspend_DCache = 0x400018b4 );
|
PROVIDE( Cache_Suspend_DCache = 0x400018b4 );
|
||||||
|
|
||||||
|
PROVIDE( strcat = 0x40001374 );
|
||||||
|
PROVIDE( strcmp = 0x40001230 );
|
||||||
|
PROVIDE( strchr = 0x4000138c );
|
||||||
|
PROVIDE( strlcpy = 0x400013bc );
|
||||||
|
PROVIDE( strstr = 0x40001254 );
|
||||||
|
PROVIDE( strcasecmp = 0x4000135c );
|
||||||
|
PROVIDE( strdup = 0x40001380 );
|
||||||
|
PROVIDE( atoi = 0x400014d0 );
|
||||||
|
@ -24,6 +24,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
|
- Feature `have-strchr` is removed (#2462)
|
||||||
|
|
||||||
## 0.10.1 - 2024-10-10
|
## 0.10.1 - 2024-10-10
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
@ -180,9 +180,6 @@ log = ["dep:log", "esp-hal/log", "esp-wifi-sys/log"]
|
|||||||
## Enable sniffer mode support
|
## Enable sniffer mode support
|
||||||
sniffer = ["wifi"]
|
sniffer = ["wifi"]
|
||||||
|
|
||||||
# Don't include `strchr` - not shown in docs
|
|
||||||
have-strchr = []
|
|
||||||
|
|
||||||
# Implement serde Serialize / Deserialize
|
# Implement serde Serialize / Deserialize
|
||||||
serde = ["dep:serde", "enumset?/serde", "heapless/serde"]
|
serde = ["dep:serde", "enumset?/serde", "heapless/serde"]
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::compat::malloc::*;
|
// these are not called but needed for linking
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn fwrite(ptr: *const (), size: usize, count: usize, stream: *const ()) -> usize {
|
unsafe extern "C" fn fwrite(ptr: *const (), size: usize, count: usize, stream: *const ()) -> usize {
|
||||||
@ -20,141 +20,8 @@ unsafe extern "C" fn fclose(stream: *const ()) -> i32 {
|
|||||||
todo!("fclose {:?}", stream);
|
todo!("fclose {:?}", stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
// not available in ROM on ESP32-S2
|
||||||
unsafe extern "C" fn strcat(destination: *mut u8, source: *const u8) -> *const u8 {
|
#[cfg(feature = "esp32s2")]
|
||||||
trace!("strcat {:?} {:?}", destination, source);
|
|
||||||
|
|
||||||
let dst: *mut u8 = strchr(destination.cast(), 0) as *mut u8;
|
|
||||||
let len = strchr(source.cast(), 0) as usize - source as usize;
|
|
||||||
core::ptr::copy(source, dst, len);
|
|
||||||
destination
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
unsafe extern "C" fn strcmp(str1: *const i8, str2: *const i8) -> i32 {
|
|
||||||
trace!("strcmp {:?} {:?}", str1, str2);
|
|
||||||
|
|
||||||
// TODO: unwrap!() when defmt supports it
|
|
||||||
let s1 = core::ffi::CStr::from_ptr(str1).to_str().unwrap();
|
|
||||||
let s2 = core::ffi::CStr::from_ptr(str2).to_str().unwrap();
|
|
||||||
|
|
||||||
let x = s1.cmp(s2);
|
|
||||||
|
|
||||||
match x {
|
|
||||||
core::cmp::Ordering::Less => -1,
|
|
||||||
core::cmp::Ordering::Equal => 0,
|
|
||||||
core::cmp::Ordering::Greater => 1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "have-strchr")]
|
|
||||||
extern "C" {
|
|
||||||
fn strchr(str: *const i8, c: i32) -> *const i8;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(feature = "have-strchr"))]
|
|
||||||
#[no_mangle]
|
|
||||||
unsafe extern "C" fn strchr(str: *const i8, c: i32) -> *const i8 {
|
|
||||||
trace!("strchr {:?} {}", str, c);
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let mut p = str;
|
|
||||||
loop {
|
|
||||||
if *p == c as i8 {
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
if *p == 0 {
|
|
||||||
return core::ptr::null();
|
|
||||||
}
|
|
||||||
|
|
||||||
p = p.add(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
unsafe extern "C" fn strlcpy(dst: *mut u8, src: *const u8, size: usize) -> usize {
|
|
||||||
trace!("strlcpy {:?} {:?} {}", dst, src, size);
|
|
||||||
|
|
||||||
let mut dst = dst;
|
|
||||||
let mut src = src;
|
|
||||||
let mut cnt = 0;
|
|
||||||
loop {
|
|
||||||
dst.write_volatile(0);
|
|
||||||
|
|
||||||
let c = src.read_volatile();
|
|
||||||
|
|
||||||
if c == 0 || cnt >= size {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
dst.write_volatile(c);
|
|
||||||
dst = dst.add(1);
|
|
||||||
src = src.add(1);
|
|
||||||
cnt += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
unsafe extern "C" fn strstr(str1: *const i8, str2: *const i8) -> *const i8 {
|
|
||||||
trace!("strstr {:?} {:?}", str1, str2);
|
|
||||||
|
|
||||||
let s1 = core::ffi::CStr::from_ptr(str1).to_str().unwrap();
|
|
||||||
let s2 = core::ffi::CStr::from_ptr(str2).to_str().unwrap();
|
|
||||||
|
|
||||||
let idx = s1.find(s2);
|
|
||||||
|
|
||||||
match idx {
|
|
||||||
Some(offset) => str1.add(offset),
|
|
||||||
None => core::ptr::null(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
unsafe extern "C" fn strcasecmp(str1: *const u8, str2: *const u8) -> i32 {
|
|
||||||
trace!("strcasecmp {:?} {:?}", str1, str2);
|
|
||||||
|
|
||||||
let mut str1 = str1;
|
|
||||||
let mut str2 = str2;
|
|
||||||
|
|
||||||
let mut c1 = *str1 as char;
|
|
||||||
let mut c2 = *str2 as char;
|
|
||||||
|
|
||||||
while c1 != '\0' && c2 != '\0' {
|
|
||||||
c1 = c1.to_ascii_lowercase();
|
|
||||||
c2 = c2.to_ascii_lowercase();
|
|
||||||
|
|
||||||
if c1 != c2 {
|
|
||||||
return c1 as i32 - c2 as i32;
|
|
||||||
}
|
|
||||||
|
|
||||||
str1 = str1.add(1);
|
|
||||||
str2 = str2.add(1);
|
|
||||||
|
|
||||||
c1 = *str1 as char;
|
|
||||||
c2 = *str2 as char;
|
|
||||||
}
|
|
||||||
|
|
||||||
c1 as i32 - c2 as i32
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
unsafe extern "C" fn strdup(str: *const i8) -> *const u8 {
|
|
||||||
trace!("strdup {:?}", str);
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let s = core::ffi::CStr::from_ptr(str);
|
|
||||||
let s = s.to_str().unwrap(); // TODO when defmt supports it
|
|
||||||
|
|
||||||
let p = malloc(s.len() + 1);
|
|
||||||
core::ptr::copy_nonoverlapping(str, p as *mut i8, s.len() + 1);
|
|
||||||
p as *const u8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn atoi(str: *const i8) -> i32 {
|
unsafe extern "C" fn atoi(str: *const i8) -> i32 {
|
||||||
trace!("atoi {:?}", str);
|
trace!("atoi {:?}", str);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user