SayoriOS 0.3.3

jse_func.c
1 #include "portability.h"
3 #include <io/ports.h>
4
5
6 #include "io/tty.h"
7 #include "lib/libstring/string.h"
8 #include "../libvector/include/vector.h"
9 #include "lib/stdio.h"
10
11
12 #include "elk_config.h"
13 #include "elk.h"
14
15 char* jse_strstr(const char* haystack, const char* needle) {
16 if (*needle == '\0') {
17 return (char*) haystack;
18 }
19
20 while (*haystack) {
21 const char* h = haystack;
22 const char* n = needle;
23
24 while (*h && *n && (*h == *n)) {
25 h++;
26 n++;
27 }
28
29 if (*n == '\0') {
30 return (char*) haystack;
31 }
32
33 haystack++;
34 }
35
36 return NULL;
37 }
38
39 void jse_ncpy(char *destination, const char *source, int length) {
40 for (int i = 0; i < length; i++) {
41 if (source[i] != '\0') {
42 destination[i] = source[i]; // Копируем символ из source в destination
43 } else {
44 destination[i] = '\0'; // Дополняем destination нулевыми символами, если source закончилась
45 }
46 }
47 }
48
49
50 void jse_trim(char *str) {
51 int start = 0, end = strlen(str) - 1;
52
53 // Удаляем пробелы в начале строки
54 while (str[start] == ' ' || str[start] == '\t' || str[start] == '\n') {
55 start++;
56 }
57
58 // Удаляем пробелы в конце строки
59 while (str[end] == ' ' || str[end] == '\t' || str[end] == '\n') {
60 end--;
61 }
62
63 // Сдвигаем символы, чтобы удалить пробелы в начале
64 for (int i = 0; i <= end - start; i++) {
65 str[i] = str[i + start];
66 }
67
68 // Устанавливаем конец строки
69 str[end - start + 1] = '\0';
70 }
71
72 // Функция для совмещения двух буферов с текстом
73 char* jse_mergeBuffers(char *buffer1, char *buffer2, int bufferSize1, int bufferSize2) {
74 //qemu_log("\n\nbuf1: [%d] '%s'\n\n", bufferSize1, buffer1);
75 //qemu_log("\n\nbuf2: [%d] '%s'\n\n", bufferSize2, buffer2);
76 int mergedSize = bufferSize1 + bufferSize2 ; // Вычисляем размер объединенного буфера
77 char *mergeResult = (char *)calloc(1, (mergedSize + 1) * sizeof(char)); // Выделяем память под новый буфер
78
79 // Копируем содержимое первого буфера в объединенный буфер
80 jse_ncpy(mergeResult, buffer1, bufferSize1);
81
82 // Копируем содержимое второго буфера в объединенный буфер
83 jse_ncpy(mergeResult + bufferSize1, buffer2, bufferSize2);
84
85 // Устанавливаем завершающий нулевой символ
86 mergeResult[mergedSize] = '\0';
87
88 // Освобождаем память, занятую первым буфером
89 free(buffer1);
90 // Освобождаем память, занятую вторым буфером
91 // Я сам освобождаю его в другом месте, поэтому тут оно не надо
92 //free(buffer2);
93
94 return mergeResult;
95 }
96
102 void jse_func_tolower(char* as){
103 while(*as != 0)
104 {
105 if(*as >= 'A' && *as <= 'Z')
106 *as += ('a' - 'A');
107 as++;
108 }
109 }
110
116 void jse_func_toupper(char* as){
117 while(*as != 0)
118 {
119 if(*as >= 'a' && *as <= 'z')
120 *as -= ('a' - 'A');
121 as++;
122 }
123 }
124
125 char jse_func_char_tolower(char ch) {
126 if (ch >= 'A' && ch <= 'Z') {
127 return ch + 32; // Разница между большой и маленькой буквой в ASCII
128 } else {
129 return ch;
130 }
131 }
132
133 int jse_func_atoi(const char* str) {
134 int result = 0;
135 int sign = 1;
136 int base = 10; // По умолчанию десятичная система
137
138 // Пропускаем начальные пробелы
139 while (*str == ' ') {
140 str++;
141 }
142
143 // Обрабатываем знак +/-
144 if (*str == '-') {
145 sign = -1;
146 str++;
147 } else if (*str == '+') {
148 str++;
149 }
150
151 // Обработка префиксов 0x (шестнадцатеричное число) и 0 (восьмеричное число)
152 if (*str == '0') {
153 str++;
154 if (*str == 'x' || *str == 'X') {
155 base = 16; // Шестнадцатеричная система
156 str++;
157 } else {
158 base = 8; // Восьмеричная система
159 }
160 }
161
162 // Обработка числовых символов
163 while (*str) {
164 int digit = *str - '0';
165 if (digit >= 0 && digit < base) {
166 result = result * base + digit;
167 } else if (base == 16) {
168 int hex = *str - 'A' + 10;
169 if (hex >= 10 && hex < 16) {
170 result = result * base + hex;
171 } else {
172 break;
173 }
174 } else {
175 break;
176 }
177 str++;
178 }
179
180 return sign * result;
181 }
182
183
185 int jse_p_int(const char* str, char** endptr){
186 int result = 0;
187 bool negative = false;
188 int exponent = 0;
189 int sign = 1;
190
191 // Пропускаем начальные пробелы
192 while (*str == ' ') {
193 str++;
194 }
195
196 // Определяем знак числа
197 if (*str == '-' || *str == '+') {
198 sign = (*str++ == '-') ? -1 : 1;
199 }
200
201 // Парсим целую часть числа
202 while (*str >= '0' && *str <= '9') {
203 result = result * 10 + (*str++ - '0');
204 }
205
206 // Парсим дробную часть числа
207 if (*str == '.') {
208 //double fraction = 1.0;
209 str++;
210 while (*str >= '0' && *str <= '9') {
211 //result = result + (double)(*str - '0') / (fraction *= 10.0);
212 str++;
213 }
214 }
215
216 result *= sign;
217
218 if (endptr != NULL) {
219 *endptr = (char*)str;
220 }
221
222 return result;
223 }
224
225 int jse_getInt(struct js *js, jsval_t arg){
226 int type = js_type(arg);
227 if (type == JS_NUM) return js_getnum(arg);
228 if (type == JS_STR) return jse_func_atoi(js_str(js,arg));
229 if (type == JS_UNDEF) return 0;
230 if (type == JS_NULL) return 0;
231 if (type == JS_FALSE) return 0;
232 if (type == JS_TRUE) return 1;
233 return js_mkundef();
234 }
235
243 char* jse_strdup(const char* str) {
244 size_t length = strlen(str) + 1; // Длина строки + 1 для символа '\0'
245 char* newStr = calloc(1,length); // Выделение памяти для новой строки
246
247 if (newStr != NULL) {
248 memcpy(newStr, str, length); // Копирование содержимого исходной строки
249 newStr[length] = 0;
250 }
251
252 return newStr;
253 }
strlen
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
memcpy
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173
js
Definition: elk.h:48