SayoriOS 0.3.3

elk_engine.c
1 #include "portability.h"
3 #include <io/ports.h>
4 #include "elk.h"
5 #include "io/tty.h"
6 #include "lib/stdio.h"
7
8
9 jsval_t jse_fnc_system_ticks(struct js *js, jsval_t *args, int nargs) {
10 return js_mknum(getTicks());
11 }
12
13 jsval_t js_drawRect(struct js *js, jsval_t *args, int nargs) {
14 if (nargs != 5) return js_mkundef();
15 int x = jse_getInt(js,args[0]); // Fetch 1st arg
16 int y = jse_getInt(js,args[1]); // Fetch 2nd arg
17 int w = jse_getInt(js,args[2]); // Fetch 3nd arg
18 int h = jse_getInt(js,args[3]); // Fetch 4nd arg
19 int color = jse_getInt(js,args[4]); // Fetch 5nd arg
20 //qemu_warn("x:%d | y:%d | w:%d | h:%d | color: %x",x,y,w,h,color);
21 drawRect(x,y,w,h,color);
22 return js_mktrue();
23 }
24
25 static jsval_t js_console_debug(struct js *js, jsval_t *args, int nargs) {
26 for (int i = 0; i < nargs; i++){
27 int type = js_type(args[i]);
28
29 printf("[Index: %d] [Type:%d] %s\n", i, type, js_str(js,args[i]));
30 }
31 return js_mkundef();
32 }
33
34 static jsval_t js_console_log(struct js *js, jsval_t *args, int nargs) {
35 for (int i = 0; i < nargs; i++){
36 qemu_log("%s", js_str(js,args[i]));
37 }
38 return js_mkundef();
39 }
40
41 static jsval_t js_console_note(struct js *js, jsval_t *args, int nargs) {
42 for (int i = 0; i < nargs; i++){
43 qemu_note("%s", js_str(js, args[i]));
44 }
45 return js_mkundef();
46 }
47
48 static jsval_t js_console_warn(struct js *js, jsval_t *args, int nargs) {
49 for (int i = 0; i < nargs; i++){
50 qemu_warn("%s", js_str(js,args[i]));
51 }
52 return js_mkundef();
53 }
54
55 static jsval_t js_console_err(struct js *js, jsval_t *args, int nargs) {
56 for (int i = 0; i < nargs; i++){
57 qemu_err("%s", js_str(js,args[i]));
58 }
59 return js_mkundef();
60 }
61
62 static jsval_t js_print(struct js *js, jsval_t *args, int nargs) {
63 for (int i = 0; i < nargs; i++){
64 tty_printf("%s", js_str(js,args[i]));
65 }
66 return js_mkundef();
67 }
68
69 static jsval_t js_alert(struct js *js, jsval_t *args, int nargs) {
70 for (int i = 0; i < nargs; i++){
71 const char* af = js_str(js,args[i]);
72 printf("%s", af);
73 }
74 printf("\n");
75 return js_mkundef();
76 }
77
78 static jsval_t js_nop(struct js *js, jsval_t *args, int nargs) {
79 return js_mkundef();
80 }
81
82 void elk_destroy(struct js* js){
83 jse_array_destroy(js);
84 jse_event_destroy(js);
85 jse_canvas_destroy(js);
86 }
87
88 void elk_setup(struct js* js){
90 js_set(js, js_glob(js), "console_debug", js_mkfun(js_console_debug));
91 js_set(js, js_glob(js), "console_log", js_mkfun(js_console_log));
92 js_set(js, js_glob(js), "console_warn", js_mkfun(js_console_warn));
93 js_set(js, js_glob(js), "console_err", js_mkfun(js_console_err));
94 js_set(js, js_glob(js), "console_note", js_mkfun(js_console_note));
95 js_set(js, js_glob(js), "nop", js_mkfun(js_nop));
96
98 js_set(js, js_glob(js), "system_ticks", js_mkfun(jse_fnc_system_ticks));
99
101 jse_canvas_config(js);
102
104 jse_event_config(js);
105
107 jse_array_config(js);
108
110 js_set(js, js_glob(js), "rect", js_mkfun(js_drawRect));
111 js_set(js, js_glob(js), "print", js_mkfun(js_print));
112 js_set(js, js_glob(js), "alert", js_mkfun(js_alert));
113 }
114
115 int elk_eval(const char* buf){
116 size_t stack = 32768 + sizeof(struct js);
117
118 char* js_mem = kcalloc(stack, 1);
119 // char js_mem[32768] = {0};
120 struct js *js = js_create(js_mem, (stack));
121 if (js == NULL){
122 qemu_err("\n[JSE] Runtime Fatal Error!\n\r Message: %s\n","No free RAM");
123 return 0;
124 }
125
126 elk_setup(js);
127
128 jsval_t result = js_eval(js, buf, strlen(buf));
129
130 elk_destroy(js);
131
132 if (js->isFatal){
133 printf("\n[JSE] Runtime Fatal Error!\n\r Message: %s\n",js_str(js, result));
134 } else {
135 printf("[JSE] Result: %s\n",js_str(js, result));
136 }
137
138 js_statsInfo(js);
139 kfree(js_mem);
140 return (js->isFatal == 1?0:1);
141 }
142
143 int elk_file(const char* path){
144 FILE* file = fopen(path, "r");
145 if (!file){
146 qemu_err("[JSE] File no found!");
147 return 0;
148 }
149
150 size_t filesize = fsize(file);
151
152 char* buf = kcalloc(sizeof(char) * (filesize+1), 1);
153 fread(file, 1, filesize, buf);
154
155 jse_file_getBuff(buf);
156
157 fclose(file);
158 kfree(buf);
159 return 1;
160
161 }
filesize
size_t filesize(const char *Path)
[FileIO] Возвращает размер указанного файла
Definition: fileio.c:67
strlen
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
drawRect
void drawRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color)
Рисуем залитый прямоугольник
Definition: pixel.c:25
fclose
void fclose(FILE *stream)
Закончить работу с файлом
Definition: stdio.c:213
fopen
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
Definition: stdio.c:166
fsize
int fsize(FILE *stream)
Получение размера файла в байтах
Definition: stdio.c:227
fread
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Definition: stdio.c:250
FILE
Структура файла. Требуется для работы с VFS.
Definition: stdio.h:21
js
Definition: elk.h:48
getTicks
size_t getTicks()
Получить количество тиков
Definition: timer.c:26