Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
str.c
Go to the documentation of this file.
1#include <str.h>
2#include <vector.h>
3#include "type.h"
4#include "libk/simd.h"
5
6extern void __fast__memcpy__(void* dst, void* val, size_t len);
7extern void __fast__memcpy_aligned__(void* dst, void* val, size_t len);
8extern void __fast_memset__(void* dst, int val, size_t len);
9extern void __fast_memset_aligned__(void* dst, int val, size_t len);
10extern int __fast__strncmp__(const char* s1, const char* s2, size_t n);
11extern void* __fast__memchr__(const void* buf, int c, size_t len);
12
13KERNEL_API int strcmp(const char* s1, const char* s2) {
14 while (*s1 && (*s1 == *s2)) {
15 s1++;
16 s2++;
17 }
18 return *(unsigned char*) s1 - *(unsigned char*) s2;
19}
20
21KERNEL_API int strncmp(const char* s1, const char* s2, size_t n) {
22 if (!simd_has_avx2) {
23 while (n-- != 0) {
24 if (*s1 != *s2++)
25 return *(unsigned char*) s1
26 - *(unsigned char*) --s2;
27 if (*s1++ == 0)
28 break;
29 }
30 return 0;
31 }
32
33 return __fast__strncmp__(s1, s2, n);
34}
35
36KERNEL_API void* memchr(const void* buf, int c, size_t len) {
37 if (!simd_has_avx2) {
38 const unsigned char* p = (const unsigned char*)buf;
39 const unsigned char target = (unsigned char)c;
40 while (len--) {
41 if (*p == target)
42 return (void*)p;
43 p++;
44 }
45 return NULL;
46 }
47
48 return __fast__memchr__(buf, c, len);
49}
50
51KERNEL_API int memcmp(const void* s1, const void* s2, size_t n) {
52 const unsigned char* a = (const unsigned char*)s1;
53 const unsigned char* b = (const unsigned char*)s2;
54
55 for (size_t i = 0; i < n; i++) {
56 if (a[i] != b[i]) {
57 return (int)a[i] - (int)b[i];
58 }
59 }
60
61 return 0;
62}
63
64void to_lowercase(char* str) {
65 while (*str) {
66 if (*str >= 'A' && *str <= 'Z') {
67 *str += ('a' - 'A');
68 }
69 str++;
70 }
71}
72
73// warn: modifies the input string
74char* rtrim(char* str) {
75 size_t i = strlen(str) - 1;
76 while (i >= 0 && str[i] == ' ') {
77 str[i] = 0;
78 i--;
79 }
80 return str;
81}
82
83KERNEL_API void strcpy(char* dest, const char* src) {
84 while (*src) {
85 *dest++ = *src++;
86 }
87 *dest = 0;
88}
89
90KERNEL_API char* strncpy(char* dest, const char* src, size_t n) {
91 size_t i;
92 for (i = 0; i < n && src[i] != '\0'; i++)
93 dest[i] = src[i];
94 for (; i < n; i++)
95 dest[i] = '\0';
96 return dest;
97}
98
99KERNEL_API void strcat(char* dest, const char* src) {
100 while (*dest)
101 dest++;
102 strcpy(dest, src);
103}
104
105size_t strlen(const char* s) {
106 size_t len = 0;
107 while (s[len]) {
108 len++;
109 }
110 return len;
111}
112
113char* strchr(const char* s, int c) {
114 while (*s != (char) c) {
115 if (!*s++)
116 return 0;
117 }
118 return (char*) s;
119}
120
121size_t strspn(const char* s, const char* accept) {
122 const char* p = s;
123 const char* a;
124 size_t count = 0;
125 for (; *p != '\0'; ++p) {
126 for (a = accept; *a != '\0'; ++a) {
127 if (*p == *a)
128 break;
129 }
130 if (*a == '\0')
131 return count;
132 ++count;
133 }
134 return count;
135}
136
137size_t strcspn(const char* s, const char* reject) {
138 size_t count = 0;
139 while (*s) {
140 if (strchr(reject, *s++))
141 return count;
142 count++;
143 }
144 return count;
145}
146
147char* strtok_r(char* str, const char* delim, char** saveptr) {
148 char* end;
149 if (str == NULL)
150 str = *saveptr;
151 if (*str == '\0') {
152 *saveptr = str;
153 return NULL;
154 }
155 str += strspn(str, delim);
156 if (*str == '\0') {
157 *saveptr = str;
158 return NULL;
159 }
160 end = str + strcspn(str, delim);
161 if (*end == '\0') {
162 *saveptr = end;
163 return str;
164 }
165 *end = '\0';
166 *saveptr = end + 1;
167 return str;
168}
169
170KERNEL_API void memset(void* ptr, int value, size_t num) {
171 if (!simd_has_avx2) {
172 uint8_t* ptr_ = (uint8_t*) ptr;
173
174 uint64_t fill = 0;
175 for (size_t i = 0; i < 8; i++) {
176 fill <<= 8;
177 fill |= (uint64_t) value;
178 }
179
180 // Align ke 8-byte dulu
181 while (num > 0 && ((uintptr_t) ptr_ & 7)) {
182 *ptr_++ = (uint8_t) value;
183 num--;
184 }
185
186 size_t blocks = num / 8;
187 size_t tail = num % 8;
188
189 for (size_t i = 0; i < blocks; i++) {
190 memcopy(ptr_ + (i * 8), &fill, 8);
191 }
192
193 ptr_ += blocks * 8;
194
195 for (size_t i = 0; i < tail; i++)
196 ptr_[i] = (uint8_t) value;
197
198 return;
199 }
200
201 // check is ptr alignment 32
202 if (((uintptr_t) ptr % 32) == 0)
204 else
206}
207
208char* strpbrk(const char* s, const char* accept) {
209 if (!s || !accept) {
210 return NULL;
211 }
212
213 while (*s != '\0') {
214 const char* a = accept;
215
216 while (*a != '\0') {
217 if (*a == *s) {
218 return (char*) s;
219 }
220 a++;
221 }
222 s++;
223 }
224
225 return NULL;
226}
227
228char* strsep2(char** stringp, const char* delim) {
229 char* start = *stringp;
230 char* p;
231
232 if (start == NULL) {
233 return NULL;
234 }
235
236 // strpbrk mencari karakter apa pun yang ada di dalam string delim
237 p = strpbrk(start, delim);
238
239 if (p) {
240 *p = '\0';
241 *stringp = p + 1;
242 } else {
243 *stringp = NULL;
244 }
245
246 return start;
247}
248
249const char* strsep(char** str, const char delim) {
250 if (*str == 0 || **str == '\0') {
251 return 0;
252 }
253 char* start = *str;
254 char* end = start;
255
256 while (*end && *end != delim) {
257 end++;
258 }
259
260 if (*end) {
261 *end = 0;
262 *str = end + 1;
263 } else {
264 *str = 0;
265 }
266
267 return start;
268}
269
270KERNEL_API void memcopy(void* dest, void* src, size_t size) {
271 if (!simd_has_avx) {
272 uint8_t* d = (uint8_t*) dest;
273 uint8_t* s = (uint8_t*) src;
274 for (size_t i = 0; i < size; i++) {
275 d[i] = s[i];
276 }
277 return;
278 }
279
280 if ((((uintptr_t) dest & 31) == 0) && (((uintptr_t) src & 31) == 0)) {
281 __fast__memcpy_aligned__(dest, src, size);
282 return;
283 }
284 __fast__memcpy__(dest, src, size);
285}
286
287void* memmove(void* dest, const void* src, size_t n) {
288 unsigned char* d = (unsigned char*) dest;
289 const unsigned char* s = (const unsigned char*) src;
290 if (d < s) {
291 while (n--)
292 *d++ = *s++;
293 } else {
294 d += n;
295 s += n;
296 while (n--)
297 *--d = *--s;
298 }
299 return dest;
300}
301
302char* itoa(int64_t value, int base) {
303 static char str[32];
304 if (base < 2 || base > 36) {
305 *str = '\0';
306 return str;
307 }
308
309 if (value == 0) {
310 str[0] = '0';
311 str[1] = '\0';
312 return str;
313 }
314
315 int64_t tmp = 0;
316 char* last = str;
317 char* start = str;
318
319 while (value) {
320 tmp = value;
321 value /= base;
322
323 int64_t digit = tmp - value * base;
324
325 *last++ = (char) ((digit < 10) ? ('0' + digit)
326 : ('a' + (digit - 10)));
327 }
328
329 *last = '\0';
330
331 // reverse
332 last--;
333
334 while (start < last) {
335 char swap = *start;
336 *start++ = *last;
337 *last-- = swap;
338 }
339
340 return str;
341}
int count
Definition cache.h:2
elf_section_map uintptr_t base
Definition elf.h:296
a
Definition entry.h:6
static ssfn_buf_t dst
Definition graphic.c:82
size_t len
Definition oct2bin.h:7
return value
Definition oct2bin.h:22
boolean_t simd_has_avx2
Definition simd.c:9
boolean_t simd_has_avx
Definition simd.c:8
int __fast__strncmp__(const char *s1, const char *s2, size_t n)
char * strsep2(char **stringp, const char *delim)
Definition str.c:228
const char * strsep(char **str, const char delim)
Definition str.c:249
void * memmove(void *dest, const void *src, size_t n)
Definition str.c:287
char * strtok_r(char *str, const char *delim, char **saveptr)
Definition str.c:147
void to_lowercase(char *str)
Definition str.c:64
void __fast_memset__(void *dst, int val, size_t len)
void __fast__memcpy_aligned__(void *dst, void *val, size_t len)
char * strpbrk(const char *s, const char *accept)
Definition str.c:208
void * __fast__memchr__(const void *buf, int c, size_t len)
char * rtrim(char *str)
Definition str.c:74
void __fast_memset_aligned__(void *dst, int val, size_t len)
size_t strspn(const char *s, const char *accept)
Definition str.c:121
char * itoa(int64_t value, int base)
Definition str.c:302
size_t strlen(const char *s)
Definition str.c:105
void __fast__memcpy__(void *dst, void *val, size_t len)
char * strchr(const char *s, int c)
Definition str.c:113
size_t strcspn(const char *s, const char *reject)
Definition str.c:137
int strncmp(const char *s1, const char *s2, size_t n)
int strcmp(const char *s1, const char *s2)
void strcpy(char *dest, const char *src)
char * strncpy(char *dest, const char *src, size_t n)
int memcmp(const void *s1, const void *s2, size_t n)
void strcat(char *dest, const char *src)
void memset(void *ptr, int value, size_t num)
void memcopy(void *dest, void *src, size_t size)
void * memchr(const void *buf, int c, size_t len)
kstring str(const char *str)
uint32_t tail
Definition tty.h:11
#define NULL
Definition type.h:76
#define KERNEL_API
Definition type.h:93
unsigned long uintptr_t
Definition type.h:73
unsigned long uint64_t
Definition type.h:25
unsigned char uint8_t
Definition type.h:7
signed long int64_t
Definition type.h:49
size_t size
Definition vnode.h:3
uint64_t ptr
Definition xhci.hpp:0