PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/C++/string.cpp

http://github.com/Zaxuhe/AsciiGameOS
C++ | 401 lines | 336 code | 38 blank | 27 comment | 123 complexity | 5cdf02a2542684fbd2f115ccda74d070 MD5 | raw file
  1. // common.c -- Defines some global functions.
  2. // From JamesM's kernel development tutorials.
  3. #include "string.h"
  4. namespace String{
  5. // Copy len bytes from src to dest.
  6. char *memcpy(void *dest, const void *src, size_t len)
  7. {
  8. // TODO: implement this yourself!
  9. char *d=(char *)dest;
  10. char *s=(char *)src;
  11. for(;len>0;len--)
  12. {
  13. *d++= *s++;
  14. }
  15. return d;
  16. }
  17. // Write len copies of val into dest.
  18. char *memset(void *dest, int val, size_t len)
  19. {
  20. // TODO: implement this yourself!
  21. char *d=(char *)dest;
  22. for(;len>0;len--)
  23. {
  24. *d++=val;
  25. }
  26. return d;
  27. }
  28. //Returns a pointer to first occourance of 'c' in 's'
  29. char *memchr (const void *s, int c, size_t n)
  30. {
  31. if (n)
  32. {
  33. const char *p =(const char *) s;
  34. char cc = c;
  35. do {
  36. if (*p == cc)
  37. return (char *)p;
  38. p++;
  39. } while (--n != 0);
  40. }
  41. return 0;
  42. }
  43. //compares 2 memory blocks; returns non-zero if un-equal else zero
  44. int memcmp(const void *s1, const void *s2, size_t n)
  45. {
  46. if (n != 0)
  47. {
  48. const unsigned char *p1 =(unsigned char*)s1, *p2 =(unsigned char *)s2;
  49. do {
  50. if (*p1++ != *p2++)
  51. return (*--p1 - *--p2);
  52. } while (--n != 0);
  53. }
  54. return 0;
  55. }
  56. //concatenate strings
  57. char *strcat(char *s, const char *append)
  58. {
  59. char *save = s;
  60. for ( ; *s; ++s);
  61. while ((*s++ = *append++));
  62. return save;
  63. }
  64. //search for a char 'c' in 's'; returns pointer of first occourance; if not found then zero
  65. char *strchr(const char *s, int c)
  66. {
  67. char cc = c;
  68. while (*s)
  69. {
  70. if (*s == cc)
  71. return (char *)s;
  72. s++;
  73. }
  74. if (cc == 0)
  75. return (char *)s;
  76. return 0;
  77. }
  78. //compares 2 strings
  79. int strcmp(const char *s1, const char *s2)
  80. {
  81. while (*s1 == *s2)
  82. {
  83. if (*s1 == 0)
  84. return 0;
  85. s1++;
  86. s2++;
  87. }
  88. return *(unsigned const char *)s1 - *(unsigned const char *)(s2);
  89. }
  90. //string copy
  91. char * strcpy(char *to, const char *from)
  92. {
  93. char *save = to;
  94. for (; (*to = *from); ++from, ++to);
  95. return save;
  96. }
  97. size_t strcspn(const char *s1, const char *s2)
  98. {
  99. const char *p, *spanp;
  100. char c, sc;
  101. for (p = s1;;)
  102. {
  103. c = *p++;
  104. spanp = s2;
  105. do {
  106. if ((sc = *spanp++) == c)
  107. return p - 1 - s1;
  108. } while (sc != 0);
  109. }
  110. /* NOTREACHED */
  111. }
  112. //string length
  113. size_t strlen(const char *str)
  114. {
  115. const char *s;
  116. if (str == 0)
  117. return 0;
  118. for (s = str; *s; ++s);
  119. return s-str;
  120. }
  121. //strnlen checks UPTO MAX_LEN for '\0' if length is less then return length else MAX_LEN
  122. size_t strnlen(const char *str, size_t MAX_LEN)
  123. {
  124. size_t len;
  125. len=strlen(str);
  126. if (len+1< MAX_LEN)
  127. return len;
  128. return MAX_LEN;
  129. }
  130. //string concat
  131. char *strncat(char *dst, const char *src, size_t n)
  132. {
  133. if (n != 0)
  134. {
  135. char *d = dst;
  136. const char *s = src;
  137. while (*d != 0)
  138. d++;
  139. do {
  140. if ((*d = *s++) == 0)
  141. break;
  142. d++;
  143. } while (--n != 0);
  144. *d = 0;
  145. }
  146. return dst;
  147. }
  148. //string comp upto n chars
  149. int strncmp(const char *s1, const char *s2, size_t n)
  150. {
  151. if (n == 0)
  152. return 0;
  153. do {
  154. if (*s1 != *s2++)
  155. return *(unsigned const char *)s1 - *(unsigned const char *)--s2;
  156. if (*s1++ == 0)
  157. break;
  158. } while (--n != 0);
  159. return 0;
  160. }
  161. //string copy upto n chars
  162. char *strncpy(char *dst, const char *src, size_t n)
  163. {
  164. if (n != 0) {
  165. char *d = dst;
  166. const char *s = src;
  167. do {
  168. if ((*d++ = *s++) == 0)
  169. {
  170. while (--n != 0)
  171. *d++ = 0;
  172. break;
  173. }
  174. } while (--n != 0);
  175. }
  176. return dst;
  177. }
  178. char *strpbrk(const char *s1, const char *s2)
  179. {
  180. const char *scanp;
  181. int c, sc;
  182. while ((c = *s1++) != 0)
  183. {
  184. for (scanp = s2; (sc = *scanp++) != 0;)
  185. if (sc == c)
  186. return (char *)(s1 - 1);
  187. }
  188. return 0;
  189. }
  190. char *strrchr(const char *s, int c)
  191. {
  192. char cc = c;
  193. const char *sp=(char *)0;
  194. while (*s)
  195. {
  196. if (*s == cc)
  197. sp = s;
  198. s++;
  199. }
  200. if (cc == 0)
  201. sp = s;
  202. return (char *)sp;
  203. }
  204. size_t strspn(const char *s1, const char *s2)
  205. {
  206. const char *p = s1, *spanp;
  207. char c, sc;
  208. cont:
  209. c = *p++;
  210. for (spanp = s2; (sc = *spanp++) != 0;)
  211. if (sc == c)
  212. goto cont;
  213. return (p - 1 - s1);
  214. }
  215. char *strstr(const char *s, const char *find)
  216. {
  217. char c, sc;
  218. size_t len;
  219. if ((c = *find++) != 0)
  220. {
  221. len = strlen(find);
  222. do {
  223. do {
  224. if ((sc = *s++) == 0)
  225. return 0;
  226. } while (sc != c);
  227. } while (strncmp(s, find, len) != 0);
  228. s--;
  229. }
  230. return (char *)s;
  231. }
  232. char *strtok(char *s, const char *delim)
  233. {
  234. const char *spanp;
  235. int c, sc;
  236. char *tok;
  237. static char *last;
  238. if (s == NULL && (s = last) == NULL)
  239. return (NULL);
  240. /*
  241. * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
  242. */
  243. cont:
  244. c = *s++;
  245. for (spanp = delim; (sc = *spanp++) != 0;) {
  246. if (c == sc)
  247. goto cont;
  248. }
  249. if (c == 0) { /* no non-delimiter characters */
  250. last = NULL;
  251. return (NULL);
  252. }
  253. tok = s - 1;
  254. /*
  255. * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
  256. * Note that delim must have one NUL; we stop if we see that, too.
  257. */
  258. for (;;) {
  259. c = *s++;
  260. spanp = delim;
  261. do {
  262. if ((sc = *spanp++) == c) {
  263. if (c == 0)
  264. s = NULL;
  265. else
  266. s[-1] = 0;
  267. last = s;
  268. return (tok);
  269. }
  270. } while (sc != 0);
  271. }
  272. /* NOTREACHED */
  273. }
  274. size_t strxfrm (char *dst, char *src, size_t n)
  275. {
  276. size_t r = 0;
  277. int c;
  278. if (n != 0) {
  279. while ((c = *src++) != 0)
  280. {
  281. r++;
  282. if (--n == 0)
  283. {
  284. while (*src++ != 0)
  285. r++;
  286. break;
  287. }
  288. *dst++ = c;
  289. }
  290. *dst = 0;
  291. }
  292. return r;
  293. }
  294. char *strlwr (char *s) {
  295. char *p;
  296. p=s;
  297. while (*p) {
  298. if ((*p>='A') && (*p<='Z'))
  299. *p += 'a'-'A';
  300. p++;
  301. };
  302. return s;
  303. }
  304. char *strupr (char *s) {
  305. char *p;
  306. p=s;
  307. while (*p) {
  308. if ((*p>='a') && (*p<='z'))
  309. *p -= 'a'-'A';
  310. p++;
  311. };
  312. return s;
  313. }
  314. int atoi(const char *s)
  315. {
  316. int v = 0;
  317. int sign = 1;
  318. while (*s == ' ' || (unsigned int)(*s - 9) < 5u)
  319. s++;
  320. switch (*s)
  321. {
  322. case '-':
  323. sign=-1;
  324. case '+':
  325. s++;
  326. }
  327. while ((unsigned int) (*s - '0') < 10u)
  328. {
  329. v = v * 10 + *s - '0';
  330. s++;
  331. }
  332. return (sign == -1)? -v:v;
  333. }
  334. void itoa(char *buf, int base, long long d)
  335. {
  336. char *p = buf;
  337. char *p1, *p2;
  338. unsigned long ud = d;
  339. if (base == 10 && d < 0)
  340. {
  341. *p++ = '-';
  342. buf++;
  343. ud = -d;
  344. }
  345. do
  346. {
  347. int remainder = ud % base;
  348. *p++ = (remainder < 10)? remainder + '0':remainder + 'a' - 10;
  349. } while (ud /= base);
  350. *p = 0;
  351. // reverse the string
  352. p1 = buf;
  353. p2 = p - 1;
  354. while (p1 < p2)
  355. {
  356. char tmp = *p1;
  357. *p1 = *p2;
  358. *p2 = tmp;
  359. p1++;
  360. p2--;
  361. }
  362. }
  363. }; //end namespace string