3 #include "eBatRuntime.h"
6 bat_debug(
"[Find GoTo] Size: %d\n", bat->Size_GT);
7 for (
int i = 0; i < bat->Size_GT; i++){
9 bat_debug(
" |--- '%s' == '%s'\n", gt->Identifier, key);
10 if (
strcmp(gt->Identifier, key) == 0){
11 bat_debug(
" |--- TRUE\n");
15 bat_debug(
" |--- NULL RETURN\n");
20 if (bat->Echo == 1 && group->Size > 0){
21 printf(
"%s ", EBAT_CONFIG_HELLO_LINE);
22 for (
int i = 0; i < group->Size; i++){
24 if (Line->type == BAT_TOKEN_TYPE_VARIABLE) {
25 printf(
"%c%s%c ",
'%', Line->value,
'%');
26 }
else if (Line->type == BAT_TOKEN_TYPE_STRING) {
27 printf(
"\"%s\" ", Line->value);
29 printf(
"%s ", Line->value);
37 for (
int y = 0; y < group->Size; y++){
39 bat_debug(
" |--- [%d | %d] Tok: [%d] %s | Val: %s \n", y+1, group->Size, xtok->type, bat_debug_type(xtok->type), xtok->value);
46 if (Data1->type != BAT_TOKEN_TYPE_VARIABLE){
47 bat_fatalerror(Line,
"The first value must be a variable.");
50 if (Data2->type != BAT_TOKEN_TYPE_STRING){
51 bat_fatalerror(Line,
"The second value must be a string.");
54 eBatCheckModule(Line, EBAT_CONFIG_SYSTEM_SET,
"System.Set");
55 eBatCheckVariable(Line, Data1->value, D1);
57 qemu_ok(
"D1: '%s' && D3 '%s'", D1, Data2->value);
60 if (Eq->type == BAT_TOKEN_TYPE_EQUAL){
61 ret = (
strcmp(D1, Data2->value) == 0?1:0);
63 ret = (
strcmp(D1, Data2->value) != 0?1:0);
72 if (Data1->type != Data2->type || (Data1->type != BAT_TOKEN_TYPE_VARIABLE && Data1->type != BAT_TOKEN_TYPE_NUMBER)) {
73 bat_fatalerror(Line,
"You cannot compare different types of data. Only NUMBERS and VARIABLES are allowed to be compared.");
76 if (Data1->type == BAT_TOKEN_TYPE_VARIABLE) {
77 eBatCheckModule(Line, EBAT_CONFIG_SYSTEM_SET,
"System.Set");
78 eBatCheckVariable(Line, Data1->value, D1);
79 eBatCheckVariable(Line, Data2->value, D2);
80 if (D1 == NULL || D2 == NULL){
81 if (D1 != NULL) free((
void*) D1);
82 if (D2 != NULL) free((
void*) D2);
86 int ret = (
strcmp(D1, D2) == 0?1:0);
91 }
else if (Data1->type == BAT_TOKEN_TYPE_NUMBER){
92 int a = bat_strtol(Data1->value);
93 int b = bat_strtol(Data2->value);
95 case BAT_TOKEN_TYPE_EQUAL:{
98 case BAT_TOKEN_TYPE_NOT_EQUAL:{
101 case BAT_TOKEN_TYPE_GREATER:{
104 case BAT_TOKEN_TYPE_LESS:{
107 case BAT_TOKEN_TYPE_LESS_EQUAL:{
110 case BAT_TOKEN_TYPE_GREATER_EQUAL:{
121 if (group->Size <= 0) {
122 bat_debug(
"Group Size is 0\n");
129 bat_debug(
"[%d] MainTok == %s\n", offset, bat_debug_type(MainTok->type));
131 if (MainTok->type == BAT_TOKEN_TYPE_PAUSE){
132 bat_runtime_system_pause();
134 }
else if (MainTok->type == BAT_TOKEN_TYPE_GOTO){
135 EBAT_INVALIDARGC(line, group->Size - offset, 2);
137 qemu_warn(
"Start goto '%s'\n", Data1->value);
139 if (Data1->type == BAT_TOKEN_TYPE_VARIABLE){
140 eBatCheckVariable(line, Data1->value, D1);
141 gt = bat_runtime_find_goto(bat, D1);
144 gt = bat_runtime_find_goto(bat, Data1->value);
146 eBatCheckGoTo(line, gt);
149 for (
int x = 0; x < gt->Size; x++){
152 bat_runtime_echo(bat, group);
154 ret = bat_runtime_eval(bat, group, line, 0);
155 bat_debug(
"sysline: %d | line: %d | ret: %d\n",gt->Line, line, ret);
156 if (EBAT_CONFIG_CRITICAL_STOP == 1 && ret > 0) {
157 bat_debug(
"CRITICAL OUT\n");
158 bat->ErrorCode = ret;
163 bat_runtime_eval(bat, (
BAT_GROUP_T*) gt->Groups, line, 0);
167 if (MainTok->type == BAT_TOKEN_TYPE_EXIT) {
168 EBAT_INVALIDARGC(line, group->Size - offset, 2);
170 return (-1 * bat_strtol(Data1->value));
173 if (MainTok->type == BAT_TOKEN_TYPE_SET) {
174 eBatCheckModule(line, EBAT_CONFIG_SYSTEM_SET,
"System.Set");
175 EBAT_INVALIDARGC(line, group->Size - offset, 4);
179 eBatCheckMixingData(line, EQ->type, BAT_TOKEN_TYPE_SET);
180 if (SET->type == BAT_TOKEN_TYPE_NOT){
181 bat_runtime_system_set(VAR->value, NULL);
183 eBatCheckMixingData(line, SET->type, BAT_TOKEN_TYPE_STRING);
184 bat_runtime_system_set(VAR->value, SET->value);
187 if (MainTok->type == BAT_TOKEN_TYPE_ECHO) {
188 EBAT_INVALIDMINARGC(line, group->Size - offset, 2);
191 if (TextTok->type == BAT_TOKEN_TYPE_DEBUG){
192 bat->Debug = !(bat->Debug);
194 }
else if (TextTok->type == BAT_TOKEN_TYPE_TRUE){
197 }
else if (TextTok->type == BAT_TOKEN_TYPE_FALSE){
202 for (
int ec = 1; ec < group->Size - offset; ec++){
203 int isStart = (ec == 1?1:0);
204 int isEnd = (group->Size - offset - 1 == ec?1:0);
207 if (Echo->type == BAT_TOKEN_TYPE_VARIABLE){
208 eBatCheckModule(line, EBAT_CONFIG_SYSTEM_SET,
"System.Set");
209 eBatCheckVariable(line, Echo->value, Text);
210 bat_runtime_system_echo(Text, isStart, isEnd);
213 bat_runtime_system_echo(Echo->value, isStart, isEnd);
219 if (MainTok->type == BAT_TOKEN_TYPE_IF) {
221 EBAT_INVALIDMINARGC(line, group->Size - offset, 3);
226 if (DataNOT->type == BAT_TOKEN_TYPE_NOT){
235 if (Data1->type == BAT_TOKEN_TYPE_EXIST) {
236 qemu_note(
"D1 == BAT_TOKEN_TYPE_EXIST");
237 eBatCheckModule(line, EBAT_CONFIG_FILEIO_EXIST,
"FileIO.Exits");
238 if (Data2->type == BAT_TOKEN_TYPE_STRING){
239 int breq = bat_runtime_fileio_exist(Data2->value);
240 bat_debug(
"IF EXIST STRING: %d | %d\n", breq, (breq == 1 && isNOT == 0) ||
241 (breq != 1 && isNOT == 1));
242 if ((breq == 1 && isNOT == 0) ||
243 (breq != 1 && isNOT == 1)){
244 bat_debug(
"Start eval %d\n", offset + isNOT + 3);
245 bat_runtime_eval(bat, group, line, offset + isNOT + 3);
248 eBatCheckMixingData(line, Data2->type, BAT_TOKEN_TYPE_VARIABLE);
249 eBatCheckModule(line, EBAT_CONFIG_SYSTEM_SET,
"System.Set");
250 eBatCheckVariable(line, Data2->value, Path);
252 int breq = bat_runtime_fileio_exist(Path);
253 bat_debug(
"IF EXIST VARIABLE: %d\n", breq);
254 if ((breq == 1 && isNOT == 0) ||
255 (breq != 1 && isNOT == 1)){
256 bat_runtime_eval(bat, group, line, offset + isNOT + 3);
262 }
else if (Data1->type == BAT_TOKEN_TYPE_NUMBER) {
263 qemu_note(
"D1 == BAT_TOKEN_TYPE_NUMBER");
264 EBAT_INVALIDMINARGC(line, group->Size - offset, offset + 4);
266 int breq = bat_runtime_equal(line, Data1, Data2, Data3);
267 if ((breq == 1 && isNOT == 0) ||
268 (breq != 1 && isNOT == 1)){
269 bat_runtime_eval(bat, group, line, offset + isNOT + 3);
271 bat_debug(
"breq: %d | xret\n", breq);
273 }
else if (Data1->type == BAT_TOKEN_TYPE_VARIABLE && Data3->type == BAT_TOKEN_TYPE_VARIABLE) {
274 EBAT_INVALIDMINARGC(line, group->Size - offset, offset + 4);
276 int breq = bat_runtime_equal(line, Data1, Data2, Data3);
277 if ((breq == 1 && isNOT == 0) ||
278 (breq != 1 && isNOT == 1)){
279 bat_runtime_eval(bat, group, line, offset + isNOT + 3);
281 }
else if (Data1->type == BAT_TOKEN_TYPE_VARIABLE && Data3->type == BAT_TOKEN_TYPE_STRING) {
282 qemu_ok(
"D1 == VAR && D3 == STR");
283 EBAT_INVALIDMINARGC(line, group->Size - offset, offset + 4);
285 int breq = bat_runtime_equal_var_and_string(line, Data1, Data2, Data3);
286 if ((breq == 1 && isNOT == 0) ||
287 (breq != 1 && isNOT == 1)) {
288 qemu_ok(
"[PASS] Line: %d | Off: %d", line, offset + isNOT + 4);
289 bat_runtime_eval(bat, group, line, offset + isNOT + 4);
293 if (MainTok->type == BAT_TOKEN_TYPE_RUN || MainTok->type == BAT_TOKEN_TYPE_STRING) {
294 int argc = group->Size - offset;
295 char **argv = malloc((argc + 1) *
sizeof(
char*));
300 for (
int i = 0; i < argc; i++){
302 if (DataX->type == BAT_TOKEN_TYPE_VARIABLE){
303 eBatCheckModule(line, EBAT_CONFIG_SYSTEM_SET,
"System.Set");
304 eBatCheckVariable(line, DataX->value, Text);
305 size_t slen =
strlen(Text);
306 argv[i] = malloc((slen + 1) *
sizeof(
char));
307 if (argv[i] == NULL) {
310 memset(argv[i], 0, slen + 1);
311 memcpy(argv[i], Text, slen);
314 size_t slen =
strlen(DataX->value);
315 argv[i] = malloc((slen + 1) *
sizeof(
char));
316 if (argv[i] == NULL) {
319 memset(argv[i], 0, slen + 1);
320 memcpy(argv[i], DataX->value, slen);
322 printf(
"[%d] val: '%s'\n", i, DataX->value);
324 int ret = bar_runtime_system_exec(argc, argv);
331 int bat_runtime_exec(
BAT_T* bat){
332 bat_debug(
"========================\n");
333 bat_debug(
"Runtime EXEC\n");
334 bat_debug(
"========================\n");
336 for (
int x = 0; x < bat->Size; x++){
339 bat_runtime_echo(bat, group);
341 ret = bat_runtime_eval(bat, group, x + 1, 0);
342 bat_debug(
"line: %d | ret: %d\n", x +1, ret);
343 if (EBAT_CONFIG_CRITICAL_STOP == 1 && ret > 0) {
344 bat_debug(
"CRITICAL OUT\n");
350 bat->ErrorCode = ret;
351 bat_debug(
"========================\n");
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.