string.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: string.h,v 1.35.2.1 2001/12/21 00:52:47 davem 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 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  7.  */
  8. #ifndef __SPARC_STRING_H__
  9. #define __SPARC_STRING_H__
  10. #include <asm/page.h>
  11. /* Really, userland/ksyms should not see any of this stuff. */
  12. #ifdef __KERNEL__
  13. extern void __memmove(void *,const void *,__kernel_size_t);
  14. extern __kernel_size_t __memcpy(void *,const void *,__kernel_size_t);
  15. extern __kernel_size_t __memset(void *,int,__kernel_size_t);
  16. #ifndef EXPORT_SYMTAB_STROPS
  17. /* First the mem*() things. */
  18. #define __HAVE_ARCH_BCOPY
  19. #define __HAVE_ARCH_MEMMOVE
  20. #undef memmove
  21. #define memmove(_to, _from, _n) 
  22. ({ 
  23. void *_t = (_to); 
  24. __memmove(_t, (_from), (_n)); 
  25. _t; 
  26. })
  27. #define __HAVE_ARCH_MEMCPY
  28. static inline void *__constant_memcpy(void *to, const void *from, __kernel_size_t n)
  29. {
  30. extern void __copy_1page(void *, const void *);
  31. if(n <= 32) {
  32. __builtin_memcpy(to, from, n);
  33. } else {
  34. switch(n) {
  35. case PAGE_SIZE:
  36. __copy_1page(to, from);
  37. break;
  38. default:
  39. __memcpy(to, from, n);
  40. break;
  41. }
  42. }
  43. return to;
  44. }
  45. static inline void *__nonconstant_memcpy(void *to, const void *from, __kernel_size_t n)
  46. {
  47. __memcpy(to, from, n);
  48. return to;
  49. }
  50. #undef memcpy
  51. #define memcpy(t, f, n) 
  52. (__builtin_constant_p(n) ? 
  53.  __constant_memcpy((t),(f),(n)) : 
  54.  __nonconstant_memcpy((t),(f),(n)))
  55. #define __HAVE_ARCH_MEMSET
  56. static inline void *__constant_c_and_count_memset(void *s, char c, __kernel_size_t count)
  57. {
  58. extern void bzero_1page(void *);
  59. extern __kernel_size_t __bzero(void *, __kernel_size_t);
  60. if(!c) {
  61. if(count == PAGE_SIZE)
  62. bzero_1page(s);
  63. else
  64. __bzero(s, count);
  65. } else {
  66. __memset(s, c, count);
  67. }
  68. return s;
  69. }
  70. static inline void *__constant_c_memset(void *s, char c, __kernel_size_t count)
  71. {
  72. extern __kernel_size_t __bzero(void *, __kernel_size_t);
  73. if(!c)
  74. __bzero(s, count);
  75. else
  76. __memset(s, c, count);
  77. return s;
  78. }
  79. static inline void *__nonconstant_memset(void *s, char c, __kernel_size_t count)
  80. {
  81. __memset(s, c, count);
  82. return s;
  83. }
  84. #undef memset
  85. #define memset(s, c, count) 
  86. (__builtin_constant_p(c) ? (__builtin_constant_p(count) ? 
  87.                             __constant_c_and_count_memset((s), (c), (count)) : 
  88.                             __constant_c_memset((s), (c), (count))) 
  89.                           : __nonconstant_memset((s), (c), (count)))
  90. #define __HAVE_ARCH_MEMSCAN
  91. #undef memscan
  92. #define memscan(__arg0, __char, __arg2)
  93. ({
  94. extern void *__memscan_zero(void *, size_t);
  95. extern void *__memscan_generic(void *, int, size_t);
  96. void *__retval, *__addr = (__arg0);
  97. size_t __size = (__arg2);
  98. if(__builtin_constant_p(__char) && !(__char))
  99. __retval = __memscan_zero(__addr, __size);
  100. else
  101. __retval = __memscan_generic(__addr, (__char), __size);
  102. __retval;
  103. })
  104. #define __HAVE_ARCH_MEMCMP
  105. extern int memcmp(const void *,const void *,__kernel_size_t);
  106. /* Now the str*() stuff... */
  107. #define __HAVE_ARCH_STRLEN
  108. extern __kernel_size_t strlen(const char *);
  109. #define __HAVE_ARCH_STRNCMP
  110. extern int __strncmp(const char *, const char *, __kernel_size_t);
  111. static inline int __constant_strncmp(const char *src, const char *dest, __kernel_size_t count)
  112. {
  113. register int retval;
  114. switch(count) {
  115. case 0: return 0;
  116. case 1: return (src[0] - dest[0]);
  117. case 2: retval = (src[0] - dest[0]);
  118. if(!retval && src[0])
  119.   retval = (src[1] - dest[1]);
  120. return retval;
  121. case 3: retval = (src[0] - dest[0]);
  122. if(!retval && src[0]) {
  123.   retval = (src[1] - dest[1]);
  124.   if(!retval && src[1])
  125.     retval = (src[2] - dest[2]);
  126. }
  127. return retval;
  128. case 4: retval = (src[0] - dest[0]);
  129. if(!retval && src[0]) {
  130.   retval = (src[1] - dest[1]);
  131.   if(!retval && src[1]) {
  132.     retval = (src[2] - dest[2]);
  133.     if (!retval && src[2])
  134.       retval = (src[3] - dest[3]);
  135.   }
  136. }
  137. return retval;
  138. case 5: retval = (src[0] - dest[0]);
  139. if(!retval && src[0]) {
  140.   retval = (src[1] - dest[1]);
  141.   if(!retval && src[1]) {
  142.     retval = (src[2] - dest[2]);
  143.     if (!retval && src[2]) {
  144.       retval = (src[3] - dest[3]);
  145.       if (!retval && src[3])
  146.         retval = (src[4] - dest[4]);
  147.     }
  148.   }
  149. }
  150. return retval;
  151. default:
  152. retval = (src[0] - dest[0]);
  153. if(!retval && src[0]) {
  154.   retval = (src[1] - dest[1]);
  155.   if(!retval && src[1]) {
  156.     retval = (src[2] - dest[2]);
  157.     if(!retval && src[2])
  158.       retval = __strncmp(src+3,dest+3,count-3);
  159.   }
  160. }
  161. return retval;
  162. }
  163. }
  164. #undef strncmp
  165. #define strncmp(__arg0, __arg1, __arg2)
  166. (__builtin_constant_p(__arg2) ?
  167.  __constant_strncmp(__arg0, __arg1, __arg2) : 
  168.  __strncmp(__arg0, __arg1, __arg2))
  169.  
  170. #endif /* !EXPORT_SYMTAB_STROPS */
  171. #endif /* __KERNEL__ */
  172. #endif /* !(__SPARC_STRING_H__) */