string.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. /* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk>
  2. * This file is part of the Linux-8086 C library and is distributed
  3. * under the GNU Library General Public License.
  4. */
  5. #include <string.h>
  6. #include <malloc.h>
  7. /* This is a basic string package; it includes the most used functions
  8. strlen strcat strcpy strcmp strncat strncpy strncmp strchr strrchr strdup
  9. memcpy memccpy memset memmove
  10. These functions are in seperate files.
  11. strpbrk.o strsep.o strstr.o strtok.o strcspn.o
  12. strspn.o strcasecmp.o strncasecmp.o
  13. */
  14. /********************** Function strlen ************************************/
  15. #ifdef L_strlen
  16. size_t strlen(const char * str)
  17. {
  18. register char * p =(char *) str;
  19. while(*p) p++;
  20. return p-str;
  21. }
  22. #endif
  23. /********************** Function strcat ************************************/
  24. #ifdef L_strcat
  25. char * strcat(char *d, const char * s)
  26. {
  27. (void) strcpy(d+strlen(d), s);
  28. return d;
  29. }
  30. #endif
  31. /********************** Function strcpy ************************************/
  32. #ifdef L_strcpy
  33. char * strcpy( char *d, const char * s)
  34. {
  35. /* This is probably the quickest on an 8086 but a CPU with a cache will
  36. * prefer to do this in one pass */
  37. return memcpy(d, s, strlen(s)+1);
  38. }
  39. #endif
  40. /********************** Function strcmp ************************************/
  41. #ifdef L_strcmp
  42. int strcmp(const char *d, const char * s)
  43. {
  44. register const unsigned char *s1 = (const unsigned char *) d;
  45. register const unsigned char *s2 = (const unsigned char *) s;
  46. unsigned register char c1, c2;
  47. do
  48. {
  49. c1 = (unsigned char) *s1++;
  50. c2 = (unsigned char) *s2++;
  51. if (c1 == '\0')
  52. return c1 - c2;
  53. }
  54. while (c1 == c2);
  55. return c1 - c2;
  56. }
  57. #endif
  58. /********************** Function strncat ************************************/
  59. #ifdef L_strncat
  60. char * strncat( char *d, const char *s, size_t l)
  61. {
  62. register char *s1=d+strlen(d), *s2;
  63. s2 = memchr(s, 0, l);
  64. if( s2 )
  65. memcpy(s1, s, s2-s+1);
  66. else
  67. {
  68. memcpy(s1, s, l);
  69. s1[l] = '\0';
  70. }
  71. return d;
  72. }
  73. #endif
  74. /********************** Function strncpy ************************************/
  75. #ifdef L_strncpy
  76. char * strncpy ( char *s1, const char *s2, size_t n)
  77. {
  78. register char c;
  79. char *s = s1;
  80. --s1;
  81. if (n >= 4)
  82. {
  83. size_t n4 = n >> 2;
  84. for (;;)
  85. {
  86. c = *s2++;
  87. *++s1 = c;
  88. if (c == '\0')
  89. break;
  90. c = *s2++;
  91. *++s1 = c;
  92. if (c == '\0')
  93. break;
  94. c = *s2++;
  95. *++s1 = c;
  96. if (c == '\0')
  97. break;
  98. c = *s2++;
  99. *++s1 = c;
  100. if (c == '\0')
  101. break;
  102. if (--n4 == 0)
  103. goto last_chars;
  104. }
  105. n = n - (s1 - s) - 1;
  106. if (n == 0)
  107. return s;
  108. goto zero_fill;
  109. }
  110. last_chars:
  111. n &= 3;
  112. if (n == 0)
  113. return s;
  114. do
  115. {
  116. c = *s2++;
  117. *++s1 = c;
  118. if (--n == 0)
  119. return s;
  120. }
  121. while (c != '\0');
  122. zero_fill:
  123. do
  124. *++s1 = '\0';
  125. while (--n > 0);
  126. return s;
  127. }
  128. #endif
  129. /********************** Function strncmp ************************************/
  130. #ifdef L_strncmp
  131. int strncmp (const char *s1, const char *s2, size_t n)
  132. {
  133. unsigned register char c1 = '\0';
  134. unsigned register char c2 = '\0';
  135. if (n >= 4)
  136. {
  137. size_t n4 = n >> 2;
  138. do
  139. {
  140. c1 = (unsigned char) *s1++;
  141. c2 = (unsigned char) *s2++;
  142. if (c1 == '\0' || c1 != c2)
  143. return c1 - c2;
  144. c1 = (unsigned char) *s1++;
  145. c2 = (unsigned char) *s2++;
  146. if (c1 == '\0' || c1 != c2)
  147. return c1 - c2;
  148. c1 = (unsigned char) *s1++;
  149. c2 = (unsigned char) *s2++;
  150. if (c1 == '\0' || c1 != c2)
  151. return c1 - c2;
  152. c1 = (unsigned char) *s1++;
  153. c2 = (unsigned char) *s2++;
  154. if (c1 == '\0' || c1 != c2)
  155. return c1 - c2;
  156. } while (--n4 > 0);
  157. n &= 3;
  158. }
  159. while (n > 0)
  160. {
  161. c1 = (unsigned char) *s1++;
  162. c2 = (unsigned char) *s2++;
  163. if (c1 == '\0' || c1 != c2)
  164. return c1 - c2;
  165. n--;
  166. }
  167. return c1 - c2;
  168. }
  169. #endif
  170. /********************** Function strchr ************************************/
  171. #ifdef L_strchr
  172. char *
  173. strchr(s, c)
  174. const char * s;
  175. int c;
  176. {
  177. register char ch;
  178. for(;;)
  179. {
  180. if( (ch= *s) == c ) return (char*)s;
  181. if( ch == 0 ) return 0;
  182. s++;
  183. }
  184. }
  185. #endif
  186. /********************** Function strrchr ************************************/
  187. #ifdef L_strrchr
  188. char * strrchr(s, c)
  189. const char * s;
  190. int c;
  191. {
  192. register char * prev = 0;
  193. register char * p = (char*)s;
  194. /* For null it's just like strlen */
  195. if( c == '\0' ) return p+strlen(p);
  196. /* everything else just step along the string. */
  197. while( (p=strchr(p, c)) != 0 )
  198. {
  199. prev = p; p++;
  200. }
  201. return prev;
  202. }
  203. #endif
  204. /********************** Function strdup ************************************/
  205. #ifdef L_strdup
  206. char * strdup(s)
  207. const char * s;
  208. {
  209. register size_t len;
  210. register char * p;
  211. len = strlen(s)+1;
  212. p = (char *) malloc(len);
  213. if(p) memcpy(p, s, len); /* Faster than strcpy */
  214. return p;
  215. }
  216. #endif
  217. /********************** Function memcpy ************************************/
  218. #ifdef L_memcpy
  219. void *
  220. memcpy(d, s, l)
  221. void *d;
  222. const void *s;
  223. size_t l;
  224. {
  225. register char *s1=d, *s2=(char *)s;
  226. for( ; l>0; l--) *((unsigned char*)s1++) = *((unsigned char*)s2++);
  227. return d;
  228. }
  229. #endif
  230. /********************** Function memccpy ************************************/
  231. #ifdef L_memccpy
  232. void * memccpy(d, s, c, l) /* Do we need a fast one ? */
  233. void *d;
  234. const void *s;
  235. int c;
  236. size_t l;
  237. {
  238. register char *s1=d, *s2=(char*)s;
  239. while(l-- > 0)
  240. if((*s1++ = *s2++) == c )
  241. return s1;
  242. return 0;
  243. }
  244. #endif
  245. /********************** Function memset ************************************/
  246. #ifdef L_memset
  247. void * memset(str, c, l)
  248. void * str;
  249. int c;
  250. size_t l;
  251. {
  252. register char *s1=str;
  253. while(l-->0) *s1++ = c;
  254. return str;
  255. }
  256. #endif
  257. /********************** Function memmove ************************************/
  258. #ifdef L_memmove
  259. void *
  260. memmove(d, s, l)
  261. void *d;
  262. const void *s;
  263. size_t l;
  264. {
  265. register char *s1=d, *s2=(char*)s;
  266. /* This bit of sneakyness c/o Glibc, it assumes the test is unsigned */
  267. if( s1-s2 >= l ) return memcpy(d,s,l);
  268. /* This reverse copy only used if we absolutly have to */
  269. s1+=l; s2+=l;
  270. while(l-- >0)
  271. *(--s1) = *(--s2);
  272. return d;
  273. }
  274. #endif
  275. /********************** THE END ********************************************/