diff lwasm/debug.c @ 372:90de73ba0cac

Created a useful debug framework and adjusted lw_expr_print() to return a "static" dynamic string
author lost@starbug
date Thu, 22 Apr 2010 18:19:06 -0600
parents 6b33faa21a0a
children eacdae8a1575
line wrap: on
line diff
--- a/lwasm/debug.c	Wed Apr 21 23:29:18 2010 -0600
+++ b/lwasm/debug.c	Thu Apr 22 18:19:06 2010 -0600
@@ -32,7 +32,7 @@
 Various debug utilities
 
 */
-void dump_state(asmstate_t *as, FILE *fp)
+void dump_state(asmstate_t *as)
 {
 	line_t *cl;
 	exportlist_t *ex;
@@ -41,40 +41,51 @@
 	struct line_expr_s *le;
 	lwasm_error_t *e;
 	
-	fprintf(fp, "Lines:\n");
+	debug_message(as, 100, "Lines:");
 	
 	for (cl = as -> line_head; cl; cl = cl -> next)
 	{
-		fprintf(fp, "%p ", cl);
-		if (cl -> insn >= 0)
-		{
-			fprintf(fp, "INSN %d (%s) ", cl -> insn, instab[cl -> insn].opcode);
-			fprintf(fp, "LEN %d ", cl -> len);
-		}
-		fprintf(fp, "\n    ADDR:");
-		lw_expr_print(cl -> addr, fp);
+		debug_message(as, 100, "%p INSN %d (%s) LEN %d", cl, cl -> insn, (cl -> insn >= 0) ? instab[cl -> insn].opcode : "<none>", cl -> len);
+		debug_message(as, 100, "    ADDR: %s", lw_expr_print(cl -> addr));
+
 		for (le = cl -> exprs; le; le = le -> next)
 		{
-			fprintf(fp, "\n    EXPR %d:", le -> id);
-			lw_expr_print(le -> expr, fp);
+			debug_message(as, 100, "    EXPR %d: %s", le -> id, lw_expr_print(le -> expr));
 		}
 		if (cl -> outputl > 0)
 		{
 			int i;
-			fprintf(fp, "\n    OUTPUT:");
 			for (i = 0; i < cl -> outputl; i++)
 			{
-				fprintf(fp, "%02X", cl -> output[i]);
+				debug_message(as, 100, "    OBYTE %02X: %02X", i, cl -> output[i]);
 			}
 		}
 		for (e = cl -> err; e; e = e -> next)
 		{
-			fprintf(fp, "\n    ERR: %s", e -> mess);
+			debug_message(as, 100, "    ERR: %s", e -> mess);
 		}
 		for (e = cl -> warn; e; e = e -> next)
 		{
-			fprintf(fp, "\n    WARN: %s", e -> mess);
+			debug_message(as, 100, "    WARN: %s", e -> mess);
 		}
-		fprintf(fp, "\n");
 	}
 }
+
+void debug_message(asmstate_t *as, int level, const char *fmt, ...)
+{
+	va_list args;
+
+	if (as -> debug_level < level)
+		return;
+
+	if (as -> debug_file == NULL)
+		as -> debug_file = stderr;
+
+	va_start(args, fmt);
+	
+	fprintf(as -> debug_file, "DEBUG %03d: ", level);
+	vfprintf(as -> debug_file, fmt, args);
+	fputc('\n', as -> debug_file);
+
+	va_end(args);
+}