#include void* memchr(const void* s, int c, size_t n) { unsigned char *p = (unsigned char*) s; while(n--) { if(*p != (unsigned char) c) { p++; } else { return p; } } return 0; } int memcmp(const void* s1, const void* s2, size_t n) { const unsigned char* p1 = (const unsigned char*) s1; const unsigned char* p2 = (const unsigned char*) s2; while(n--) { if(*p1 != *p2) { return *p1 - *p2; } else { p1++, p2++; } } return 0; } void* memcpy(void* dest, const void* src, size_t n) { char *dp = (char*) dest; const char *sp = (const char*) src; while(n--) *dp++ = *sp++; return dest; } void* memmove(void* dest, const void* src, size_t n) { unsigned char tmp[n]; memcpy(tmp, src, n); memcpy(dest, tmp, n); return dest; } void* memset(void* s, int c, size_t n) { unsigned char* p = (unsigned char*) s; while(n--) *p++ = (unsigned char) c; return s; } size_t strlen(const char* str) { const char* s; for(s = str; *s; ++s) {} return (s - str); } char* strcat(char* dest, const char* src) { size_t dest_len = strlen(dest); size_t i; for(i = 0; src[i] != '\0'; i++) { dest[dest_len + i] = src[i]; } dest[dest_len + i] = '\0'; return dest; } char* strncat(char* dest, const char* src, size_t n) { size_t dest_len = strlen(dest); size_t i; for(i = 0; i < n && src[i] != '\0'; i++) { dest[dest_len + i] = src[i]; } dest[dest_len + i] = '\0'; return dest; } char* strchr(const char* s, int c) { while(*s != (char) c) { if(!*s++) return 0; } return (char*) s; } char* strrchr(char* s, int c) { char* ret = 0; do { if(*s == (char) c) ret = s; } while(*s++); return ret; } int strcmp(const char* s1, const char* s2) { while(*s1 && (*s1 == *s2)) s1++, s2++; return *(const unsigned char*) s1 - *(const unsigned char*) s2; } int strncmp(const char* s1, const char* s2, size_t n) { while(n--) { if(*s1++ != *s2++) { return *(unsigned char*) (s1 - 1) - *(unsigned char*) (s2 - 1); } } return 0; } char* strcpy(char* dest, const char* src) { char* ret = dest; while(*dest++ = *src++); return ret; } char* strncpy(char* dest, const char* src, size_t n) { char* ret = dest; do { if(!n--) return ret; } while (*dest++ = *src++); while(n--) *dest++ = 0; return ret; } size_t strcspn(const char* s1, const char* s2) { size_t ret = 0; while(*s1) { if(strchr(s2, *s1)) { return ret; } else { s1++, ret++; } } return ret; } size_t strspn(const char* s1, const char* s2) { size_t ret = 0; while(*s1 && strchr(s2, *s1++)) ret++; return ret; } char* strpbrk(const char* s1, const char* s2) { while(*s1) { if(strchr(s2, *s1++)) return (char*) --s1; } return 0; } char* strstr(const char* s1, const char* s2) { size_t n = strlen(s2); while(*s1) { if(!memcmp(s1++, s2, n)) { return (char*) (s1 - 1); } } return 0; } char* strtok(char* str, const char* delim) { static char* p = 0; if(str) { p = str; } else if(!p) { return 0; } str = p + strspn(p, delim); p = str + strcspn(str, delim); if(p == str) return p = 0; p = *p ? *p = 0, p + 1 : 0; return str; } size_t strxfrm(char* dest, const char* src, size_t n) { size_t n2 = strlen(src); if(n > n2) strcpy(dest, src); return n2; }