/* DIVIDE_START=sub.c */
/*
	ＮＩＦＴＹのＬＯＧ整理				sub.c
*/
#include	"catlog.h"
#include	<time.h>

/*********************************************************/
/* 下の del_tailspace 関数は<Nakatani>さんよりいただいた */
/*********************************************************/
void	del_tailspace(unsigned char *str)
{
	int		i, len;

	len= strlen( str );
	for (i = len; i > 0; i--) {
		if (*(str + i) == 0x20) {	/* 半角スペース */
			*(str + i) = '\0';		/* 1文字詰める  */
		} else if ( ( *(str + i) == 0x40 ) && ( *(str + i - 1) == 0x081 ) ) {
			/* 全角スペース */
			i--;
			*(str + i) = '\0'; /* 2文字詰める */
		} else {
			break; /* スペースで無ければ逆サーチ終了 */
		};
	};
}

int		isSearchFileSub( const char *name1 , const char *name2 )
{
	while ( *name2 ) {
		if ( *name2 == '*' )			return( YES );
		if ( *name2 != '?' ) {
			if ( *name1 != *name2 )		return( NO );
		};
		name1++;	name2++;
	};
	if ( *name1 == *name2 )				return( YES );
	return( NO );
}

static	void
isSearchFileSubCopy( const char *f_name, char *name, char *atr )
{
	if ( strlen( f_name ) > 12 ) {
		*name= *atr= '\0';		return;
	};

	while ( *f_name ) {
		if ( *f_name == '.' )	break;
		*name++ = *f_name++;
	};
	*name= '\0';
	if ( *f_name == '.' ) {
		f_name++;
		while( *f_name )	*atr++ = *f_name++;
	};
	*atr= '\0';
}

int		isSearchFile( char *f_name )
{
	int		i;
	char	name1[ 12 ] , atr1[ 4 ];
	char	name2[ 12 ] , atr2[ 4 ];

	/***********************************************/
	/* S:xxxx が設定されていない場合は全部検索する */
	/***********************************************/
	if ( maxSearchFileName == 0 )						return( TRUE );
	if ( strlen( f_name ) > 12 )						return( FALSE );

	isSearchFileSubCopy( f_name, name1, atr1 );
	for ( i=0 ; i<maxSearchFileName ; i++ ) {
		isSearchFileSubCopy( SearchFileName[i], name2, atr2 );
		if (	isSearchFileSub( name1, name2 ) == TRUE
		&&		isSearchFileSub( atr1, atr2 ) == TRUE
		) return( TRUE );
	};
	return( FALSE );
}

int		isWithoutSearchDir( const char *dir_name, const char *ff_name )
{
	int		i;
	char	str[ 128 ];

	sprintf( str, "%s%s", dir_name, ff_name );
	for ( i = 0 ; i < maxWithoutInPutPath ; i++ ) {
		if ( strcmp( ff_name, WithoutInPutPath[i] ) == 0 )	return( TRUE );
		/* フルパス指定も可能にした '93.2.7 */
		if ( strcmp( str, WithoutInPutPath[i] ) == 0 )		return( TRUE );
	};
	return( FALSE );
}

int		isWithoutSearchFile( char *f_name )
{
	int		i;
	char	name1[ 12 ] , atr1[ 4 ];
	char	name2[ 12 ] , atr2[ 4 ];

	/***********************************************/
	/* S:xxxx が設定されていない場合は全部検索する */
	/***********************************************/
	if (  max_WithoutSearchFileName == 0 )				return( NO );

	isSearchFileSubCopy( f_name, name1, atr1 );
	for ( i=0 ; i<max_WithoutSearchFileName ; i++ ) {
		isSearchFileSubCopy( WithoutSearchFileName[i], name2, atr2 );
		if (	isSearchFileSub( name1, name2 ) == YES
		&&		isSearchFileSub( atr1, atr2 ) == YES
		)												return( YES );
	};
	return( NO );
}

static	void	print_now_time_sub( int time , char *str0 )
{
	char	str1[ 20 ] , str2[ 20 ];

	sprintf(str1,"%2d",time);
	to_shift_zen_s(str1,str2);	strcat(str,str2);	strcat(str,str0);
}

void	print_now_time()
{
	struct	tm		*timeptr;
			time_t	secsnow;

	/********************************/
	/* 現在の日付をシステムから知る */
	/********************************/
	time( &secsnow );					/* 現在の時刻 */
	timeptr = localtime( &secsnow );	/* 構造体に変換 */
	strcpy( str , "\n現在の時刻は１９" );
	print_now_time_sub( timeptr->tm_year    , "年" );
	print_now_time_sub( timeptr->tm_mon + 1 , "月" );
	print_now_time_sub( timeptr->tm_mday    , "日 " );
	print_now_time_sub( timeptr->tm_hour    , "時" );
	print_now_time_sub( timeptr->tm_min     , "分" );
	print_now_time_sub( timeptr->tm_sec     ,"秒です。");
	printf("%s",str);
}

int		matchstr( const char *trg , const char *form )
{
	while ( *form ) {
		if ( *form != *trg ) {
			switch( *form ) {
				case '%':	if ( ! isdigit( *trg ) )	return( FALSE );
							break;
				case '$':	if ( ! isalpha( *trg ) )	return( FALSE );
				case '?':	break;
				default:	if ( *form != *trg )		return( FALSE );
			};
		};
		form++;		trg++;
	};
	return( TRUE );
}

int		matchLSP( const char *form )
{
	if ( LSL < strlen( form ) )			return ( FALSE );
	return( matchstr( LSP, form ) );
}

int		matchPSP( const char *form )
{
	if ( PSL < strlen( form ) )			return ( FALSE );
	return( matchstr( PSP, form ) );
}

int		matchNSP( const char *form )
{
	if ( NSL < strlen( form ) )			return ( FALSE );
	return( matchstr( NSP, form ) );
}

char	*skip_space( char *str )
{
	forever {
		if ( isspace( *str ) ) {							str++;
		} else if ( strncmp( "　" , str , 2 ) == 0 ) {		str += 2;
		} else {											return( str );
		};
	};
}

unsigned	int	id_to_int( const char *id )
{
	unsigned	int		d;

	d =              ( ( id[0] - 0x41 ) & 0x1f );
	d = ( d << 5 ) | ( ( id[1] - 0x41 ) & 0x1f );
	d = ( d << 5 ) | ( ( id[2] - 0x41 ) & 0x1f );
	d = ( d << 17 ) | ( atoi( id + 3 ) & 0x1ffff );
	return( d );
}

void	int_to_id( int num , char *id )
{
	char	str1[ 24 ] , str2[ 8 ] , *p;

	sprintf( str1 , "%5d" , num & 0x1ffff );
	file_name_space_0( str1 );
	p = str2;
	*p++ = ( ( num >> 27 ) & 0x1f ) + 0x41;
	*p++ = ( ( num >> 22 ) & 0x1f ) + 0x41;
	*p++ = ( ( num >> 17 ) & 0x1f ) + 0x41;		*p = '\0';
	strcpy( id , str2 );	strcat( id , str1 );
}

/********************************/
/* 日付情報を内部形式に変換する */
/********************************/
static	int	date_to_int_data[] = {
				12 * 31 * 24 * 60 ,		/* 年 */
				     31 * 24 * 60 ,		/* 月 */
				          24 * 60 ,		/* 日 */
				               60 ,		/* 時 */
				                1		/* 分 */
	};

static	int	date_to_int_data_sub[] = {
				1 ,		/* 年 */
				1 ,		/* 月 */
				1 ,		/* 日 */
				0 ,		/* 時 */
				0		/* 分 */
	};

int		date_to_int( char *date )
{
	int		d , i , s;

	d = s = 0;
	if (	MesNum == MAIL
	||		MesNum == ALL_MAIL
	) {
		/* 以下の判定は手抜きだ 1993.10.2 */
		if ( *date == '9' ) {		s = 0;
		} else {					s = 1;
		};
	};
	for ( i = s ; i < 5 ; i++ ) {
		d +=	(
					( *date & 0x0f ) * 10 + ( *(date + 1 ) & 0x0f )
					- date_to_int_data_sub[ i ]
				) * date_to_int_data[ i ];
		date += 2;
		if ( ! isdigit( *date ) )	break;
	};
	return( d );
}

void	int_to_date( char *date , int d )
{
	int		i , s;
	char	str1[ 24 ];

	if (	d < date_to_int_data[0]
/*	1993.10.2 コメントアウト
	||		MesNum == MAIL
	||		MesNum == ALL_MAIL
*/
	) {			s = 1;
	} else {	s = 0;
	};
	strcpy( date , "" );
	for ( i = s ; i < 5 ; i++ ) {
		s = d / date_to_int_data[ i ] + date_to_int_data_sub[ i ];
		d = d % date_to_int_data[ i ];
		sprintf( str1 , "%02d" , s );		strcat( date , str1 );
	};
	file_name_space_0( date );		/* 空白を 0 に置き換える */
}

static void	(*catlog_findfirst_sub)( const char *file , const char *ff_name );

static	int		catlog_findfirst_checkDirNameSw;
static	int		catlog_findfirst_checkFileNameSw;

static	void	catlog_findfirst_loop( const char *path )
{
			int		done;
	struct	ffblk	ffblk;
			char	f_name[ 256 ];

	ForcedEndCheck();

	if ( QuietSw != YES && catlog_findfirst_mes_sw == YES ) {
		printf("\n<%s>のファイルを処理します。", path );
	};

	strcpy( f_name , path );	strcat( f_name , "*.*" );	/* 全ﾌｧｲﾙを検索 */
	done = findfirst( f_name , &ffblk , FA_DIREC );	/* Directory を指定 */
	while ( ! done ) {
		strcpy( f_name , path );	strcat( f_name , ffblk.ff_name );
		if ( ffblk.ff_attrib == FA_DIREC ) {
			if (	strcmp( ffblk.ff_name , "." ) != 0
			&&		strcmp( ffblk.ff_name , ".." ) != 0
			&&		catlog_findfirst_no_subdir_sw == NO
			) {	/* Sub dir 再帰呼出し */
				strcat( f_name , "\\" );
				/* 1994.3.30 追加 検索から除外するディレクトリを読み飛ばす */
				if ( catlog_findfirst_checkDirNameSw == YES ) {
					if ( isWithoutSearchDir( path, ffblk.ff_name ) == FALSE ) {
						catlog_findfirst_loop( f_name );
					};
				} else {
						catlog_findfirst_loop( f_name );
				};
			};
		} else {
			/* ファイル名 */
			/* 1994.3.30 追加 検索から除外するファイルを読み飛ばす */
			strcpy( catlog_findfirst_path, path );
			if ( catlog_findfirst_checkFileNameSw == YES ) {
				if (	isWithoutSearchFile( ffblk.ff_name ) == FALSE
				&&		isSearchFile( ffblk.ff_name ) == TRUE
				) {
					(*catlog_findfirst_sub)( f_name , ffblk.ff_name );
				};
			} else {
					(*catlog_findfirst_sub)( f_name , ffblk.ff_name );
			};
		};
		done = findnext( &ffblk );
	};
}

void
catlog_findfirst(
	const char *path,
	void (*sub)( const char *file , const char *ff_name ),
	int		checkDirNameSw,
	int		checkFileNameSw
) {
	catlog_findfirst_sub = sub;
	catlog_findfirst_loop( path );
	catlog_findfirst_checkDirNameSw = checkDirNameSw;
	catlog_findfirst_checkFileNameSw = checkFileNameSw;
}

void	disp_start_check_file( const char *f_name , size_t fsize )
{
	CollectFileNumber++;
	CollectFileSize += fsize;
	mess_check {
		color( WHITE );
		printf("\n%5d <%-12s:%7ld> (%9d) → ",
			CollectFileNumber,
			f_name,
			fsize,
			CollectFileSize
		);
		if ( DisplayLogFileSw == YES ) puts("\n");
	};
	hatugen_su = 0;
}

void	disp_end_check_file( size_t fsize )
{
	AllHatsugenSu  += hatugen_su;
	mess_check {
		color( WHITE );
		printf("発言:%3d 合計:%5d個 %9ld",
			hatugen_su ,
			AllHatsugenSu ,
			fsize
		);
	};
}

void	set_catlog_file_line_1( const char *mes )
{
	strcpy( str , "-------------------------------------------------------- Resort by CATLOG\n" );
	strncpy( str , mes , strlen( mes ) - 1 );
}

/****************************************************************************
＞ 123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234
＞  1    1/08 15:09 時: ◎ＣＤＲＯＭで特許出願公開
＞  2    1/08 12:01 時: ◎松下、米ベンチャー企業に出資
*****************************************************************************/
void	set_hatsugen_date_clip( char *ptr )
{
	char	*p1 , *p2;

	p1 = HatsugenDate;								/* 発言の日付 */
	p2 = ptr + 6;	*p1++ = *p2++; *p1++ = *p2++;	/* month */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* date */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* time */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* minutes */
	*p1 = '\0';
}

void	set_hatsugen_date_forum( char *ptr )
{
	char	*p1 , *p2;

/*           1         2         3         4                           */
/* 0123456789 123456789 123456789 123456789 1234567                    */
/* ( 1)   92/09/18 14:05                     コメント数：1             */
/* ( 1)   92/09/18 14:16  00001へのコメント  コメント数：1             */
	p1 = HatsugenDate;
	p2 = ptr + 7;	*p1++ = *p2++; *p1++ = *p2++;	/* year */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* month */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* date */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* time */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* minutes */
	*p1 = '\0';
}

void	set_hatsugen_date_mail( char *ptr )
{
	int		i, cnt;
	char	*trg;

/*           1         2         3         4                           */
/*  123456789 123456789 123456789 123456789 12                         */
/*  1  山本　年秀　　　  NAA02244  05/05 13:12                         */
	trg = HatsugenDate;								/* 発言の日付 */
	if ( *(ptr+32) == ' ' ) {		ptr += 40;	cnt = 5;
	} else {						ptr += 32;	cnt = 4;
	};
	for( i=0; i<cnt; i++ ) {
		*trg++ = *ptr++;		*trg++ = *ptr++;		ptr++;
	};
	*trg = '\0';
}

void	set_hatsugen_date_hp( char *ptr )
{
	char	*p1 , *p2;

/*           1         2         3         4                           */
/*  123456789 123456789 123456789 123456789 123456789 123456789        */
/* 001  [92/05/04 16:00]  NAA02244      オープンしました               */
	p1 = HatsugenDate;								/* 発言の日付 */
	p2 = ptr +  6;	*p1++ = *p2++; *p1++ = *p2++;	/* year */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* month */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* date */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* time */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* minutes */
	*p1 = '\0';
}

void	set_hatsugen_date_bill( char *ptr )
{
	char	*p1 , *p2;

	p1 = HatsugenDate;							/* 発言の日付 */
	p2 = ptr;	*p1++ = *p2++; *p1++ = *p2++;	/* year */
	p2++;		*p1++ = *p2++; *p1++ = *p2++;	/* month */
	*p1 = '\0';
}

void	set_hatsugen_date_lib( char *ptr )
{
	char	*p1 , *p2;

/****************************************************************************
＞          1         2         3         4         5
＞ 123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234
＞ 343  NAA02244 92/06/08   57903   19 B CATLOG06.EXE NIFTY通信ログ編集ﾌﾟﾛｸﾞﾗﾑ
*****************************************************************************/
	p1 = HatsugenDate;							/* 発言の日付 */
	p2 = ptr+15;	*p1++ = *p2++; *p1++ = *p2++;	/* year */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* month */
	p2++;			*p1++ = *p2++; *p1++ = *p2++;	/* date */
	*p1 = '\0';
}

int		isCollectID( const char *str )
{
	int		i;

	for ( i=0 ; i<max_collect_ID ; i++ ) {
		if ( strncmp( CollectIds[ i ] , str , 8 ) ==0 ) {	/* 一致 */
			strcpy( CollectId , CollectIds[ i ] );
			MesNum = COLLECT_ID;
			return( i );
		};
	};
	return( -1 );
}

int		isIDname( const char *str )
{
	if ( strlen( str ) != 8 )									return( NO );
	if ( matchstr(str, "$$$%%%%" ) == FALSE )					return( NO );
	return( YES );
}

char	*last_yen( char *str )
{
	char	*result;

	result = str;
	while ( *str ) {	if ( *str == '\\' ) result = str;
						str++;
	};
	return( result );
}

const	char	*last_comma( const char *str )
{
	const	char	*result;

	result = (char *)str;
	while ( *str ) {	if ( *str == '.' ) result = str;
						str++;
	};
	return( result );
}

void	get_mes_now_number( char *str , char *now )
{
	char	*p1;

	if ( *(str+3) == '/' ) {
		p1 = str + 4;	/* xxx/xxx の行 */
		*now++ = *p1++;	*now++ = *p1++;	*now++ = *p1++;
	} else if ( *( str + 5 ) == '/' ) {
		p1 = str + 6;	/* xxxxx/xxxxx の行 */
		*now++ = *p1++;	*now++ = *p1++;	*now++ = *p1++;
		*now++ = *p1++;	*now++ = *p1++;
	};
	*now = '\0';
}

/************************************************************************/
/*                                                                      */
/* フォーラムの入口からフォーラム名を取り出す                           */
/*                                                                      */
/************************************************************************/
static	int		isMtlinkInputLine( char *psp, char *nsp )
{
	if ( matchstr( psp,"メーテルリンク  トップメニュー  TOP"
		) == TRUE
	&&	matchstr( nsp, " 1. ご案内                  (YOMU)       2. 電子メール"
		) == TRUE
	)														return( TRUE );

/*
		"　「メーテル広場」は、会員の方のコミュニケーションのための広場です。"
		"　初めての方は、【自己紹介の部屋】で自己アピールをどうぞ！"
*/
	if ( matchstr( psp,
		"　「メーテル広場」は、会員の方のコミュニケーションのための広場です。"
		) == TRUE
	&&	matchstr( nsp,
		"　初めての方は、【自己紹介の部屋】で自己アピールをどうぞ！"
		) == TRUE
	)														return( TRUE );
	return( FALSE );
}

int		get_forum_name_last_str( )
{
	int		sw;
	char	*p1, *p2;

	/* 1993.11.28 ２つのフォーラム名に対応 */
	*ForumName2= '\0';

	if ( matchstr( LSP, "＜練習・質問コーナー＞" ) == TRUE ) {
		strcpy( ForumName , "BEGIN" );
		return( TRUE );
	};

	if ( isMtlinkInputLine( PSP, NSP ) == TRUE ) {
		strcpy( ForumNameLine, "＜メーテル広場＞    HIROBA" );
		strcpy( ForumName , "HIROBA" );
		return( TRUE );
	};

	p1 = LSP;	sw = FALSE;
	while ( *p1 ) {
		if(p1[0]==' ' && p1[1]==' ' && p1[2]==' ' && p1[3]==' ' ) {
			sw = TRUE;	break;
		};
		p1++;
	};
	if ( sw == FALSE )										return( FALSE );

	p1 += 4;	p2= ForumName;
	while ( isalnum( *p1 ) ) *p2++ = *p1++;
	*p2= '\0';

	/* 1993.11.28 ２つのフォーラム名に対応 */
	if ( *p1 == ' ' ) {
		p1 += 4;
		p2= ForumName2;
		while ( isalnum( *p1 ) ) *p2++ = *p1++;
		*p2= '\0';
	};

	return( TRUE );
}

/************************************************************************/
/*                                                                      */
/* - Fxxxx からフォーラム名を取り出す                                   */
/* - FTOWNS1  MES(18):通信ソフトについて(３) 92/04/25 -                 */
/*                                                                      */
/************************************************************************/
void	get_forum_name( char *str , char *forumName )
{
	if ( matchstr( str, "−会議室?%" ) != TRUE ) {
		str += 10;
		while ( isalnum( *str ) ) *forumName++ = *str++;
	};
	*forumName = '\0';
}

/************************************************************************/
/*                                                                      */
/* - Fxxxx から会議室番号を取り出す                                     */
/* - FTOWNS1  MES(18):通信ソフトについて(３) 92/04/25 -                 */
/*                                                                      */
/************************************************************************/
int	get_mes_num_from_forum_name_line( char *str )
{
	str += 2;
	while ( isalnum( *str ) ) str++;	/* FTOWNS1 */
	str= skip_space( str );
	while ( isalpha( *str ) ) str++;	/* MES */
	if ( *str != '(' )	return( 0 );	/* 不明 */
	str++;
	return( atoi( str ) );
}

/****************************************************************************
＞          1         2         3         4         5
＞ 123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234
＞ 343  NAA02244 92/06/08   57903   19 B CATLOG06.EXE NIFTY通信ログ編集ﾌﾟﾛｸﾞﾗﾑ
*****************************************************************************/
int	isLIBLine()
{
	if (	matchPSP(
				"???%  $$$%%%%% %%/%%/%% ??????% ???% ? ?"
			) == FALSE
	)															return( NO );
	/* type */
	if (	PSP[37] != 'T'
	&&		PSP[37] != 'B'
	&&		PSP[37] != 'N'
	)															return( NO );
	return( YES );
}

int	isLIBFirstLine()
{
	if(matchPSP("データライブラリ (1:データ一覧  2:検索")==TRUE) return(YES);
	return( NO );
}

/***********************************************************************/
/*                                                                     */
/*      フォーラムの入口の行？                                         */
/*                                                                     */
/*           1         2         3         4                           */
/*  123456789 123456789 123456789 123456789 12345                      */
/* 1:お知らせ            2:掲示板      3:電子会議                      */
/*                                                                     */
/***********************************************************************/
int		isMesInputLine( )
{
	if (	matchPSP("?:お知らせ            ?:掲示板      ?:電子会議"
			) == TRUE
	&&		matchNSP("?:データライブラリ    ?:会員情報    ?:リアルタイム会議"
			) == TRUE
	)															return( YES );
	if ( isMtlinkInputLine( PSP, NSP ) == TRUE )				return( YES );
	return( NO );
}

/*********************************************************/
/*                                                       */
/*      ﾌｫｰﾗﾑ名の行？                                    */
/*                                                       */
/* - FTOWNS1  MES(18):通信ソフトについて(３) 92/04/25 -  */
/*                                                       */
/*********************************************************/
static	int		isMesForumNameLine_sub( char *str , int len )
{
	char	*p1;

	if ( len < 14 )												return( NO );

					/*    123456789 */
	if ( matchstr( str, "−会議室?%  " ) == TRUE )				return( YES );

	/********************************************/
	/* F で始まらないフォーラムへも対応 92.7.17 */
	/********************************************/
	if ( strncmp( str,"- ",2) !=0 )								return( NO );

	p1 = str + 2;

	/* フォーラム名 : 英数字 ? */
	while ( isalnum( *p1 ) ) p1++;

	/* 2つの空白 */
	if ( *p1++ != ' ' )											return( NO );
	if ( *p1++ != ' ' )											return( NO );

	/* - FTOWNS1  MES( 3): */
	if ( matchstr( p1, "MES(?%):" ) == FALSE )					return( NO );

	return( YES );
}

int		isMesForumNameLineNext()
{
	return( isMesForumNameLine_sub( NSP , NSL ) );
}

int		isMesForumNameLine()
{
	return( isMesForumNameLine_sub( PSP , PSL ) );
}

/***********************************************************************/
/*                                                                     */
/*      isMesHyoudaiLine( char *str ) 発言の表題の行？                 */
/*                                                                     */
/*           1         2         3         4                           */
/* 0123456789 123456789 123456789 123456789 1234567                    */
/* 000/000   NAA02244  飛雪              最近の楽しみ                  */
/* 000/000   NAA02244  1 2 3 4 5 6 7 8   最近の楽しみ                  */
/* 000/000   ********                    SYSOP 削除                    */
/* 00001/00011 NAA02244  飛雪             MESを選択後、時間がかかります */
/* 00002/00011 NAA02244  飛雪             正常だったのか               */
/* ( 1)   92/09/18 14:05                     コメント数：1             */
/* ( 1)   92/09/18 14:16  00001へのコメント  コメント数：1             */
/*                                                                     */
/***********************************************************************/
static	int		isMesHyoudaiLine_sub( char *str , int len )
{
					/* 発言の表題が異なる場合があるので修正 ↓ */
	if ( matchstr( str,"%%%/%%%   $$$%%%%%  ???????????????? ??")==TRUE )
			return( YES );
	if ( matchstr( str,"%%%/%%%   ********                   ??")==TRUE )
			return( YES );
	if ( matchstr( str,"%%%%%/%%%%% $$$%%%%%  ???????????????? ?")==TRUE )
			return( YES );
	if ( matchstr( str,"%%%%%/%%%%% ********                   ?")==TRUE )
			return( YES );
	return( NO );
}

int		isMesHyoudaiLineNext()
{
	return( isMesHyoudaiLine_sub( NSP , NSL ) );
}

int		isMesHyoudaiLine()
{
	return( isMesHyoudaiLine_sub( PSP , PSL ) );
}

/***********************************************************************/
/*                                                                     */
/*      isMesSecondLine( ) 会議室番号の行？                            */
/*                                                                     */
/*           1         2         3         4                           */
/*  123456789 123456789 123456789 1234567                              */
/* ( 1)   89/04/13 20:39  006へのコメント                              */
/* ( 1)   92/09/18 14:05                     コメント数：1             */
/* ( 2)   92/05/04 03:20                                               */
/*                                                                     */
/***********************************************************************/
int		isMesSecondLine()
{
	if ( matchNSP( "(?%)   %%/%%/%% %%:%%" ) == TRUE )			return( YES );
	if ( matchNSP( "       %%/%%/%% %%:%%" ) == TRUE )			return( YES );
	return( NO );
}

/***********************************************************************/
/*                                                                     */
/*      isHPFirstLine( char *str ) ＨＰの１行目？                      */
/*                                                                     */
/*           1         2         3         4                           */
/*  123456789 123456789 123456789 123456789 123456789 123456789        */
/* 001  [92/05/04 16:00]  NAA02244      オープンしました               */
/*                                                                     */
/***********************************************************************/
int	isHPFirstLine()
{
	if(matchPSP("%%%  [%%/%%/%% %%:%%]  $$$%%%%%      ?")==FALSE)	return(NO);
	return( YES );
}

int	isHPEnd()
{
	char	*p;

	if ( PSL < 3 )												return( NO );
	if ( isHPFirstLine() == YES )								return( YES );
	if ( strncmp( PSP , "HP>" , 3 ) == 0 ) {
		/* HP> : end 条件に入れることは問題があるかもしれない */
		if ( PSL == 3 )		return( YES );
		p = PSP + 3;
		if (	PSL >= 6
		&&		(	strncmp( p , "GO " , 3 ) == 0
				||	strncmp( p , "go " , 3 ) == 0
				||	strncmp( p , "MOV" , 3 ) == 0
				)
		)														return ( YES );
	};
/*
	if ( strncmp( PSP,"HP>MOV", 6 ) == 0 )						return( YES );
*/
	/* 1993.8.9 以下の文字列を追加した */
					/*123456789 123456789 123*/
	if ( strncmp(PSP,"ID (改行のみ：自分のHP)",23) == 0 )		return( YES );
	return( NO );
}

/*****************************************/
/*      ＰＡＴＩＯの１行目？             */
/*****************************************/
int		isPATIOFirstLine()
{
	if (	isMesHyoudaiLine() == YES
	&&		*( PSP + 5 ) == '/'		/* 新形式の発言形式だけに */
	&&		isMesSecondLine() == YES
	)										return( YES );
	return( NO );
}

int		isPATIOEnd()
{
	char	*p;

	if ( PSL < 9 )										return( NO );

/*
 0123456789
>PATIO(N)>
*/
	if ( isPATIOFirstLine() == YES )					return( YES );

	/* 1994.3.30 追加 ちょっと乱暴だが……… */
	if ( matchPSP( "PATIO(?)>" ) == TRUE )				return( YES );

	if ( matchPSP( "PATIO(?)>" ) == TRUE
	&&		(	*( PSP + 6 ) == 'R'
			||	*( PSP + 6 ) == 'N'
			||	*( PSP + 6 ) == 'C'
			)
	) {
		/* PATIO(?)> : end 条件に入れることは問題があるかもしれない */
		if ( PSL == 9 )								return( YES );
		p = PSP + 9;
		if (	PSL > 12
		&&		(	strncmp( p , "GO " , 3 ) == 0
				||	strncmp( p , "go " , 3 ) == 0
				||	strncmp( p , "MOV" , 3 ) == 0
				)
		)	return( YES );
		if (matchstr(p,"−これ以上の発言はありません−")==TRUE)	return( YES );
	};
	/* 1993.8.9 追加 */
	if ( matchPSP("ID (改行のみ：自分のパティオ)")==TRUE)		return( YES );
	/* 1994.3.30 追加 */
	if (matchPSP( "−これ以上の発言はありません−")==TRUE)		return( YES );
	return( NO );
}

/***********************************************/
/*      Ｍａｉｌの１行目？                     */
/*           1         2         3         4   */
/*  123456789 123456789 123456789 123456789 12 */
/*  1  山本　年秀　　　  NAA02244  05/05 13:12 */
/*  2 #飛雪              NAA02244  06/02 21:56 */
/***********************************************/
int	isMailFirstLine()
{
			/*       #123456789 123456  NAA02244  05/05 13:12 */
	if (matchPSP("?% ?????????????????  $$$%%%%%  %%/%% %%:%%")!=TRUE
			/*       #123456789 123456  NAA02244          93/05/05 13:12 */
	&&	matchPSP("?% ?????????????????  $$$%%%%%          %%/%%/%% %%:%%")
			!=TRUE
	) {
		return( NO );
	};
	if ( matchNSP( "    題名：" ) == FALSE )	return( NO );
	return ( YES );
}

int	isMailEnd()
{
	if ( isMailFirstLine() == YES )					return( YES );
	if ( matchPSP( "受信後 (1:削除" ) == TRUE )		return( YES );
	return( NO );
}

/********************************/
/* 会議室の終了時に現れる文字列 */
/********************************/
int	isMesEnd()
{
	if ( PSL == 0 )								return( NO );

	if ( isMesInputLine() == YES )				return( YES );

	/* - FTOWNS1 : ﾌｫｰﾗﾑ名  */
	if ( isMesForumNameLine() == YES )		 	return( YES );

	/* 発言の表題の行 */
	if ( isMesHyoudaiLine() == YES )			return( YES );

	/*           123456789 123456 */
	IFPStrEqu3( "電子会議 (1:発言" , 16 )		return( YES );
	IFPStrEqu3( "電子会議 (1:コメ" , 16 )		return( YES );
	IFPStrEqu3( "電子会議 (改行の" , 16 )		return( YES );
	IFPStrEqu3( "＞◆次頁はありません◆",22)	return( YES );
	IFPStrEqu3(   "◆次頁はありません◆",20)	return( YES );

	/* 下の命令は <Nakatani> さんより教えていただいた */
	if	( *(int *)PSP == 0x0a0d0820 )			return( YES );

	IFPStrEqu3("*****log整理",12)				return( YES );

	return( NO );
}

/*************************************************************************/
/*************************************************************************/
/*************************************************************************/

int	get_digit( char *str )
{
	int	d;

	d = 0;
	str= skip_space( str );
	while ( *str ) {
		while ( isdigit( *str ) ) {
			d = d * 10 + ( *str - '0');
			str++;
		};
		if ( *str != ',' ) break;
		str++;
	};
	return( d );
}

void	without_crlf(char *str)
{
	while( *str ) {
		if ( *str=='\n' ) {		*str='\0';		return;		};
		str++;
	};
}

extern	int		answer_all_sw;
extern	int		AnswerSw;

int		get_yesno()
{
	int c;

	if ( answer_all_sw == YES )	return( AnswerSw );

	forever {
		c=_dos_keyboard_input_without_echo();
		switch (c) {
			case 'y':
			case 'Y':
			case 0x0d:		/* 改行キー */
			case 'ﾖ':
			case 'ﾗ':
			case 0x12:		/* 実行キー */
				return(YES);
			case 'n':
			case 'N':
			case ' ':
			case 'ﾒ':
			case 'ﾇ':
			case 0x11:		/* 取消キー */
				return(NO);
		};
	};
}

int	get_yesno_mes()
{
	if ( get_yesno()==YES ) {
		printf("ＹＥＳ\n");	return(YES);
	} else {
		printf("ＮＯ\n");	return(NO);
	};
}

