string.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: string.h,v 1.20 2001/09/27 04:36:24 kanoj Exp $
  2.  * string.h: External definitions for optimized assembly string
  3.  *           routines for the Linux Kernel.
  4.  *
  5.  * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu)
  6.  * Copyright (C) 1996,1997,1999 Jakub Jelinek (jakub@redhat.com)
  7.  */
  8. #ifndef __SPARC64_STRING_H__
  9. #define __SPARC64_STRING_H__
  10. /* Really, userland/ksyms should not see any of this stuff. */
  11. #ifdef __KERNEL__
  12. #include <asm/asi.h>
  13. extern void __memmove(void *,const void *,__kernel_size_t);
  14. extern __kernel_size_t __memcpy(void *,const void *,__kernel_size_t);
  15. extern void *__memset(void *,int,__kernel_size_t);
  16. extern void *__builtin_memcpy(void *,const void *,__kernel_size_t);
  17. extern void *__builtin_memset(void *,int,__kernel_size_t);
  18. #ifndef EXPORT_SYMTAB_STROPS
  19. /* First the mem*() things. */
  20. #define __HAVE_ARCH_BCOPY
  21. #define __HAVE_ARCH_MEMMOVE
  22. #undef memmove
  23. #define memmove(_to, _from, _n) 
  24. ({ 
  25. void *_t = (_to); 
  26. __memmove(_t, (_from), (_n)); 
  27. _t; 
  28. })
  29. #define __HAVE_ARCH_MEMCPY
  30. static inline void *__constant_memcpy(void *to, const void *from, __kernel_size_t n)
  31. {
  32. if(n) {
  33. if(n <= 32) {
  34. __builtin_memcpy(to, from, n);
  35. } else {
  36. __memcpy(to, from, n);
  37. }
  38. }
  39. return to;
  40. }
  41. static inline void *__nonconstant_memcpy(void *to, const void *from, __kernel_size_t n)
  42. {
  43. __memcpy(to, from, n);
  44. return to;
  45. }
  46. #undef memcpy
  47. #define memcpy(t, f, n) 
  48. (__builtin_constant_p(n) ? 
  49.  __constant_memcpy((t),(f),(n)) : 
  50.  __nonconstant_memcpy((t),(f),(n)))
  51. #define __HAVE_ARCH_MEMSET
  52. static inline void *__constant_memset(void *s, int c, __kernel_size_t count)
  53. {
  54. extern __kernel_size_t __bzero(void *, __kernel_size_t);
  55. if(!c) {
  56. __bzero(s, count);
  57. return s;
  58. } else
  59. return __memset(s, c, count);
  60. }
  61. #undef memset
  62. #define memset(s, c, count) 
  63. ((__builtin_constant_p(count) && (count) <= 32) ? 
  64.  __builtin_memset((s), (c), (count)) : 
  65.  (__builtin_constant_p(c) ? 
  66.   __constant_memset((s), (c), (count)) : 
  67.   __memset((s), (c), (count))))
  68. #define __HAVE_ARCH_MEMSCAN
  69. #undef memscan
  70. #define memscan(__arg0, __char, __arg2)
  71. ({
  72. extern void *__memscan_zero(void *, size_t);
  73. extern void *__memscan_generic(void *, int, size_t);
  74. void *__retval, *__addr = (__arg0);
  75. size_t __size = (__arg2);
  76. if(__builtin_constant_p(__char) && !(__char))
  77. __retval = __memscan_zero(__addr, __size);
  78. else
  79. __retval = __memscan_generic(__addr, (__char), __size);
  80. __retval;
  81. })
  82. #define __HAVE_ARCH_MEMCMP
  83. extern int memcmp(const void *,const void *,__kernel_size_t);
  84. /* Now the str*() stuff... */
  85. #define __HAVE_ARCH_STRLEN
  86. extern __kernel_size_t __strlen(const char *);
  87. extern __kernel_size_t strlen(const char *);
  88. #define __HAVE_ARCH_STRNCMP
  89. extern int __strncmp(const char *, const char *, __kernel_size_t);
  90. static inline int __constant_strncmp(const char *src, const char *dest, __kernel_size_t count)
  91. {
  92. register int retval;
  93. switch(count) {
  94. case 0: return 0;
  95. case 1: return (src[0] - dest[0]);
  96. case 2: retval = (src[0] - dest[0]);
  97. if(!retval && src[0])
  98.   retval = (src[1] - dest[1]);
  99. return retval;
  100. case 3: retval = (src[0] - dest[0]);
  101. if(!retval && src[0]) {
  102.   retval = (src[1] - dest[1]);
  103.   if(!retval && src[1])
  104.     retval = (src[2] - dest[2]);
  105. }
  106. return retval;
  107. case 4: retval = (src[0] - dest[0]);
  108. if(!retval && src[0]) {
  109.   retval = (src[1] - dest[1]);
  110.   if(!retval && src[1]) {
  111.     retval = (src[2] - dest[2]);
  112.     if (!retval && src[2])
  113.       retval = (src[3] - dest[3]);
  114.   }
  115. }
  116. return retval;
  117. case 5: retval = (src[0] - dest[0]);
  118. if(!retval && src[0]) {
  119.   retval = (src[1] - dest[1]);
  120.   if(!retval && src[1]) {
  121.     retval = (src[2] - dest[2]);
  122.     if (!retval && src[2]) {
  123.       retval = (src[3] - dest[3]);
  124.       if (!retval && src[3])
  125.         retval = (src[4] - dest[4]);
  126.     }
  127.   }
  128. }
  129. return retval;
  130. default:
  131. retval = (src[0] - dest[0]);
  132. if(!retval && src[0]) {
  133.   retval = (src[1] - dest[1]);
  134.   if(!retval && src[1]) {
  135.     retval = (src[2] - dest[2]);
  136.     if(!retval && src[2])
  137.       retval = __strncmp(src+3,dest+3,count-3);
  138.   }
  139. }
  140. return retval;
  141. }
  142. }
  143. #undef strncmp
  144. #define strncmp(__arg0, __arg1, __arg2)
  145. (__builtin_constant_p(__arg2) ?
  146.  __constant_strncmp(__arg0, __arg1, __arg2) : 
  147.  __strncmp(__arg0, __arg1, __arg2))
  148. #endif /* !EXPORT_SYMTAB_STROPS */
  149. #endif /* __KERNEL__ */
  150. #endif /* !(__SPARC64_STRING_H__) */