PageRenderTime 52ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/string.cpp

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