/*
		log text check (title, log)
					1993.6.27 v1.0
					1994.8.15 v1.1.(delimitter & hp process)
					1994.10.30 v1.2.(mail & bbs message process)
					copyright Y.Ouchi

			in		*log  : input log text
					leng  : log length
					**title: title charactor save area
					*intext: analized result
					*disptextn : display text no array

*/

#include	<stdio.h>
#include	<string.h>
#include	<stdlib.h>
#include	"egb.h"
#include	"mos.h"
#include	"bb.h"
#include	"logcheck.h"

		/* external variable */
extern	char	egbwork[1536];
extern	int		max_content;
extern	int		max_title;
extern	int		max_textn;

		/* common static variable */
static	int		textcheckflag;		/* text analize state flag */
static	int		delim_flag;			/* delimitter exist flag */
static	int		nowpt,lastpt;		/* log analizing pointer */
static	int		textno;				/* analized text number */
static	int		headflag;			/* line head state flag */

		/* 外部関数宣言 */
extern	void	linedsp(int, int, char *);
extern	void	mesout(int);
extern	void	box(int, int, int, int, int, int);
extern	int		crfind(int, char *, int *, int *);
extern	int		crbsfind(int, char *, int *, int *);
extern	int		bsfind(int, char *, int *, int *);

		/* 関数プロトタイプ宣言 */
		int		mescheck(unsigned char *, int, text_content *);
		int		titlecheck(unsigned char *, int, title_content *);
		int		hptitlecheck(unsigned char *, int, title_content *);
		void	last_close(struct logcontent *);
		int		headsearch(unsigned char*, int);
		int		mailbbscheck(unsigned char *, int, text_content *);


int		logcheck(unsigned char *log, int leng, char **title,
							struct logcontent *intext, short *disptextn)
{
	int		j,k=0;
	int		endcode=0;
	int		titleno=0;
	char	*waitmes={"now analizing text"};
	int		lleng,npos;
	text_content	textcheckresult;
	title_content	titlecheckresult;

		/* log file check */

			/* message display */
	MOS_setpos(320,200);
	MOS_sysIcon(82,16,16,0);
	MOS_color(0,15);
	MOS_disp(1);
	EGB_writePage(egbwork,0);
	box(220,250,420,270,ARROW_COL,0);
	EGB_color(egbwork,0,TEXT_COL);
	linedsp(248,290,waitmes);

			/* head text initial data set */
	textno=0;
	delim_flag=0;
	lastpt=0;
	nowpt=0;
	textcheckflag=NOT_CHECK;

	if (log[0]==0x2d && log[1]==0x20) headflag=3;
	else {
		if (log[0]<=0x39 && log[0]>=0x30) headflag=1;
		else {
			intext->text[textno].text.pos=0;
			intext->text[textno].text.id=NOTITLE_TEXT_ID;
			intext->text[textno].text.leng=0;
			intext->text[textno].text.com_lvl=0;
			intext->text[textno].text.title_index=-1;
			crfind(leng,(char *)&log[0],&lleng,&npos);
			intext->text[textno].text.lleng=lleng;
			textcheckflag=NOTITLE_CK;
			headflag=-1;
		}
	}

		/* text check loop */
	while(nowpt<leng){
		if (headflag==-1) headflag=headsearch(log,leng);
		switch ( headflag ){
			case CR_NUM:			/* cr+number */
			case BS_NUM:			/* bs+number */
				switch ( mescheck (log,leng,&textcheckresult) ){
					case 0:		/* 3_digit message */
						last_close(intext);
						intext->text[textno].text=textcheckresult;
						intext->text[textno].text.title_index=titleno-1;
						textcheckflag=MES_CK;
						break;
					case 1:		/* 5_digit message */
						last_close(intext);
						intext->text[textno].text=textcheckresult;
						intext->text[textno].text.title_index=titleno-1;
						textcheckflag=MES_CK;
						break;
					case 2:		/* home party message */
						last_close(intext);

						intext->text[textno].text=textcheckresult;
						intext->text[textno].text.title_index=titleno-1;
						textcheckflag=HPMES_CK;
						break;
					case -1:	/* no message */
					case -2:	/* abnormal end (log end) */
						break;
				}
				headflag=-1;
				break;

			case CR_MINUS:		/* cr+'-' */
			case BS_MINUS:		/* bs+'-' */
				headflag=titlecheck(log,leng,&titlecheckresult);
				if (headflag>=0){
					/* title found process */
					last_close(intext);

					intext->text[textno].title=titlecheckresult;
					intext->text[textno].title.index=titleno;
					lleng=titlecheckresult.lleng;
					for (j=0;j<lleng;j++)
						title[titleno][j]=log[titlecheckresult.pos+j];
					title[titleno][j]=0x00;
					titleno++;
					textno++;
					if (headflag==0) headflag=-1;
				}
				break;

			case HP_HEAD:		/* home party head */
				headflag=hptitlecheck(log,leng,&titlecheckresult);
				if (headflag>=0){
					/* home party title found process */
					last_close(intext);

					intext->text[textno].title=titlecheckresult;
					intext->text[textno].title.index=titleno;
					lleng=titlecheckresult.lleng;
					for (j=0;j<lleng;j++)
						title[titleno][j]=log[titlecheckresult.pos+j];
					title[titleno][j]=0x00;
					titleno++;
					textno++;
					if (headflag==0) headflag=-1;
				}
				break;

			case CR_ETC_NUM:		/* cr+?+number */
				switch ( mailbbscheck (log,leng,&textcheckresult) ){
					case 0:		/* mail message */
						last_close(intext);
						intext->text[textno].text=textcheckresult;
						intext->text[textno].text.title_index=-2;
						textcheckflag=MAIL_CK;
						break;
					case 1:		/* BBS message */
						last_close(intext);
						intext->text[textno].text=textcheckresult;
						intext->text[textno].text.title_index=-3;
						textcheckflag=BBSMES_CK;
						break;

					case -1:	/* no message */
					case -2:	/* abnormal end (log end) */
						break;
				}

				headflag=-1;
				break;

			case END_PTN:		/* end charactor found */
				last_close(intext);
				intext->text[textno].text.pos=nowpt;
				intext->text[textno].text.id=NOTITLE_TEXT_ID;
				intext->text[textno].text.leng=0;
				intext->text[textno].text.com_lvl=0;
				intext->text[textno].text.title_index=-1;
				textcheckflag=NOTITLE_CK;
				headflag=-1;

				break;

			case TEXT_END:		/* text end */
				break;
		}

			/* display analisys posision */
		if (nowpt-k>1000){
			box(220,250,(220+(nowpt*200/leng)),270,ARROW_COL,1);
			k=nowpt;
		}

/*		printf("textno= %d\ntitleno= %d\n",textno,titleno); */

		if (textno>max_content-2){
			mesout (TEXTNO_ERROR);
			MOS_end( );
			exit (1);
		}

		if (titleno>max_title-2){
			mesout (TITLENO_ERROR);
			MOS_end( );
			exit (1);
		}

	}

	last_close(intext);
	intext->maxtext=textno;
	for (j=0;j<textno;j++) disptextn[j]=j;
	max_textn=textno;

	MOS_sysIcon(170,0,0,0);
	MOS_disp(0);
	MOS_color(0,ARROW_COL);
	EGB_color(egbwork,0,BACK_COL);
	EGB_clearScreen(egbwork);
	EGB_color(egbwork,0,TEXT_COL);

	if (textno>0) endcode=1;
	else endcode=0;

	return (endcode);
}

/*
	message check
		(called when first charactor of line is number)
			in		log  : text
					leng : text length
			out		return 0 : forum message found (3_digit number)
						   1 : forum message found (5_digit number)
						   2 : home party message found
						   -1: not message
						   -2: abnormal end (log end)
					result : check result (if check ok)
*/
int		mescheck (unsigned char *log, int leng, text_content *result)
{
	int		endcode;
	int		crno,lleng,npos;

	endcode=-1;

	crno=crfind(leng-nowpt,(char *)&log[nowpt],&lleng,&npos);
	if (crno==0 || npos==0){
		lastpt=leng;
		nowpt=leng;
		return(-2);
	}
	if (lleng>79){
		nowpt=nowpt+npos;
		return(-1);
	}

	if (log[nowpt+3]==0x2f){
		if (log[nowpt+1]<=0x39 && log[nowpt+1]>=0x30
			&& log[nowpt+2]<=0x39 && log[nowpt+2]>=0x30
			&& log[nowpt+4]<=0x39 && log[nowpt+4]>=0x30
			&& log[nowpt+5]<=0x39 && log[nowpt+5]>=0x30
			&& log[nowpt+6]<=0x39 && log[nowpt+6]>=0x30){

			/* 3_digit number + '/' + 3_digit number found */
			if (log[nowpt+npos]!=0x28 || log[nowpt+npos+3]!=0x29){
				nowpt=nowpt+npos;
				return (-1);
			}

			result->text_no=(log[nowpt]-0x30)*100+
							(log[nowpt+1]-0x30)*10+
							(log[nowpt+2]-0x30);
			if (log[nowpt+npos+1]==0x20){
				if (log[nowpt+npos+2]<=0x39 && log[nowpt+npos+2]>=0x30)
					result->mes_no=log[nowpt+npos+2]-0x30;
				else result->mes_no=0;
			}
			else{
				if (log[nowpt+npos+1]<=0x39 && log[nowpt+npos+1]>=0x30
					&& log[nowpt+npos+2]<=0x39 && log[nowpt+npos+2]>=0x30){
					result->mes_no=(log[nowpt+npos+1]-0x30)*10+
									log[nowpt+npos+2]-0x30;
				}
				else result->mes_no=0;
			}

			if (log[nowpt+npos+23]!=0x20){
				if (log[nowpt+npos+23]<=0x39 && log[nowpt+npos+23]>=0x30
					&& log[nowpt+npos+24]<=0x39 && log[nowpt+npos+24]>=0x30
					&& log[nowpt+npos+25]<=0x39 && log[nowpt+npos+25]>=0x30){
					result->com_no=(log[nowpt+npos+23]-0x30)*100
									+(log[nowpt+npos+24]-0x30)*10
									+(log[nowpt+npos+25]-0x30);
					result->id=TEXT3C_ID;
				}
				else{
					result->com_no=0;
					result->id=TEXT3_ID;
				}
			}
			else{
				result->com_no=0;
				result->id=TEXT3_ID;
			}

			result->pos=nowpt;
			result->leng=0;
			result->com_lvl=0;
			result->lleng=lleng;

			nowpt=nowpt+npos;
			endcode=0;
		}

		else{
			nowpt=nowpt+npos;
			return (-1);
		}
	}
		/* not 3_digit message */
	else{
		if (log[nowpt+5]==0x2f){
			if (log[nowpt+1]<=0x39 && log[nowpt+1]>=0x30
				&& log[nowpt+2]<=0x39 && log[nowpt+2]>=0x30
				&& log[nowpt+3]<=0x39 && log[nowpt+3]>=0x30
				&& log[nowpt+4]<=0x39 && log[nowpt+4]>=0x30
				&& log[nowpt+6]<=0x39 && log[nowpt+6]>=0x30
				&& log[nowpt+7]<=0x39 && log[nowpt+7]>=0x30
				&& log[nowpt+8]<=0x39 && log[nowpt+8]>=0x30
				&& log[nowpt+9]<=0x39 && log[nowpt+9]>=0x30
				&& log[nowpt+10]<=0x39 && log[nowpt+10]>=0x30 ){

			/* 5 digit number + '/' + 5_digit number found */
				if (log[nowpt+npos]!=0x28 || log[nowpt+npos+3]!=0x29){
					nowpt=nowpt+npos;
					return (-1);
				}

				result->text_no=
						(log[nowpt]-0x30)*10000+(log[nowpt+1]-0x30)*1000+
						(log[nowpt+2]-0x30)*100+(log[nowpt+3]-0x30)*10+
						(log[nowpt+4]-0x30);
				if (log[nowpt+npos+1]==0x20){
					if (log[nowpt+npos+2]<=0x39 && log[nowpt+npos+2]>=0x30){
						result->mes_no=log[nowpt+npos+2]-0x30;
					}
					else result->mes_no=0;
				}
				else{
					if (log[nowpt+npos+1]<=0x39 && log[nowpt+npos+1]>=0x30
						&& log[nowpt+npos+2]<=0x39 && log[nowpt+npos+2]>=0x30)
						result->mes_no=
							(log[nowpt+npos+1]-0x30)*10+log[nowpt+npos+2]-0x30;
					else result->mes_no=0;
				}

				if (log[nowpt+npos+23]!=0x20){
					if (log[nowpt+npos+23]<=0x39 && log[nowpt+npos+23]>=0x30
					&& log[nowpt+npos+24]<=0x39 && log[nowpt+npos+24]>=0x30
					&& log[nowpt+npos+25]<=0x39 && log[nowpt+npos+25]>=0x30
					&& log[nowpt+npos+26]<=0x39 && log[nowpt+npos+26]>=0x30
					&& log[nowpt+npos+27]<=0x39 && log[nowpt+npos+27]>=0x30){
						result->com_no=
							(log[nowpt+npos+23]-0x30)*10000+
								(log[nowpt+npos+24]-0x30)*1000+
								(log[nowpt+npos+25]-0x30)*100+
								(log[nowpt+npos+26]-0x30)*10+
								(log[nowpt+npos+27]-0x30);
						result->id=TEXT5C_ID;
					}
					else{
						result->com_no=0;
						result->id=TEXT5_ID;
					}
				}
				else{
					result->com_no=0;
					result->id=TEXT5_ID;
				}

				result->pos=nowpt;
				result->leng=0;
				result->com_lvl=0;
				result->lleng=lleng;
				nowpt=nowpt+npos;
				endcode=1;
			}
			else{
				nowpt=nowpt+npos;
				return (-1);
			}
		}

		else{
				/* home party message check */
			if (log[nowpt+1]<=0x39 && log[nowpt+1]>=0x30
				&& log[nowpt+2]<=0x39 && log[nowpt+2]>=0x30
				&& log[nowpt+3]==0x20 && log[nowpt+4]==0x20
				&& log[nowpt+5]==0x5b && log[nowpt+8]==0x2f
				&& log[nowpt+17]==0x3a && log[nowpt+20]==0x5d){

				/* home party message found */
				result->mes_no=0;
				result->text_no=(log[nowpt]-0x30)*100+(log[nowpt+1]-0x30)*10
									+(log[nowpt+2]-0x30);
				result->com_no=0;
				result->id=TEXTHP_ID;
				result->pos=nowpt;
				result->leng=0;
				result->com_lvl=0;
				result->lleng=lleng;
				endcode=2;
			}
		}
	}
	return (endcode);
}





