⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 string.cpp

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 CPP
字号:
/*!    \file   string.cpp    \brief  standard library    standard library    Copyright (c) 2002,2003 Higepon    All rights reserved.    License=MIT/X Licnese    \author  HigePon    \version $Revision: 1.4 $    \date   create:2002/12/15 update:$Date: 2004/07/09 09:19:06 $*/#include <monapi/string.h>/*!    \brief memmove*/void *memmove(void* s1, const void* s2, size_t size){    void *p = s1;    char *c1 = (char*)s1;    char *c2 = (char*)s2;    if (c1 > c2) {        c1 += size - 1;        c2 += size - 1;        while (0 < size--)            *c1-- = *c2--;    } else {        while (0 < size--)            *c1++ = *c2++;    }    return p;}/*!    \brief memcmp*/int memcmp(const void* s1, const void* s2, size_t size){    char *c1 = (char*)s1;    char *c2 = (char*)s2;    while (0 < size--) {        if (*c1 != *c2)            return *c1 - *c2;        c1++;        c2++;    }    return 0;}/*!    \brief memset    function memset    \param buf   buffer to set    \param value value to set    \param size  size    \author HigePon    \date   create:2002/12/15 update:*/void *memset(void* buf, int value, size_t size) {    char *p = (char*)buf;    while (size > 0) {        *p = value;        p++;        size--;    }    return buf;}/*!    \brief strlen    function strlen    \param  str target string    \return length of str    \author HigePon    \date   create:2002/12/15 update:*/size_t strlen(const char* str) {    size_t length;    for (length = 0; str[length] != '\0'; length++);    return length;}/*!    \brief strcpy    function strcpy    \param  to   destination buffer    \param  from source string    \return copy of from    \author HigePon    \date   create:2002/12/15 update:*/char* strcpy(char* to, const char* from) {    char* p = to;    while (*from) {        *p = *from;        p++;        from++;    }    *p = '\0';    return to;}/*!    \brief strcmp    function strcmp    \param  str1 string to compare    \param  str2 string to compare    \return index of charcter    \author HigePon    \date   create:2002/12/15 update:*/int strcmp(const char* str1, const char* str2) {    while (*str1 == *str2) {        if (*str1 == '\0') return 0;        str1++;        str2++;    }    return (unsigned char)*str1 - (unsigned char)*str2;}void* memcpy(void* s1, void* s2, size_t size) {//     slow?//     char* p = (char*)s1;//     const char* s = (char*)s2;//     while (size > 0) {//         *p = *s;//         p++;//         s++;//         size--;//     }    asm volatile("movl %0, %%edi \n"                 "movl %1, %%esi \n"                 "movl %2, %%ecx \n"                 "cld            \n"                 "rep            \n"                 "movsb          \n"                 : /* no output */                 : "m"(s1), "m"(s2), "m"(size)                 : "edi", "esi", "ecx");    return s1;}char* strncpy(char* s1, const char* s2, size_t n) {    char* p = s1;    for (; n > 0; n--) {        if (*s2 == '\0') break;        *p = *s2;        p++;        s2++;    }    while (n > 1) {        n--;        *p = '\0';    }    return s1;}char* strtok(char* str, const char* delim) {    static char* place;    char* token;    int   length;    if (str != NULL) {        token = str + strspn(str, delim);    } else {        if (place[0] == '\0') return NULL;        token = place + strspn(place, delim);    }    length = strcspn(token, delim);    if (token[length] == '\0') {        place = token + length;    } else {        token[length] = '\0';        place = token + length + 1;    }    return token;}size_t strspn(const char* str1, const char* str2) {    const char* const head = str1;    for (; *str1; str1++) {        const char* t;        for (t = str2; *t != *str1; t++) {            if (*t == '\0') return str1 - head;        }    }    return str1 - head;}size_t strcspn(const char* str1, const char* str2) {    const char* const head = str1;    const char* t;    for (; *str1; str1++) {        for (t = str2; *t; t++) if (*t == *str1) return str1 - head;    }        return str1 - head;}char* ltona(long value, char* str, int n, int base) {    static const char xdigit[] = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"};    unsigned long ulvalue;    unsigned int ubase;    int sign = 0;    char* ps = str + n;    *ps = '\0';    if (base < 0) {        ubase = -base;        if (value < 0) {            value = -value;            sign  = -1;            --n;        }    } else {        ubase = base;    }    ulvalue  = value;    if (n > 0 && (2 <= ubase && ubase <  sizeof(xdigit))) {        do {            *--ps = xdigit[(unsigned)(ulvalue % ubase)];        } while (--n > 0 && (ulvalue /= ubase) != 0);    }    if (sign < 0)        *--ps = '-';    while (--n >= 0)        *--ps = '0';    return str;}char *strcat(char *s,char *t) {    char* p = s + strlen(s);    while ((*p++ = *t++) != 0);    return s;}/*!    \brief strstr    \author Tino    \date   create:2004/03/18 update:*/char* strstr(const char* str1, const char* str2){    if (str1 == NULL || str2 == NULL) return NULL;    for (const char* p1 = str1; *p1 != '\0'; p1++) {        for (const char* p1a = p1, * p2 = str2;; p1a++, p2++) {            if (*p2 == '\0') return (char*)p1;            if (*p2 != *p1a) break;        }    }    return NULL;}int strncmp(const char* s1, const char* s2, size_t n){    if (n == 0) return 0;    do    {        if (*s1 != *s2++)        {            return (*(const unsigned char *)s1 -  *(const unsigned char *)(s2 - 1));        }        if (*s1++ == 0)        {            break;        }    } while (--n != 0);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -