Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
string.c
Go to the documentation of this file.
1#include <memory/kalloc.h>
2#include <str.h>
3#include <string.h>
4#include <type.h>
5
6KERNEL_API kstring str(const char* src) {
7 if (!src)
8 return NULL;
9
10 size_t len = strlen(src);
11
12 /* Sanity check: prevent huge allocations */
13 if (len > 4096)
14 return NULL;
15
16 kstring s = (kstring)kalloc(sizeof(*s));
17 if (!s)
18 return NULL;
19
20 char* buf = (char*)kalloc(len + 1);
21 if (!buf) {
22 kfree(s, sizeof(*s));
23 return NULL;
24 }
25
26 s->c_str = buf;
27 s->len = len;
28 s->cap = len + 1;
29
30 memcopy(buf, (void*)src, len); /* Use memcopy instead of strcpy */
31 buf[len] = '\0'; /* Manually null-terminate */
32 return s;
33}
34
36 if (!str)
37 return;
38 if (str->c_str)
39 kfree(str->c_str, str->cap);
40 kfree(str, sizeof(*str));
41}
42
44 if (!s1 || !s2)
45 return false;
46 if (s1->len != s2->len)
47 return false;
48 return strncmp(s1->c_str, s2->c_str, s1->len) == 0;
49}
50
51KERNEL_API kstring str_concat(kstring s, const char* suffix) {
52 if (!s || !suffix)
53 return NULL;
54
55 size_t suffix_len = strlen(suffix);
56 size_t new_len = s->len + suffix_len;
57
58 kstring s_new = (kstring)kalloc(sizeof(*s_new));
59 if (!s_new)
60 return NULL;
61
62 char* buf = (char*)kalloc(new_len + 1);
63 if (!buf) {
64 kfree(s_new, sizeof(*s_new));
65 return NULL;
66 }
67
68 s_new->c_str = buf;
69 s_new->len = new_len;
70 s_new->cap = new_len + 1;
71
72 strcpy(s_new->c_str, s->c_str);
73 strcpy(s_new->c_str + s->len, suffix);
74
75 return s_new;
76}
77
78KERNEL_API kstring str_concat_prefix(kstring s, const char* prefix) {
79 if (!s || !prefix)
80 return NULL;
81
82 size_t prefix_len = strlen(prefix);
83 size_t new_len = s->len + prefix_len;
84
85 kstring s_new = (kstring)kalloc(sizeof(*s_new));
86 if (!s_new)
87 return NULL;
88
89 char* buf = (char*)kalloc(new_len + 1);
90 if (!buf) {
91 kfree(s_new, sizeof(*s_new));
92 return NULL;
93 }
94
95 s_new->c_str = buf;
96 s_new->len = new_len;
97 s_new->cap = new_len + 1;
98
99 strcpy(buf, prefix);
100 strcpy(buf + prefix_len, s->c_str);
101
102 return s_new;
103}
104
106 if (!str || !str->c_str || str->len == 0)
107 return;
108
109 /* pakai int bukan size_t supaya i >= 0 bisa dievaluasi dengan benar */
110 int i = (int)str->len - 1;
111 while (i >= 0) {
112 char c = str->c_str[i];
113 if (c == ' ' || c == '\n' || c == '\t' || c == '\r') {
114 str->c_str[i] = '\0';
115 str->len--;
116 i--;
117 } else {
118 break;
119 }
120 }
121}
void kfree(void *ptr, size_t size)
void * kalloc(size_t size)
size_t len
Definition oct2bin.h:7
int strncmp(const char *s1, const char *s2, size_t n)
void strcpy(char *dest, const char *src)
size_t strlen(const char *s)
Definition str.c:105
void memcopy(void *dest, void *src, size_t size)
boolean_t stringcmp(kstring s1, kstring s2)
void str_release(kstring str)
void str_trim(kstring str)
kstring str_concat(kstring s, const char *suffix)
kstring str(const char *str)
kstring str_concat_prefix(kstring s, const char *prefix)
size_t len
Definition string.h:13
char * c_str
Definition string.h:12
size_t cap
Definition string.h:14
#define NULL
Definition type.h:76
#define KERNEL_API
Definition type.h:93
uint8_t boolean_t
Definition type.h:89