2024-08-31 12:36:49 +08:00
|
|
|
#include "../include/string.h"
|
2024-09-01 14:56:38 +08:00
|
|
|
#include "../include/ctype.h"
|
|
|
|
#include "../include/stdlib.h"
|
|
|
|
|
|
|
|
int ispunct(char ch) {
|
|
|
|
return ch == '!' || ch == '@' || ch == '#' || ch == '$' || ch == '%' || ch == '^' || ch == '&' || ch == '*' ||
|
|
|
|
ch == '(' || ch == ')' || ch == '+' || ch == '-' || ch == '/' || ch == '?' || ch == '"' || ch == '\'' ||
|
|
|
|
ch == ':' || ch == ';' || ch == '{' || ch == '[' || ch == ']' || ch == '}' || ch == '|' || ch == '\\' ||
|
|
|
|
ch == '~' || ch == '`' || ch == '<' || ch == '>' || ch == ',' || ch == '.';
|
|
|
|
}
|
|
|
|
|
|
|
|
char toupper(char ch) {
|
|
|
|
return (ch & 0xDF);
|
|
|
|
}
|
|
|
|
|
|
|
|
char tolower(char ch) {
|
|
|
|
return (ch | 0x20);
|
|
|
|
}
|
|
|
|
|
|
|
|
int iscsymf(int ch) {
|
|
|
|
return ch == '_' || isdigit(ch) || isalpha(ch);
|
|
|
|
}
|
|
|
|
|
|
|
|
int isascll(char ch) {
|
|
|
|
return ((ch & 0x80) == 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
int iscntrl(char ch) {
|
|
|
|
return ((ch == 0x7F) || (ch >= 0x00 && ch <= 0x1F));
|
|
|
|
}
|
|
|
|
|
|
|
|
int isprint(int c) {
|
|
|
|
return (c > 0x1F && c < 0x7F);
|
|
|
|
}
|
|
|
|
|
|
|
|
int isgraph(int c) {
|
|
|
|
return (c > 0x20 && c < 0x7F);
|
|
|
|
}
|
|
|
|
|
|
|
|
int isxdigit(int c) {
|
|
|
|
if (!((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) {
|
|
|
|
if (!isdigit(c)) return 0;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
2024-08-31 12:36:49 +08:00
|
|
|
|
|
|
|
int isspace(int c) {
|
|
|
|
return (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' ||
|
|
|
|
c == '\v');
|
|
|
|
}
|
|
|
|
|
|
|
|
int isdigit(int c) {
|
|
|
|
return (c >= '0' && c <= '9');
|
|
|
|
}
|
|
|
|
|
|
|
|
int isalpha(int c) {
|
|
|
|
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
|
|
|
|
}
|
|
|
|
|
|
|
|
int isupper(int c) {
|
|
|
|
return (c >= 'A' && c <= 'Z');
|
|
|
|
}
|
|
|
|
|
2024-09-01 14:56:38 +08:00
|
|
|
const char *memchr(const char *buf, char c, unsigned long long count) {
|
|
|
|
while (count) {
|
|
|
|
if (*buf == c)
|
|
|
|
return buf;
|
|
|
|
++count;
|
|
|
|
++buf;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2024-08-31 12:36:49 +08:00
|
|
|
size_t strnlen(const char *s, size_t maxlen) {
|
|
|
|
const char *es = s;
|
|
|
|
while (*es && maxlen) {
|
|
|
|
es++;
|
|
|
|
maxlen--;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (es - s);
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t strlen(const char *str) {
|
|
|
|
size_t len = 0;
|
|
|
|
while (str[len])
|
|
|
|
len++;
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
|
|
|
int strcmp(const char *s1, const char *s2) {
|
|
|
|
char is_equal = 1;
|
|
|
|
|
|
|
|
for (; (*s1 != '\0') && (*s2 != '\0'); s1++, s2++) {
|
|
|
|
if (*s1 != *s2) {
|
|
|
|
is_equal = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is_equal) {
|
|
|
|
if (*s1 != '\0') {
|
|
|
|
return 1;
|
|
|
|
} else if (*s2 != '\0') {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return (int) (*s1 - *s2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
char *strcpy(char *dest, const char *src) {
|
|
|
|
do {
|
|
|
|
*dest++ = *src++;
|
|
|
|
} while (*src != 0);
|
|
|
|
*dest = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *strcat(char *dest, const char *src) {
|
|
|
|
char *temp = dest;
|
|
|
|
while (*temp != '\0')
|
|
|
|
temp++;
|
|
|
|
while ((*temp++ = *src++) != '\0');
|
2024-09-01 14:56:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void *memcpy(void *s, const void *ct, size_t n) {
|
|
|
|
if (NULL == s || NULL == ct || n <= 0)
|
|
|
|
return NULL;
|
|
|
|
while (n--)
|
|
|
|
*(char *) s++ = *(char *) ct++;
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
int memcmp(const void *a_, const void *b_, uint32_t size) {
|
|
|
|
const char *a = a_;
|
|
|
|
const char *b = b_;
|
|
|
|
while (size-- > 0) {
|
|
|
|
if (*a != *b) return *a > *b ? 1 : -1;
|
|
|
|
a++, b++;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *memset(void *s, int c, size_t n) {
|
|
|
|
unsigned char *p = s;
|
|
|
|
while (n-- > 0)
|
|
|
|
*p++ = c;
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *memmove(void *dest, const void *src, size_t num) {
|
|
|
|
void *ret = dest;
|
|
|
|
if (dest < src) {
|
|
|
|
while (num--)//前->后
|
|
|
|
{
|
|
|
|
*(char *) dest = *(char *) src;
|
|
|
|
dest = (char *) dest + 1;
|
|
|
|
src = (char *) src + 1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
while (num--)//后->前
|
|
|
|
{
|
|
|
|
*((char *) dest + num) = *((char *) src + num);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *strncat(char *dest, const char *src, unsigned long long count) {
|
|
|
|
if (dest == 0 || src == 0)return 0;
|
|
|
|
char *ret = dest;
|
|
|
|
while (*dest != '\0')dest++;
|
|
|
|
for (unsigned long long i = 0; i < count; ++i)dest[i] = src[i];
|
|
|
|
dest[count] = '\0';
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *strncpy(char *dest, const char *src, unsigned long long count) {
|
|
|
|
if (dest == 0 || src == 0)return 0;
|
|
|
|
char *ret = dest;
|
|
|
|
while (count)*dest = *src, ++dest, ++src, --count;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *strstr(const char *str1, const char *str2) {
|
|
|
|
if (str1 == 0 || str2 == 0)return 0;
|
|
|
|
const char *temp = 0;
|
|
|
|
const char *res = 0;
|
|
|
|
while (*str1 != '\0') {
|
|
|
|
temp = str1;
|
|
|
|
res = str2;
|
|
|
|
while (*temp == *res)++temp, ++res;
|
|
|
|
if (*res == '\0')return str1;
|
|
|
|
++str1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *strdup(const char *str) {
|
|
|
|
if (str == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
char *strat = (char *) str;
|
|
|
|
int len = 0;
|
|
|
|
while (*str++ != '\0')
|
|
|
|
len++;
|
|
|
|
char *ret = (char *) malloc(len + 1);
|
|
|
|
|
|
|
|
while ((*ret++ = *strat++) != '\0') {}
|
|
|
|
|
|
|
|
return ret - (len + 1);
|
2024-08-31 12:36:49 +08:00
|
|
|
}
|