3 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
32 var_t
*var_find (char *name
)
36 for (var
= var_list
.next
; var
!= &var_list
; var
= var
->next
) {
37 if (!strcmp (var
->name
, name
))
44 int var_create (char type
, char *name
, unsigned len
, void *address
, unsigned line
)
48 /* alloc and init context */
49 var
= (var_t
*) malloc (sizeof (var_t
));
56 var
->name
= (char *) malloc (sizeof (char) * (len
+ 1));
61 memcpy (var
->name
, name
, len
);
62 var
->name
[len
] = '\0';
64 var
->address
= address
;
68 var
->next
= &var_list
;
69 var
->prev
= var_list
.prev
;
70 var
->prev
->next
= var
;
71 var
->next
->prev
= var
;
73 printf ("var_create () -> '%s' on line %d\n", var
->name
, line
);
78 int source_nextline (char *source
, unsigned size
)
82 for (i
= 0; i
< size
; i
++) {
83 //printf ("znak: %c : %d\n", source[i], source[i]);
84 if (source
[i
] == '\n') {
85 //printf ("source_nextline: %d\n", i);
93 char *source_param (char *source
, unsigned *size
)
96 char *param
= (char *) 0;
99 for (i
= 0; i
< len
; i
++) {
101 if (source
[i
] == ' ' || source
[i
] == '\t') {
106 if ((source
[i
] >= 'a' && source
[i
] <= 'z') ||
107 (source
[i
] >= 'A' && source
[i
] <= 'Z') ||
108 (source
[i
] >= '0' && source
[i
] <= '9'))
110 } else if (source
[i
] == ' ' || source
[i
] == '\t' || source
[i
] == '\n' || source
[i
] == ';') {
119 char *source_paramfirst (char *source
, unsigned *size
)
122 char *param
= (char *) 0;
123 unsigned len
= *size
;
125 for (i
= 0; i
< len
; i
++) {
127 if (source
[i
] == ' ' || source
[i
] == '\t')
130 if ((source
[i
] >= 'a' && source
[i
] <= 'z') ||
131 (source
[i
] >= 'A' && source
[i
] <= 'Z') ||
132 (source
[i
] >= '0' && source
[i
] <= '9'))
134 } else if (source
[i
] == ' ' || source
[i
] == ',' || source
[i
] == '\t') {
143 char *source_paramsecond (char *source
, unsigned *size
)
146 char *param
= (char *) 0;
147 unsigned len
= *size
;
149 for (i
= 0; i
< len
; i
++) {
151 if (source
[i
] == ' ' || source
[i
] == '\t' || source
[i
] == ',')
154 if ((source
[i
] >= 'a' && source
[i
] <= 'z') ||
155 (source
[i
] >= 'A' && source
[i
] <= 'Z') ||
156 (source
[i
] >= '0' && source
[i
] <= '9'))
158 else if (source
[i
] == '\'')
160 } else if (source
[i
] == ' ' || source
[i
] == '\t' || source
[i
] == '\n' || source
[i
] == ';') {
169 int source_parse (char *source
, unsigned size
)
174 for (i
= 0; i
< size
; i
++) {
176 if (!strncmp ("global ", source
+i
, 7)) {
177 unsigned var
= size
-i
-7;
178 char *param
= source_param (source
+i
+7, &var
);
181 printf ("ERROR -> !param\n");
185 var_create (VAR_TYPE_GLOBAL
, param
, var
, (void *) 0x0 + i
, line
);
187 i
+= source_nextline (source
+i
, size
-i
);
194 if (!strncmp ("mov ", source
+i
, 4)) {
195 unsigned reg_len
= size
-i
-4;
196 char *paramreg
= source_paramfirst (source
+i
+4, ®_len
);
199 printf ("ERROR -> !paramreg\n");
203 unsigned val_len
= size
-reg_len
-i
-4;
204 char *paramval
= source_paramsecond (source
+i
+reg_len
+4, &val_len
);
207 printf ("ERROR -> !val_len\n");
211 i
+= source_nextline (source
+i
, size
-i
);
213 paramreg
[reg_len
] = '\0';
214 paramval
[val_len
] = '\0';
216 printf ("mov: %s, %s\n", paramreg
, paramval
);
218 unsigned char reg
= 0;
220 if (paramreg
[0] == 'e' && paramreg
[1] == 'a' && paramreg
[2] == 'x')
222 else if (paramreg
[0] == 'e' && paramreg
[1] == 'b' && paramreg
[2] == 'x')
224 else if (paramreg
[0] == 'e' && paramreg
[1] == 'c' && paramreg
[2] == 'x')
226 else if (paramreg
[0] == 'e' && paramreg
[1] == 'd' && paramreg
[2] == 'x')
229 buffer_copy (bin_pos
, (void *) ®
, 1);
232 /* Let's convert parameter to binary number */
233 if (paramval
[0] == '\'') {
235 printf ("ERROR -> wrong parameter syntax - %d != 3, line: %d\n", val_len
, line
);
239 if (paramval
[2] != '\'' || paramval
[1] == '\'') {
240 printf ("ERROR -> wrong parameter syntax, line: %d\n", line
);
245 //printf ("mov val char = %c\n", c);
247 buffer_copy (bin_pos
, (void *) &c
, sizeof (int));
248 bin_pos
+= sizeof (int);
250 } else if (paramval
[0] == '0' && paramval
[1] == 'x') {
251 char *endptr
, *str
= paramval
+2;
253 long val
= strtol (str
, &endptr
, 16);
255 //printf ("mov val hexa = %d\n", val);
257 buffer_copy (bin_pos
, (void *) &val
, sizeof (int));
258 bin_pos
+= sizeof (int);
261 for (x
= 0; x
< val_len
-1; x
++) {
262 if (!(paramval
[x
] >= '0' && paramval
[x
] <= '9')) {
263 printf ("ERROR -> wrong parameter syntax - only numbers are allowed, line: %d\n", line
);
268 int num
= atoi (paramval
);
270 //printf ("mov val digit = %d\n", num);
272 buffer_copy (bin_pos
, (void *) &num
, sizeof (int));
273 bin_pos
+= sizeof (int);
281 if (!strncmp ("int ", source
+i
, 4)) {
282 unsigned var
= size
-i
-4;
283 char *param
= source_param (source
+i
+4, &var
);
286 printf ("ERROR -> !param\n");
290 i
+= source_nextline (source
+i
, size
-i
);
292 unsigned char intr
= 0xcd; // int
293 buffer_copy (bin_pos
, (void *) &intr
, 1);
298 if (param
[0] == '0' && param
[1] == 'x') {
299 char *endptr
, *str
= param
+2;
301 long val
= strtol (str
, &endptr
, 16);
303 //printf ("int: 0x%x\n", val);
305 buffer_copy (bin_pos
, (void *) &val
, 1);
309 for (x
= 0; x
< var
; x
++) {
310 if (!isdigit (param
[x
])) {
311 printf ("ERROR -> wrong parameter syntax - only numbers are allowed, line: %d\n", line
);
316 int num
= atoi (param
);
318 buffer_copy (bin_pos
, (void *) &num
, 1);
322 printf ("int: %s\n", param
);
329 if (!strncmp ("ret", source
+i
, 3)) {
330 if (!function_curr
) {
331 printf ("ERROR -> ret cannot be called out of function, line: %d\n", line
);
335 printf ("Function %s end on line %d\n", function_curr
->name
, line
);
339 unsigned char ret
= 0xc3;
340 buffer_copy (bin_pos
, (void *) &ret
, 1);
343 i
+= source_nextline (source
+i
, size
-i
);
349 if ((source
[i
] >= 'a' && source
[i
] <= 'z') || (source
[i
] >= 'A' && source
[i
] <= 'Z')) {
352 for (y
= i
; y
< size
-i
; y
++) {
354 if (source
[y
] == ':') {
357 var_t
*var
= var_find (source
+i
);
360 printf ("ERROR -> unknown variable '%s', line %d\n", source
+i
, line
);
364 printf ("Function '%s' on line %d\n", var
->name
, line
);
366 function_curr
= var
; // set current function
371 if (source
[y
] == ' ' || source
[y
] == '\t' || source
[y
] == '\n' || source
[y
] == 32 || source
[y
] == ';') {
374 printf ("ERROR -> unknown command '%s', line: %d - %d, %c\n", source
+i
, line
, i
, source
[i
]);
381 //if (source[i] != ' ' || source[i] != ';')
382 //printf ("ERROR -> unspecified character '%c', line: %d\n", source[i], line);
383 if (source
[i
] == ';') {
384 i
+= source_nextline (source
+i
, size
-i
);
390 if (source
[i
] == '\n')
397 char *source_open (char *file
)
399 int fd
= open (file
, O_RDONLY
);
402 printf ("error -> file '%s' not found !\n", file
);
406 char *buffer
= (char *) malloc (sizeof (char) * 513);
409 printf ("ERROR -> out of memory !\n");
413 if (!read (fd
, buffer
, 512)) {
414 printf ("ERROR -> !source_open ()\n");
418 printf ("Source: %s\n", buffer
);
425 var_list
.next
= &var_list
;
426 var_list
.prev
= &var_list
;