/*
	title check
		(called when first charactor of line is '-')
			in		log   : text
					leng  : text length
			out		return  0 : title found (title only)
						    1 : title + number
						    3 : title + '- '
						    5 : title + '＞'
						   -1 : not title
						   -2 : abnormal end (log end)
					result : check result
*/
int		titlecheck(unsigned char *log, int leng, title_content *result)
{
	int		j,endcode;
	int		crno,lleng,npos;
	char	*workchar;

		/* return code initial set */
	endcode=-1;

		/* title check ( MES(nn) search ) */
	crno=crfind(leng-nowpt,(char *)&log[nowpt],&lleng,&npos);

	if (crno==0 || npos==0){	/* cr not found or log end */
		lastpt=leng;
		nowpt=leng;
		return (-2);
	}
	if (lleng>79){				/* line length > 79 -> not title */
		nowpt=nowpt+npos;
		return (-1);
	}

	for (j=8;j<20;j++) if (log[nowpt+j]==0x28) break;
	if (j>19){					/* '(' not found in line */
		nowpt=nowpt+npos;
		return (-1);
	}

	if (log[nowpt+j+3]!=0x29 || log[nowpt+j-1]!=0x53
			|| log[nowpt+j-2]!=0x45 || log[nowpt+j-3]!=0x4d){
		nowpt=nowpt+npos;
		return (-1);
	}

		/* title found process */
	endcode=0;
	if (log[nowpt+j+1]==0x20){
		if (log[nowpt+j+2]<=0x39 && log[nowpt+j+2]>=0x30)
							result->mes_no=log[nowpt+j+2]-0x30;
		else result->mes_no=0;
	}
	else{
		if (log[nowpt+j+1]<=0x39 && log[nowpt+j+1]>=0x30
				&& log[nowpt+j+2]<=0x39 && log[nowpt+j+2]>=0x30)
				result->mes_no=(log[nowpt+j+1]-0x30)*10+log[nowpt+j+2]-0x30;
		else result->mes_no=0;
	}

	result->pos=nowpt;
	result->id=TITLE_ID;
	workchar=&(result->a);
	for (j=0;j<7;j++){
		if (log[nowpt+j+3]==0x20) break;
		workchar[j]=log[nowpt+j+3];
	}
	workchar[j]=0x00;
	result->lleng=lleng;

	nowpt=nowpt+npos;

		/* next line head check */
	if (log[nowpt]<=0x39 && log[nowpt]>=0x30) endcode=1;
	else{
		if (log[nowpt]==0x2d && log[nowpt+1]==0x20) endcode=3;
		else{
			if (log[nowpt]==0x81 && log[nowpt+1]==0x84){
				if (log[nowpt+2]==0x0d && log[nowpt+3]==0x0a){
					endcode=5;
					nowpt=nowpt+4;
				}
				else{
					if (crfind(leng-nowpt,(char *)&log[nowpt],&lleng,&npos)
							==0 || npos==0){
						lastpt=leng;
						nowpt=leng;
						return (-2);
					}
					else{
						endcode=5;
						nowpt=nowpt+npos;
					}
				}
			}
		}
	}

	return (endcode);
}



/*
	line head search
		line head mark(numeric, '-' etc) search
			in		log : input text
					leng: text length
			out		 TEXT_END : log end
					 CR_NUM : cr+number
					 BS_NUM : bs+number
					 CR_MINUS : cr+'- '
					 BS_MINUS : bs+'- '
					 HP_HEAD : home party head
					 END_PTN : end charactor
					 CR_ETC_NUM : cr+blunk+number
					lastpt : last message end point
					nowpt  : next message head point
*/
int		headsearch(unsigned char *log, int leng)
{
int		contflag; 
int		crno,lleng,npos;
int		j;

	j=0;
	contflag=1;
	if (delim_flag==1){

		/* delimitter flag on process */
		while(contflag){
			if(bsfind(leng-nowpt,(char *)&log[nowpt],&lleng,&npos)==0){
				lastpt=leng;
				nowpt=leng;
				return(TEXT_END);
			}
			lastpt=nowpt+lleng;
			nowpt=nowpt+npos;
			if(log[nowpt]<=0x39 && log[nowpt]>=0x30) return(BS_NUM);
			if(log[nowpt]==0x2d && log[nowpt+1]==0x20) return(BS_MINUS);
			if(log[nowpt]==0x81 && log[nowpt+1]==0x84){
				delim_flag=0;
				return(END_PTN);
			}
		}
		return(TEXT_END);
	}

		/* delimitter flag off process */
	else{
		while(contflag){
			crno=crbsfind(leng-nowpt,(char *)&log[nowpt],&lleng,&npos);
			if(crno>0  && npos>0){

				/* cr found process */
				lastpt=nowpt+lleng;
				nowpt=nowpt+npos;
				if(log[nowpt]<=0x39){
					if (log[nowpt]>=0x30) return(CR_NUM);/* cr+number found */
					else{
						if(log[nowpt]==0x2d && log[nowpt+1]==0x20)
							/* cr+'- ' found */   return(CR_MINUS);

						else{

					/* line head char <= 0x2f */
							if (textcheckflag==NOTITLE_CK){
								if(log[nowpt+1]==0x31){

								/* home party title patern check */
									j=0;
									while(ptnchar[1][j]){
										if(ptnchar[1][j]!=
												(char)log[nowpt+j])
															break;
										j++;
									}
									if(j==strlen(ptnchar[1])){
										nowpt=nowpt+j;
										return(HP_HEAD);
									}
								}
							}

							switch ( textcheckflag ){
								case NOTITLE_CK:	/* no_title mes check */
								case MAIL_CK:		/* mail mes check */
								case BBSMES_CK:		/* BBS mes check */
									if (log[nowpt+1]>=0x30 && 
											log[nowpt+1]<=0x39)
								/* cr+?+number found (in notitle message)*/
										return (CR_ETC_NUM);
									if (log[nowpt+2]>=0x30 && 
											log[nowpt+2]<=0x39)
								/* cr+?+number found (in notitle message)*/
										return (CR_ETC_NUM);
									break;

								default: break;
							}
						}
					}
				}
				else{		/* line head char >=0x40 */

					if(log[nowpt+1]==0x84){
						if (textcheckflag==MES_CK){
							j=0;
							while(ptnchar[0][j]){
								if(ptnchar[0][j]!=(char)log[nowpt+j]) break;
								j++;
							}
							if(j==strlen(ptnchar[0])){
								nowpt=nowpt+j;
										/* '＞◆次頁はありません' found */
								return(END_PTN);
							}
						}
					}

					switch ( textcheckflag ){
						case HPMES_CK :

				/* home party end mark (>HP) check
							when home party message check */
							if (log[nowpt]==0x48 && log[nowpt+1]==0x50
												&& log[nowpt+2]==0x3e){
								crno=crfind(leng-nowpt,
									(char *)&log[nowpt],&lleng,&npos);
								if (crno==0 || npos==0){
									lastpt=leng;
									nowpt=leng;
									return (END_PTN);
								}
								else{
									nowpt=nowpt+npos;
									return (END_PTN);
								}
							}
							break;

						case BBSMES_CK :
							j=0;
							while(ptnchar[5][j]){
								if(ptnchar[5][j]!=(char)log[nowpt+j])
																 break;	
								j++;
							}
							if(j==strlen(ptnchar[5])){
								nowpt=nowpt+j;
										/* '表示終了' found */
								return(END_PTN);
							}

							j=0;
							while(ptnchar[7][j]){
								if(ptnchar[7][j]!=(char)log[nowpt+j])
																 break;	
								j++;
							}
							if(j==strlen(ptnchar[7])){
										/* '続き (･･･' found */
										/* next 1-line feed */
								crno=crfind(leng-nowpt,
									(char *)&log[nowpt],&lleng,&npos);
								if (crno==0 || npos==0){
									lastpt=leng;
									nowpt=leng;
									return (END_PTN);
								}
								else{
									nowpt=nowpt+npos;
									break;
								}
							}

							j=0;
							while(ptnchar[8][j]){
								if(ptnchar[8][j]!=(char)log[nowpt+j])
																 break;	
								j++;
							}
							if(j==strlen(ptnchar[8])){
							/* 'next>' found in BBS message */
								nowpt=nowpt+j;
								if (log[nowpt+2]<=0x39 && log[nowpt+2]>=0x30)
										return(CR_ETC_NUM);
								else	return(END_PTN);
							}

							if (log[nowpt+1]==0x84 && 
									log[nowpt]==0x81){
							/* '＞' found in BBS message */
								return (END_PTN);
							}

							break;

						case MAIL_CK :
							j=0;
							while(ptnchar[3][j]){
								if(ptnchar[3][j]!=(char)log[nowpt+j])
																 break;	
								j++;
							}
							if(j==strlen(ptnchar[3])){
										/* '受信後･･･' found */
								crno=crfind(leng-nowpt,
									(char *)&log[nowpt],&lleng,&npos);
								if (crno==0 || npos==0){
									lastpt=leng;
									nowpt=leng;
									return (END_PTN);
								}
								else{
									nowpt=nowpt+npos;
									return (END_PTN);
								}
							}

							j=0;
							while(ptnchar[4][j]){
								if(ptnchar[4][j]!=(char)log[nowpt+j])
																 break;	
								j++;
							}
							if(j==strlen(ptnchar[4])){
										/* 'action:' found */
								crno=crfind(leng-nowpt,
									(char *)&log[nowpt],&lleng,&npos);
								if (crno==0 || npos==0){
									lastpt=leng;
									nowpt=leng;
									return (END_PTN);
								}
								else{
									nowpt=nowpt+npos;
									return (END_PTN);
								}
							}
					}
				}

			}

			else{

				if (crno==-1){
				/*	back_space found process */
					delim_flag=1;

					lastpt=nowpt+lleng;
					nowpt=nowpt+npos;
					if(log[nowpt]<=0x39 && log[nowpt]>=0x30)
													return(BS_NUM);
					if(log[nowpt]==0x2d && log[nowpt+1]==0x20)
													return(BS_MINUS);
					if(log[nowpt]==0x81 && log[nowpt+1]==0x84){
						delim_flag=0;
						if(crfind(leng-nowpt,(char *)&log[nowpt],
													&lleng,&npos)!=0){
							if(npos==0) nowpt=leng;
							else nowpt=nowpt+npos;
						}
						else nowpt=leng;
						return(END_PTN);
					}
				}
				else{
							/* log end */
					lastpt=leng;
					nowpt=leng;
					return (TEXT_END);
				}
			}
		}
	}
	return (TEXT_END);
}


