www.pudn.com > hos-v4_os.rar > analyze.cpp


// --------------------------------------------------------------------------- 
//  Hyper Operating System V4  コンフィギュレーター                            
//    構文解析クラス                                                           
//                                                                             
//                                    Copyright (C) 1998-2002 by Project HOS   
//                                    http://sourceforge.jp/projects/hos/      
// --------------------------------------------------------------------------- 
 
 
#include  
#include  
#include  
#include "defercd.h" 
#include "analyze.h" 
 
 
 
// ステートメントをAPI名とパラメーターに分割 
int CAnalyze::SplitState(char* pszApiName, char* pszParams, const char *pszState) 
{ 
	int iErr; 
 
	// コマンド名の切り出し 
	while ( *pszState != '(' ) 
	{ 
		if ( *pszState == '\0' ) 
		{ 
			return CFG_ERR_SYNTAX; 
		} 
		*pszApiName++ = *pszState++; 
	} 
	*pszApiName = '\0'; 
	pszState++; 
 
	// パラメーター部の切り出し 
	iErr = SearchChar(pszParams, pszState, ')'); 
	if ( iErr != CFG_ERR_OK ) 
	{ 
		return iErr; 
	} 
 
	// 後続チェック 
	if ( *pszState != '\0' ) 
	{ 
		return CFG_ERR_SEMICOLON; 
	} 
 
	return CFG_ERR_OK; 
} 
 
 
// 特定文字のまでの切り出し 
int CAnalyze::SearchChar(char* pszBuf, const char* &pszText, char c) 
{ 
	char cDelimiter; 
	bool blText = false; 
	bool blEsc  = false; 
	int  iErr; 
 
	for ( ; ; ) 
	{ 
		// 終端チェック 
		if ( *pszText == '\0' ) 
		{ 
			iErr = CFG_ERR_SYNTAX; 
			break; 
		} 
 
		// 文字チェック 
		if ( *pszText == c ) 
		{ 
			pszText++; 
			iErr = CFG_ERR_OK; 
			break; 
		} 
 
		// '\' の次の文字は無条件にエスケープ 
		if ( blEsc ) 
		{ 
			*pszBuf++ = *pszText++; 
			blEsc = false; 
			continue; 
		} 
		blEsc = false; 
 
		// '\' チェック 
		if ( *pszBuf == '\\' ) 
		{ 
			*pszBuf++ = *pszText++; 
			blEsc = true; 
			continue; 
		} 
 
		// 文字列開始チェック 
		if ( !blText && *pszText == '\"' || *pszText == '\'' ) 
		{ 
			cDelimiter = *pszText; 
			*pszBuf++ = *pszText++; 
			blText = true; 
			continue; 
		} 
 
		// 文字列内部 
		if ( blText ) 
		{ 
			if ( *pszText == cDelimiter ) 
			{ 
				*pszBuf++ = *pszText++; 
				blText = false; 
			} 
			else 
			{ 
				*pszBuf++ = *pszText++; 
			} 
			continue; 
		} 
 
		// '{' チェック 
		if ( *pszText == '{' ) 
		{ 
			*pszBuf++ = *pszText++; 
			iErr = SearchChar(pszBuf, pszText, '}'); 
			if ( iErr != CFG_ERR_OK ) 
			{ 
				iErr = CFG_ERR_BRACE; 
			} 
			pszBuf  += strlen(pszBuf); 
			*pszBuf++ = '}'; 
			continue; 
		} 
 
		// '(' チェック 
		if ( *pszText == '(' ) 
		{ 
			*pszBuf++ = *pszText++; 
			iErr = SearchChar(pszBuf, pszText, ')'); 
			if ( iErr != CFG_ERR_OK ) 
			{ 
				iErr = CFG_ERR_PAREN; 
			} 
			pszBuf  += strlen(pszBuf); 
			*pszBuf++ = ')'; 
			continue; 
		} 
 
		*pszBuf++ = *pszText++; 
	} 
 
	*pszBuf = '\0'; 
 
	return iErr; 
} 
 
 
// パラメーターの切り出し 
int CAnalyze::GetParameter(char* pszBuf, const char* &pszText) 
{ 
	int iErr; 
 
	// コンマまで切り出す 
	iErr = SearchChar(pszBuf, pszText, ','); 
	if ( iErr == CFG_ERR_SYNTAX ) 
	{ 
		// 括弧対応OKで終端ならコンマが見つからなくても可 
		iErr = CFG_ERR_OK; 
	} 
 
	return iErr; 
} 
 
 
// 文字列定数を展開する 
int CAnalyze::DecodeText(char *pszBuf, const char* pszText) 
{ 
	bool blEsc = false; 
 
	if ( *pszText++ != '\"')  
	{ 
		return CFG_ERR_TEXT; 
	} 
 
	for ( ; ; ) 
	{ 
		if ( *pszText == '\0' ) 
		{ 
			return CFG_ERR_TEXT; 
		} 
 
		// 前の文字が '\' なら読み飛ばし 
		if ( blEsc ) 
		{ 
			*pszBuf++ = *pszText++; 
			blEsc = false; 
			continue; 
		} 
 
		// エスケープ文字チェック 
		if ( *pszText == '\\' ) 
		{ 
			pszText++; 
			blEsc = true; 
			continue; 
		} 
 
		// 終端チェック 
		if ( *pszText == '\"' ) 
		{ 
			pszText++; 
			break; 
		} 
 
		*pszBuf++ = *pszText++; 
	} 
 
	// 完結していなければエラー 
	if ( *pszText != '\0' ) 
	{ 
			return CFG_ERR_TEXT; 
	} 
 
	*pszBuf = '\0'; 
 
	return CFG_ERR_OK; 
} 
 
 
// 前後の空白を削除する 
void CAnalyze::SpaceCut(char* pszText) 
{ 
	char *pszTmp; 
	int  i = 0; 
 
	pszTmp = pszText; 
 
	// 先頭の空白を読み飛ばす 
	while ( *pszTmp == ' ' ) 
	{ 
		pszTmp++; 
	} 
 
	// コピー 
	while ( *pszTmp != '\0' ) 
	{ 
		pszText[i++] = *pszTmp++; 
	} 
 
	// 末尾の空白を削除 
	while ( i > 0 && pszText[i - 1] == ' ' ) 
	{ 
		i--; 
	} 
 
	pszText[i] = '\0'; 
} 
 
 
// --------------------------------------------------------------------------- 
//  Copyright (C) 1998-2002 by Project HOS                                     
// ---------------------------------------------------------------------------