OpenCores
URL https://opencores.org/ocsvn/igor/igor/trunk

Subversion Repositories igor

[/] [igor/] [trunk/] [simulator/] [print.c] - Rev 4

Compare with Previous | Blame | View Log

#include <stdio.h>
#include <inttypes.h>
 
#include "print.h"
#include "object.h"
#include "regs.h"
#include "memory.h"
 
uint8_t currently_printing[MEMORY_ADDRESS_SPACE_SIZE];
 
void
print_init(void)
{
	int i;
	for (i = 0; i < DEFAULT_MEMORY_SIZE; i++)
		currently_printing[i] = 0;
}
 
void
print_list(uint32_t addr, int first)
{
	reg_t val = memory_get(addr);
	int32_t datum = object_get_datum(val);
	uint32_t type = object_get_type(val);
 
	if (type == TYPE_CONS) {
		reg_t cdr = memory_get(addr+1);
		if (object_get_type(cdr) != TYPE_SNOC) {
			printf("#(0x%X:malformed cons cell: second part has type 0x%X)",
			       addr, object_get_type(cdr));
			return;
		}
		printf(first ? "(" : " ");
		print(datum);
		print_list(object_get_datum(cdr), 0);
	} else if (type == TYPE_NIL) {
		printf(")");
	} else {
		printf(" . ");
		print(addr);
		printf(")");
	}
}
 
void
print_array(uint32_t addr)
{
	reg_t val = memory_get(addr);
	int i;
	int sz = object_get_datum(val);
	int str = 1;
 
	for (i = 0; i < sz; i++) {
		val = memory_get(addr+i+1);
		if (object_get_type(val) != TYPE_PTR) {
			printf("#(0x%X:malformed array)", addr);
			return;
		}
		val = memory_get(object_get_datum(val));
		if (object_get_type(val) != TYPE_CHAR) {
			str = 0;
			break;
		}
	}
 
	if (str) {
		printf("\"");
		for (i = 0; i < sz; i++) {
			val = memory_get(addr+i+1);
			val = memory_get(object_get_datum(val));
			printf("%c", object_get_datum(val));
		}
		printf("\"");
	} else {
		printf("#(0x%X:array(%d)", addr, sz);
		for (i = 0; i < sz; i++) {
			printf(" ");
			print(object_get_datum(memory_get(addr+i+1)));
		}
		printf(")");
	}
}
 
void
print_symbol(uint32_t addr)
{
	reg_t val = memory_get(addr);
	uint32_t arr_addr = object_get_datum(val);
	reg_t arr = memory_get(arr_addr);
	int sz = 0, i = 0;
	if (object_get_type(arr) != TYPE_ARRAY)
		goto print_symbol_err;
	sz = object_get_datum(arr);
	for (i = 1; i <= sz; i++) {
		val = memory_get(arr_addr+i);
		if (object_get_type(val) != TYPE_PTR)
			goto print_symbol_err;
		val = memory_get(object_get_datum(val));
		if (object_get_type(val) != TYPE_CHAR)
			goto print_symbol_err;
		printf("%c", object_get_datum(val));
	}
 
	return;
print_symbol_err:
	printf("#(0x%X:malformed symbol [%X,%X])", addr, sz, i);
}
 
void
print_function(uint32_t addr)
{
	reg_t val = memory_get(addr);
	int32_t datum = object_get_datum(val);
 
	printf("#(0x%X:func ", addr);
	print(object_get_datum(memory_get(datum)));
	printf(")");
	/*
	printf("#(0x%X:function ", addr);
	print(datum);
	printf(")");
	*/
}
 
void
print_builtin(uint32_t addr)
{
	reg_t val = memory_get(addr);
	int32_t datum = object_get_datum(val);
 
	printf("#(builtin ");
	print(datum);
	printf(")");
}
 
void
print(uint32_t addr)
{
	reg_t val = memory_get(addr);
	int32_t datum = object_get_datum(val);
	uint32_t type = object_get_type(val);
 
	if (currently_printing[addr]) {
		printf("#(R 0x%X:%X:%X)", addr, type, datum);
		return;
	}
 
	currently_printing[addr] = 1;
 
	switch (object_get_type(val)) {
	case TYPE_NONE:
		printf("#(0x%X:none)", addr);
		break;
	case TYPE_INT:
		printf("%d", datum);
		break;
	case TYPE_FLOAT:
		printf("%f", (float)datum);
		break;
	case TYPE_CONS:
		print_list(addr, 1);
		break;
	case TYPE_SNOC:
		printf("#(0x%X:snoc ", addr);
		print(datum);
		printf(")");
		break;
	case TYPE_PTR:
		printf("#(0x%X:ptr ", addr);
		print(datum);
		printf(")");
		break;
	case TYPE_ARRAY:
		print_array(addr);
		break;
	case TYPE_NIL:
		printf("nil");
		break;
	case TYPE_T:
		printf("t");
		break;
	case TYPE_CHAR:
		printf("#\\%c", datum);
		break;
	case TYPE_SYMBOL:
		print_symbol(addr);
		break;
	case TYPE_FUNCTION:
		print_function(addr);
		break;
	case TYPE_BUILTIN:
		print_builtin(addr);
		break;
	default:
		printf("#(0x%X:invalid object %X:%X)", addr, type, datum);
		break;
	}
 
	currently_printing[addr] = 0;
}
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.