/*
		home party title check
			(called when line head = ' 1.  サービスに入る    2. ご案内')
				in		log  : text
						leng : text length
						result: check result
				out		0 : home party title found
						1 : home party title + number found
						-1: not title
						-2: abnormal end (log end)
						result
*/
int		hptitlecheck(unsigned char *log, int leng, title_content *result)
{
	int		endcode;
	int		crno,lleng,npos;
	int		lastsv,nowsv;
	int		j;

		/* return code initial set */
	endcode=-1;

		/* 1 lines feed */
	crno=crfind(leng-nowpt,(char *)&log[nowpt],&lleng,&npos);
	if(crno==0 || npos==0){
		lastpt=leng;
		nowpt=leng;
		return(-2);
	}
	if (lleng>79) return (endcode);
	lastpt=nowpt+lleng;
	nowpt=nowpt+npos;

		/* search 'HP>' for 10 lines */
	for (j=0;j<10;j++){
		crno=crfind(leng-nowpt,(char *)&log[nowpt],&lleng,&npos);
		if(crno==0 || npos==0){
			lastpt=leng;
			nowpt=leng;
			return(-2);
		}
		lastsv=lastpt;
		nowsv=nowpt;
		lastpt=nowpt+lleng;
		nowpt=nowpt+npos;
		if (log[nowpt]==0x48 && log[nowpt+1]==0x50 && log[nowpt+2]==0x3e){
			lastpt=lastsv;
			nowpt=nowsv;
			endcode=0;
			break;
		}
	}

	if (endcode==0){
		/* home party title found */
		result->mes_no=0;
		result->pos=nowpt;
		result->id=TITLE_ID;
		result->lleng=lleng;
		result->a=0x00;
		nowpt=nowpt+npos;

		crno=crfind(leng-nowpt,(char *)&log[nowpt],&lleng,&npos);
		if(crno==0 || npos==0){
			lastpt=leng;
			nowpt=leng;
		}
		else nowpt=nowpt+npos;
		if (log[nowpt]<=0x39 && log[nowpt]>=0x30) endcode=1;
		else endcode=-1;
	}
	return(endcode);

}



