view lwasm/list.c @ 388:8991eb507d2d

Added missing arg-nonnull.h ??? file to repo
author lost@l-w.ca
date Wed, 14 Jul 2010 20:17:57 -0600
parents a741d2e4869f
children fbb7bfed8076
line wrap: on
line source

/*
list.c

Copyright © 2010 William Astle

This file is part of LWTOOLS.

LWTOOLS is free software: you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.

You should have received a copy of the GNU General Public License along with
this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include <config.h>

#include <stdio.h>
#include <string.h>

#include <lw_alloc.h>
#include <lw_string.h>

#include "lwasm.h"
#include "instab.h"

/*
Do listing
*/
void do_list(asmstate_t *as)
{
	line_t *cl;
	FILE *of;
	int i;
	
	if (!(as -> flags & FLAG_LIST))
		return;

	if (as -> list_file)
		of = fopen(as -> list_file, "w");
	else
		of = stdout;
	if (!of)
	{
		fprintf(stderr, "Cannot open list file; list not generated\n");
		return;
	}
	for (cl = as -> line_head; cl; cl = cl -> next)
	{
		if (cl -> len < 1)
		{
			fprintf(of, "                      ");
		}
		else
		{
			lw_expr_t te;
			te = lw_expr_copy(cl -> addr);
			as -> exportcheck = 1;
			lwasm_reduce_expr(as, te);
			as -> exportcheck = 0;
			fprintf(of, "%04X ", lw_expr_intval(te) & 0xffff);
			lw_expr_destroy(te);
			for (i = 0; i < cl -> outputl && i < 8; i++)
			{
				fprintf(of, "%02X", cl -> output[i]);
			}
			for (; i < 8; i++)
			{
				fprintf(of, "  ");
			}
			fprintf(of, " ");
		}
		fprintf(of, "%15s:%05d %s\n", cl -> linespec, cl -> lineno, cl -> ltext);
		if (cl -> outputl > 8)
		{
			for (i = 8; i < cl -> outputl; i++)
			{
				if (i % 8 == 0)
				{
					if (i != 8)
						fprintf(of, "\n     ");
					else
						fprintf(of, "     ");
				}
				fprintf(of, "%02X", cl -> output[i]);
			}
			if (i % 8)
				fprintf(of, "\n");
		}
	}
}