1 #include "portability.h"
7 #include "lib/libstring/string.h"
8 #include "../libvector/include/vector.h"
12 #include "elk_config.h"
17 void jse_file_config(
const char *cfg,
const char *file){
18 size_t minStack = JSE_MIN_STACK;
19 size_t bufferSize = 0;
20 size_t stack = JSE_MIN_STACK;
21 bool jse_p_no_warn_stack =
false;
22 size_t param_size = -1;
23 char* out = kcalloc(1,
sizeof(
char) * minStack + bufferSize);
24 string_t* str = string_from_charptr(cfg);
25 vector_t* vec = string_split(str,
"\n");
27 for(
int i = 0; i < vec->size; i++) {
30 vector_t* param = string_split(str_param,
" ");
33 if (param->size < 2)
continue;
35 jse_trim(((
string_t*)(param->data[0]))->data);
36 jse_trim(((
string_t*)(param->data[1]))->data);
39 char* fn_buf = kcalloc(1,
sizeof(
char) * (
strlen(JSE_LIBS_PATH) +
strlen(((
string_t*)(param->data[1]))->data) + 1 ) );
50 qemu_err(
"[JSE] [Include] File '%s' no found!", fn_buf);
58 char* buf = kcalloc(1,
sizeof(
char) * (
filesize+1));
67 qemu_ok(
" [JSE] [Include] File '%s' is loaded!", fn_buf);
71 }
else if (param->size <= 3 &&
strcmpn(((
string_t*)(param->data[0]))->data,
"//#pragma")) {
72 jse_trim(((
string_t*)(param->data[2]))->data);
73 qemu_note(
" [JSE] [Pragma] key: '%s' value: '%s'", ((
string_t*)(param->data[1]))->data, ((
string_t*)(param->data[2]))->data);
75 int stackValue = jse_func_atoi(((
string_t*)(param->data[2]))->data);
76 if (stackValue < stack){
77 if (!jse_p_no_warn_stack) qemu_warn(
" [JSE] [WARN] The stack size has been reset to the minimum size by the installed JSE.");
79 }
else if (stackValue > (
strlen(file) + bufferSize) * 5) {
80 if (!jse_p_no_warn_stack) qemu_warn(
" [JSE] [WARN] You have set the stack value to less than the recommended value (%d), errors may appear during script execution.", (
strlen(file) + bufferSize) * 5);
84 }
else if (
strcmpn(((
string_t*)(param->data[1]))->data,
"no-warn-stack")){
85 int value = jse_func_atoi(((
string_t*)(param->data[2]))->data);
86 jse_p_no_warn_stack = (value == 1?
true:
false);
90 qemu_err(
"[JSE] Unknown argv (%s)", ((
string_t*)(param->data[0]))->data);
97 string_split_free(vec);
100 out = jse_mergeBuffers(out, file,
strlen(out),
strlen(file));
101 qemu_note(
" [JSE] Stack size: %d", stack);
102 stack +=
sizeof(
struct js) + 1;
107 char* js_mem = kcalloc(1,stack);
108 struct js *
js = js_create(js_mem, (stack));
112 js->incSize = bufferSize;
113 js->paramSize = param_size;
122 jsval_t result = js_eval(
js, out,
strlen(out));
127 qemu_err(
"\n[JSE] Runtime Fatal Error!\n\r Message: %s\n", js_str(
js, result));
129 printf(
"[JSE] Result: %s\n",js_str(
js, result));
143 void jse_file_preconfig(
const char *buffer,
const char *first_search,
const char *second_search) {
144 const char *start = buffer;
145 const char *first_occurrence = jse_strstr(start, first_search);
147 if (first_occurrence != NULL) {
148 start = first_occurrence +
strlen(first_search);
149 const char *second_occurrence = jse_strstr(start, second_search);
151 if (second_occurrence != NULL) {
152 int content_length = second_occurrence - start;
154 int fileoff = content_length +
strlen(first_search) +
strlen(second_search);
156 void*
config = calloc(
sizeof(
char) * (content_length + 1), 1);
157 void* file = calloc(
sizeof(
char) * (
strlen(buffer) - content_length), 1);
159 jse_ncpy((
char*)
config, (
char*) start, content_length);
160 jse_ncpy((
char*) file, (
char*) buffer + fileoff, (
strlen(buffer) - content_length));
162 jse_file_config((
char*)
config, (
char*) file);
168 qemu_note(
"[JSE] The JSE configuration block was not found in the file, so JSE executes in normal mode and with standard settings.");
172 void jse_file_getBuff(
char* buf){
173 const char *sc1 =
"//<#JSE#";
174 const char *sc2 =
"//#JSE#>";
176 jse_file_preconfig(buf, sc1, sc2);
uint32_t config
Корректировка
size_t filesize(const char *Path)
[FileIO] Возвращает размер указанного файла
size_t strlen(const char *str)
Возращает длину строки
bool strcmpn(const char *str1, const char *str2)
Сравнение строк
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
void fclose(FILE *stream)
Закончить работу с файлом
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
int fsize(FILE *stream)
Получение размера файла в байтах
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Структура файла. Требуется для работы с VFS.