📄 string.h
字号:
__asm__ __volatile__ ("std\n\t" "repne; scasb\n\t" "je 1f\n\t" "orl $-1,%0\n" "1:\tcld" : "=D" (__res), "=&c" (__d0) : "a" (__c), "0" (__s + __n - 1), "1" (__n), "m" ( *(struct { __extension__ char __x[__n]; } *)__s) : "cc");# endif return __res + 1;}# ifdef __USE_GNU# define memrchr(s, c, n) __memrchr ((s), (c), (n))# endif#endif/* Return pointer to C in S. */#define _HAVE_STRING_ARCH_rawmemchr 1__STRING_INLINE void *__rawmemchr (const void *__s, int __c);#ifndef _FORCE_INLINES__STRING_INLINE void *__rawmemchr (const void *__s, int __c){ register unsigned long int __d0; register unsigned char *__res; __asm__ __volatile__ ("cld\n\t" "repne; scasb\n\t" : "=D" (__res), "=&c" (__d0) : "a" (__c), "0" (__s), "1" (0xffffffff), "m" ( *(struct { char __x[0xfffffff]; } *)__s) : "cc"); return __res - 1;}# ifdef __USE_GNU__STRING_INLINE void *rawmemchr (const void *__s, int __c){ return __rawmemchr (__s, __c);}# endif /* use GNU */#endif/* Return the length of S. */#define _HAVE_STRING_ARCH_strlen 1#define strlen(str) \ (__extension__ (__builtin_constant_p (str) \ ? __builtin_strlen (str) \ : __strlen_g (str)))__STRING_INLINE size_t __strlen_g (__const char *__str);__STRING_INLINE size_t__strlen_g (__const char *__str){ register char __dummy; register __const char *__tmp = __str; __asm__ __volatile__ ("1:\n\t" "movb (%0),%b1\n\t" "leal 1(%0),%0\n\t" "testb %b1,%b1\n\t" "jne 1b" : "=r" (__tmp), "=&q" (__dummy) : "0" (__str), "m" ( *(struct { char __x[0xfffffff]; } *)__str) : "cc" ); return __tmp - __str - 1;}/* Copy SRC to DEST. */#define _HAVE_STRING_ARCH_strcpy 1#define strcpy(dest, src) \ (__extension__ (__builtin_constant_p (src) \ ? (sizeof ((src)[0]) == 1 && strlen (src) + 1 <= 8 \ ? __strcpy_a_small ((dest), (src), strlen (src) + 1) \ : (char *) memcpy ((char *) (dest), \ (__const char *) (src), \ strlen (src) + 1)) \ : __strcpy_g ((dest), (src))))#define __strcpy_a_small(dest, src, srclen) \ (__extension__ ({ char *__dest = (dest); \ union { \ unsigned int __ui; \ unsigned short int __usi; \ unsigned char __uc; \ char __c; \ } *__u = (void *) __dest; \ switch (srclen) \ { \ case 1: \ __u->__uc = '\0'; \ break; \ case 2: \ __u->__usi = __STRING_SMALL_GET16 (src, 0); \ break; \ case 3: \ __u->__usi = __STRING_SMALL_GET16 (src, 0); \ __u = __extension__ ((void *) __u + 2); \ __u->__uc = '\0'; \ break; \ case 4: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ break; \ case 5: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ __u = __extension__ ((void *) __u + 4); \ __u->__uc = '\0'; \ break; \ case 6: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ __u = __extension__ ((void *) __u + 4); \ __u->__usi = __STRING_SMALL_GET16 (src, 4); \ break; \ case 7: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ __u = __extension__ ((void *) __u + 4); \ __u->__usi = __STRING_SMALL_GET16 (src, 4); \ __u = __extension__ ((void *) __u + 2); \ __u->__uc = '\0'; \ break; \ case 8: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ __u = __extension__ ((void *) __u + 4); \ __u->__ui = __STRING_SMALL_GET32 (src, 4); \ break; \ } \ (char *) __dest; }))__STRING_INLINE char *__strcpy_g (char *__dest, __const char *__src);__STRING_INLINE char *__strcpy_g (char *__dest, __const char *__src){ register char *__tmp = __dest; register char __dummy; __asm__ __volatile__ ( "1:\n\t" "movb (%0),%b2\n\t" "leal 1(%0),%0\n\t" "movb %b2,(%1)\n\t" "leal 1(%1),%1\n\t" "testb %b2,%b2\n\t" "jne 1b" : "=&r" (__src), "=&r" (__tmp), "=&q" (__dummy), "=m" ( *(struct { char __x[0xfffffff]; } *)__dest) : "0" (__src), "1" (__tmp), "m" ( *(struct { char __x[0xfffffff]; } *)__src) : "cc"); return __dest;}#ifdef __USE_GNU# define _HAVE_STRING_ARCH_stpcpy 1/* Copy SRC to DEST. */# define __stpcpy(dest, src) \ (__extension__ (__builtin_constant_p (src) \ ? (strlen (src) + 1 <= 8 \ ? __stpcpy_a_small ((dest), (src), strlen (src) + 1) \ : __stpcpy_c ((dest), (src), strlen (src) + 1)) \ : __stpcpy_g ((dest), (src))))# define __stpcpy_c(dest, src, srclen) \ ((srclen) % 4 == 0 \ ? __mempcpy_by4 (dest, src, srclen) - 1 \ : ((srclen) % 2 == 0 \ ? __mempcpy_by2 (dest, src, srclen) - 1 \ : __mempcpy_byn (dest, src, srclen) - 1))/* In glibc itself we use this symbol for namespace reasons. */# define stpcpy(dest, src) __stpcpy ((dest), (src))# define __stpcpy_a_small(dest, src, srclen) \ (__extension__ ({ union { \ unsigned int __ui; \ unsigned short int __usi; \ unsigned char __uc; \ char __c; \ } *__u = (void *) (dest); \ switch (srclen) \ { \ case 1: \ __u->__uc = '\0'; \ break; \ case 2: \ __u->__usi = __STRING_SMALL_GET16 (src, 0); \ __u = __extension__ ((void *) __u + 1); \ break; \ case 3: \ __u->__usi = __STRING_SMALL_GET16 (src, 0); \ __u = __extension__ ((void *) __u + 2); \ __u->__uc = '\0'; \ break; \ case 4: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ __u = __extension__ ((void *) __u + 3); \ break; \ case 5: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ __u = __extension__ ((void *) __u + 4); \ __u->__uc = '\0'; \ break; \ case 6: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ __u = __extension__ ((void *) __u + 4); \ __u->__usi = __STRING_SMALL_GET16 (src, 4); \ __u = __extension__ ((void *) __u + 1); \ break; \ case 7: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ __u = __extension__ ((void *) __u + 4); \ __u->__usi = __STRING_SMALL_GET16 (src, 4); \ __u = __extension__ ((void *) __u + 2); \ __u->__uc = '\0'; \ break; \ case 8: \ __u->__ui = __STRING_SMALL_GET32 (src, 0); \ __u = __extension__ ((void *) __u + 4); \ __u->__ui = __STRING_SMALL_GET32 (src, 4); \ __u = __extension__ ((void *) __u + 3); \ break; \ } \ (char *) __u; }))__STRING_INLINE char *__mempcpy_by4 (char *__dest, __const char *__src, size_t __srclen);__STRING_INLINE char *__mempcpy_by4 (char *__dest, __const char *__src, size_t __srclen){ register char *__tmp = __dest; register unsigned long int __d0, __d1; __asm__ __volatile__ ("1:\n\t" "movl (%2),%0\n\t" "leal 4(%2),%2\n\t" "movl %0,(%1)\n\t" "leal 4(%1),%1\n\t" "decl %3\n\t" "jnz 1b" : "=&r" (__d0), "=r" (__tmp), "=&r" (__src), "=&r" (__d1) : "1" (__tmp), "2" (__src), "3" (__srclen / 4) : "memory", "cc"); return __tmp;}__STRING_INLINE char *__mempcpy_by2 (char *__dest, __const char *__src, size_t __srclen);__STRING_INLINE char *__mempcpy_by2 (char *__dest, __const char *__src, size_t __srclen){ register char *__tmp = __dest; register unsigned long int __d0, __d1; __asm__ __volatile__ ("shrl $1,%3\n\t" "jz 2f\n" /* only a word */ "1:\n\t" "movl (%2),%0\n\t" "leal 4(%2),%2\n\t" "movl %0,(%1)\n\t" "leal 4(%1),%1\n\t" "decl %3\n\t" "jnz 1b\n" "2:\n\t" "movw (%2),%w0\n\t" "movw %w0,(%1)" : "=&q" (__d0), "=r" (__tmp), "=&r" (__src), "=&r" (__d1), "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest) : "1" (__tmp), "2" (__src), "3" (__srclen / 2), "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src) : "cc"); return __tmp + 2;}__STRING_INLINE char *__mempcpy_byn (char *__dest, __const char *__src, size_t __srclen);__STRING_INLINE char *__mempcpy_byn (char *__dest, __const char *__src, size_t __srclen){ register unsigned long __d0, __d1; register char *__tmp = __dest; __asm__ __volatile__ ("cld\n\t" "shrl $1,%%ecx\n\t" "jnc 1f\n\t" "movsb\n" "1:\n\t" "shrl $1,%%ecx\n\t" "jnc 2f\n\t" "movsw\n" "2:\n\t" "rep; movsl" : "=D" (__tmp), "=&c" (__d0), "=&S" (__d1), "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest) : "0" (__tmp), "1" (__srclen), "2" (__src), "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src) : "cc"); return __tmp;}__STRING_INLINE char *__stpcpy_g (char *__dest, __const char *__src);__STRING_INLINE char *__stpcpy_g (char *__dest, __const char *__src){ register char *__tmp = __dest; register char __dummy; __asm__ __volatile__ ( "1:\n\t" "movb (%0),%b2\n\t" "leal 1(%0),%0\n\t" "movb %b2,(%1)\n\t" "leal 1(%1),%1\n\t" "testb %b2,%b2\n\t" "jne 1b" : "=&r" (__src), "=r" (__tmp), "=&q" (__dummy), "=m" ( *(struct { char __x[0xfffffff]; } *)__dest) : "0" (__src), "1" (__tmp), "m" ( *(struct { char __x[0xfffffff]; } *)__src) : "cc"); return __tmp - 1;}#endif/* Copy no more than N characters of SRC to DEST. */#define _HAVE_STRING_ARCH_strncpy 1#define strncpy(dest, src, n) \ (__extension__ (__builtin_constant_p (src) \ ? ((strlen (src) + 1 >= ((size_t) (n)) \ ? (char *) memcpy ((char *) (dest), \ (__const char *) (src), n) \ : __strncpy_cg ((dest), (src), strlen (src) + 1, n))) \ : __strncpy_gg ((dest), (src), n)))#define __strncpy_cg(dest, src, srclen, n) \ (((srclen) % 4 == 0) \ ? __strncpy_by4 (dest, src, srclen, n) \ : (((srclen) % 2 == 0) \ ? __strncpy_by2 (dest, src, srclen, n) \ : __strncpy_byn (dest, src, srclen, n)))__STRING_INLINE char *__strncpy_by4 (char *__dest, __const char __src[], size_t __srclen, size_t __n);__STRING_INLINE char *__strncpy_by4 (char *__dest, __const char __src[], size_t __srclen, size_t __n){ register char *__tmp = __dest; register int __dummy1, __dummy2; __asm__ __volatile__ ("1:\n\t" "movl (%2),%0\n\t" "leal 4(%2),%2\n\t" "movl %0,(%1)\n\t" "leal 4(%1),%1\n\t" "decl %3\n\t" "jnz 1b" : "=&r" (__dummy1), "=r" (__tmp), "=&r" (__src), "=&r" (__dummy2), "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest) : "1" (__tmp), "2" (__src), "3" (__srclen / 4), "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src) : "cc"); (void) memset (__tmp, '\0', __n - __srclen); return __dest;}__STRING_INLINE char *__strncpy_by2 (char *__dest, __const char __src[], size_t __srclen, size_t __n);__STRING_INLINE char *__strncpy_by2 (char *__dest, __const char __src[], size_t __srclen, size_t __n){ register char *__tmp = __dest; register int __dummy1, __dummy2; __asm__ __volatile__ ("shrl $1,%3\n\t" "jz 2f\n" /* only a word */ "1:\n\t" "movl (%2),%0\n\t" "leal 4(%2),%2\n\t" "movl %0,(%1)\n\t" "leal 4(%1),%1\n\t" "decl %3\n\t" "jnz 1b\n" "2:\n\t" "movw (%2),%w0\n\t" "movw %w0,(%1)\n\t" : "=&q" (__dummy1), "=r" (__tmp), "=&r" (__src), "=&r" (__dummy2), "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest) : "1" (__tmp), "2" (__src), "3" (__srclen / 2), "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src) : "cc"); (void) memset (__tmp + 2, '\0', __n - __srclen); return __dest;}__STRING_INLINE char *__strncpy_byn (char *__dest, __const char __src[], size_t __srclen, size_t __n);__STRING_INLINE char *__strncpy_byn (char *__dest, __const char __src[], size_t __srclen, size_t __n){ register unsigned long int __d0, __d1; register char *__tmp = __dest; __asm__ __volatile__ ("cld\n\t" "shrl $1,%1\n\t" "jnc 1f\n\t" "movsb\n" "1:\n\t" "shrl $1,%1\n\t" "jnc 2f\n\t" "movsw\n" "2:\n\t" "rep; movsl" : "=D" (__tmp), "=&c" (__d0), "=&S" (__d1), "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest) : "1" (__srclen), "0" (__tmp),"2" (__src), "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src) : "cc"); (void) memset (__tmp, '\0', __n - __srclen); return __dest;}__STRING_INLINE char *__strncpy_gg (char *__dest, __const char *__src, size_t __n);__STRING_INLINE char *__strncpy_gg (char *__dest, __const char *__src, size_t __n){ register char *__tmp = __dest; register char __dummy; if (__n > 0) __asm__ __volatile__ ("1:\n\t" "movb (%0),%2\n\t" "incl %0\n\t" "movb %2,(%1)\n\t" "incl %1\n\t" "decl %3\n\t" "je 3f\n\t" "testb %2,%2\n\t" "jne 1b\n\t" "2:\n\t" "movb %2,(%1)\n\t" "incl %1\n\t" "decl %3\n\t" "jne 2b\n\t" "3:" : "=&r" (__src), "=&r" (__tmp), "=&q" (__dummy), "=&r" (__n) : "0" (__src), "1" (__tmp), "3" (__n) : "memory", "cc"); return __dest;}/* Append SRC onto DEST. */#define _HAVE_STRING_ARCH_strcat 1#define strcat(dest, src) \ (__extension__ (__builtin_constant_p (src) \ ? __strcat_c ((dest), (src), strlen (src) + 1) \ : __strcat_g ((dest), (src))))__STRING_INLINE char *__strcat_c (char *__dest, __const char __src[], size_t __srclen);__STRING_INLINE char *__strcat_c (char *__dest, __const char __src[], size_t __srclen){#ifdef __i686__ register unsigned long int __d0; register char *__tmp; __asm__ __volatile__ ("repne; scasb" : "=D" (__tmp), "=&c" (__d0), "=m" ( *(struct { char __x[0xfffffff]; } *)__dest) : "0" (__dest), "1" (0xffffffff), "a" (0), "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src) : "cc"); --__tmp;#else register char *__tmp = __dest - 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -