home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 5 / CD_Magazyn_EXEC_nr_5.iso / Programy / Programowanie / vbcc07e.lzx / vbcc / amiga68k / include / string.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  7.4 KB  |  287 lines

  1. #ifndef __STRING_H
  2. #define __STRING_H 1
  3.  
  4. #ifndef __SIZE_T
  5. #define __SIZE_T 1
  6. typedef unsigned long size_t;
  7. #endif
  8.  
  9. #undef NULL
  10. #define NULL ((void *)0)
  11.  
  12. void *memcpy(void *,const void *,size_t);
  13. void *memmove(void *,const void *,size_t);
  14. char *strcpy(char *,const char *);
  15. char *strncpy(char *,const char *,size_t);
  16. char *strcat(char *,const char *);
  17. char *strncat(char *,const char *,size_t);
  18. int memcmp(const void *,const void *,size_t);
  19. int strcmp(const char *,const char *);
  20. int strncmp(const char *,const char *,size_t);
  21. void *memchr(const void *,int,size_t);
  22. char *strchr(const char *,int);
  23. size_t strcspn(const char *,const char *);
  24. char *strpbrk(const char *,const char *);
  25. char *strrchr(const char *,int);
  26. size_t strspn(const char *,const char *);
  27. char *strstr(const char *,const char *);
  28. void *memset(void *,int,size_t);
  29. size_t strlen(const char *);
  30. char *strtok(char *,const char *);
  31. char *strerror(int);
  32.  
  33. #ifdef __INLINE_ALL
  34. #define __INLINE_MEMCHR
  35. #define __INLINE_MEMCMP
  36. #define __INLINE_STRCAT
  37. #define __INLINE_STRCHR
  38. #define __INLINE_STRCSPN
  39. #define __INLINE_STRERROR
  40. #define __INLINE_STRNCAT
  41. #define __INLINE_STRPBRK
  42. #define __INLINE_STRRCHR
  43. #define __INLINE_STRSPN
  44. #define __INLINE_STRSTR
  45. #define __INLINE_STRTOL
  46. #endif
  47.  
  48. #ifdef __INLINE_MEMCHR
  49. #pragma only-inline on
  50. #include "vbccm68k:libsrc/string/memchr.c"
  51. #pragma only-inline off
  52. #endif
  53. #ifdef __INLINE_MEMCMP
  54. #pragma only-inline on
  55. #include "vbccm68k:libsrc/string/memcmp.c"
  56. #pragma only-inline off
  57. #endif
  58. #ifdef __INLINE_STRCAT
  59. #pragma only-inline on
  60. #include "vbccm68k:libsrc/string/strcat.c"
  61. #pragma only-inline off
  62. #endif
  63. #ifdef __INLINE_STRCHR
  64. #pragma only-inline on
  65. #include "vbccm68k:libsrc/string/strchr.c"
  66. #pragma only-inline off
  67. #endif
  68. #ifdef __INLINE_STRCSPN
  69. #pragma only-inline on
  70. #include "vbccm68k:libsrc/string/strcspn.c"
  71. #pragma only-inline off
  72. #endif
  73. #ifdef __INLINE_STRERROR
  74. #pragma only-inline on
  75. #include "vbccm68k:libsrc/string/strerror.c"
  76. #pragma only-inline off
  77. #endif
  78. #ifdef __INLINE_STRNCAT
  79. #pragma only-inline on
  80. #include "vbccm68k:libsrc/string/strncat.c"
  81. #pragma only-inline off
  82. #endif
  83. #ifdef __INLINE_STRPBRK
  84. #pragma only-inline on
  85. #include "vbccm68k:libsrc/string/strpbrk.c"
  86. #pragma only-inline off
  87. #endif
  88. #ifdef __INLINE_STRRCHR
  89. #pragma only-inline on
  90. #include "vbccm68k:libsrc/string/strrchr.c"
  91. #pragma only-inline off
  92. #endif
  93. #ifdef __INLINE_STRSPN
  94. #pragma only-inline on
  95. #include "vbccm68k:libsrc/string/strspn.c"
  96. #pragma only-inline off
  97. #endif
  98. #ifdef __INLINE_STRSTR
  99. #pragma only-inline on
  100. #include "vbccm68k:libsrc/string/strstr.c"
  101. #pragma only-inline off
  102. #endif
  103. #ifdef __INLINE_STRTOK
  104. #pragma only-inline on
  105. #include "vbccm68k:libsrc/string/strtok.c"
  106. #pragma only-inline off
  107. #endif
  108.  
  109. void *memcpy(__reg("a0") void *, __reg("a1") const void *,
  110.              __reg("d2") size_t) =
  111.         "\tcmp.l\t#16,d2\n"
  112.         "\tblo.b\t*+60\n"
  113.         "\tmove.l\ta0,d0\n"
  114.         "\tmove.l\ta1,d1\n"
  115.         "\tand.b\t#1,d0\n"
  116.         "\tand.b\t#1,d1\n"
  117.         "\tcmp.b\td0,d1\n"
  118.         "\tbne.b\t*+26\n"
  119.         "\tmove.l\ta0,d0\n"
  120.         "\ttst.b\td1\n"
  121.         "\tbeq.b\t*+4\n"
  122.         "\tmove.b\t(a1)+,(a0)+\n"
  123.         "\tsubq.l\t#1,d2\n"
  124.         ";=barrier\n"
  125.         "\tmoveq\t#3,d1\n"
  126.         "\tand.l\td2,d1\n"
  127.         "\tsub.l\td1,d2\n"
  128.         ";=barrier\n"
  129.         "\tmove.l\t(a1)+,(a0)+\n"
  130.         "\tsubq.l\t#4,d2\n"
  131.         "\tbne.b\t*-6\n"
  132.         "\tmove.w\td1,d2\n"
  133.         "\tbra.b\t*+20\n"
  134.         ";=barrier\n"
  135.         "\tcmp.l\t#$10000,d2\n"
  136.         "\tblo.b\t*+10\n"
  137.         "\tmove.l\ta0,d0\n"
  138.         ";=barrier\n"
  139.         "\tmove.b\t(a1)+,(a0)+\n"
  140.         "\tsubq.l\t#1,d2\n"
  141.         "\tbne.b\t*-6\n"
  142.         "\tbra.b\t*+12\n"
  143.         ";=barrier\n"
  144.         "\tmove.l\ta0,d0\n"
  145.         ";=barrier\n"
  146.         "\tsubq.w\t#1,d2\n"
  147.         "\tblo.b\t*+6\n"
  148.         ";=barrier\n"
  149.         "\tmove.b\t(a1)+,(a0)+\n"
  150.         "\tdbf\td2,*-4\n"
  151.         ";=barrier";
  152.  
  153. void *__memcpy_desc(__reg("a0") void *, __reg("a1") const void *,
  154.                     __reg("d2") size_t) =
  155.         "\tcmp.l\t#16,d2\n"
  156.         "\tblo.b\t*+56\n"
  157.         "\tmove.l\ta0,d0\n"
  158.         "\tmove.l\ta1,d1\n"
  159.         "\tand.b\t#1,d0\n"
  160.         "\tand.b\t#1,d1\n"
  161.         "\tcmp.b\td0,d1\n"
  162.         "\tbne.b\t*+24\n"
  163.         "\ttst.b\td1\n"
  164.         "\tbeq.b\t*+4\n"
  165.         "\tmove.b\t-(a1),-(a0)\n"
  166.         "\tsubq.l\t#1,d2\n"
  167.         ";=barrier\n"
  168.         "\tmoveq\t#3,d1\n"
  169.         "\tand.l\td2,d1\n"
  170.         "\tsub.l\td1,d2\n"
  171.         ";=barrier\n"
  172.         "\tmove.l\t-(a1),-(a0)\n"
  173.         "\tsubq.l\t#4,d2\n"
  174.         "\tbne.b\t*-6\n"
  175.         "\tmove.w\td1,d2\n"
  176.         "\tbra.b\t*+16\n"
  177.         ";=barrier\n"
  178.         "\tcmp.l\t#$10000,d2\n"
  179.         "\tblo.b\t*+8\n"
  180.         ";=barrier\n"
  181.         "\tmove.b\t-(a1),-(a0)\n"
  182.         "\tsubq.l\t#1,d2\n"
  183.         "\tbne.b\t*-6\n"
  184.         "\tbra.b\t*+10\n"
  185.         ";=barrier\n"
  186.         "\tsubq.w\t#1,d2\n"
  187.         "\tblo.b\t*+6\n"
  188.         ";=barrier\n"
  189.         "\tmove.b\t-(a1),-(a0)\n"
  190.         "\tdbf\td2,*-4\n"
  191.         ";=barrier\n"
  192.         "\tmove.l\ta0,d0";
  193.  
  194. #define memmove(d,s,n) ((d)<=(s) ? memcpy(d,s,n) : \
  195.                                    __memcpy_desc((char *)(d)+(n),(char *)(s)+(n),n))
  196.  
  197. void *memset(__reg("a0") void *, __reg("d0") int, __reg("d2") size_t) =
  198.         "\tmove.l\ta0,a1\n"
  199.         "\tcmp.l\t#16,d2\n"
  200.         "\tblo.b\t*+38\n"
  201.         "\tmove.l\ta0,d1\n"
  202.         "\tand.b\t#1,d1\n"
  203.         "\tbeq.b\t*+4\n"
  204.         "\tmove.b\td0,(a0)+\n"
  205.         "\tsubq.l\t#1,d2\n"
  206.         ";=barrier\n"
  207.         "\tmove.b\td0,d1\n"
  208.         "\tlsl.w\t#8,d0\n"
  209.         "\tmove.b\td1,d0\n"
  210.         "\tmove.w\td0,d1\n"
  211.         "\tswap\td0\n"
  212.         "\tmove.w\td1,d0\n"
  213.         "\tmoveq\t#3,d1\n"
  214.         "\tand.l\td2,d1\n"
  215.         "\tsub.l\td1,d2\n"
  216.         ";=barrier\n"
  217.         "\tmove.l\td0,(a0)+\n"
  218.         "\tsubq.l\t#4,d2\n"
  219.         "\tbne.b\t*-6\n"
  220.         "\tmove.w\td1,d2\n"
  221.         ";=barrier\n"
  222.         "\tsubq.w\t#1,d2\n"
  223.         "\tblo.b\t*+6\n"
  224.         ";=barrier\n"
  225.         "\tmove.b\td0,(a0)+\n"
  226.         "\tdbf\td2,*-4\n"
  227.         ";=barrier\n"
  228.         "\tmove.l\ta1,d0";
  229.  
  230. size_t strlen(__reg("a0") const char *) =
  231.         "\tmove.l\ta0,d0\n"
  232.         ";=barrier\n"
  233.         "\ttst.b\t(a0)+\n"
  234.         "\tbne.b\t*-4\n"
  235.         "\tsub.l\ta0,d0\n"
  236.         "\tnot.l\td0";
  237.  
  238. char *strcpy(__reg("a0") char *, __reg("a1") const char *) =
  239.         "\tmove.l\ta0,d0\n"
  240.         ";=barrier\n"
  241.         "\tmove.b\t(a1)+,(a0)+\n"
  242.         "\tbne.b\t*-4";
  243.  
  244. char *strncpy(__reg("a0") char *, __reg("a1") const char *,
  245.               __reg("d1") size_t) =
  246.         "\tmove.l\ta0,d0\n"
  247.         "\tbra.b\t*+6\n"
  248.         ";=barrier\n"
  249.         "\tmove.b\t(a1),(a0)+\n"
  250.         "\tbeq.b\t*+2\n"
  251.         "\taddq.l\t#1,a1\n"
  252.         ";=barrier\n"
  253.         "\tsubq.l\t#1,d1\n"
  254.         "\tbpl.b\t*-10";
  255.  
  256. int strcmp(__reg("a0") const char *, __reg("a1") const char *) =
  257.         "\tmoveq\t#0,d0\n"
  258.         "\tmoveq\t#0,d1\n"
  259.         ";=barrier\n"
  260.         "\tmove.b\t(a0)+,d0\n"
  261.         "\tmove.b\t(a1)+,d1\n"
  262.         "\tbeq.b\t*+6\n"
  263.         "\tsub.l\td1,d0\n"
  264.         "\tbeq.b\t*-10\n"
  265.         "\tmoveq\t#0,d1\n"
  266.         ";=barrier\n"
  267.         "\tsub.l\td1,d0";
  268.  
  269. int strncmp(__reg("a0") const char *, __reg("a1") const char *,
  270.             __reg("d2") size_t) =
  271.         "\tmoveq\t#0,d0\n"
  272.         "\tmoveq\t#0,d1\n"
  273.         ";=barrier\n"
  274.         "\tsubq.l\t#1,d2\n"
  275.         "\tbmi.b\t*+14\n"
  276.         "\tmove.b\t(a0)+,d0\n"
  277.         "\tmove.b\t(a1)+,d1\n"
  278.         "\tbeq.b\t*+6\n"
  279.         "\tsub.l\td1,d0\n"
  280.         "\tbeq.b\t*-14\n"
  281.         "\tmoveq\t#0,d1\n"
  282.         ";=barrier\n"
  283.         "\tsub.l\td1,d0";
  284.  
  285.  
  286. #endif
  287.