summaryrefslogtreecommitdiffstats
path: root/fpgaedit.y
diff options
context:
space:
mode:
Diffstat (limited to 'fpgaedit.y')
-rw-r--r--fpgaedit.y106
1 files changed, 92 insertions, 14 deletions
diff --git a/fpgaedit.y b/fpgaedit.y
index c4b98d5..704fc31 100644
--- a/fpgaedit.y
+++ b/fpgaedit.y
@@ -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