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 }
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173
Definition: elk.h:48