home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-s390 / string.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  3.7 KB  |  138 lines

  1. /*
  2.  *  include/asm-s390/string.h
  3.  *
  4.  *  S390 version
  5.  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
  7.  */
  8.  
  9. #ifndef _S390_STRING_H_
  10. #define _S390_STRING_H_
  11.  
  12. #ifdef __KERNEL__
  13.  
  14. #ifndef _LINUX_TYPES_H
  15. #include <linux/types.h>
  16. #endif
  17.  
  18. #define __HAVE_ARCH_MEMCHR    /* inline & arch function */
  19. #define __HAVE_ARCH_MEMCMP    /* arch function */
  20. #define __HAVE_ARCH_MEMCPY    /* gcc builtin & arch function */
  21. #define __HAVE_ARCH_MEMSCAN    /* inline & arch function */
  22. #define __HAVE_ARCH_MEMSET    /* gcc builtin & arch function */
  23. #define __HAVE_ARCH_STRCAT    /* inline & arch function */
  24. #define __HAVE_ARCH_STRCMP    /* arch function */
  25. #define __HAVE_ARCH_STRCPY    /* inline & arch function */
  26. #define __HAVE_ARCH_STRLCAT    /* arch function */
  27. #define __HAVE_ARCH_STRLCPY    /* arch function */
  28. #define __HAVE_ARCH_STRLEN    /* inline & arch function */
  29. #define __HAVE_ARCH_STRNCAT    /* arch function */
  30. #define __HAVE_ARCH_STRNCPY    /* arch function */
  31. #define __HAVE_ARCH_STRNLEN    /* inline & arch function */
  32. #define __HAVE_ARCH_STRRCHR    /* arch function */
  33. #define __HAVE_ARCH_STRSTR    /* arch function */
  34.  
  35. /* Prototypes for non-inlined arch strings functions. */
  36. extern int memcmp(const void *, const void *, size_t);
  37. extern void *memcpy(void *, const void *, size_t);
  38. extern void *memset(void *, int, size_t);
  39. extern int strcmp(const char *,const char *);
  40. extern size_t strlcat(char *, const char *, size_t);
  41. extern size_t strlcpy(char *, const char *, size_t);
  42. extern char *strncat(char *, const char *, size_t);
  43. extern char *strncpy(char *, const char *, size_t);
  44. extern char *strrchr(const char *, int);
  45. extern char *strstr(const char *, const char *);
  46.  
  47. #undef __HAVE_ARCH_MEMMOVE
  48. #undef __HAVE_ARCH_STRCHR
  49. #undef __HAVE_ARCH_STRNCHR
  50. #undef __HAVE_ARCH_STRNCMP
  51. #undef __HAVE_ARCH_STRNICMP
  52. #undef __HAVE_ARCH_STRPBRK
  53. #undef __HAVE_ARCH_STRSEP
  54. #undef __HAVE_ARCH_STRSPN
  55.  
  56. #if !defined(IN_ARCH_STRING_C)
  57.  
  58. static inline void *memchr(const void * s, int c, size_t n)
  59. {
  60.     register int r0 asm("0") = (char) c;
  61.     const void *ret = s + n;
  62.  
  63.     asm volatile ("0: srst  %0,%1\n"
  64.               "   jo    0b\n"
  65.               "   jl    1f\n"
  66.               "   la    %0,0\n"
  67.               "1:"
  68.               : "+a" (ret), "+&a" (s) : "d" (r0) : "cc" );
  69.     return (void *) ret;
  70. }
  71.  
  72. static inline void *memscan(void *s, int c, size_t n)
  73. {
  74.     register int r0 asm("0") = (char) c;
  75.     const void *ret = s + n;
  76.  
  77.     asm volatile ("0: srst  %0,%1\n"
  78.               "   jo    0b\n"
  79.               : "+a" (ret), "+&a" (s) : "d" (r0) : "cc" );
  80.     return (void *) ret;
  81. }
  82.  
  83. static inline char *strcat(char *dst, const char *src)
  84. {
  85.     register int r0 asm("0") = 0;
  86.     unsigned long dummy;
  87.     char *ret = dst;
  88.  
  89.     asm volatile ("0: srst  %0,%1\n"
  90.               "   jo    0b\n"
  91.               "1: mvst  %0,%2\n"
  92.               "   jo    1b"
  93.               : "=&a" (dummy), "+a" (dst), "+a" (src)
  94.               : "d" (r0), "0" (0) : "cc", "memory" );
  95.     return ret;
  96. }
  97.  
  98. static inline char *strcpy(char *dst, const char *src)
  99. {
  100.     register int r0 asm("0") = 0;
  101.     char *ret = dst;
  102.  
  103.     asm volatile ("0: mvst  %0,%1\n"
  104.               "   jo    0b"
  105.               : "+&a" (dst), "+&a" (src) : "d" (r0)
  106.               : "cc", "memory" );
  107.     return ret;
  108. }
  109.  
  110. static inline size_t strlen(const char *s)
  111. {
  112.     register unsigned long r0 asm("0") = 0;
  113.     const char *tmp = s;
  114.  
  115.     asm volatile ("0: srst  %0,%1\n"
  116.               "   jo    0b"
  117.               : "+d" (r0), "+a" (tmp) :  : "cc" );
  118.     return r0 - (unsigned long) s;
  119. }
  120.  
  121. static inline size_t strnlen(const char * s, size_t n)
  122. {
  123.     register int r0 asm("0") = 0;
  124.     const char *tmp = s;
  125.     const char *end = s + n;
  126.  
  127.     asm volatile ("0: srst  %0,%1\n"
  128.               "   jo    0b"
  129.               : "+a" (end), "+a" (tmp) : "d" (r0)  : "cc" );
  130.     return end - s;
  131. }
  132.  
  133. #endif /* !IN_ARCH_STRING_C */
  134.  
  135. #endif /* __KERNEL__ */
  136.  
  137. #endif /* __S390_STRING_H_ */
  138.