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 }
size_t filesize(const char *Path)
[FileIO] Возвращает размер указанного файла
Definition: fileio.c:67
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
void drawRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color)
Рисуем залитый прямоугольник
Definition: pixel.c:25
void fclose(FILE *stream)
Закончить работу с файлом
Definition: stdio.c:213
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
Definition: stdio.c:166
int fsize(FILE *stream)
Получение размера файла в байтах
Definition: stdio.c:227
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Definition: stdio.c:250
Структура файла. Требуется для работы с VFS.
Definition: stdio.h:21
Definition: elk.h:48
size_t getTicks()
Получить количество тиков
Definition: timer.c:26