#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <direct.h>
#include "sftlib.h"

#define PROTO
#define SOFTDATA "sftlib.dat"
#define SOFTCARD 10
#define INDEX    "sftlib.ind"

void  fprintuse( FILE *fp, char *fpath);
int getcldata( soft *x);
int getdata( soft *x);
int mkind( char *in, char *out );
int   data2ind( soft *x, index *y);

int test=0;  /* テスト用 */


int main( int argc, char *argv[])
{
	FILE  *fpw;
	soft   data;  
    int    num;
	char  *fname, *index;
    int    ret, i;

	num=SOFTCARD;
	fname=SOFTDATA;
	index=INDEX;
	if( argc ==1 ) {fprintuse(stderr,argv[0]);}
	for( i=1; i< argc; i++ ) {
		if( strncmp( argv[i],"-t", 2 )==0 ) test=1;
		else if( strncmp( argv[i],"-h",2)==0 ) { fprintuse(stderr, argv[0]);} 
		else if( strncmp( argv[i],"-d",2) ==0 ) { i++;fname=argv[i];} 
		else if( strncmp( argv[i],"-i",2) ==0 ) { i++;index=argv[i];} 
		else if( isdigit(*argv[i]) ) sscanf( argv[i], "%i", &num);
		else {
			fprintuse(stderr, argv[0]);
			fprintf( stderr, "undefined option %s\n", argv[i]);
		}
	}

	fpw=fopen( fname ,"wb");
	if( fpw==NULL) {
		fprintf(stderr, "%s open error!!\n", fname);
		return 1;
	}

    for( i=1; i<=num; i++)
    {
		if( test==0 ) getcldata( &data );
			else getdata( &data );
		ret=fwrite( &data, sizeof(data), 1, fpw );
		if( ret!=1 ) { 
			fprintf(stderr, "fwrite error!! ret=%d\n",ret);
			return 2;
		}
    }
	fclose (fpw);

	fprintf( stderr, "Data created in %s.\n", fname); 
	fprintf( stderr, "One recorde size=%d Total size=%d\n", 
		sizeof(soft), sizeof(soft)*num);


	mkind( fname, index);

    return 0;
}


int mkind( char *iname, char *oname)
{
	FILE  *fpr, *fpw;
	soft   data;  
	index  ind;
    int    num, ret ;

	fpw=fopen( oname ,"wb");
	if( fpw==NULL) {
		fprintf(stderr, "%s open error!!\n", oname);
		return 1;
	}

	fpr=fopen( iname ,"rb");
	if( fpr==NULL) {
		fprintf(stderr, "%s open error!!\n", iname);
		fclose(fpw);
		return 1;
	}

	num=0;
    while( fread( &data, sizeof(soft), 1, fpr )==1 )
    {
		data2ind( &data , &ind );
		ind.softno=num;
		ret=fwrite( &ind, sizeof(index), 1, fpw );
		if( ret!=1 ) { 
			fprintf(stderr, "fwrite error!! ret=%d\n",ret);
			fclose( fpr );
			fclose( fpw );
			return 2;	
		}
		num++;
    }

	fclose (fpr);
	fclose (fpw);

	fprintf( stderr, "Data created in %s.\n", oname); 
	fprintf( stderr, "One recorde size=%d Total size=%d\n", 
		sizeof(index), sizeof(index)*num);

    return 0;
}






void  fprintuse( FILE *fp, char *fpath)
{
	char drv[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
	_splitpath(fpath, drv, dir, fname, ext);
	fprintf( fp, "usage: %s%s [-help] NNN -d DATA -i INDX [-test]\n", 
		fname, ext);
	fprintf( fp, "       -test テスト用のデータ作成\n");
	fprintf( fp, "       -help ヘルプの表示\n");
	fprintf( fp, "       NNN:  出力するデータの数\n");
	fprintf( fp, "       DATA: 出力するデータファイル名 " SOFTDATA "\n");
	fprintf( fp, "       INDX: 出力するインデックスファイル名 " INDEX "\n");
	exit(-1);
}

int getdata( soft *x ) /* テストデータ作成 */
{
	static i=1, n=1;
	memset( x, 0, sizeof(soft) );
    x->d_system[0]='S';          /* システム         3[A-Z] */
    x->d_system[1]=' ';          /* システム         3[A-Z] */
    x->d_system[2]=' ';          /* システム         3[A-Z] */
    x->d_name1h='A'+(i%26);            /* タイトルキー      [A-Z] */
    x->d_name2h='B'+(i%25);            /* サブタイトルキー  [A-Z] */
    x->d_makerh='C'+(i%24);            /* メーカーキー      [A-Z] */
    x->d_abouth='D'+(i%23);            /* 概要キー          [A-Z] */
    x->d_infomh='E'+(i%22);            /* 周辺機器キー      [A-Z] */
    x->d_code[0]='A'+(i%26);           /* 管理コード         注3    */
    x->d_code[1]='A'+((i*17)%23);      /* 管理コード         注3    */
    x->d_code[2]='0'+((i*3)%10);       /* 管理コード         注3    */
    x->d_code[3]='0'+((i*7)%10);       /* 管理コード         注3    */
	x->d_sort=DB_ctob('A'+((i*17)%23));
	x->d_media=(i%30)+1;
	x->d_teika=i*100;
	x->d_ram=i*64;
	x->d_hd=i*256;
	x->d_date1=(2*i+1)*35001+700000000;
	sprintf( x->d_name1, "タイトル %4d", n++);
	sprintf( x->d_name2, "サブタイトル %d", i++);
	sprintf( x->d_maker, "メーカー %d", i++);
	sprintf( x->d_about, "概要 %d", i++);
	sprintf( x->d_infom, "周辺機器 %d", i++);
	sprintf( x->d_docfile, "F%d.DOC", i++);
	BYTE(((char*)x)+sizeof(soft)-2)=0x0d;
	BYTE(((char*)x)+sizeof(soft)-1)=0x0a;
	i++;
	return 0;
}

