]> git.buserror.net Git - polintos/scott/priv.git/blob - lib/c/freestanding/string.c
Move some freestanding libc functions from the kernel into
[polintos/scott/priv.git] / lib / c / freestanding / string.c
1 // string and memory functions.
2 //
3 // This software is copyright (c) 2007 Scott Wood <scott@buserror.net>.
4 // 
5 // This software is provided 'as-is', without any express or implied warranty.
6 // In no event will the authors or contributors be held liable for any damages
7 // arising from the use of this software.
8 // 
9 // Permission is hereby granted to everyone, free of charge, to use, copy,
10 // modify, prepare derivative works of, publish, distribute, perform,
11 // sublicense, and/or sell copies of the Software, provided that the above
12 // copyright notice and disclaimer of warranty be included in all copies or
13 // substantial portions of this software.
14
15 #include <stdint.h>
16 #include <string.h>
17
18 void *memcpy(void *dest, const void *src, size_t len)
19 {
20         const char *cs = static_cast<const char *>(src);
21         char *cd = static_cast<char *>(dest);
22
23         for (size_t i = 0; i < len; i++)
24                 cd[i] = cs[i];
25
26         return dest;
27 }
28
29 void *memmove(void *dest, const void *src, size_t len)
30 {
31         if (dest < src)
32                 return memcpy(dest, src, len);
33
34         const char *cs = static_cast<const char *>(src);
35         char *cd = static_cast<char *>(dest);
36
37         for (size_t i = len - 1; i >= 0; i--)
38                 cd[i] = cs[i];
39
40         return dest;
41 }
42
43 int memcmp(const void *b1, const void *b2, size_t len)
44 {
45         size_t pos;
46         const char *c1 = static_cast<const char *>(b1);
47         const char *c2 = static_cast<const char *>(b2);
48         
49         for (pos = 0; pos < len; pos++) {
50                 if (c1[pos] != c2[pos])
51                         return c1[pos] - c2[pos];
52                         
53                 pos++;
54         }
55         
56         return 0;
57 }
58
59 size_t strnlen(const char *s, size_t n)
60 {
61         size_t pos = 0;
62         while (pos < n && *s++)
63                 pos++;
64         return pos;
65 }
66
67 size_t strlen(const char *s)
68 {
69         size_t pos = 0;
70         while (*s++)
71                 pos++;
72         return pos;
73 }
74
75 char *strcpy(char *dest, const char *src)
76 {
77         char *orig = dest;
78
79         do {
80                 *dest = *src++;
81         } while (*dest++);
82
83         return orig;
84 }
85
86 char *strncpy(char *dest, const char *src, size_t len)
87 {
88         char *orig = dest;
89
90         while (len--) {
91                 *dest = *src++;
92                 
93                 if (!*dest++)
94                         break;
95         }
96         
97         memset(dest, 0, len);
98         return orig;
99 }
100
101 char *strcat(char *dest, const char *src)
102 {
103         char *orig = dest;
104         dest += strlen(dest);
105
106         do {
107                 *dest = *src++;
108         } while (*dest++);
109
110         return orig;
111 }
112
113 char *strncat(char *dest, const char *src, size_t len)
114 {
115         char *orig = dest;
116         int orig_len = strlen(dest);
117         
118         len -= orig_len;
119         dest += orig_len;
120
121         while (len--) {
122                 *dest = *src++;
123                 
124                 if (!*dest++)
125                         break;
126         }
127         
128         memset(dest, 0, len);
129         return orig;
130 }
131
132 void *memset(void *b, int ch, size_t len)
133 {
134         char *c = static_cast<char *>(b);
135         
136         while (len--)
137                 *c++ = ch;
138
139         return b;
140 }