/* proj3.c */
/* author: Edward A. Green */
/* purpose:  implementation of Compiler course, project 3 */

#include "proj3.h"

BLOCK *block_it(FILE *in_file, CONNECT *connect);
void  next_use(BLOCK *blocks);
void  remove_useless(BLOCK *blocks);
void  dump_blocks(BLOCK *blocks);
void  dump_next_use(BLOCK *blocks);
void  dump_connect(CONNECT *connect);


void main(int argc, char **argv)
{
	/* INPUT FILE VARIABLES */
	FILE *in_file;  /* input file */
	BLOCK *blocks;  /* internal representation of program */
	CONNECT *connect_table;
	CONNECT *connect_hold;


	/* argument check */
	if (argc<2)
	  {
	  printf("Must specify quad file name on command line.\n");
	  exit(1);
	  }

	/* open quad file */
	if (NULL==(in_file=fopen(argv[1],"rt")))
	  {
	  printf("First argument is not a file name.\n");
	  exit(1);
	  }

	/* sentinal for connect_table (handle for returning table) */
	connect_table=(CONNECT *)malloc(sizeof(CONNECT));
	connect_table->from=-1;
	connect_table->next=NULL;

	/* CAPTURE THE FILE INFORMATION */
	/* CALCULATE AND PRINT BASIC BLOCK CONNECTION TABLE */
	blocks=block_it(in_file,connect_table);

	/* close quad file */
	fclose(in_file);

	/* kill the connect table sentinal */
	connect_hold=connect_table;
	connect_table=connect_table->next;
	free(connect_hold);

	/* CALCULATE NEXT USE INFO AND ADD IT TO THE BLOCKS */
	next_use(blocks);

	/* DO TWO OPTIMIZATIONS */
	propagate(blocks);
	next_use(blocks);  /* bring next use up to date */
	remove_useless(blocks);

	/* GENERATE MACHINE CODE */
	make_asm_code(blocks);
}
