📄 wstring.c
字号:
/* Copyright (C) 2002 Manuel Novoa III * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *//* ATTENTION! ATTENTION! ATTENTION! ATTENTION! ATTENTION! * * Besides uClibc, I'm using this code in my libc for elks, which is * a 16-bit environment with a fairly limited compiler. It would make * things much easier for me if this file isn't modified unnecessarily. * In particular, please put any new or replacement functions somewhere * else, and modify the makefile to use your version instead. * Thanks. Manuel * * ATTENTION! ATTENTION! ATTENTION! ATTENTION! ATTENTION! *//* Dec 20, 2002 * Initial test implementation of strcoll, strxfrm, wcscoll, and wcsxfrm. * The code needs to be cleaned up a good bit, but I'd like to see people * test it out. * * Sep 11, 2003 * Patch by Atsushi Nemoto <anemo@mba.ocn.ne.jp> to do arch-required * mapping of signal strings (alpha, mips, hppa, sparc). */#define _GNU_SOURCE#include <string.h>#include <strings.h>#include <stdio.h>#include <limits.h>#include <ctype.h>#include <stdlib.h>#include <errno.h>#include <signal.h>#include <assert.h>#include <locale.h>#include <bits/uClibc_uintmaxtostr.h>#ifdef WANT_WIDE#include <wchar.h>#include <wctype.h>#include <bits/uClibc_uwchar.h>#define Wvoid wchar_t#define Wchar wchar_t#define Wuchar __uwchar_t#define Wint wchar_t#else#define Wvoid void#define Wchar chartypedef unsigned char __string_uchar_t;#define Wuchar __string_uchar_t#define Wint int#endif/**********************************************************************//* NOTE: If we ever do internationalized syserr messages, this will * have to be changed! */#define _SYS_NERR 125#if defined(__mips__) || defined(__sparc__)/* sparce and mips have an extra error entry, as EDEADLK and EDEADLOCK have * different meanings on those platforms. */#undef _SYS_NERR#define _SYS_NERR 126#endif#ifdef __UCLIBC_HAS_ERRNO_MESSAGES__#define _SYS_ERRMSG_MAXLEN 50#else /* __UCLIBC_HAS_ERRNO_MESSAGES__ */#define _SYS_ERRMSG_MAXLEN 0#endif /* __UCLIBC_HAS_ERRNO_MESSAGES__ */extern const char _string_syserrmsgs[];#define _SYS_NSIG 32#ifdef __UCLIBC_HAS_SIGNUM_MESSAGES__#define _SYS_SIGMSG_MAXLEN 25#else /* __UCLIBC_HAS_SIGNUM_MESSAGES__ */#define _SYS_SIGMSG_MAXLEN 0#endif /* __UCLIBC_HAS_SIGNUM_MESSAGES__ */extern const char _string_syssigmsgs[];#if _SYS_ERRMSG_MAXLEN < __UIM_BUFLEN_INT + 14#define _STRERROR_BUFSIZE (__UIM_BUFLEN_INT + 14)#else#define _STRERROR_BUFSIZE _SYS_ERRMSG_MAXLEN#endif#if _SYS_SIGMSG_MAXLEN < __UIM_BUFLEN_INT + 15#define _STRSIGNAL_BUFSIZE (__UIM_BUFLEN_INT + 15)#else#define _STRSIGNAL_BUFSIZE _SYS_SIGMSG_MAXLEN#endif/**********************************************************************/#if defined(L__string_syserrmsgs) && defined(__UCLIBC_HAS_ERRNO_MESSAGES__)const char _string_syserrmsgs[] = { /* 0: 0, 8 */ "Success\0" /* 1: 8, 24 */ "Operation not permitted\0" /* 2: 32, 26 */ "No such file or directory\0" /* 3: 58, 16 */ "No such process\0" /* 4: 74, 24 */ "Interrupted system call\0" /* 5: 98, 19 */ "Input/output error\0" /* 6: 117, 26 */ "No such device or address\0" /* 7: 143, 23 */ "Argument list too long\0" /* 8: 166, 18 */ "Exec format error\0" /* 9: 184, 20 */ "Bad file descriptor\0" /* 10: 204, 19 */ "No child processes\0" /* 11: 223, 33 */ "Resource temporarily unavailable\0" /* 12: 256, 23 */ "Cannot allocate memory\0" /* 13: 279, 18 */ "Permission denied\0" /* 14: 297, 12 */ "Bad address\0" /* 15: 309, 22 */ "Block device required\0" /* 16: 331, 24 */ "Device or resource busy\0" /* 17: 355, 12 */ "File exists\0" /* 18: 367, 26 */ "Invalid cross-device link\0" /* 19: 393, 15 */ "No such device\0" /* 20: 408, 16 */ "Not a directory\0" /* 21: 424, 15 */ "Is a directory\0" /* 22: 439, 17 */ "Invalid argument\0" /* 23: 456, 30 */ "Too many open files in system\0" /* 24: 486, 20 */ "Too many open files\0" /* 25: 506, 31 */ "Inappropriate ioctl for device\0" /* 26: 537, 15 */ "Text file busy\0" /* 27: 552, 15 */ "File too large\0" /* 28: 567, 24 */ "No space left on device\0" /* 29: 591, 13 */ "Illegal seek\0" /* 30: 604, 22 */ "Read-only file system\0" /* 31: 626, 15 */ "Too many links\0" /* 32: 641, 12 */ "Broken pipe\0" /* 33: 653, 33 */ "Numerical argument out of domain\0" /* 34: 686, 30 */ "Numerical result out of range\0" /* 35: 716, 26 */ "Resource deadlock avoided\0" /* 36: 742, 19 */ "File name too long\0" /* 37: 761, 19 */ "No locks available\0" /* 38: 780, 25 */ "Function not implemented\0" /* 39: 805, 20 */ "Directory not empty\0" /* 40: 825, 34 */ "Too many levels of symbolic links\0" /* 41: 859, 1 */ "\0" /* 42: 860, 27 */ "No message of desired type\0" /* 43: 887, 19 */ "Identifier removed\0" /* 44: 906, 28 */ "Channel number out of range\0" /* 45: 934, 25 */ "Level 2 not synchronized\0" /* 46: 959, 15 */ "Level 3 halted\0" /* 47: 974, 14 */ "Level 3 reset\0" /* 48: 988, 25 */ "Link number out of range\0" /* 49: 1013, 29 */ "Protocol driver not attached\0" /* 50: 1042, 27 */ "No CSI structure available\0" /* 51: 1069, 15 */ "Level 2 halted\0" /* 52: 1084, 17 */ "Invalid exchange\0" /* 53: 1101, 27 */ "Invalid request descriptor\0" /* 54: 1128, 14 */ "Exchange full\0" /* 55: 1142, 9 */ "No anode\0" /* 56: 1151, 21 */ "Invalid request code\0" /* 57: 1172, 13 */ "Invalid slot\0" /* 58: 1185, 1 */ "\0" /* 59: 1186, 21 */ "Bad font file format\0" /* 60: 1207, 20 */ "Device not a stream\0" /* 61: 1227, 18 */ "No data available\0" /* 62: 1245, 14 */ "Timer expired\0" /* 63: 1259, 25 */ "Out of streams resources\0" /* 64: 1284, 30 */ "Machine is not on the network\0" /* 65: 1314, 22 */ "Package not installed\0" /* 66: 1336, 17 */ "Object is remote\0" /* 67: 1353, 22 */ "Link has been severed\0" /* 68: 1375, 16 */ "Advertise error\0" /* 69: 1391, 14 */ "Srmount error\0" /* 70: 1405, 28 */ "Communication error on send\0" /* 71: 1433, 15 */ "Protocol error\0" /* 72: 1448, 19 */ "Multihop attempted\0" /* 73: 1467, 19 */ "RFS specific error\0" /* 74: 1486, 12 */ "Bad message\0" /* 75: 1498, 38 */ "Value too large for defined data type\0" /* 76: 1536, 27 */ "Name not unique on network\0" /* 77: 1563, 29 */ "File descriptor in bad state\0" /* 78: 1592, 23 */ "Remote address changed\0" /* 79: 1615, 39 */ "Can not access a needed shared library\0" /* 80: 1654, 37 */ "Accessing a corrupted shared library\0" /* 81: 1691, 32 */ ".lib section in a.out corrupted\0" /* 82: 1723, 48 */ "Attempting to link in too many shared libraries\0" /* 83: 1771, 38 */ "Cannot exec a shared library directly\0" /* 84: 1809, 50 */ "Invalid or incomplete multibyte or wide character\0" /* 85: 1859, 44 */ "Interrupted system call should be restarted\0" /* 86: 1903, 19 */ "Streams pipe error\0" /* 87: 1922, 15 */ "Too many users\0" /* 88: 1937, 31 */ "Socket operation on non-socket\0" /* 89: 1968, 29 */ "Destination address required\0" /* 90: 1997, 17 */ "Message too long\0" /* 91: 2014, 31 */ "Protocol wrong type for socket\0" /* 92: 2045, 23 */ "Protocol not available\0" /* 93: 2068, 23 */ "Protocol not supported\0" /* 94: 2091, 26 */ "Socket type not supported\0" /* 95: 2117, 24 */ "Operation not supported\0" /* 96: 2141, 30 */ "Protocol family not supported\0" /* 97: 2171, 41 */ "Address family not supported by protocol\0" /* 98: 2212, 23 */ "Address already in use\0" /* 99: 2235, 32 */ "Cannot assign requested address\0" /* 100: 2267, 16 */ "Network is down\0" /* 101: 2283, 23 */ "Network is unreachable\0" /* 102: 2306, 36 */ "Network dropped connection on reset\0" /* 103: 2342, 33 */ "Software caused connection abort\0" /* 104: 2375, 25 */ "Connection reset by peer\0" /* 105: 2400, 26 */ "No buffer space available\0" /* 106: 2426, 40 */ "Transport endpoint is already connected\0" /* 107: 2466, 36 */ "Transport endpoint is not connected\0" /* 108: 2502, 46 */ "Cannot send after transport endpoint shutdown\0" /* 109: 2548, 35 */ "Too many references: cannot splice\0" /* 110: 2583, 21 */ "Connection timed out\0" /* 111: 2604, 19 */ "Connection refused\0" /* 112: 2623, 13 */ "Host is down\0" /* 113: 2636, 17 */ "No route to host\0" /* 114: 2653, 30 */ "Operation already in progress\0" /* 115: 2683, 26 */ "Operation now in progress\0" /* 116: 2709, 22 */ "Stale NFS file handle\0" /* 117: 2731, 25 */ "Structure needs cleaning\0" /* 118: 2756, 28 */ "Not a XENIX named type file\0" /* 119: 2784, 30 */ "No XENIX semaphores available\0" /* 120: 2814, 21 */ "Is a named type file\0" /* 121: 2835, 17 */ "Remote I/O error\0" /* 122: 2852, 20 */ "Disk quota exceeded\0" /* 123: 2872, 16 */ "No medium found\0" /* 124: 2888, 18 */ "Wrong medium type"#if defined(__mips__) || defined(__sparc__) "\0" /* 125: 2906, 28 */ "File locking deadlock error"#endif /* Note: for mips we are ignoring ECANCELED since glibc doesn't have a * corresponsding message.*/};#endif/**********************************************************************/#if defined(L_sys_errlist) && defined(__UCLIBC_HAS_SYS_ERRLIST__)link_warning(_sys_errlist, "sys_nerr and sys_errlist are obsolete and uClibc support for them (in at least some configurations) will probably be unavailable in the near future.")const char *const sys_errlist[] = { [0] = _string_syserrmsgs + 0, [EPERM] = _string_syserrmsgs + 8, [ENOENT] = _string_syserrmsgs + 32, [ESRCH] = _string_syserrmsgs + 58, [EINTR] = _string_syserrmsgs + 74, [EIO] = _string_syserrmsgs + 98, [ENXIO] = _string_syserrmsgs + 117, [E2BIG] = _string_syserrmsgs + 143, [ENOEXEC] = _string_syserrmsgs + 166, [EBADF] = _string_syserrmsgs + 184, [ECHILD] = _string_syserrmsgs + 204, [EAGAIN] = _string_syserrmsgs + 223, [ENOMEM] = _string_syserrmsgs + 256, [EACCES] = _string_syserrmsgs + 279, [EFAULT] = _string_syserrmsgs + 297, [ENOTBLK] = _string_syserrmsgs + 309, [EBUSY] = _string_syserrmsgs + 331, [EEXIST] = _string_syserrmsgs + 355, [EXDEV] = _string_syserrmsgs + 367, [ENODEV] = _string_syserrmsgs + 393, [ENOTDIR] = _string_syserrmsgs + 408, [EISDIR] = _string_syserrmsgs + 424, [EINVAL] = _string_syserrmsgs + 439, [ENFILE] = _string_syserrmsgs + 456, [EMFILE] = _string_syserrmsgs + 486, [ENOTTY] = _string_syserrmsgs + 506, [ETXTBSY] = _string_syserrmsgs + 537, [EFBIG] = _string_syserrmsgs + 552, [ENOSPC] = _string_syserrmsgs + 567, [ESPIPE] = _string_syserrmsgs + 591, [EROFS] = _string_syserrmsgs + 604, [EMLINK] = _string_syserrmsgs + 626, [EPIPE] = _string_syserrmsgs + 641, [EDOM] = _string_syserrmsgs + 653, [ERANGE] = _string_syserrmsgs + 686, [EDEADLK] = _string_syserrmsgs + 716, [ENAMETOOLONG] = _string_syserrmsgs + 742, [ENOLCK] = _string_syserrmsgs + 761, [ENOSYS] = _string_syserrmsgs + 780, [ENOTEMPTY] = _string_syserrmsgs + 805, [ELOOP] = _string_syserrmsgs + 825, /* _string_syserrmsgs + 859, */ [ENOMSG] = _string_syserrmsgs + 860, [EIDRM] = _string_syserrmsgs + 887, [ECHRNG] = _string_syserrmsgs + 906, [EL2NSYNC] = _string_syserrmsgs + 934, [EL3HLT] = _string_syserrmsgs + 959, [EL3RST] = _string_syserrmsgs + 974, [ELNRNG] = _string_syserrmsgs + 988, [EUNATCH] = _string_syserrmsgs + 1013, [ENOCSI] = _string_syserrmsgs + 1042, [EL2HLT] = _string_syserrmsgs + 1069, [EBADE] = _string_syserrmsgs + 1084, [EBADR] = _string_syserrmsgs + 1101, [EXFULL] = _string_syserrmsgs + 1128, [ENOANO] = _string_syserrmsgs + 1142, [EBADRQC] = _string_syserrmsgs + 1151, [EBADSLT] = _string_syserrmsgs + 1172, /* _string_syserrmsgs + 1185, */ [EBFONT] = _string_syserrmsgs + 1186, [ENOSTR] = _string_syserrmsgs + 1207, [ENODATA] = _string_syserrmsgs + 1227, [ETIME] = _string_syserrmsgs + 1245, [ENOSR] = _string_syserrmsgs + 1259, [ENONET] = _string_syserrmsgs + 1284, [ENOPKG] = _string_syserrmsgs + 1314, [EREMOTE] = _string_syserrmsgs + 1336, [ENOLINK] = _string_syserrmsgs + 1353, [EADV] = _string_syserrmsgs + 1375, [ESRMNT] = _string_syserrmsgs + 1391, [ECOMM] = _string_syserrmsgs + 1405, [EPROTO] = _string_syserrmsgs + 1433, [EMULTIHOP] = _string_syserrmsgs + 1448, [EDOTDOT] = _string_syserrmsgs + 1467, [EBADMSG] = _string_syserrmsgs + 1486, [EOVERFLOW] = _string_syserrmsgs + 1498, [ENOTUNIQ] = _string_syserrmsgs + 1536, [EBADFD] = _string_syserrmsgs + 1563, [EREMCHG] = _string_syserrmsgs + 1592, [ELIBACC] = _string_syserrmsgs + 1615, [ELIBBAD] = _string_syserrmsgs + 1654, [ELIBSCN] = _string_syserrmsgs + 1691, [ELIBMAX] = _string_syserrmsgs + 1723, [ELIBEXEC] = _string_syserrmsgs + 1771, [EILSEQ] = _string_syserrmsgs + 1809, [ERESTART] = _string_syserrmsgs + 1859, [ESTRPIPE] = _string_syserrmsgs + 1903, [EUSERS] = _string_syserrmsgs + 1922, [ENOTSOCK] = _string_syserrmsgs + 1937, [EDESTADDRREQ] = _string_syserrmsgs + 1968, [EMSGSIZE] = _string_syserrmsgs + 1997, [EPROTOTYPE] = _string_syserrmsgs + 2014, [ENOPROTOOPT] = _string_syserrmsgs + 2045, [EPROTONOSUPPORT] = _string_syserrmsgs + 2068, [ESOCKTNOSUPPORT] = _string_syserrmsgs + 2091, [EOPNOTSUPP] = _string_syserrmsgs + 2117, [EPFNOSUPPORT] = _string_syserrmsgs + 2141, [EAFNOSUPPORT] = _string_syserrmsgs + 2171, [EADDRINUSE] = _string_syserrmsgs + 2212, [EADDRNOTAVAIL] = _string_syserrmsgs + 2235, [ENETDOWN] = _string_syserrmsgs + 2267, [ENETUNREACH] = _string_syserrmsgs + 2283, [ENETRESET] = _string_syserrmsgs + 2306, [ECONNABORTED] = _string_syserrmsgs + 2342, [ECONNRESET] = _string_syserrmsgs + 2375, [ENOBUFS] = _string_syserrmsgs + 2400, [EISCONN] = _string_syserrmsgs + 2426, [ENOTCONN] = _string_syserrmsgs + 2466, [ESHUTDOWN] = _string_syserrmsgs + 2502, [ETOOMANYREFS] = _string_syserrmsgs + 2548, [ETIMEDOUT] = _string_syserrmsgs + 2583, [ECONNREFUSED] = _string_syserrmsgs + 2604, [EHOSTDOWN] = _string_syserrmsgs + 2623, [EHOSTUNREACH] = _string_syserrmsgs + 2636, [EALREADY] = _string_syserrmsgs + 2653, [EINPROGRESS] = _string_syserrmsgs + 2683, [ESTALE] = _string_syserrmsgs + 2709, [EUCLEAN] = _string_syserrmsgs + 2731, [ENOTNAM] = _string_syserrmsgs + 2756, [ENAVAIL] = _string_syserrmsgs + 2784, [EISNAM] = _string_syserrmsgs + 2814, [EREMOTEIO] = _string_syserrmsgs + 2835, [EDQUOT] = _string_syserrmsgs + 2852, [ENOMEDIUM] = _string_syserrmsgs + 2872, [EMEDIUMTYPE] = _string_syserrmsgs + 2888,#if EDEADLOCK != EDEADLK [EDEADLOCK] = _string_syserrmsgs + 2906,#endif#if EWOULDBLOCK != EAGAIN#error EWOULDBLOCK does not equal EAGAIN#endif /* For now, ignore the other arch-specific errors. glibc only maps EPROCLIM. */ /* some other mips errors */#ifdef ECANCELED#endif#ifdef EINIT#endif#ifdef EREMDEV#endif /* some other sparc errors */#ifdef EPROCLIM#endif#ifdef ERREMOTE#endif};int sys_nerr = sizeof(sys_errlist)/sizeof(sys_errlist[0]);#endif/**********************************************************************/#ifdef L_wmemcpy#define L_memcpy#define Wmemcpy wmemcpy#else#define Wmemcpy memcpy#endif#ifdef L_memcpyWvoid *Wmemcpy(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 s1;}#endif/**********************************************************************/#ifdef L_wmemmove#define L_memmove#define Wmemmove wmemmove#else#define Wmemmove memmove#endif#ifdef L_memmoveWvoid *Wmemmove(Wvoid *s1, const Wvoid *s2, size_t n){#ifdef __BCC__ register Wchar *s = (Wchar *) s1; register const Wchar *p = (const Wchar *) s2; if (p >= s) { while (n--) { *s++ = *p++; } } else { s += n; p += n; while (n--) { *--s = *--p; } } return s1;#else register Wchar *s = (Wchar *) s1; register const Wchar *p = (const Wchar *) s2; if (p >= s) { while (n) { *s++ = *p++; --n; } } else { while (n) { --n; s[n] = p[n]; } } return s1;#endif}#endif/**********************************************************************/#ifdef L_wcscpy#define L_strcpy#define Wstrcpy wcscpy#else#define Wstrcpy strcpy#endif#ifdef L_strcpyWchar *Wstrcpy(Wchar * __restrict s1, const Wchar * __restrict s2){ register Wchar *s = s1;#ifdef __BCC__ do { *s = *s2++; } while (*s++ != 0);#else while ( (*s++ = *s2++) != 0 );#endif return s1;}#endif/**********************************************************************/#ifdef L_wcsncpy#define L_strncpy#define Wstrncpy wcsncpy#else#define Wstrncpy strncpy#endif#ifdef L_strncpyWchar *Wstrncpy(Wchar * __restrict s1, register const Wchar * __restrict s2, size_t n){ register Wchar *s = s1;#ifdef __BCC__ while (n--) { if ((*s = *s2) != 0) s2++; /* Need to fill tail with 0s. */ ++s; }#else while (n) { if ((*s = *s2) != 0) s2++; /* Need to fill tail with 0s. */ ++s; --n; }#endif return s1;}#endif/**********************************************************************/#ifdef L_wcscat#define L_strcat#define Wstrcat wcscat#else#define Wstrcat strcat#endif#ifdef L_strcatWchar *Wstrcat(Wchar * __restrict s1, register const Wchar * __restrict s2){ register Wchar *s = s1; while (*s++); --s; while ((*s++ = *s2++) != 0); return s1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -