# HG changeset patch
# User lost
# Date 1230876430 0
# Node ID 39d750ee8d34f3be671a6904df9e7e7c5ac2de29
# Parent b29eec6f381970f63d5cd9f6afcbc4af39de524e
Added error display and fixed infinite loop in lwasm_parse_line()
diff -r b29eec6f3819 -r 39d750ee8d34 src/Makefile.am
--- a/src/Makefile.am Fri Jan 02 05:17:00 2009 +0000
+++ b/src/Makefile.am Fri Jan 02 06:07:10 2009 +0000
@@ -1,3 +1,3 @@
bin_PROGRAMS = lwasm
-lwasm_SOURCES = main.c expr.c pass1.c pass2.c util.c instab.c parse.c lwasm.c insn_inh.c insn_rtor.c insn_rlist.c insn_rel.c insn_tfm.c insn_bitbit.c insn_indexed.c insn_gen.c insn_logicmem.c
+lwasm_SOURCES = main.c expr.c pass1.c pass2.c util.c instab.c parse.c lwasm.c insn_inh.c insn_rtor.c insn_rlist.c insn_rel.c insn_tfm.c insn_bitbit.c insn_indexed.c insn_gen.c insn_logicmem.c list.c
EXTRA_DIST = instab.h lwasm.h expr.h util.h
diff -r b29eec6f3819 -r 39d750ee8d34 src/list.c
--- a/src/list.c Fri Jan 02 05:17:00 2009 +0000
+++ b/src/list.c Fri Jan 02 06:07:10 2009 +0000
@@ -1,6 +1,6 @@
/*
list.c
-Copyright © 2008 William Astle
+Copyright © 2009 William Astle
This file is part of LWASM.
@@ -17,154 +17,35 @@
You should have received a copy of the GNU General Public License along with
this program. If not, see .
-Contains code for displaying a program listing in lwasm
+Contains code for displaying a program listings, etc.
*/
-//#include
-#include
+#define __list_c_seen__
+
#include
-//#include
-#include
-#define __list_c_seen__
-//#include "instab.h"
+#include
+
#include "lwasm.h"
-const char *errlist[] =
+void lwasm_show_errors(asmstate_t *as)
{
- "No error",
- "Bad opcode",
- "Illegal Symbol",
- "Multiply defined symbol",
- "Symbol required but not present",
- "Forward references not permitted",
- "Byte overflow",
- "Phase error",
- "Bad operand",
- "Symbol not permitted here",
- "Undefined symbol",
- "Bit number out of range",
- "Invalid expression",
- "Invalid register",
- "Bad file name",
- "ENDM without MACRO",
- "Redefined macro",
- "Nested namespace",
- "Bad condition",
- "User error",
- "Bad pragma",
- ""
-};
-
-void list_code(asmstate_t *as)
-{
- FILE *lf;
- sourceline_t *cl;
- int bn;
- int c;
- char *t;
+ lwasm_line_t *l;
+ lwasm_error_t *e;
- if (as -> listfile && strcmp(as -> listfile, "-"))
+ for (l = as -> lineshead; l; l = l -> next)
{
- lf = fopen(as -> listfile, "w");
- if (!lf)
+ if (l -> err)
{
- perror("Cannot open list file");
- return;
+ for (e = l -> err; e; e = e -> next)
+ {
+ fprintf(stderr, "ERROR: %s\n", e -> mess);
+ }
+ fprintf(stderr, "%s\n", l -> text);
}
}
- else
- {
- lf = stdout;
- }
-
- for (cl = as -> source_head; cl; cl = cl -> next)
- {
- bn = 0;
- if (cl -> errors)
- {
- errortab_t *e;
- for (e = cl -> errors; e; e = e -> next)
- {
- if (e -> errnum < ERR_MAXERR && e -> errnum != ERR_USER)
- fprintf(lf, "*****ERROR: %s\n", errlist[e -> errnum]);
- }
- if (cl -> user_error)
- {
- fprintf(lf, "*****ERROR: %s\n", cl -> user_error);
- }
- }
- if (cl -> skipped)
- {
- fprintf(lf, "%-15.15s", "");
- }
- else if (cl -> macrodef)
- {
- fprintf(lf, "%-15.15s", "");
- }
- else if (cl -> opcode >= 0 && cl -> numcodebytes > 0)
- {
- fprintf(lf, "%04X ", cl -> addr);
- while (bn < 5 && bn < cl -> numcodebytes)
- {
- fprintf(lf, "%02X", cl -> codebytes[bn]);
- bn++;
- }
- while (bn < 5)
- {
- fprintf(lf, " ");
- bn++;
- }
- }
- else if (cl -> addrset || (cl -> len && cl -> numcodebytes == 0))
- {
- fprintf(lf, "%04X %10s", cl -> addr, "");
- }
- else if (cl -> isequ)
- {
- fprintf(lf, " %04X ", cl -> symaddr);
- }
- else if (cl -> issetdp)
- {
- fprintf(lf, " %02X ", cl -> dpval);
- }
- else
- fprintf(lf, " ");
- fprintf(lf, " %15.15s:%06d ", cl -> sourcefile, cl -> lineno);
- // actually display the line from the file
- for (c = 0, t = cl -> line; *t; t++)
- {
- if (*t == '\n' || *t == '\r')
- break;
- if (*t == '\t')
- {
- do
- {
- fprintf(lf, " ");
- c++;
- } while (c % 8);
- }
- else
- {
- c++;
- fprintf(lf, "%c", *t);
- }
- }
-// fprintf(lf, "\n");
-
- while (bn < cl -> numcodebytes)
- {
- if (bn % 5 == 0)
- fprintf(lf, "\n%04X ", (cl -> addr + bn) & 0xFFFF);
- fprintf(lf, "%02X", cl -> codebytes[bn]);
- bn++;
- }
- fprintf(lf, "\n");
- }
-
- fprintf(lf, "\n");
- list_symbols(as, lf);
-
- if (lf != stdout)
- fclose(lf);
}
+void lwasm_list(asmstate_t *as)
+{
+ lwasm_show_errors(as);
+}
diff -r b29eec6f3819 -r 39d750ee8d34 src/main.c
--- a/src/main.c Fri Jan 02 05:17:00 2009 +0000
+++ b/src/main.c Fri Jan 02 06:07:10 2009 +0000
@@ -36,7 +36,7 @@
// external declarations
extern void lwasm_pass1(asmstate_t *as);
extern void lwasm_pass2(asmstate_t *as);
-
+extern void lwasm_list(asmstate_t *as);
// command line option handling
const char *argp_program_version = PACKAGE_STRING;
@@ -171,7 +171,7 @@
lwasm_pass2(&asmstate);
// now make a pretty listing
-// lwasm_list(&asmstate);
+ lwasm_list(&asmstate);
// now write the code out to the output file
// lwasm_output(&asmstate);
diff -r b29eec6f3819 -r 39d750ee8d34 src/pass1.c
--- a/src/pass1.c Fri Jan 02 05:17:00 2009 +0000
+++ b/src/pass1.c Fri Jan 02 06:07:10 2009 +0000
@@ -60,6 +60,9 @@
#include "lwasm.h"
#include "util.h"
+
+extern int lwasm_parse_line(asmstate_t *as, lwasm_line_t *l);
+
// we can't use standard line inputting functions here because we have to
// handle non-standard line terminations (CR, LF, CRLF, or LFCR)
int lwasm_read_file(asmstate_t *as, const char *filename)
@@ -138,6 +141,7 @@
as -> linestail = nl;
if (!(as -> lineshead))
as -> lineshead = nl;
+ lwasm_parse_line(as, nl);
}
if (c == EOF)
break;