13#define __UCONCAT(a, b) #a b
14#define _UCONCAT(a, b) __UCONCAT(a, b)
15#define UCONCAT(b) _UCONCAT(__USER_LABEL_PREFIX__, b)
18#define cstr(x) __attribute__((null_terminated_string_arg(x)))
19#define ro(...) __attribute__((access(read_only, __VA_ARGS__)))
20#define rw(...) __attribute__((access(read_write, __VA_ARGS__)))
21#define wo(...) __attribute__((access(write_only, __VA_ARGS__)))
29#define inline inline __attribute__((always_inline))
31extern char *(*String_Strcat)(
char *dest,
const char *src) cstr(1) cstr(2) rw(1) ro(2);
33extern const
char *(*_FP_String_Strchr)(const
char *str,
char c) __asm__ (UCONCAT("String_Strchr")) cstr(1) ro(1);
35static inline __attribute__((pure)) cstr(1) ro(1) const
char *String_Strchr(const
char *str,
char c) {
36 return _FP_String_Strchr(str, c);
39extern int (*_FP_String_Strcmp)(
const char *str1,
const char *str2) __asm__ (UCONCAT(
"String_Strcmp")) cstr(1) cstr(2) ro(1) ro(2);
41static inline __attribute__((pure)) cstr(1) cstr(2) ro(1) ro(2)
int String_Strcmp(const
char *str1, const
char *str2) {
42 return _FP_String_Strcmp(str1, str2);
45extern char *(*String_Strcpy)(
char *destination,
const char *source) cstr(2) wo(1) ro(2);
47extern
unsigned int (*_FP_String_Strlen)(const
char *str) __asm__ (UCONCAT("String_Strlen")) cstr(1) ro(1);
49static inline __attribute__((pure)) cstr(1) ro(1)
unsigned int String_Strlen(const
char *str) {
50 return _FP_String_Strlen(str);