diff options
Diffstat (limited to 'src/string.c')
-rw-r--r-- | src/string.c | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/src/string.c b/src/string.c index f1876f2..3beb426 100644 --- a/src/string.c +++ b/src/string.c @@ -3,8 +3,10 @@ #include <stddef.h> #include <stdint.h> +#include "string.h" -int memcmp(void *s1, const void *s2, size_t n) + +int memcmp(const void *s1, const void *s2, size_t n) { unsigned char *a = (unsigned char *) s1; unsigned char *b = (unsigned char *) s2; @@ -48,6 +50,52 @@ size_t strlen(const char *s) return len; } +// BELOW: YET UNTESTED +char *strcpy(char *dest, const char *src) { + for (size_t i=0;src[i]!='\0';i++) dest[i] = src[i]; + return dest; +} + +char *strncpy(char *dest, const char *src, size_t n) { + for (size_t i=0;src[i]!='\0'&&i<n;i++) dest[i] = src[i]; + return dest; +} + +int strcmp(const char *s1, const char *s2) { + size_t i; + for (i = 0;s1[i]!='\0'&&s2[i]!='\0';i++) + if (s1[i] != s2[i]) break; + return s1[i] - s2[i]; +} + +int strncmp(const char *s1, const char *s2, size_t n) { + size_t i; + for (i = 0;s1[i]!='\0'&&s2[i]!='\0'&&i<n;i++) + if (s1[i] != s2[i]) break; + return s1[i] - s2[i]; +} + +char *strstr(const char *haystack, const char *needle) { + int l = strlen(needle); + for (const char *r=haystack;*r!='\0';r++) + if (strncmp(r, needle, l) == 0) return (char *) r; + return NULL; +} + +char *strchr(const char *s, int c) { + const char *r = s; + for (;*r!='\0';r++) + if (*r == c) return (char *) r; + + if (c == 0) return (char *) r; + return NULL; +} + +size_t strspn(const char *s, const char *accept) { + size_t i; + for (i=0;accept[i]!='\0'&&accept[i]==s[i];i++); + return i; +} char *hex(uint32_t n, char *buf) { @@ -62,3 +110,15 @@ char *hex(uint32_t n, char *buf) } return buf; } + +#define R(a, b) (c >= a && c <= b) +bool isupper(char c) {return R('A', 'Z');} +bool islower(char c) {return R('a', 'z');} +bool isalpha(char c) {return isupper(c) || islower(c);} +bool isdigit(char c) {return R('0', '9');} +bool isxdigit(char c) {return isdigit(c) || R('A', 'F') || R('a', 'f');} +bool isalnum(char c) {return isdigit(c) || isalpha(c);} +bool isspace(char c) {return c == ' ' || (unsigned)c-'\t' < 5;} + +char toupper(char c) {if (islower(c)) return (c + ('A' - 'a')); else return c;} +char tolower(char c) {if (isupper(c)) return (c - ('A' - 'a')); else return c;} |