3 #include "eBatRuntime.h"
6 BAT_T* bat_create_session(){
7 BAT_T* bat = calloc(1,
sizeof *bat);
11 bat->Group = calloc(1,
sizeof(
size_t));
16 bat->GoTo = calloc(1,
sizeof(
size_t));
34 group->Tokens = calloc(1,
sizeof(
size_t));
46 BAT_GoTo_T* goto_create(
const char* identifier) {
47 BAT_GoTo_T* goto_store = calloc(1,
sizeof *goto_store);
51 goto_store->Identifier = bat_strdup(identifier);
52 if (!goto_store->Identifier) {
56 goto_store->Groups = calloc(1,
sizeof(
BAT_GROUP_T*));
57 if (!goto_store->Groups) {
58 free(goto_store->Identifier);
63 goto_store->Capacity = 1;
69 if (goto_store->Size >= goto_store->Capacity) {
70 size_t new_cap = goto_store->Capacity + ((goto_store->Capacity + 1) / 2);
71 void* new_buf = realloc(goto_store->Groups,
sizeof(
BAT_GROUP_T*) * new_cap);
77 goto_store->Capacity = new_cap;
79 goto_store->Groups[goto_store->Size++] = group;
82 void bat_add_group(
BAT_T * bat,
size_t element) {
83 if(bat->Size >= bat->Capacity) {
84 size_t new_cap = bat->Capacity + ((bat->Capacity + 1) / 2);
85 void* new_buf = realloc(bat->Group,
sizeof(
size_t) * new_cap);
91 bat->Capacity = new_cap;
93 bat->Group[bat->Size++] = element;
96 void bat_add_goto(
BAT_T* bat,
size_t element){
97 if(bat->Size_GT >= bat->Capacity_GT) {
98 size_t new_cap = bat->Capacity_GT + ((bat->Capacity_GT + 1) / 2);
99 void* new_buf = realloc(bat->GoTo,
sizeof(
size_t) * new_cap);
105 bat->Capacity_GT = new_cap;
107 bat->GoTo[bat->Size_GT++] = element;
110 void bat_add_token(
BAT_GROUP_T* bat,
size_t element) {
111 if(bat->Size >= bat->Capacity) {
112 size_t new_cap = bat->Capacity + ((bat->Capacity + 1) / 2);
113 void* new_buf = realloc(bat->Tokens,
sizeof(
size_t) * new_cap);
118 bat->Tokens = new_buf;
119 bat->Capacity = new_cap;
121 bat->Tokens[bat->Size++] = element;
123 BAT_TOKEN_T* bat_create_token(BAT_TOKEN_TYPE type,
char* value) {
133 token->value = malloc(len + 1);
134 memset(token->value, 0, len + 1);
135 memcpy(token->value, value, len);
140 char* bat_debug_type(BAT_TOKEN_TYPE Type){
142 case BAT_TOKEN_TYPE_GOTO:
return "GOTO";
143 case BAT_TOKEN_TYPE_ECHO:
return "ECHO";
144 case BAT_TOKEN_TYPE_IF:
return "IF";
145 case BAT_TOKEN_TYPE_SET:
return "SET";
146 case BAT_TOKEN_TYPE_TRUE:
return "TRUE";
147 case BAT_TOKEN_TYPE_FALSE:
return "FALSE";
148 case BAT_TOKEN_TYPE_NOT:
return "NOT";
149 case BAT_TOKEN_TYPE_EXIST:
return "EXIST";
150 case BAT_TOKEN_TYPE_ISSET:
return "ISSET";
151 case BAT_TOKEN_TYPE_STRING:
return "STRING";
152 case BAT_TOKEN_TYPE_NUMBER:
return "NUMBER";
153 case BAT_TOKEN_TYPE_OPERATOR:
return "OPERATOR";
154 case BAT_TOKEN_TYPE_EQUAL:
return "EQUAL";
155 case BAT_TOKEN_TYPE_NOT_EQUAL:
return "NOT_EQUAL";
156 case BAT_TOKEN_TYPE_GREATER:
return "GREATER";
157 case BAT_TOKEN_TYPE_LESS:
return "LESS";
158 case BAT_TOKEN_TYPE_LESS_EQUAL:
return "LESS_EQUAL";
159 case BAT_TOKEN_TYPE_GREATER_EQUAL:
return "GREATER_EQUAL";
160 case BAT_TOKEN_TYPE_EXIT:
return "EXIT";
161 case BAT_TOKEN_TYPE_VARIABLE:
return "VARIABLE";
162 case BAT_TOKEN_TYPE_ALIAS:
return "ALIAS";
163 case BAT_TOKEN_TYPE_START:
return "START";
164 case BAT_TOKEN_TYPE_FOR:
return "FOR";
165 case BAT_TOKEN_TYPE_WHILE:
return "WHILE";
166 case BAT_TOKEN_TYPE_DO:
return "DO";
167 case BAT_TOKEN_TYPE_IN:
return "IN";
168 case BAT_TOKEN_TYPE_STEP:
return "STEP";
169 case BAT_TOKEN_TYPE_BREAK:
return "BREAK";
170 case BAT_TOKEN_TYPE_DEBUG:
return "DEBUG";
171 case BAT_TOKEN_TYPE_COMMENT:
return "COMMENT";
172 case BAT_TOKEN_TYPE_CONTINUE:
return "CONTINUE";
173 default:
return "UNKNOWN";
177 BAT_TOKEN_TYPE bat_parse_token(
char* str) {
179 str = bat_toLower(str);
182 if (
strcmp(str,
"echo") == 0)
return BAT_TOKEN_TYPE_ECHO;
183 if (
strcmp(str,
"if") == 0)
return BAT_TOKEN_TYPE_IF;
184 if (
strcmp(str,
"set") == 0)
return BAT_TOKEN_TYPE_SET;
185 if (
strcmp(str,
"=") == 0)
return BAT_TOKEN_TYPE_SET;
186 if (
strcmp(str,
"goto") == 0)
return BAT_TOKEN_TYPE_GOTO;
187 if (
strcmp(str,
"isset") == 0)
return BAT_TOKEN_TYPE_ISSET;
188 if (
strcmp(str,
"debug") == 0)
return BAT_TOKEN_TYPE_DEBUG;
189 if (
strcmp(str,
"null") == 0)
return BAT_TOKEN_TYPE_NOT;
191 if (
strcmp(str,
"rem") == 0)
return BAT_TOKEN_TYPE_COMMENT;
192 if (
strcmp(str,
"::") == 0)
return BAT_TOKEN_TYPE_COMMENT;
194 if (
strcmp(str,
"on") == 0 ||
strcmp(str,
"true") == 0 ||
strcmp(str,
"enabled") == 0)
return BAT_TOKEN_TYPE_TRUE;
195 if (
strcmp(str,
"off") == 0 ||
strcmp(str,
"false") == 0 ||
strcmp(str,
"disabled") == 0)
return BAT_TOKEN_TYPE_FALSE;
198 if (
strcmp(str,
"not") == 0)
return BAT_TOKEN_TYPE_NOT;
199 if (
strcmp(str,
"exist") == 0)
return BAT_TOKEN_TYPE_EXIST;
200 if (
strcmp(str,
"exit") == 0)
return BAT_TOKEN_TYPE_EXIT;
203 if (
strcmp(str,
"start") == 0)
return BAT_TOKEN_TYPE_START;
204 if (
strcmp(str,
"alias") == 0)
return BAT_TOKEN_TYPE_ALIAS;
206 if (
strcmp(str,
"==") == 0)
return BAT_TOKEN_TYPE_EQUAL;
207 if (
strcmp(str,
"!=") == 0)
return BAT_TOKEN_TYPE_NOT_EQUAL;
208 if (
strcmp(str,
">") == 0)
return BAT_TOKEN_TYPE_GREATER;
209 if (
strcmp(str,
"<") == 0)
return BAT_TOKEN_TYPE_LESS;
210 if (
strcmp(str,
"<=") == 0)
return BAT_TOKEN_TYPE_LESS_EQUAL;
211 if (
strcmp(str,
">=") == 0)
return BAT_TOKEN_TYPE_GREATER_EQUAL;
213 if (
strcmp(str,
"equ") == 0)
return BAT_TOKEN_TYPE_EQUAL;
214 if (
strcmp(str,
"neq") == 0)
return BAT_TOKEN_TYPE_NOT_EQUAL;
215 if (
strcmp(str,
"gtr") == 0)
return BAT_TOKEN_TYPE_GREATER;
216 if (
strcmp(str,
"lss") == 0)
return BAT_TOKEN_TYPE_LESS;
217 if (
strcmp(str,
"leq") == 0)
return BAT_TOKEN_TYPE_LESS_EQUAL;
218 if (
strcmp(str,
"geq") == 0)
return BAT_TOKEN_TYPE_GREATER_EQUAL;
220 if (
strcmp(str,
"pause") == 0)
return BAT_TOKEN_TYPE_PAUSE;
222 if (
strcmp(str,
"for") == 0)
return BAT_TOKEN_TYPE_FOR;
223 if (
strcmp(str,
"while") == 0)
return BAT_TOKEN_TYPE_WHILE;
224 if (
strcmp(str,
"do") == 0)
return BAT_TOKEN_TYPE_DO;
225 if (
strcmp(str,
"in") == 0)
return BAT_TOKEN_TYPE_IN;
226 if (
strcmp(str,
"step") == 0)
return BAT_TOKEN_TYPE_STEP;
227 if (
strcmp(str,
"break") == 0)
return BAT_TOKEN_TYPE_BREAK;
228 if (
strcmp(str,
"continue") == 0)
return BAT_TOKEN_TYPE_CONTINUE;
229 if (
strcmp(str,
"run") == 0)
return BAT_TOKEN_TYPE_RUN;
231 if (isdigit(str[0])) {
232 return BAT_TOKEN_TYPE_NUMBER;
234 return BAT_TOKEN_TYPE_UNKNOWN;
241 char** exp = explode(Line, 0x20);
247 char* currentString = NULL;
248 for (
int u = 0; u <= c; u++){
250 bat_debug(
" |--- [%u] %s\n", u, exp[u]);
252 size_t len =
strlen(exp[u]);
253 if (exp[u][0] == 0x3a && exp[u][1] != 0x3a){
254 currentString = malloc(len *
sizeof(
char) + 1 );
255 if (currentString == NULL){
256 bat_debug(
"MALLOC ERROR\n");
259 memset(currentString, 0, len *
sizeof(
char) + 1);
260 memcpy(currentString, exp[u] + 1 , len - 1);
262 currentString[len - 1] =
'\0';
269 bat_debug(
"Create goto: %s\n", currentString);
273 bat_debug(
"ERROR CREATE GOTO\n");
277 bat_debug(
"Line: %d\n", curline);
280 bat_add_goto(bat, (
size_t) gt);
287 }
else if (exp[u][0] ==
'"' && !inString && exp[u][len - 1] ==
'"'){
288 currentString = malloc(len *
sizeof(
char) + 1 );
289 memset(currentString, 0, len *
sizeof(
char) + 1);
290 memcpy(currentString, exp[u] + 1 , len - 2);
292 currentString[len - 1] =
'\0';
294 BAT_TOKEN_T* xtok = bat_create_token(BAT_TOKEN_TYPE_STRING, currentString);
295 bat_debug(
"create token string method 1: '%s'\n", currentString);
296 bat_add_token(group, (
size_t) xtok);
298 }
else if (exp[u][0] ==
'"' && !inString) {
300 currentString = malloc(len *
sizeof(
char));
301 memset(currentString, 0, len *
sizeof(
char));
302 strcpy(currentString, exp[u] + 1);
303 }
else if (inString) {
304 if (exp[u][len - 1] ==
'"') {
305 currentString = realloc(currentString, (
strlen(currentString) + len + 2) *
sizeof(
char));
306 strcat(currentString,
" ");
307 strcat(currentString, exp[u]);
308 currentString[
strlen(currentString) - 1] =
'\0';
310 BAT_TOKEN_T* xtok = bat_create_token(BAT_TOKEN_TYPE_STRING, currentString);
312 bat_debug(
"create token string method 2: '%s'\n", currentString);
313 bat_add_token(group, (
size_t) xtok);
316 currentString = realloc(currentString, (
strlen(currentString) + len + 2) *
sizeof(
char));
317 strcat(currentString,
" ");
318 strcat(currentString, exp[u]);
321 bat_str_debug(exp[u]);
323 if (exp[u][0] ==
'%' && exp[u][len - 1] ==
'%'){
324 char* temp = malloc(len);
326 memcpy(temp, exp[u] + 1, len - 2);
327 bat_debug(
"create token variable method 1: '%s'\n", temp);
328 BAT_TOKEN_T* xtok = bat_create_token(BAT_TOKEN_TYPE_VARIABLE, temp);
329 bat_add_token(group, (
size_t) xtok);
331 BAT_TOKEN_TYPE type = bat_parse_token(exp[u]);
332 bat_debug(
"[AUTO_DETECT TYPE] Type: %s | Str: '%s'\n", bat_debug_type(type), exp[u]);
333 if (type == BAT_TOKEN_TYPE_COMMENT){
336 BAT_TOKEN_T* xtok = bat_create_token(type, exp[u]);
337 bat_add_token(group, (
size_t) xtok);
346 currentString = realloc(currentString, (
strlen(currentString) + 1) *
sizeof(
char));
347 currentString[
strlen(currentString) - 2] =
'\0';
350 bat_debug(
"create token string method 3: '%s'\n", currentString);
351 BAT_TOKEN_T* xtok = bat_create_token(BAT_TOKEN_TYPE_STRING, currentString);
352 bat_add_token(group, (
size_t) xtok);
356 for (
int u = 0; u <= c; u++){
363 BAT_T* bat_parse_string(
char* String){
364 BAT_T* bat = bat_create_session();
365 bat_debug(
"\n========================\n");
366 bat_debug(
"%s", String);
367 bat_debug(
"\n========================\n");
370 char** Line = explode(String,
'\n');
371 for (
int uL = 0; uL <= cLine; uL++){
372 if (Line[uL] == NULL){
375 int len =
strlen(Line[uL]);
376 bat_debug(
"[LINE %d | %d] [len: %d] %s\n", uL +1, cLine +1, len, Line[uL]);
377 bat_debug(
"[0x%x] '%c'\n", Line[uL][0], Line[uL][0]);
378 if (len == 0 || (len == 1 && Line[uL][0] == 0xd)){
379 bat_debug(
"!RESET TO CurGoTo!\n");
383 BAT_GROUP_T* group = bat_parse_line(bat, Line[uL]);
385 bat_debug(
"!group is NULL! SKIP\n");
386 }
else if (bat->CurGoTo != NULL){
387 bat_debug(
"GOTO group (%s) ins\n", bat->CurGoTo->Identifier);
388 goto_add_group(bat->CurGoTo, group);
390 bat_debug(
"Classic group ins\n");
391 bat_add_group(bat, (
size_t) group);
399 void bat_destroy_token(
BAT_TOKEN_T** token,
int Size){
400 qemu_log(
"[BAT] [Destroy] [Tokens] Size: %d");
401 for (
int x = 0; x < Size; x++){
403 qemu_log(
" |--- [%d | %d] TYPE: %s | Value: '%s'",x + 1, Size, bat_debug_type(tok->type), tok->value);
412 void bat_destroy_group(
BAT_GROUP_T** group,
int Size){
413 qemu_log(
"[BAT] [Destroy] [Group] Size: %d", Size);
414 for (
int x = 0; x < Size; x++){
416 qemu_log(
" |--- [%d | %d]",x + 1, Size);
423 void bat_destroy(
BAT_T* bat){
424 qemu_log(
"[BAT] [Destroy]");
425 qemu_log(
" |--- Goto (%d)", bat->Size_GT);
426 for (
int a = 0; a < bat->Size_GT; a++){
428 qemu_log(
" |--- ID: %s", gt->Identifier);
429 if (gt->Identifier != NULL){
430 free(gt->Identifier);
432 bat_destroy_group(gt->Groups, gt->Size);
436 bat_destroy_group((
BAT_GROUP_T**) bat->Group, bat->Size);
uint32_t str_cdsp2(const char *a_str, char del)
Функция отладки
size_t strlen(const char *str)
Возращает длину строки
int strcmp(const char *s1, const char *s2)
Сравнение строк
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
int strcpy(char *dest, const char *src)
Копирование строк
char * strcat(char *destination, const char *source)
Объединение строк