diff options
Diffstat (limited to 'fpgaedit.y')
-rw-r--r-- | fpgaedit.y | 106 |
1 files changed, 92 insertions, 14 deletions
@@ -9,9 +9,22 @@ extern int errno; FILE *fhan = NULL; +typedef struct variable { + struct variable *next; + char *name; + int val; +} variable; + int linelen = 16; int write_len; +int debug = 0; +variable *vlist; + +void set_variable (char *param, int val); +int get_variable (char *param); void hex_output (int offset, int len, int count); +extern void yyerror (const char *s); +extern int yylex (void); %} %union { @@ -35,6 +48,7 @@ char *tptr; %left <val> CLOSE %left <val> MD %left <val> MM +%left <val> EQ %left <val> EXIT %left <val> CR @@ -50,8 +64,9 @@ line: CR | open CR | close CR | EXIT CR { exit(EXIT_SUCCESS); } - | NAME CR { printf ("falsche Eingabe: >%s<\n", $1); } + | NAME CR { printf ("%s = %d\n", $1, get_variable($1)); free($1); } | mem CR + | NAME EQ num CR { set_variable ($1, $3); free($1); } | error ; @@ -61,6 +76,7 @@ open: OPEN { printf ("open <filename>\n"); } fhan = fopen($2, "r+"); if (!fhan) printf ("open >%s< failed\n%s\n", $2, strerror(errno)); + free ($2); } ; @@ -81,7 +97,8 @@ mem: MD { | mm exp ; -mm: MM { write_len = $1; } +mm: MM { write_len = $1; if (debug > 3) printf ("write_len = %d\n", write_len);} +; exp: num { if (fhan) { @@ -89,12 +106,14 @@ exp: num { printf ("set offset %ld failed\n", $1); } else printf ("please open file\n"); + if (debug > 3) printf ("offset = 0x%0lx\n", $1); } | exp num { unsigned int c; c = $2; - c %= 1 << write_len*8; + c %= 1 << (write_len*8); + if (debug > 3) printf ("c = 0x%0x\n", c); if (fhan) { switch (write_len) { @@ -104,27 +123,84 @@ exp: num { } fflush (fhan); } + else if (debug > 3) printf ("fhan == NULL\n"); } ; num: NUM - | num ADD num { $$ = $1 + $3; } - | num SUB num { $$ = $1 - $3; } - | num MUL num { $$ = $1 * $3; } - | num DIV num { $$ = $1 / $3; } - | num MOD num { $$ = $1 % $3; } - | num RSHIFT num { $$ = $1 >> $3; } - | num LSHIFT num { $$ = $1 << $3; } - | OBRA num CBRA { $$ = $2; } - | SUB num %prec NEG { $$ = - $2; } + | num ADD num { $$ = $1 + $3; if (debug > 3) printf ("ADD: %ld\n", $$); } + | num SUB num { $$ = $1 - $3; if (debug > 3) printf ("SUB: %ld\n", $$); } + | num MUL num { $$ = $1 * $3; if (debug > 3) printf ("MUL: %ld\n", $$); } + | num DIV num { $$ = $1 / $3; if (debug > 3) printf ("DIV: %ld\n", $$); } + | num MOD num { $$ = $1 % $3; if (debug > 3) printf ("MOD: %ld\n", $$); } + | num RSHIFT num { $$ = $1 >> $3; if (debug > 3) printf ("RSHIFT: %ld\n", $$); } + | num LSHIFT num { $$ = $1 << $3; if (debug > 3) printf ("LSHIFT: %ld\n", $$); } + | OBRA num CBRA { $$ = $2; if (debug > 3) printf ("BRA: %ld\n", $$); } + | NAME { $$ = get_variable ($1); if (debug > 3) printf ("VAR: %ld\n", $$); free($1); } +; %% +void set_variable (char *param, int val) { + variable *l, *tmp; + + if (strncmp (param, "debug", 5) == 0) { + debug = val; + printf ("debug = %d\n", debug); + return; + } + + if (debug > 3) printf ("param = >%s<\n", param); + + for (l = vlist; l; l = l->next) { + if (debug > 3) printf ("l->name = >%s<\n", l->name); + if (strcmp (l->name, param) == 0) { + l->val = val; + return; + } + } + + tmp = calloc (1, sizeof(variable)); + if (!tmp) { + printf ("no mem for variable %s!\n", param); + return; + } + + tmp->name = calloc(1 + strlen(param), sizeof(char)); + if (!tmp->name) { + printf ("no mem for variable %s!\n", param); + free(tmp); + return; + } + strcpy(tmp->name, param); + tmp->val = val; + tmp->next = vlist; + + vlist = tmp; +} + +int get_variable (char *param) { + int v = 0; + variable *l; + + if (debug > 3) printf ("param = >%s<\n", param); + + for (l = vlist; l; l = l->next) { + if (debug > 3) printf ("l->name = >%s<\n", l->name); + if (strcmp (l->name, param) == 0) { + v = l->val; + break; + } + } + return v; +} + void hex_output (int offset, int len, int count) { if (fhan) { if (fseek (fhan, offset, SEEK_SET) == -1) - printf ("set offset %ld failed\n", offset); + printf ("set offset %d failed\n", offset); else { - unsigned int c, i, t; + unsigned int c; + int i, t; for (t = 0; t <= count; t++) { printf ("0x%08x ", offset + t*linelen); @@ -160,4 +236,6 @@ void hex_output (int offset, int len, int count) { } } else printf ("please open file\n"); + + return; }
\ No newline at end of file |