10 #include "lib/string.h"
15 return (c >=
'0' && c <=
'9') ||
16 (c >=
'a' && c <=
'z') ||
17 (c >=
'A' && c <=
'Z') ;
28 if (c == -47 || c == -48){
42 if (c == -62 || c == -106 || c == -30){
60 }
else if (c == -106){
61 s = 2000+(((int) c1)* -1);
63 s = 3000+(((int) c1)* -1);
65 return (
isSymbol(c)?((((int) c)* -1)+(((
int) c1)* -1)+s):((
int) c));
78 return (
isUTF(c)?((((
int) c)* -1)+(((
int) c1)* -1)):((
int) c));
94 while (str[len] != 0){
109 const size_t def =
strlen(str);
111 for(
size_t i = 0; i < def;i++){
112 if (
isUTF(str[i]))
continue;
124 size_t struntil(
const char* str,
const char find) {
127 while(str[len] && str[len] != find)
173 void*
memcpy(
void *restrict destination,
const void *restrict source,
size_t n){
174 size_t *tmp_dest = (
size_t *)destination;
175 size_t *tmp_src = (
size_t *)source;
176 size_t len = n /
sizeof(size_t);
178 size_t tail = n & (
sizeof(size_t) - 1);
180 for (; i < len; i++) {
181 *tmp_dest++ = *tmp_src++;
185 char *dest = (
char *)destination;
186 const char *src = (
const char *)source;
188 for(i = n - tail; i < n; i++) {
203 void*
memset(
void* ptr,
char value,
size_t num) {
204 uint8_t* p = (uint8_t*)ptr;
206 for (
size_t i = 0; i < num; i++) {
220 void*
memmove(
void *dest,
void *src,
size_t count) {
222 if (dest <= src || (
char*)dest >= ((
char*)src + count))
226 *(
char*)dest = *(
char*)src;
227 dest = (
char*)dest + 1;
228 src = (
char*)src + 1;
233 dest = (
char*)dest + count - 1;
234 src = (
char*)src + count - 1;
237 *(
char*)dest = *(
char*)src;
238 dest = (
char*)dest - 1;
239 src = (
char*)src - 1;
253 int strcmp(
const char *s1,
const char *s2) {
254 while (*s1 && *s1 == *s2) {
270 bool strcmpn(
const char *str1,
const char *str2){
271 return strcmp(str1, str2) == 0;
285 while (src[i] !=
'\0')
305 int32_t
memcmp(
const char *s1,
const char *s2,
size_t n){
306 unsigned char u1, u2;
308 for (; n--; s1++, s2++){
309 u1 = *(
unsigned char *)s1;
310 u2 = *(
unsigned char *)s2;
345 char *
strpbrk(
const char *s,
const char *accept){
347 const char *a = accept;
366 size_t strspn(
const char *s,
const char *accept){
371 for (p = s; *p !=
'\0'; ++p){
372 for (a = accept; *a !=
'\0'; ++a){
394 int32_t
strncmp(
const char *s1,
const char *s2,
size_t num){
395 for (
size_t i = 0; i < num; i++){
411 char *
strtok(
char *s,
const char *delim){
412 static char *olds =
nullptr;
447 char *
strncpy(
char *dest,
const char *src,
size_t n) {
448 for (
size_t i = 0; i < n && src[i] !=
'\0'; i++) {
463 char*
strcat(
char* destination,
const char* source) {
464 char* ptr = destination;
467 while (*ptr !=
'\0') {
472 while (*source !=
'\0') {
492 void substr(
char* restrict dest,
const char* restrict source,
int from,
int length){
493 strncpy(dest, source + from, length);
506 while (*_s != (
char)_c){
522 if(*as >=
'A' && *as <=
'Z')
536 if(*as >=
'a' && *as <=
'z')
550 for(uint32_t i = 0, len =
strlen(c); i < len; i++){
551 if (!(c[i] >=
'0' && c[i] <=
'9')) {
567 bool minus = *s ==
'-';
572 for (; s[i] >=
'0' && s[i] <=
'9'; ++i)
573 n = (n * 10) + (s[i] -
'0');
580 size_t htoi(
const char* hex) {
585 if (*p >=
'0' && *p <=
'9') {
586 result = (result << 4) + (*p -
'0');
587 }
else if (*p >=
'A' && *p <=
'F') {
588 result = (result << 4) + (*p -
'A' + 10);
589 }
else if (*p >=
'a' && *p <=
'f') {
590 result = (result << 4) + (*p -
'a' + 10);
606 size_t j =
strlen(str) - 1;
608 for (int32_t i = 0; i < j; i++) {
623 size_t itoa(int32_t n,
char *buffer) {
624 char const digits[] =
"0123456789";
642 *--p = digits[n % 10];
651 size_t itou(
size_t n,
char *buffer) {
664 *--p =
'0' + (n % 10);
671 size_t itoh(
size_t i,
char *buffer) {
672 const unsigned char hex[16] =
"0123456789ABCDEF";
673 uint32_t n, d = 0x10000000;
676 while ((i / d == 0) && (d >= 0x10)) {
694 int dcmpstr(
const char *s1,
const char *s2 )
696 while ( *s1 && *s1 == *s2 ) ++s1, ++s2;
698 return ( (
unsigned char )*s1 > (
unsigned char )*s2 ) -
699 ( (
unsigned char )*s1 < (
unsigned char )*s2 );
702 char digit_count(uint64_t num) {
714 char hex_count(
size_t num) {
726 bool isnumberstr(
char* a) {
746 size_t strcount(
const char*
string,
char character) {
750 if(*
string == character)
757 char* strstr(
const char* haystack,
const char* needle) {
758 if (*needle ==
'\0') {
759 return (
char*) haystack;
763 const char* h = haystack;
764 const char* n = needle;
766 while (*h && *n && (*h == *n)) {
772 return (
char*) haystack;
782 double strtod(
const char* str,
char** endptr) {
789 while (*str ==
' ') {
794 if (*str ==
'-' || *str ==
'+') {
795 sign = (*str++ ==
'-') ? -1 : 1;
799 while (*str >=
'0' && *str <=
'9') {
800 result = result * 10 + (*str++ -
'0');
805 double fraction = 1.0;
807 while (*str >=
'0' && *str <=
'9') {
808 result = result + (double)(*str -
'0') / (fraction *= 10.0);
814 if (*str ==
'e' || *str ==
'E') {
817 if (*str ==
'-' || *str ==
'+') {
818 exponent = (*str++ ==
'-') ? -1 : 1;
821 int temp_exponent = 0;
822 while (*str >=
'0' && *str <=
'9') {
823 temp_exponent = temp_exponent * 10 + (*str++ -
'0');
825 exponent *= temp_exponent;
830 if (endptr != NULL) {
831 *endptr = (
char*)str;
834 return result * pow(10, exponent);
840 unsigned long strtoul(
const char* str,
char** endptr,
int base) {
841 unsigned long result = 0;
845 while (str[i] ==
' ') {
852 if (str[i + 1] ==
'x' || str[i + 1] ==
'X') {
865 while (str[i] !=
'\0') {
867 if (str[i] >=
'0' && str[i] <=
'9') {
868 digit = str[i] -
'0';
869 }
else if (str[i] >=
'a' && str[i] <=
'z') {
870 digit = str[i] -
'a' + 10;
871 }
else if (str[i] >=
'A' && str[i] <=
'Z') {
872 digit = str[i] -
'A' + 10;
877 result = result * base + digit;
885 if (endptr != NULL) {
886 *endptr = (
char*)(str + i);
Основные определения ядра
size_t strlen(const char *str)
Возращает длину строки
char * strpbrk(const char *s, const char *accept)
???
int strcmp(const char *s1, const char *s2)
Сравнение строк
uint32_t atoi(const char s[])
Превращает строку в число
bool strcmpn(const char *str1, const char *str2)
Сравнение строк
void strtolower(char *as)
Перевод строки в нижний регистр
uint32_t SymConvert(char c, char c1, char c2)
Возращает индекс символа
int32_t strncmp(const char *s1, const char *s2, size_t num)
Сравнение строк с ограничением количества сравниваемых символов
size_t strcount(const char *string, char character)
Посчитать количество символов character в строке string
char * strncpy(char *dest, const char *src, size_t n)
Копирование строк c ограничением длины
char * strchr(const char *_s, char _c)
Поиск первого вхождения символа в строку
bool isNumber(const char *c)
Проверяет, является ли строка числом
void strver(char *str)
Переворачивает строку задом наперед
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
uint32_t UTFConvert(char c, char c1)
Возращает индекс символа
char * strtok(char *s, const char *delim)
Разбиение строки на части по указанному разделителю
size_t mb_strlen(const char *str)
Возращает длину строки с учетом UTF-8.
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
bool isSymbol(char c)
Проверяет, является ли специальным символом
size_t strspn(const char *s, const char *accept)
Определение максимальной длины участка строки, содержащего только указанные символы
void substr(char *restrict dest, const char *restrict source, int from, int length)
Вырезает и возвращает подстроку из строки
bool isUTF(char c)
Проверяет, является ли символ формата UTF-8.
int32_t memcmp(const char *s1, const char *s2, size_t n)
Сравнение массивов
void strtoupper(char *as)
Перевод строки в верхний регистр
int strcpy(char *dest, const char *src)
Копирование строк
void * memmove(void *dest, void *src, size_t count)
Копирование массивов (в том числе пересекающихся)
size_t itoa(int32_t n, char *buffer)
Конвертируем число в символы
size_t struntil(const char *str, const char find)
Возвращает индекс символа в строке
size_t str_bksp(char *str, char c)
???
char * strcat(char *destination, const char *source)
Объединение строк