📄 wstring.c
字号:
&& (++s2, *s1++)); return r;#endif}__XL_ALIAS(strcasecmp)#endif /* defined(__UCLIBC_HAS_XLOCALE__) && !defined(__UCLIBC_DO_XLOCALE) */#endif/**********************************************************************/#if defined(L_strncasecmp) || defined(L_strncasecmp_l) || defined(L_wcsncasecmp) || defined(L_wcsncasecmp_l)#if defined(L_wcsncasecmp) || defined(L_wcsncasecmp_l)#define strncasecmp wcsncasecmp#define strncasecmp_l wcsncasecmp_l#define __strncasecmp_l __wcsncasecmp_l#ifdef __UCLIBC_DO_XLOCALE#define TOLOWER(C) __towlower_l((C), locale_arg)#else#define TOLOWER(C) towlower((C))#endif#else /* defined(L_wcsncasecmp) || defined(L_wcsncasecmp_l) */#ifdef __UCLIBC_DO_XLOCALE#define TOLOWER(C) __tolower_l((C), locale_arg)#else#define TOLOWER(C) tolower((C))#endif#endif /* defined(L_wcsncasecmp) || defined(L_wcsncasecmp_l) */#if defined(__UCLIBC_HAS_XLOCALE__) && !defined(__UCLIBC_DO_XLOCALE)int strncasecmp(register const Wchar *s1, register const Wchar *s2, size_t n){ return __strncasecmp_l(s1, s2, n, __UCLIBC_CURLOCALE);}#else /* defined(__UCLIBC_HAS_XLOCALE__) && !defined(__UCLIBC_DO_XLOCALE) */int __XL(strncasecmp)(register const Wchar *s1, register const Wchar *s2, size_t n __LOCALE_PARAM ){#ifdef WANT_WIDE while (n && ((*s1 == *s2) || (TOLOWER(*s1) == TOLOWER(*s2)))) { if (!*s1++) { return 0; } ++s2; --n; } return (n == 0) ? 0 : ((((Wuchar)TOLOWER(*s1)) < ((Wuchar)TOLOWER(*s2))) ? -1 : 1); /* TODO -- should wide cmp funcs do wchar or Wuchar compares? */#else int r = 0; while ( n && ((s1 == s2) || !(r = ((int)( TOLOWER(*((unsigned char *)s1)))) - TOLOWER(*((unsigned char *)s2)))) && (--n, ++s2, *s1++)); return r;#endif}__XL_ALIAS(strncasecmp)#endif /* defined(__UCLIBC_HAS_XLOCALE__) && !defined(__UCLIBC_DO_XLOCALE) */#endif/**********************************************************************/#ifdef L_wcsnlen#define L_strnlen#define Wstrnlen wcsnlen#else#define Wstrnlen strnlen#endif#ifdef L_strnlensize_t Wstrnlen(const Wchar *s, size_t max){ register const Wchar *p = s;#ifdef __BCC__ /* bcc can optimize the counter if it thinks it is a pointer... */ register const char *maxp = (const char *) max;#else#define maxp max#endif while (maxp && *p) { ++p; --maxp; } return p - s;}#undef maxp#endif/**********************************************************************//* No wide analog. */#ifdef L_memccpyvoid *memccpy(void * __restrict s1, const void * __restrict s2, int c, size_t n){ register char *r1 = s1; register const char *r2 = s2; while (n-- && (((unsigned char)(*r1++ = *r2++)) != ((unsigned char) c))); return (n == (size_t) -1) ? NULL : r1;}#endif/**********************************************************************/#undef Wstrlen#undef Wstrcpy#ifdef L_wcsdup#define L_strdup#define Wstrdup wcsdup#define Wstrlen wcslen#define Wstrcpy wcscpy#else#define Wstrdup strdup#define Wstrlen strlen#define Wstrcpy strcpy#endif#ifdef L_strdupWchar *Wstrdup(register const Wchar *s1){ register Wchar *s; if ((s = malloc((Wstrlen(s1) + 1) * sizeof(Wchar))) != NULL) { Wstrcpy(s, s1); } return s;}#endif/**********************************************************************/#ifdef L_strerrorchar *strerror(int errnum){ static char buf[_STRERROR_BUFSIZE]; _susv3_strerror_r(errnum, buf, sizeof(buf)); return buf;}#endif/**********************************************************************//* SUSv3 functions. *//**********************************************************************/#ifdef L__susv3_strerror_r#ifdef __UCLIBC_HAS_ERRNO_MESSAGES__#if defined(__alpha__) || defined(__mips__) || defined(__sparc__)static const unsigned char estridx[] = { 0, /* success is always 0 */ EPERM, ENOENT, ESRCH, EINTR, EIO, ENXIO, E2BIG, ENOEXEC, EBADF, ECHILD, EAGAIN, ENOMEM, EACCES, EFAULT, ENOTBLK, EBUSY, EEXIST, EXDEV, ENODEV, ENOTDIR, EISDIR, EINVAL, ENFILE, EMFILE, ENOTTY, ETXTBSY, EFBIG, ENOSPC, ESPIPE, EROFS, EMLINK, EPIPE, EDOM, ERANGE, EDEADLK, ENAMETOOLONG, ENOLCK, ENOSYS, ENOTEMPTY, ELOOP, 0, ENOMSG, EIDRM, ECHRNG, EL2NSYNC, EL3HLT, EL3RST, ELNRNG, EUNATCH, ENOCSI, EL2HLT, EBADE, EBADR, EXFULL, ENOANO, EBADRQC, EBADSLT, 0, EBFONT, ENOSTR, ENODATA, ETIME, ENOSR, ENONET, ENOPKG, EREMOTE, ENOLINK, EADV, ESRMNT, ECOMM, EPROTO, EMULTIHOP, EDOTDOT, EBADMSG, EOVERFLOW, ENOTUNIQ, EBADFD, EREMCHG, ELIBACC, ELIBBAD, ELIBSCN, ELIBMAX, ELIBEXEC, EILSEQ, ERESTART, ESTRPIPE, EUSERS, ENOTSOCK, EDESTADDRREQ, EMSGSIZE, EPROTOTYPE, ENOPROTOOPT, EPROTONOSUPPORT, ESOCKTNOSUPPORT, EOPNOTSUPP, EPFNOSUPPORT, EAFNOSUPPORT, EADDRINUSE, EADDRNOTAVAIL, ENETDOWN, ENETUNREACH, ENETRESET, ECONNABORTED, ECONNRESET, ENOBUFS, EISCONN, ENOTCONN, ESHUTDOWN, ETOOMANYREFS, ETIMEDOUT, ECONNREFUSED, EHOSTDOWN, EHOSTUNREACH, EALREADY, EINPROGRESS, ESTALE, EUCLEAN, ENOTNAM, ENAVAIL, EISNAM, EREMOTEIO,#ifdef __mips__ 0, /* mips has an outrageous value for this... */#else EDQUOT,#endif ENOMEDIUM, EMEDIUMTYPE,#if defined(__mips__) || defined(__sparc__) EDEADLOCK,#endif};#endifint _susv3_strerror_r(int errnum, char *strerrbuf, size_t buflen){ register char *s; int i, retval; char buf[_STRERROR_BUFSIZE]; static const char unknown[] = { 'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', ' ' }; retval = EINVAL;#ifdef __UCLIBC_HAS_ERRNO_MESSAGES__#if defined(__alpha__) || defined(__mips__) || defined(__sparc__) /* Need to translate errno to string index. */ for (i = 0 ; i < sizeof(estridx)/sizeof(estridx[0]) ; i++) { if (estridx[i] == errnum) { goto GOT_ESTRIDX; } } i = INT_MAX; /* Failed, but may need to check mips special case. */#ifdef __mips__ if (errnum == EDQUOT) { /* Deal with large EDQUOT value on mips */ i = 122; }#endif /* __mips__ */ GOT_ESTRIDX:#else /* No errno to string index translation needed. */ i = errnum;#endif if (((unsigned int) i) < _SYS_NERR) { /* Trade time for space. This function should rarely be called * so rather than keeping an array of pointers for the different * messages, just run through the buffer until we find the * correct string. */ for (s = (char *) _string_syserrmsgs ; i ; ++s) { if (!*s) { --i; } } if (*s) { /* Make sure we have an actual message. */ retval = 0; goto GOT_MESG; } }#endif /* __UCLIBC_HAS_ERRNO_MESSAGES__ */ s = _int10tostr(buf+sizeof(buf)-1, errnum) - sizeof(unknown); memcpy(s, unknown, sizeof(unknown)); GOT_MESG: if (!strerrbuf) { /* SUSv3 */ buflen = 0; } i = strlen(s) + 1; if (i > buflen) { i = buflen; retval = ERANGE; } if (i) { memcpy(strerrbuf, s, i); strerrbuf[i-1] = 0; /* In case buf was too small. */ } if (retval) { __set_errno(retval); } return retval;}#else /* __UCLIBC_HAS_ERRNO_MESSAGES__ */int _susv3_strerror_r(int errnum, char *strerrbuf, size_t buflen){ register char *s; int i, retval; char buf[_STRERROR_BUFSIZE]; static const char unknown[] = { 'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', ' ' }; s = _int10tostr(buf+sizeof(buf)-1, errnum) - sizeof(unknown); memcpy(s, unknown, sizeof(unknown)); if (!strerrbuf) { /* SUSv3 */ buflen = 0; } retval = EINVAL; i = buf + sizeof(buf) - s; if (i > buflen) { i = buflen; retval = ERANGE; } if (i) { memcpy(strerrbuf, s, i); strerrbuf[i-1] = 0; /* In case buf was too small. */ } __set_errno(retval); return retval;}#endif /* __UCLIBC_HAS_ERRNO_MESSAGES__ */#endif/**********************************************************************//* GNU extension functions. *//**********************************************************************/#ifdef L__glibc_strerror_rweak_alias(_glibc_strerror_r,__strerror_r);char *_glibc_strerror_r(int errnum, char *strerrbuf, size_t buflen){ _susv3_strerror_r(errnum, strerrbuf, buflen); return strerrbuf;}#endif/**********************************************************************/#ifdef L_memmemvoid *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen){ register const char *ph; register const char *pn; const char *plast; size_t n; if (needlelen == 0) { return (void *) haystack; } if (haystacklen >= needlelen) { ph = (const char *) haystack; pn = (const char *) needle; plast = ph + (haystacklen - needlelen); do { n = 0; while (ph[n] == pn[n]) { if (++n == needlelen) { return (void *) ph; } } } while (++ph <= plast); } return NULL;}#endif/**********************************************************************/#ifdef L_wmempcpy#define L_mempcpy#define Wmempcpy wmempcpy#else#define Wmempcpy __mempcpy#endif#ifdef L_mempcpy#ifndef L_wmempcpyweak_alias(__mempcpy,mempcpy);#endifWvoid *Wmempcpy(Wvoid * __restrict s1, const Wvoid * __restrict s2, size_t n){ register Wchar *r1 = s1; register const Wchar *r2 = s2;#ifdef __BCC__ while (n--) { *r1++ = *r2++; }#else while (n) { *r1++ = *r2++; --n; }#endif return r1;}#endif/**********************************************************************/#ifdef L_memrchrvoid *memrchr(const void *s, int c, size_t n){ register const unsigned char *r;#ifdef __BCC__ /* bcc can optimize the counter if it thinks it is a pointer... */ register const char *np = (const char *) n;#else#define np n#endif r = ((unsigned char *)s) + ((size_t) np); while (np) { if (*--r == ((unsigned char)c)) { return (void *) r; /* silence the warning */ } --np; } return NULL;}#undef np#endif/**********************************************************************/#ifdef L_wcpcpy#define L_stpcpy#define Wstpcpy wcpcpy#else#define Wstpcpy stpcpy#endif#ifdef L_stpcpyWchar *Wstpcpy(register Wchar * __restrict s1, const Wchar * __restrict s2){#ifdef __BCC__ do { *s1 = *s2++; } while (*s1++ != 0);#else while ( (*s1++ = *s2++) != 0 );#endif return s1 - 1;}#endif/**********************************************************************/#ifdef L_wcpncpy#define L_stpncpy#define Wstpncpy wcpncpy#else#define Wstpncpy stpncpy#endif#ifdef L_stpncpyWchar *Wstpncpy(register Wchar * __restrict s1,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -