/*****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <doslib.h>
#include <conio.h>
#include "defines.h"
#include "fat32.h"
#include "aparam.h"
#include "akey.h"
#include "astdio.h"
#include "astring.h"
#include "acmp.h"
#include "amacro.h"

char prog[]="@@> TYPE32.C : 2000/10/20 THU : COMMAND : TYPE32 : X680x0 : GCC";

// 2000/09/14	FAT32対応版
// 2000/09/20	/?時のメッセージが間違っていたので修正
// 2000/10/03	ロングファイル名対応（ライブラリのリンクし直しだけ）
// 2000/10/19	ファイル名長定数をfat32.hのそれに合わせて変更
//		ロングファイル名関数差し替えに対応（実行ファイル大幅サイズ縮小）
// 2000/12/05	FILE32のサイズが大きくなりスタックをオーバーする可能性が出てきたので
//		staticに変更した。
/*****************************************************************************/

static int fmessage,attr=FA_ARCH|FA_RONLY,fhide=0,fchar,fkbclr;
static long size,count;

/*****************************************************************************/

int type32_main(unchar *fname)
{
static FILE32 fp,ffp;
static unchar drv[MAXDRIVE32],dir[MAXDIR32],name[MAXFILE32],ext[MAXEXT32];
int c,cc,fkanji,ecode=0;
long j,cnt;
	/* ファイル名解体:drv,dir ｦ ﾄｯﾃｵｸ */
	/* ファイルネーム補正 */
	if (vfnsplit32(fname,drv,dir,name,ext,attr,&fp,0)) return(2);
	
	do {
		if ((fp.atr & FA_HIDE) && !fhide) continue;
		/* フルパス名作成：FILES/NFILESはファイル名と拡張子しか返さないから */
		strmfp30(fname,drv,dir,fp.name);
		if (fmessage) {prints(fname); crlf();}
		
		if (vfopen32(fname,"rt",&ffp)) {
			printsn("\aファイルがオープン出来ません:",fname);
			return(2);
		}
		j=0;
		cnt=count;
		while (c=fgetc32(&ffp),!feof32(&ffp) && !ferror32(&ffp)) {
			if (fkbclr && c=='\n') kbclr();
			
			fkanji=check_kanji1(c);
			if (fkanji) {
				cc=fgetc32(&ffp);
				if (feof32(&ffp)) break;
			}
			
			if (count>0) { /* 表示開始文字数指定がある時 */
				if ((--count)>0) continue;
			}
			
			printc(c);
			if (fkanji) printc(cc);
			if (fchar) kslow();
			
			if (size>0) {
				if ((++j)>=size) {
					if (fmessage) {
						prints("\n[size is over:");
						print_dec(size);
						prints("]\n");
					}
					break;
				}
			}
		}
		if (ferror32(&ffp)) {
			printsn("\aファイルが読めません:",fname);
			ecode=3;
		}
		fclose32(&ffp);
		crlf();
		count=cnt;
	} while (NVFILES32(&fp)>=0);
	return(ecode);
}

/*****************************************************************************/

void main(int argc,unchar *argv[])
{
int i,j,ret,helpflag=0;
	/* parameter check */
	/* オプションチェック初期化 */
	clear_param();
    HELP:
	if (helpcom(argc,argv,helpflag,"TYPE32","FAT32フルパス名 [Options]")) exit(helpflag? helpflag:255);
	
	/* /! = key board buffer clear mode */
	fkbclr=check_param2("!",argv,argc,0);
	
	/* 表示文字数指定 */
	if (check_param3("O",argv,argc,&size,BIT2)) {
		if (size<0) size=0;
	}
	
	/* 表示開始文字数 */
	if (check_param3("S",argv,argc,&count,BIT2)) {
		if (count<0) count=0;
	}
	
	/* filename & [size is over] message not print */
	fmessage=(!check_param2("M",argv,argc,0));
	
	/* 隠しファイル */
	if (check_param2("H",argv,argc,0)) {
		attr=FA_ARCH|FA_RONLY|FA_HIDE;
		fhide=1;
	}
	
	/* 通常ファイル */
	if (check_param2("A",argv,argc,0)) {
		attr=FA_ARCH|FA_RONLY;
		fhide=0;
	}
    	
	/* オプションチェック */
	i=check_param_error(argv,argc);
	if (i) {
		printsn("\aオプションエラーです：",argv[i]);
		exit(4);
	}
	
	fchar=check_char_device(stdout); /* 出力先がキャラクターデバイスかどうか */
	
	/* filename */
	/* "/"または"-"のついていない最初のパラメーターがfilenameになる */
	i=getfname(argc,argv,1,NULL);
	if (i==0) {
		/* help! */
		helpflag=100;
		goto HELP;
	}
	
	if (OpenUni2SJisF(argv[0])) {
		prints("Unicode関数が初期化出来ない\n");
		exit(100);
	}
	j=i;
	for (;j<argc;j++) {
		i=getfname(argc,argv,1,NULL);
		if (i==0) break;
		ret=type32_main(argv[i]);
		if (ret) break;
	}
	CloseUni2SJisF();
	exit(ret);
}

/*****************************************************************************/
