#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <dos.h>
#include <dir.h>
#include <alloc.h>
#include <time.h>
#include "conv.h"
#include "..\primary.h"

FILE *fin,*fout, *rep;

int Lib;	/* input format for library files */
int Line = 1;

char Infile[0x80],Outfile[0x80],SLine[0x80];

void main(argc,argv)
int argc;
char *argv[];
{
	char buf[0x100];
	int x;
	if((argc!=2) & (argc !=3)){
		fprintf(stderr,"EEFilter: <-l> <File>\n");
		exit(-1);
	}
	if(argc==2)
		Lib=0;	/* Basic EEDraw file, */
	else if((strcmp(argv[1],"-l"))==0)
		Lib=1;
	else if((strcmp(argv[1],"-z"))==0){
		fprintf(stderr,"Usage: EEFilter <-l> Filename\n");
		fprintf(stderr,"EEDraw/EELibs Conversion Utility\n");
		exit(0);
	}
	if(Lib==0 && argc==2)
		sprintf(Infile,"%s",argv[1]);
	else if(Lib==0 && argc==3)
		sprintf(Infile,"%s",argv[2]);
	else if(Lib==1 && argc==3)
		sprintf(Infile,"%s",argv[2]);
	else {
		fprintf(stderr,"EEFilter: <-l> <File>\n");
		exit(-1);
	}
	if((fin=fopen(Infile,"r"))==NULL){
		fprintf(stderr,"Cant open file %s for reading\n",Infile);
		exit(-1);
	}
	sprintf(Outfile,"EEFilter.jnk");
	if((fout=fopen(Outfile,"w"))==NULL){
		fprintf(stderr,"Can't open Tempery file for writting\n");
		exit(-1);
	}
	if((rep=fopen("EEFilter.rep","a"))!=NULL){
		fprintf(rep,"Basic report for filter,\n");
		fprintf(rep,"Input File %s\n",Infile);
		fprintf(rep,"Output file %s\n",Outfile);
		fprintf(rep,"Mode %d\n**********\n\n",Lib);
		fclose(rep);
	}

	if(Lib==0){	/* EED Sytle File */
		fgets(buf,0x100,fin);
		fprintf(fout,"EEDraw EEDRAW PROGRAM Version 2.4\n");
		Copy_Line(1);
		Line=2;
		Sch_Layer_Head();
		do_eed();
	} else if(Lib==1){
		fgets(buf,0x100,fin);
		fprintf(fout,"EEDRAW-LIB Version 1.1\n");
		do_lib();
	}
	fclose(fin);
	fclose(fout);
	x=do_move();
	exit(x);
}

/* Copy N Lines from the input to the output */
void Copy_Line(Num)
int Num;
{
	char buf[0x100];
	while(Num!=0){
		fgets(buf,0x100,fin);
		fprintf(fout,"%s",buf);
		Num--;
	}
}

