aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cxrefbas.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/cxrefbas.c b/cxrefbas.c
index 9228f28..4598117 100644
--- a/cxrefbas.c
+++ b/cxrefbas.c
@@ -8,39 +8,41 @@
#include "bas.h"
#include "bcdfp.h"
-/* not yet...
typedef struct {
unsigned short lineno;
unsigned short pos;
- unsigned char type;
+ unsigned char cmd;
} lineref_t;
-*/
-unsigned short *linerefs[32769];
+lineref_t *linerefs[32769];
int refcounts[32769];
int lines_exist[32769];
unsigned char last_cmd, on_op;
int last_cmd_pos;
-void add_lineref(unsigned short from, unsigned short to) {
- unsigned short *p;
+void add_lineref(unsigned short from, unsigned short pos) {
+ lineref_t *p;
int c;
+ unsigned short to;
+ to = fp2int(program + pos);
if(to > 32767) return;
p = linerefs[to];
c = refcounts[to];
if(c) {
- p = realloc(p, sizeof(unsigned short) * (c + 1));
+ p = realloc(p, sizeof(lineref_t) * (c + 1));
} else {
- p = malloc(sizeof(unsigned short));
+ p = malloc(sizeof(lineref_t));
}
if(!p) die("Out of memory.");
linerefs[to] = p;
- p[c] = from;
+ linerefs[to][c].lineno = from;
+ linerefs[to][c].pos = pos;
+ linerefs[to][c].cmd = last_cmd;
c++;
refcounts[to] = c;
}
@@ -137,14 +139,14 @@ CALLBACK(got_exp) {
case CMD_RESTORE:
case CMD_TRAP:
if((pos == last_cmd_pos + 1) && standalone) {
- add_lineref(lineno, fp2int(program + pos + 1));
+ add_lineref(lineno, pos + 1);
} else {
computed_msg(lineno);
}
break;
case CMD_IF:
if(last_tok == OP_THEN) {
- add_lineref(lineno, fp2int(program + pos + 1));
+ add_lineref(lineno, pos + 1);
}
break;
case CMD_ON: {
@@ -153,7 +155,7 @@ CALLBACK(got_exp) {
case OP_GOSUB:
case OP_COMMA:
if(standalone)
- add_lineref(lineno, fp2int(program + pos + 1));
+ add_lineref(lineno, pos + 1);
else
computed_msg(lineno);
break;
@@ -176,13 +178,26 @@ void build_ref_table(void) {
}
void print_ref_table(void) {
+ char c;
int i, j;
for(i = 0; i < 32768; i++) {
if(refcounts[i]) {
if(!lines_exist[i]) putchar('!');
printf("%d: ", i);
for(j = 0; j < refcounts[i]; j++) {
- printf("%d ", linerefs[i][j]);
+ printf("%d:", linerefs[i][j].lineno);
+ switch(linerefs[i][j].cmd) {
+ case CMD_GOTO: c = 'G'; break;
+ case CMD_GO_TO: c = 'G'; break;
+ case CMD_GOSUB: c = 'S'; break;
+ case CMD_RESTORE: c = 'R'; break;
+ case CMD_TRAP: c = 'T'; break;
+ case CMD_IF: c = 'I'; break;
+ case CMD_ON: c = 'O'; break;
+ default: c = '?'; break;
+ }
+ putchar(c);
+ putchar(' ');
}
putchar('\n');
}