#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"list.h"
#include"chain.h"

#define	TRUE	(-1)
#define	FALSE	0


char line[]="-------------------------------------------------------------------------------\n";
char top[]="  NO.     FILENAME         SIZE        DATE    TIME             LINE           \n";

extern LIST	head;
extern PARA outfile;
extern FILE *ofp;


void LineCount(void)
{
	int		lcnt=1,cnt=0,readsize=0;
	char 	*t;
	LIST	*p;
	FILE	*fp;
	
	for(p=head.next;p!=NULL;p=p->next){
		if((fp=fopen(p->file,"r"))==NULL){
			printf("'%s' can't open.\n",p->file);
			exit(1);
		}
		
		readsize=(p->size)+2; /* +1は最後にいれる'\n'のため */
		p->bf=(char *)malloc(readsize);
		readsize=fread(p->bf,1,readsize,fp);
		p->rsize=readsize+1; 		/* LFを外したファイルの大きさ */
		
		t=p->bf;
		if(t==NULL) return;
		lcnt=HEADERLINE+TAILLINE; 	/* 注釈が3行と最後の区切り分 */
		for(cnt=0;cnt<readsize;cnt++)
			if(*t++=='\n') lcnt++;
		
		*t='\n';
		p->line=lcnt;
		fclose(fp);
		printf("o");
	}
}

/*********************************************
   file.000 〜 file.999のファイルネームを返す.
 ファイル file.000,file.001などは同時にオープン
 することはないので静的変数を使う。
**********************************************/
char *WriteOpenName(char *f)
{
	static int	fnum=0;
	int	i,k;
	char *p;
	
	if(fnum > 999 ) return(NULL);
	
	strcpy(f,outfile.file);
	
	p=strchr(f,'\0'); /* '\0'を探す */
	*p++='.';
	for(i=100,k=fnum;i>=1;i/=10){
		*p++='0'+ k/i;
		k=k % i;
	}
	*p='\0';
	fnum++;
	return(f);
}

char *GetTimeString(unsigned short int time,char *timebuf)
{
	char *p=timebuf;
	int	i=0;
	
	i=(time&0xf800)>>11;
	
	if(i<10)	*p++='0';
	else		*p++='0'+ i/10;
	*p++='0'+ i%10;*p++=':';
	
	i=(time&0x07e0)>>5;
	if(i<10)	*p++='0';
	else		*p++='0'+i/10;
	*p++='0'+i%10;*p='\0';
	return(timebuf);
}
char *GetDateString(unsigned short int date,char *datebuf)
{
	char *p=datebuf;
	int	i=0;
	
	i=(date&0xfe00)>>9;
	i=(i+80)%100;
	if(i<10)	*p++='0';
	else		*p++='0'+ i/10;
	*p++='0'+ i%10;*p++='/';
	
	i=(date&0x01e0)>>5;
	if(i<10)	*p++='0';
	else		*p++='0'+i/10;
	*p++='0'+i%10;*p++='/';
	
	i=(date&0x001f);
	if(i<10)	*p++='0';
	else		*p++='0'+i/10;
	*p++='0'+i%10;*p='\0';
	
	return(datebuf);
}


/****************************************************
 lcnt(行数カウンター)の値は main 関数が保持している。
 lcntはMakeList()の値が入った状態で呼ばれる。
****************************************************/
void MakeIndex(int lcnt)
{
	int 	i=0;
	LIST 	*l=NULL;
	char	date[8],time[8];
	
	lcnt+=HEADERLINE+1; /* 上下の区切り用ライン  */
	
	fwrite(top,1,80,ofp);  /* 見出しの最上段 	*/
	fwrite(line,1,80,ofp); /* 始めの区切り 		*/
	for(l=head.next,i=1;l!=NULL;l=l->next){
		if(l->flag==TRUE){
			l->sline=lcnt;
			fprintf(ofp,"#%03d  [%12s]   %07d byte  %8s  %4s  (%05d) %05d <---> %05d\n"
				,i,l->file,l->size,
				GetDateString(l->wr_date,date),GetTimeString(l->wr_time,time)
				,l->line,l->sline,l->sline+l->line-1);
			lcnt+=l->line;
			i++;
		}
	}
	fwrite(line,1,80,ofp); /* 終わりの区切り */
}

void Chain(int m)
{
	LIST *lp;
	char	dd[8],tt[5];
	int	i;
	
	for(i=1,lp=head.next;lp!=NULL;lp=lp->next){
		if(lp->flag==TRUE){
			fwrite(line,1,80,ofp);
			fprintf(ofp,"(%03d/%03d)  %12s %06dbyte %8s %5s  %05d line  %05d <--> %05d\n"
				,i++,m,lp->file,lp->size
				,GetDateString(lp->wr_date,dd),GetTimeString(lp->wr_time,tt)
				,lp->line,lp->sline,lp->sline+lp->line-1);
			fwrite(lp->bf,1,lp->rsize,ofp);
			fwrite(line,1,80,ofp);
		}
	}
}
