mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 23:44:35 +00:00
Implement strcasecmp, wcslen and wcsrtombs
This commit is contained in:
parent
09e549fdb7
commit
43af65b21e
@ -424,6 +424,97 @@ EXTERNC char *strtok(char *src, const char *delim)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int strcasecmp(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
const unsigned char *p1 = (const unsigned char *)s1;
|
||||||
|
const unsigned char *p2 = (const unsigned char *)s2;
|
||||||
|
int result;
|
||||||
|
if (p1 == p2)
|
||||||
|
return 0;
|
||||||
|
while ((result = std::tolower(*p1) - std::tolower(*p2++)) == 0)
|
||||||
|
if (*p1++ == '\0')
|
||||||
|
break;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t wcslen(const wchar_t *s)
|
||||||
|
{
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
while (s[len] != L'\0')
|
||||||
|
{
|
||||||
|
if (s[++len] == L'\0')
|
||||||
|
return len;
|
||||||
|
if (s[++len] == L'\0')
|
||||||
|
return len;
|
||||||
|
if (s[++len] == L'\0')
|
||||||
|
return len;
|
||||||
|
++len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps)
|
||||||
|
{
|
||||||
|
size_t count = 0;
|
||||||
|
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
wchar_t wc = **src;
|
||||||
|
if (wc == L'\0')
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (wc < 0x80)
|
||||||
|
{
|
||||||
|
if (dst)
|
||||||
|
*dst++ = (char)wc;
|
||||||
|
count++;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
else if (wc < 0x800)
|
||||||
|
{
|
||||||
|
if (dst)
|
||||||
|
{
|
||||||
|
*dst++ = (char)(0xC0 | (wc >> 6));
|
||||||
|
*dst++ = (char)(0x80 | (wc & 0x3F));
|
||||||
|
}
|
||||||
|
count += 2;
|
||||||
|
len -= 2;
|
||||||
|
}
|
||||||
|
else if (wc < 0x10000)
|
||||||
|
{
|
||||||
|
if (dst)
|
||||||
|
{
|
||||||
|
*dst++ = (char)(0xE0 | (wc >> 12));
|
||||||
|
*dst++ = (char)(0x80 | ((wc >> 6) & 0x3F));
|
||||||
|
*dst++ = (char)(0x80 | (wc & 0x3F));
|
||||||
|
}
|
||||||
|
count += 3;
|
||||||
|
len -= 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (dst)
|
||||||
|
{
|
||||||
|
*dst++ = (char)(0xF0 | (wc >> 18));
|
||||||
|
*dst++ = (char)(0x80 | ((wc >> 12) & 0x3F));
|
||||||
|
*dst++ = (char)(0x80 | ((wc >> 6) & 0x3F));
|
||||||
|
*dst++ = (char)(0x80 | (wc & 0x3F));
|
||||||
|
}
|
||||||
|
count += 4;
|
||||||
|
len -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*src)++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dst)
|
||||||
|
*dst = '\0';
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
EXTERNC int atoi(const char *String)
|
EXTERNC int atoi(const char *String)
|
||||||
{
|
{
|
||||||
uint64_t Length = strlen((char *)String);
|
uint64_t Length = strlen((char *)String);
|
||||||
|
@ -5,6 +5,13 @@
|
|||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct mbstate_t
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
unsigned int value;
|
||||||
|
} mbstate_t;
|
||||||
|
|
||||||
#define NAN (__builtin_nanf(""))
|
#define NAN (__builtin_nanf(""))
|
||||||
|
|
||||||
int isdigit(int c);
|
int isdigit(int c);
|
||||||
@ -71,9 +78,11 @@ extern "C"
|
|||||||
char *strchr(const char *String, int Char);
|
char *strchr(const char *String, int Char);
|
||||||
char *strrchr(const char *String, int Char);
|
char *strrchr(const char *String, int Char);
|
||||||
int strncasecmp(const char *lhs, const char *rhs, long unsigned int Count);
|
int strncasecmp(const char *lhs, const char *rhs, long unsigned int Count);
|
||||||
int strcasecmp(const char *lhs, const char *rhs);
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
char *strtok(char *src, const char *delim);
|
char *strtok(char *src, const char *delim);
|
||||||
long int strtol(const char *str, char **endptr, int base);
|
long int strtol(const char *str, char **endptr, int base);
|
||||||
|
size_t wcslen(const wchar_t *s);
|
||||||
|
size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps);
|
||||||
int log2(unsigned int n);
|
int log2(unsigned int n);
|
||||||
|
|
||||||
void *__memcpy_chk(void *dest, const void *src, size_t len, size_t slen);
|
void *__memcpy_chk(void *dest, const void *src, size_t len, size_t slen);
|
||||||
|
@ -152,7 +152,9 @@ typedef __UINTMAX_TYPE__ uintmax_t;
|
|||||||
|
|
||||||
typedef __PTRDIFF_TYPE__ ptrdiff_t;
|
typedef __PTRDIFF_TYPE__ ptrdiff_t;
|
||||||
typedef __SIZE_TYPE__ size_t;
|
typedef __SIZE_TYPE__ size_t;
|
||||||
// typedef __WCHAR_TYPE__ wchar_t;
|
#ifndef __cplusplus
|
||||||
|
typedef __WCHAR_TYPE__ wchar_t;
|
||||||
|
#endif
|
||||||
typedef __WINT_TYPE__ wint_t;
|
typedef __WINT_TYPE__ wint_t;
|
||||||
typedef __SIG_ATOMIC_TYPE__ sig_atomic_t;
|
typedef __SIG_ATOMIC_TYPE__ sig_atomic_t;
|
||||||
// TODO: ssize_t
|
// TODO: ssize_t
|
||||||
|
Loading…
x
Reference in New Issue
Block a user