static	int	kanamoji[]={
	/* 0xa0 - 0xaf */
	0x2121,	0x2123,	0x2156,	0x2157,	0x2122,	0x2126,
	0x2572,	0x2521,	0x2523,	0x2525,	0x2527,	0x2529,
	0x2563,	0x2565,	0x2567,	0x2543,
	/* 0xb0 - 0xbf */
	0x213d,	0x2522,	0x2524,	0x2526,	0x2528,	0x252a,
	0x252b,	0x252d,	0x252f,	0x2531,	0x2533,	0x2535,
	0x2537,	0x2539,	0x253b,	0x253d,
	/* 0xc0 - 0xcf */
	0x253f,	0x2541,	0x2544,	0x2546,	0x2548,	0x254a,
	0x254b,	0x254c,	0x254d,	0x254e,	0x254f,	0x2552,
	0x2555,	0x2558,	0x255b,	0x255e,
	/* 0xd0 - 0xdf */
	0x255f,	0x2560,	0x2561,	0x2562,	0x2564,	0x2566,
	0x2568,	0x2569,	0x256a,	0x256b,	0x256c,	0x256d,
	0x256f,	0x2573,	0x212b,	0x212c
};

static	int	asciimoji1[]={	/* !"#$%&'()*+,-./  */
	0x2121,	0x212a,	0x2149,	0x2174,	0x2170,	0x2173,
	0x2175,	0x212d,	0x214a,	0x214b,	0x2176,	0x215c,
	0x2124,	0x215d,	0x2125,	0x213f
};

static	int	asciimoji2[]={	/* :;<=>? */
	0x2127,	0x2128,	0x2163,	0x2161,	0x2164,	0x2129
};

static	int	asciimoji3[]={	/* [\]^_ */
	0x214c,	0x216f,	0x214d,	0x2130,	0x2132
};

static	int	asciimoji4[]={	/* {|}~ */
	0x2150,	0x2143,	0x2151,	0x2131
};

int	to_jis_zen( int c )	/* JIS の全角コードに変換する */
{
	if ( isalnum(c) ) return(0x2300+c);	/* '0'-'9' 'A'-'Z' 'a'-'z' */
	if ( (0x20<=c) && (c<=0x2f) ) return( asciimoji1[c-0x20] );
	if ( (0x3a<=c) && (c<=0x3f) ) return( asciimoji2[c-0x3a] );
	if ( (0x5b<=c) && (c<=0x5f) ) return( asciimoji3[c-0x5b] );
	if ( (0x7b<=c) && (c<=0x7f) ) return( asciimoji4[c-0x7b] );

	if ( c=='`' ) return(0x212e);
	if ( 0xa0<=c && c<=0xdf ) return( kanamoji[c-0xa0] );
	return(c);
}

static	void	int86_af(union REGS *inregs , union REGS *outregs)
{
	asm volatile(
		"movw %0,%%ax ; movw %1,%%bx ; movw %2,%%cx ; movw %3,%%dx
		int  $0xaf"
	: :	"g"(inregs->x.ax),"g"(inregs->x.bx),"g"(inregs->x.cx),
		"g"(inregs->x.dx)
	: "ax","bx","cx","dx" );
	asm volatile(
		"movw %%ax,%0 ; movw %%bx,%1 ; movw %%cx,%2 ; movw %%dx,%3"
	:	"=g"(outregs->x.ax),"=g"(outregs->x.bx),"=g"(outregs->x.cx),
		"=g"(outregs->x.dx)
	: : "ax","bx","cx","dx" );
}

static	union	REGS	inregs,outregs;
int	jis_shift( int c )	/* ＪＩＳ　→　シフト・ＪＩＳ変換 */
{
	inregs.x.dx = c;
	inregs.h.ah = 0x00;
	int86_af( &inregs , &outregs );
	c = outregs.x.dx;
	return( c );
}

int	to_shift_zen( int c )	/* SHIFT_JIS の全角コードに変換する */
{
	int	c0;

	if ( c == ' ' )		return( 0x08140 );
	if ( isalnum( c ) )	return( 0x0821f + c );
	c0=to_jis_zen(c);
	if ( c0!=c )		return( jis_shift(c0) );
	return(c);
}

void	to_shift_zen_s( const char *src , char *targ )
{
	int	c;

	while ( ( c = *src++ ) ) {
		c = to_shift_zen( c );
		*targ++ = ( c >> 8 ) & 0xff;
		*targ++ = c & 0xff;
	};
	*targ = '\0';
}

char	*touppers( char *str0 )		/* 文字列を大文字に変換する */
{
	char	*p;

	p = str0;
	while ( *p ) {
		if ( iskanji( *p ) ) {			p++;
		} else {						*p = toupper( *p );
		};
		p++;
	};
	return( str0 );
}

/* DIVIDE_END */