/*
		last text control data close
			in		intexta  : input text control data add
			out		non
*/
void	last_close (struct logcontent *intexta)
{
	if (textcheckflag!=NOT_CHECK){
		if (lastpt-intexta->text[textno].text.pos>0){
			intexta->text[textno].text.leng=
					lastpt-intexta->text[textno].text.pos;
			textno++;
		}
		textcheckflag=NOT_CHECK;
	}
	return;
}



/*
	mail & BBS message check
		(called when second charactor of line is number)
			in		log  : text
					leng : text length
			out		return 0 : mail message found
						   1 : BBS message found
						   -1: not message
						   -2: abnormal end (log end)
					result : check result (if check ok)
*/
int		mailbbscheck (unsigned char *log, int leng, text_content *result)
{
	int		endcode;
	int		crno,lleng,npos;

	endcode=-1;

	crno=crfind(leng-nowpt,(char *)&log[nowpt],&lleng,&npos);
	if (crno==0 || npos==0){
		lastpt=leng;
		nowpt=leng;
		return(-2);
	}
	if (lleng>79 || lleng<30){
		nowpt=nowpt+npos;
		return(-1);
	}

	if (log[nowpt+20]==0x20){

	/* mail message check */
	/*  mail number & nifty id & date, time check */
		if (log[nowpt+1]<=0x39 && log[nowpt+1]>=0x30
			&& log[nowpt+2]==0x20
			&& log[nowpt+22]>=0x41 && log[nowpt+22]<=0x5a
			&& log[nowpt+23]>=0x41 && log[nowpt+23]<=0x5a
			&& log[nowpt+24]>=0x41 && log[nowpt+24]<=0x5a
			&& log[nowpt+25]<=0x39 && log[nowpt+25]>=0x30
			&& log[nowpt+26]<=0x39 && log[nowpt+26]>=0x30
			&& log[nowpt+27]<=0x39 && log[nowpt+27]>=0x30
			&& log[nowpt+28]<=0x39 && log[nowpt+28]>=0x30
			&& log[nowpt+29]<=0x39 && log[nowpt+29]>=0x30
			&& log[nowpt+40]<=0x39 && log[nowpt+40]>=0x30
			&& log[nowpt+41]<=0x39 && log[nowpt+41]>=0x30
			&& log[nowpt+42]==0x2f && log[nowpt+51]>=0x3a){

	/*  second line '題' check */
			if (log[nowpt+npos+4]!=0x91 || log[nowpt+npos+5]!=0xe8){
				nowpt=nowpt+npos;
				return (-1);
			}

		/* mail message found */
			result->text_no=0;
			result->mes_no=0;
			result->com_no=0;
			result->id=MAIL_ID;
			result->pos=nowpt;
			result->leng=0;
			result->com_lvl=0;
			result->lleng=lleng;

			nowpt=nowpt+npos;
			endcode=0;
		}

		else{
			nowpt=nowpt+npos;
			return (-1);
		}
	}
		/* BBS message check */
	else{

		/* first line  number & nifty id & date check */
		if (log[nowpt+2]<=0x39 && log[nowpt+2]>=0x30
			&& log[nowpt+3]==0x20 && log[nowpt+4]==0x20
			&& log[nowpt+5]==0x20
			&& log[nowpt+6]>=0x41 && log[nowpt+6]<=0x5a
			&& log[nowpt+7]>=0x41 && log[nowpt+7]<=0x5a
			&& log[nowpt+8]>=0x41 && log[nowpt+8]<=0x5a
			&& log[nowpt+9]<=0x39 && log[nowpt+9]>=0x30
			&& log[nowpt+10]<=0x39 && log[nowpt+10]>=0x30
			&& log[nowpt+11]<=0x39 && log[nowpt+11]>=0x30
			&& log[nowpt+12]<=0x39 && log[nowpt+12]>=0x30
			&& log[nowpt+13]<=0x39 && log[nowpt+13]>=0x30
			&& log[nowpt+16]<=0x39 && log[nowpt+16]>=0x30
			&& log[nowpt+17]<=0x39 && log[nowpt+17]>=0x30
			&& log[nowpt+18]==0x2f
			&& log[nowpt+27]<=0x39 && log[nowpt+27]>=0x30 ){

		/* second line  blunk check */
			if (log[nowpt+npos+2]!=0x20){
				nowpt=nowpt+npos;
				return (-1);
			}

		/* BBS message found */
			result->text_no=0;
			result->mes_no=0;
			result->com_no=0;
			result->id=BBSMES_ID;
			result->pos=nowpt;
			result->leng=0;
			result->com_lvl=0;
			result->lleng=lleng;
			nowpt=nowpt+npos;
			endcode=1;
		}
		else{
			nowpt=nowpt+npos;
			return (-1);
		}
	}

	return (endcode);
}

