FastLED 3.10.8
Loading...
Searching...
No Matches
cstring.h
Go to the documentation of this file.
1#pragma once
2
4// FastLED C String Functions (cstring.h equivalents)
5//
6// Provides wrappers for standard C string functions (memcpy, strlen, strcmp, etc.)
7// while avoiding the slow <cstring> include that impacts compilation time.
8//
9// All functions are in the fl:: namespace for type safety and clarity.
10// Implementations are in cstring.cpp
12
13#include "fl/stl/stdint.h"
15#include "fl/stl/noexcept.h"
16
17namespace fl {
18// Implementations. The public fl::name functions below are templates with an
19// unused defaulted parameter, so wherever the C library version is also
20// visible (ADL on an fl type, or a using-directive for fl) the non-template
21// ::name wins the tie instead of the call being ambiguous (FastLED#4827).
22namespace libc_impl {
23size_t strlen(const char* s) FL_NO_EXCEPT;
24int strcmp(const char* s1, const char* s2) FL_NO_EXCEPT;
25int strncmp(const char* s1, const char* s2, size_t n) FL_NO_EXCEPT;
26char* strcpy(char* dest, const char* src) FL_NO_EXCEPT;
27char* strncpy(char* dest, const char* src, size_t n) FL_NO_EXCEPT;
28char* strcat(char* dest, const char* src) FL_NO_EXCEPT;
29char* strncat(char* dest, const char* src, size_t n) FL_NO_EXCEPT;
30const char* strstr(const char* haystack, const char* needle) FL_NO_EXCEPT;
31char* strchr(char* s, int c) FL_NO_EXCEPT;
32const char* strchr(const char* s, int c) FL_NO_EXCEPT;
33char* strrchr(char* s, int c) FL_NO_EXCEPT;
34const char* strrchr(const char* s, int c) FL_NO_EXCEPT;
35size_t strspn(const char* s1, const char* s2) FL_NO_EXCEPT;
36size_t strcspn(const char* s1, const char* s2) FL_NO_EXCEPT;
37char* strpbrk(char* s1, const char* s2) FL_NO_EXCEPT;
38const char* strpbrk(const char* s1, const char* s2) FL_NO_EXCEPT;
39char* strtok(char* s1, const char* s2) FL_NO_EXCEPT;
40char* strerror(int errnum) FL_NO_EXCEPT;
41void* memcpy(void* dest, const void* src, size_t n) FL_NO_EXCEPT;
42int memcmp(const void* s1, const void* s2, size_t n) FL_NO_EXCEPT;
43void* memmove(void* dest, const void* src, size_t n) FL_NO_EXCEPT;
44void* memset(void* s, int c, size_t n) FL_NO_EXCEPT;
45void* memchr(void* s, int c, size_t n) FL_NO_EXCEPT;
46const void* memchr(const void* s, int c, size_t n) FL_NO_EXCEPT;
47} // namespace libc_impl
48
49
50// ============================================================================
51// Standard String Functions
52// ============================================================================
53
54// fl::strlen - wrapper for strlen
55template <typename FlLibcTag = void>
56FASTLED_FORCE_INLINE size_t strlen(const char* s) FL_NO_EXCEPT { return libc_impl::strlen(s); }
57
58// fl::strcmp - wrapper for strcmp
59template <typename FlLibcTag = void>
60FASTLED_FORCE_INLINE int strcmp(const char* s1, const char* s2) FL_NO_EXCEPT { return libc_impl::strcmp(s1, s2); }
61
62// fl::strncmp - wrapper for strncmp
63template <typename FlLibcTag = void>
64FASTLED_FORCE_INLINE int strncmp(const char* s1, const char* s2, size_t n) FL_NO_EXCEPT { return libc_impl::strncmp(s1, s2, n); }
65
66// fl::strcpy - wrapper for strcpy (use with caution - prefer strncpy)
67template <typename FlLibcTag = void>
68FASTLED_FORCE_INLINE char* strcpy(char* dest, const char* src) FL_NO_EXCEPT { return libc_impl::strcpy(dest, src); }
69
70// fl::strncpy - bounded string copy that ALWAYS null-terminates.
71// Copies at most n chars from src, then writes a terminator at
72// dest[copied] (copied <= n). Pass n = capacity - 1 (dest sized >= n+1).
73// Differs from ::strncpy, which leaves dest unterminated when
74// strlen(src) >= n. Remaining destination bytes up to n are zero-padded.
75template <typename FlLibcTag = void>
76FASTLED_FORCE_INLINE char* strncpy(char* dest, const char* src, size_t n) FL_NO_EXCEPT { return libc_impl::strncpy(dest, src, n); }
77
78// fl::strcat - wrapper for strcat (use with caution - prefer strncat)
79template <typename FlLibcTag = void>
80FASTLED_FORCE_INLINE char* strcat(char* dest, const char* src) FL_NO_EXCEPT { return libc_impl::strcat(dest, src); }
81
82// fl::strncat - wrapper for strncat
83template <typename FlLibcTag = void>
84FASTLED_FORCE_INLINE char* strncat(char* dest, const char* src, size_t n) FL_NO_EXCEPT { return libc_impl::strncat(dest, src, n); }
85
86// fl::strstr - wrapper for strstr
87template <typename FlLibcTag = void>
88FASTLED_FORCE_INLINE const char* strstr(const char* haystack, const char* needle) FL_NO_EXCEPT { return libc_impl::strstr(haystack, needle); }
89
90// fl::strchr - wrapper for strchr (find first occurrence of character)
91template <typename FlLibcTag = void>
92FASTLED_FORCE_INLINE char* strchr(char* s, int c) FL_NO_EXCEPT { return libc_impl::strchr(s, c); }
93
94// fl::strchr - const version wrapper for strchr
95template <typename FlLibcTag = void>
96FASTLED_FORCE_INLINE const char* strchr(const char* s, int c) FL_NO_EXCEPT { return libc_impl::strchr(s, c); }
97
98// fl::strrchr - wrapper for strrchr (find last occurrence of character)
99template <typename FlLibcTag = void>
100FASTLED_FORCE_INLINE char* strrchr(char* s, int c) FL_NO_EXCEPT { return libc_impl::strrchr(s, c); }
101
102// fl::strrchr - const version wrapper for strrchr
103template <typename FlLibcTag = void>
104FASTLED_FORCE_INLINE const char* strrchr(const char* s, int c) FL_NO_EXCEPT { return libc_impl::strrchr(s, c); }
105
106// fl::strspn - wrapper for strspn (length of initial segment matching characters)
107template <typename FlLibcTag = void>
108FASTLED_FORCE_INLINE size_t strspn(const char* s1, const char* s2) FL_NO_EXCEPT { return libc_impl::strspn(s1, s2); }
109
110// fl::strcspn - wrapper for strcspn (length of initial segment not matching characters)
111template <typename FlLibcTag = void>
112FASTLED_FORCE_INLINE size_t strcspn(const char* s1, const char* s2) FL_NO_EXCEPT { return libc_impl::strcspn(s1, s2); }
113
114// fl::strpbrk - wrapper for strpbrk (find first occurrence of any character from set)
115template <typename FlLibcTag = void>
116FASTLED_FORCE_INLINE char* strpbrk(char* s1, const char* s2) FL_NO_EXCEPT { return libc_impl::strpbrk(s1, s2); }
117
118// fl::strpbrk - const version wrapper for strpbrk
119template <typename FlLibcTag = void>
120FASTLED_FORCE_INLINE const char* strpbrk(const char* s1, const char* s2) FL_NO_EXCEPT { return libc_impl::strpbrk(s1, s2); }
121
122// fl::strtok - wrapper for strtok (tokenize string, note: not thread-safe)
123template <typename FlLibcTag = void>
124FASTLED_FORCE_INLINE char* strtok(char* s1, const char* s2) FL_NO_EXCEPT { return libc_impl::strtok(s1, s2); }
125
126// fl::strerror - wrapper for strerror (convert error number to string)
127template <typename FlLibcTag = void>
129
130// ============================================================================
131// Memory Functions
132// ============================================================================
133
134// fl::memcpy - wrapper for memcpy
135template <typename FlLibcTag = void>
136FASTLED_FORCE_INLINE void* memcpy(void* dest, const void* src, size_t n) FL_NO_EXCEPT { return libc_impl::memcpy(dest, src, n); }
137
138// fl::memcmp - wrapper for memcmp
139template <typename FlLibcTag = void>
140FASTLED_FORCE_INLINE int memcmp(const void* s1, const void* s2, size_t n) FL_NO_EXCEPT { return libc_impl::memcmp(s1, s2, n); }
141
142// fl::memmove - wrapper for memmove (handles overlapping memory)
143template <typename FlLibcTag = void>
144FASTLED_FORCE_INLINE void* memmove(void* dest, const void* src, size_t n) FL_NO_EXCEPT { return libc_impl::memmove(dest, src, n); }
145
146// fl::memset - wrapper for memset
147template <typename FlLibcTag = void>
148FASTLED_FORCE_INLINE void* memset(void* s, int c, size_t n) FL_NO_EXCEPT { return libc_impl::memset(s, c, n); }
149
150// fl::memchr - wrapper for memchr
151template <typename FlLibcTag = void>
152FASTLED_FORCE_INLINE void* memchr(void* s, int c, size_t n) FL_NO_EXCEPT { return libc_impl::memchr(s, c, n); }
153
154// fl::memchr - const version wrapper for memchr
155template <typename FlLibcTag = void>
156FASTLED_FORCE_INLINE const void* memchr(const void* s, int c, size_t n) FL_NO_EXCEPT { return libc_impl::memchr(s, c, n); }
157
158// ============================================================================
159// Legacy compatibility functions (aliases)
160// ============================================================================
161
162// fl::memcopy - legacy name for memcpy
163inline void* memcopy(void* dest, const void* src, size_t n) FL_NO_EXCEPT {
164 return memcpy(dest, src, n);
165}
166
167// ============================================================================
168// Arduino PROGMEM String Functions (platform-specific _P variants)
169// ============================================================================
170// These are used when strings are stored in program memory on embedded platforms
171
172// Forward declarations for pgm_p type (defined in json.hpp)
173namespace detail {
174 typedef const void* pgm_p;
175}
176
177// Only declare PROGMEM functions on platforms that support them
178#if defined(ARDUINO) && defined(FL_IS_AVR)
179
180// fl::strlen_P - strlen for PROGMEM strings
181size_t strlen_P(detail::pgm_p s) FL_NO_EXCEPT;
182
183// fl::strcmp_P - strcmp with PROGMEM string
184int strcmp_P(const char* a, detail::pgm_p b) FL_NO_EXCEPT;
185
186// fl::memcmp_P - memcmp with PROGMEM memory
187int memcmp_P(const void* a, detail::pgm_p b, size_t n) FL_NO_EXCEPT;
188
189// fl::memcpy_P - memcpy from PROGMEM
190void* memcpy_P(void* dest, detail::pgm_p src, size_t n) FL_NO_EXCEPT;
191
192#endif // defined(ARDUINO) && defined(__AVR__)
193
194} // namespace fl
#define FASTLED_FORCE_INLINE
const void * pgm_p
Definition cstring.h:174
char * strncat(char *dest, const char *src, size_t n) FL_NO_EXCEPT
void * memset(void *s, int c, size_t n) FL_NO_EXCEPT
int strncmp(const char *s1, const char *s2, size_t n) FL_NO_EXCEPT
char * strchr(char *s, int c) FL_NO_EXCEPT
void * memcpy(void *dest, const void *src, size_t n) FL_NO_EXCEPT
char * strtok(char *s1, const char *s2) FL_NO_EXCEPT
char * strpbrk(char *s1, const char *s2) FL_NO_EXCEPT
size_t strcspn(const char *s1, const char *s2) FL_NO_EXCEPT
void * memchr(void *s, int c, size_t n) FL_NO_EXCEPT
size_t strlen(const char *s) FL_NO_EXCEPT
size_t strspn(const char *s1, const char *s2) FL_NO_EXCEPT
char * strcpy(char *dest, const char *src) FL_NO_EXCEPT
char * strrchr(char *s, int c) FL_NO_EXCEPT
int memcmp(const void *s1, const void *s2, size_t n) FL_NO_EXCEPT
char * strncpy(char *dest, const char *src, size_t n) FL_NO_EXCEPT
void * memmove(void *dest, const void *src, size_t n) FL_NO_EXCEPT
char * strerror(int errnum) FL_NO_EXCEPT
const char * strstr(const char *haystack, const char *needle) FL_NO_EXCEPT
char * strcat(char *dest, const char *src) FL_NO_EXCEPT
int strcmp(const char *s1, const char *s2) FL_NO_EXCEPT
FASTLED_FORCE_INLINE size_t strcspn(const char *s1, const char *s2) FL_NO_EXCEPT
Definition cstring.h:112
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
FASTLED_FORCE_INLINE void * memchr(void *s, int c, size_t n) FL_NO_EXCEPT
Definition cstring.h:152
FASTLED_FORCE_INLINE int strcmp(const char *s1, const char *s2) FL_NO_EXCEPT
Definition cstring.h:60
FASTLED_FORCE_INLINE int memcmp(const void *s1, const void *s2, size_t n) FL_NO_EXCEPT
Definition cstring.h:140
FASTLED_FORCE_INLINE char * strncat(char *dest, const char *src, size_t n) FL_NO_EXCEPT
Definition cstring.h:84
FASTLED_FORCE_INLINE void * memset(void *s, int c, size_t n) FL_NO_EXCEPT
Definition cstring.h:148
FASTLED_FORCE_INLINE char * strcpy(char *dest, const char *src) FL_NO_EXCEPT
Definition cstring.h:68
FASTLED_FORCE_INLINE void * memmove(void *dest, const void *src, size_t n) FL_NO_EXCEPT
Definition cstring.h:144
FASTLED_FORCE_INLINE char * strtok(char *s1, const char *s2) FL_NO_EXCEPT
Definition cstring.h:124
FASTLED_FORCE_INLINE void * memcpy(void *dest, const void *src, size_t n) FL_NO_EXCEPT
Definition cstring.h:136
FASTLED_FORCE_INLINE const char * strstr(const char *haystack, const char *needle) FL_NO_EXCEPT
Definition cstring.h:88
void * memcopy(void *dest, const void *src, size_t n) FL_NO_EXCEPT
Definition cstring.h:163
FASTLED_FORCE_INLINE char * strrchr(char *s, int c) FL_NO_EXCEPT
Definition cstring.h:100
FASTLED_FORCE_INLINE size_t strspn(const char *s1, const char *s2) FL_NO_EXCEPT
Definition cstring.h:108
FASTLED_FORCE_INLINE char * strncpy(char *dest, const char *src, size_t n) FL_NO_EXCEPT
Definition cstring.h:76
FASTLED_FORCE_INLINE int strncmp(const char *s1, const char *s2, size_t n) FL_NO_EXCEPT
Definition cstring.h:64
FASTLED_FORCE_INLINE char * strcat(char *dest, const char *src) FL_NO_EXCEPT
Definition cstring.h:80
FASTLED_FORCE_INLINE char * strchr(char *s, int c) FL_NO_EXCEPT
Definition cstring.h:92
FASTLED_FORCE_INLINE char * strerror(int errnum) FL_NO_EXCEPT
Definition cstring.h:128
FASTLED_FORCE_INLINE size_t strlen(const char *s) FL_NO_EXCEPT
Definition cstring.h:56
FASTLED_FORCE_INLINE char * strpbrk(char *s1, const char *s2) FL_NO_EXCEPT
Definition cstring.h:116
Base definition for an LED controller.
Definition crgb.hpp:179