1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org)
// Distributed under the Apache Software License, Version 2.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.apache.org/licenses/LICENSE-2.0)
// Official repository: https://github.com/nekernel-org/neboot
/**
* @file neboot-string.c
* @author Amlal El Mahrouss (amlal@nekernel.org)
* @brief string library.
* @version 0.1
* @date 2024-01-16
*
* @copyright Copyright (c) 2024 Amlal El Mahrouss
*
*/
#include <include/string.h>
/// BUGS: 0
size_t strncmp(const char* src, const char* cmp, size_t size) {
if (src == nil) return 0;
int32_t counter = 0;
for (size_t index = 0; index < size; ++index) {
if (src[index] != cmp[index]) ++counter;
}
return counter;
}
void* memset(void* ptr, const char value, size_t len) {
if (ptr == nil) return nil;
char* start = ptr;
while (len) {
*start = value;
++start;
--len;
}
return (void*) start;
}
void* memmove(void* dest, const void* src, size_t len) {
memncpy(dest, src, len);
return dest;
}
size_t memcpy(void* dst, const void* src) {
if (src == nil || dst == nil) return 0;
const char* src_chr = src;
char* dst_chr = dst;
size_t index = 0;
size_t len = strlen(src);
while (index < len) {
dst_chr[index] = src_chr[index];
++index;
}
return 0;
}
/* @brief unoptimized memcpy, TODO: use isa specific memcpy. */
size_t memncpy(void* dst, const void* src, size_t len) {
#if __OL == 3 && defined(__riscv)
riscv_memncpy(dst, src, len);
#else
if (src == nil || dst == nil) return 0;
const char* src_chr = src;
char* dst_chr = dst;
size_t index = 0;
while (index < len) {
dst_chr[index] = src_chr[index];
++index;
}
return 0;
#endif
}
size_t strlen(const char* str) {
if (*str == 0) return 0;
size_t len = 0;
while (str[len] != '\0') ++len;
return len;
}
size_t strnlen(const char* str, size_t len) {
size_t cnt = 0;
while (len > cnt) {
++cnt;
if (str[cnt] == '\0') return (size_t) -1;
}
return len;
}
void strreverse(char* s) {
if (s == nil) return;
if (*s == '\0') return;
char *first, *last, temp;
first = s;
last = s + strlen(s) - 1;
while (first != last) {
temp = *first;
*(first++) = *last;
*(last--) = temp;
}
}
char* strchr(char* str, const char chr) {
while (*str != chr) {
++str;
if (*str == 0) return nil;
}
return str;
}
/// @brief Compare two strings.
/// @param src source string
/// @param cmp string to compare.
/// @return
size_t strcmp(caddr_t src, caddr_t cmp) {
if (src == null || *src == 0) return 1;
if (cmp == null || *cmp == 0) return 1;
int32_t counter = 0;
for (size_t index = 0; src[index] != 0; ++index) {
if (cmp[index] != src[index]) ++counter;
}
return counter;
}
|