/* Simple Tracing Cedar Programs */
/* Christian Jacobi: December 7, 1987 4:35:09 pm PST */

#include <stdio.h>

char tfName[] = "tracefile.tmp";
FILE *tf;

int lastPos = 1000000;
char *lastFile = 0;

extern void XR←TraceSource(pos, leng, file)
	/*compiler generated calls*/
	int pos, leng;
	char *file;
	{
	if (file!=lastFile) {
		lastPos = pos;
		lastFile = file;
		if (file!=0) {
			fprintf(tf, "\n[");
			fprintf(tf, file);
			fprintf(tf, "]* ");
			};
		};
	if (pos<lastPos){
		fprintf(tf, "\n* ");
		};
	lastPos = pos;
	fprintf(tf, "%d..%d  ", pos, pos+leng);
	fflush(tf);
	};

extern void XR←C2CTrace(pos, leng, file)
	/*old version for compatibility*/
	int pos, leng;
	char *file;
	{
	XR←TraceSource(pos, leng, file);
	};

extern void XR←TraceInit() {
	tf = fopen(tfName, "w");
	printf("trace file ");
	printf(tfName);
	printf(" opened\n");
	fprintf(tf, "Cedar program trace\n");
	};

extern void XR←TraceClose() {
	if (fclose(tf) != 0) {
		printf("error while closing trace file");
		}
	else {
		printf("trace file ");
		printf(tfName);
		printf(" closed\n");
		};
	};

extern void XR←TraceChar(ch)
	int ch;
	{
	(void) putc((ch % 0177), tf);
	fflush(tf);
	};

extern void XR←TraceInt(i)
	int i;
	{
	fprintf(tf, " %d", i);
	fflush(tf);
	};

extern void XR←TraceString(s)
	int s;
	{
	int *lp = (int*) s;
	char *cp = ((char*) s)+4;
	int cnt;
	int i = 0;
	if (lp!=0) {
		cnt = ((unsigned)*lp) >> 16;
		while (i < cnt) {
			(void) putc(*cp, tf);
			cp = cp+1;
			i = i+1;
			};
		fflush(tf);
		};
	};

static void XR←load←trace() { 
	XR←TraceInit(); 
	};

static void XR←run←trace() { 
	XR←TraceInit();
	};

static void XR←unload←trace() { printf("don't unload trace"); };