void Sch_Layer_Head()
{
	fprintf(fout,"EELAYER 12 0\n");
    	fprintf(fout,"Wire   15  2  0\n");
     	fprintf(fout,"Bus   14  2  1\n");
    	fprintf(fout,"Gate    3  1  2\n");
    	fprintf(fout,"IEEE    4  1  3\n");
  	fprintf(fout,"PinFun    1  1  4\n");
  	fprintf(fout,"PinNum   14  1  5\n");
  	fprintf(fout,"PinNam    1  1  6\n");
  	fprintf(fout,"RefDes   14  1  7\n");
    	fprintf(fout,"Attr   14  1  8\n");
  	fprintf(fout,"Device    3  1  9\n");
   	fprintf(fout,"Notes    1  2 10\n");
  	fprintf(fout,"NetNam    4  1 11\n");
     	fprintf(fout,"Pin   15  1 12\n");
	fprintf(fout,"EELAYER END\n");
	Line = Line + 15;
}
void do_eed()
{
	char buf[0x100];
	char cmd,flag;
	int v1,v2,v3,v4,v5;
	do {
		buf[0]='\0';
		cmd='\0';
		fgets(buf,0x100,fin);
		sscanf(buf,"%c %d %d %d %d %d",&cmd,&v1,&v2,&v3,&v4,&v5);
		switch(cmd){
			case 'P' :
				sscanf(buf,"%c %c %d",&cmd,&flag,&v1);
				fprintf(fout,"%c %c 0 %s",cmd,flag,&buf[4]);
				Copy_Line(v1);
				Line = Line + 1 + v1;
				break;
			case 'T' :
				fprintf(fout,"%c 10 %s",cmd,&buf[2]);
				Copy_Line(1);
				Line = Line +2;
				break;
			case 'L' :
				fprintf(fout,"%s",buf);
				Copy_Line(2);
				Line = Line + 3;
				break;
			case 'C' :
				fprintf(fout,"C %d %d %d\n",LAYER_WIRE, v1,v2);
				Line ++;
				break;
			default  :
				if((rep=fopen("eefilter.rep","a"))!=NULL){
					fprintf(rep,"\n*******\nErrors\n");
					fprintf(rep,"Error: found line %d\n",
						Line);
					fprintf(rep,"Line :%s:\n",buf);
					fclose(rep);
				}
				break;
		} 
	}while(!feof(fin));	/* outer loop of basic filter */
}
void do_lib()
{ 
	char buf[0x100];
	char cmd;
	int v1,v2,v3,v4,v5;
	do {
    	buf[0]='\0';
    	cmd='\0';
    	fgets(buf,0x100,fin);
	if((buf[1]==' ') & ((buf[0] >= 'A') & (buf[0] <= 'Z'))){
		sscanf(buf,"%c %d %d %d %d %d",&cmd,&v1,&v2,&v3,&v4,&v5);
		switch(cmd){
			case '#' :
				fprintf(fout,"%s",buf);
				break;
			case 'P' :
				sscanf(buf,"%c %d",&cmd,&v1);
				fprintf(fout,"%c %d %s",cmd,LAYER_GATE,&buf[2]);
				Line = Line + 1;
				break;
			case 'L' :
				fprintf(fout,"%c %d %s",cmd,LAYER_GATE,&buf[2]);
				Line++;
				break;
			case 'S' :
				fprintf(fout,"%c %d %s",cmd,LAYER_GATE,&buf[2]);
				Line++;
				break;
			case 'A' :
				fprintf(fout,"%c %d %s",cmd,LAYER_GATE,&buf[2]);
				Line++;
				break;
			case 'C' :
				fprintf(fout,"%c %d %s",cmd,LAYER_GATE,&buf[2]);
				Line++;
				break;
			case 'T' :
				fprintf(fout,"%c %d %s",cmd,LAYER_PINNAM,
					&buf[2]);
				Line = Line++;
				break;
		 
			default  :
				if((rep=fopen("eefilter.rep","a"))!=NULL){
					fprintf(rep,"\n*******\nErrors\n");
					fprintf(rep,"Error: found line %d\n",
						Line);
					fprintf(rep,"Line :%s:\n",buf);
					fclose(rep);
				}
				break;
		} 

/* end of switch statemant, check words in other half of ELSE statment */

	    } else {
		fprintf(fout,"%s",buf);
	    }
/* end of word checks */
	}while(!feof(fin));	/* outer loop of basic filter */
}
int do_move()
{
	char c;
	if((fin=fopen(Outfile,"r"))==NULL){
		fprintf(stderr,"Cant reopen temp file for reading\n");
		return(-1);
	}
	if((fout=fopen(Infile,"w"))==NULL){
		fprintf(stderr,"Cant open %s for writting\n",Infile);
		return(-1);
	}
	while((c=getc(fin))!=EOF)
		putc(c,fout);
	return(0);
}
