| #include "string.h" |
| |
| unsigned long strlen(const char *buf) |
| { |
| unsigned long len = 0; |
| |
| while (*buf++) |
| ++len; |
| return len; |
| } |
| |
| char *strcat(char *dest, const char *src) |
| { |
| char *p = dest; |
| |
| while (*p) |
| ++p; |
| while ((*p++ = *src++) != 0) |
| ; |
| return dest; |
| } |
| |
| char *strcpy(char *dest, const char *src) |
| { |
| *dest = 0; |
| return strcat(dest, src); |
| } |
| |
| int strcmp(const char *a, const char *b) |
| { |
| while (*a == *b) { |
| if (*a == '\0') { |
| break; |
| } |
| ++a, ++b; |
| } |
| return *a - *b; |
| } |
| |
| char *strchr(const char *s, int c) |
| { |
| while (*s != (char)c) |
| if (*s++ == '\0') |
| return NULL; |
| return (char *)s; |
| } |
| |
| char *strstr(const char *s1, const char *s2) |
| { |
| size_t l1, l2; |
| |
| l2 = strlen(s2); |
| if (!l2) |
| return (char *)s1; |
| l1 = strlen(s1); |
| while (l1 >= l2) { |
| l1--; |
| if (!memcmp(s1, s2, l2)) |
| return (char *)s1; |
| s1++; |
| } |
| return NULL; |
| } |
| |
| int memcmp(const void *s1, const void *s2, size_t n) |
| { |
| const unsigned char *a = s1, *b = s2; |
| int ret = 0; |
| |
| while (n--) { |
| ret = *a - *b; |
| if (ret) |
| break; |
| ++a, ++b; |
| } |
| return ret; |
| } |
| |
| void *memmove(void *dest, const void *src, size_t n) |
| { |
| const unsigned char *s = src; |
| unsigned char *d = dest; |
| |
| if (d <= s) { |
| while (n--) |
| *d++ = *s++; |
| } else { |
| d += n, s += n; |
| while (n--) |
| *--d = *--s; |
| } |
| return dest; |
| } |
| |
| void *memchr(const void *s, int c, size_t n) |
| { |
| const unsigned char *str = s, chr = (unsigned char)c; |
| |
| while (n--) |
| if (*str++ == chr) |
| return (void *)(str - 1); |
| return NULL; |
| } |
| |
| long atol(const char *ptr) |
| { |
| long acc = 0; |
| const char *s = ptr; |
| int neg, c; |
| |
| while (*s == ' ' || *s == '\t') |
| s++; |
| if (*s == '-'){ |
| neg = 1; |
| s++; |
| } else { |
| neg = 0; |
| if (*s == '+') |
| s++; |
| } |
| |
| while (*s) { |
| if (*s < '0' || *s > '9') |
| break; |
| c = *s - '0'; |
| acc = acc * 10 + c; |
| s++; |
| } |
| |
| if (neg) |
| acc = -acc; |
| |
| return acc; |
| } |