string.h

来自「linux 内核源代码」· C头文件 代码 · 共 138 行

H
138
字号
#ifndef _BLACKFIN_STRING_H_#define _BLACKFIN_STRING_H_#include <linux/types.h>#ifdef __KERNEL__		/* only set these up for kernel code */#define __HAVE_ARCH_STRCPYextern inline char *strcpy(char *dest, const char *src){	char *xdest = dest;	char temp = 0;	__asm__ __volatile__ (		"1:"		"%2 = B [%1++] (Z);"		"B [%0++] = %2;"		"CC = %2;"		"if cc jump 1b (bp);"		: "+&a" (dest), "+&a" (src), "=&d" (temp)		:		: "memory", "CC");	return xdest;}#define __HAVE_ARCH_STRNCPYextern inline char *strncpy(char *dest, const char *src, size_t n){	char *xdest = dest;	char temp = 0;	if (n == 0)		return xdest;	__asm__ __volatile__ (		"1:"		"%3 = B [%1++] (Z);"		"B [%0++] = %3;"		"CC = %3;"		"if ! cc jump 2f;"		"%2 += -1;"		"CC = %2 == 0;"		"if ! cc jump 1b (bp);"		"jump 4f;"		"2:"		/* if src is shorter than n, we need to null pad bytes now */		"%3 = 0;"		"3:"		"%2 += -1;"		"CC = %2 == 0;"		"if cc jump 4f;"		"B [%0++] = %3;"		"jump 3b;"		"4:"		: "+&a" (dest), "+&a" (src), "+&da" (n), "=&d" (temp)		:		: "memory", "CC");	return xdest;}#define __HAVE_ARCH_STRCMPextern inline int strcmp(const char *cs, const char *ct){	/* need to use int's here so the char's in the assembly don't get	 * sign extended incorrectly when we don't want them to be	 */	int __res1, __res2;	__asm__ __volatile__ (		"1:"		"%2 = B[%0++] (Z);"      /* get *cs */		"%3 = B[%1++] (Z);"      /* get *ct */		"CC = %2 == %3;"         /* compare a byte */		"if ! cc jump 2f;"       /* not equal, break out */		"CC = %2;"               /* at end of cs? */		"if cc jump 1b (bp);"    /* no, keep going */		"jump.s 3f;"             /* strings are equal */		"2:"		"%2 = %2 - %3;"          /* *cs - *ct */		"3:"		: "+&a" (cs), "+&a" (ct), "=&d" (__res1), "=&d" (__res2)		:		: "memory", "CC");	return __res1;}#define __HAVE_ARCH_STRNCMPextern inline int strncmp(const char *cs, const char *ct, size_t count){	/* need to use int's here so the char's in the assembly don't get	 * sign extended incorrectly when we don't want them to be	 */	int __res1, __res2;	if (!count)		return 0;	__asm__ __volatile__ (		"1:"		"%3 = B[%0++] (Z);"      /* get *cs */		"%4 = B[%1++] (Z);"      /* get *ct */		"CC = %3 == %4;"         /* compare a byte */		"if ! cc jump 3f;"       /* not equal, break out */		"CC = %3;"               /* at end of cs? */		"if ! cc jump 4f;"       /* yes, all done */		"%2 += -1;"              /* no, adjust count */		"CC = %2 == 0;"		"if ! cc jump 1b;"       /* more to do, keep going */		"2:"		"%3 = 0;"                /* strings are equal */		"jump.s 4f;"		"3:"		"%3 = %3 - %4;"          /* *cs - *ct */		"4:"		: "+&a" (cs), "+&a" (ct), "+&da" (count), "=&d" (__res1), "=&d" (__res2)		:		: "memory", "CC");	return __res1;}#define __HAVE_ARCH_MEMSETextern void *memset(void *s, int c, size_t count);#define __HAVE_ARCH_MEMCPYextern void *memcpy(void *d, const void *s, size_t count);#define __HAVE_ARCH_MEMCMPextern int memcmp(const void *, const void *, __kernel_size_t);#define	__HAVE_ARCH_MEMCHRextern void *memchr(const void *s, int c, size_t n);#define	__HAVE_ARCH_MEMMOVEextern void *memmove(void *dest, const void *src, size_t count);#endif /*__KERNEL__*/#endif				/* _BLACKFIN_STRING_H_ */

⌨️ 快捷键说明

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