예제 #1
0
파일: TextFilter.cpp 프로젝트: JCGit/Ggame
//*****************************************************************************
//	문자열의 모든 치환 대상을 치환시킨다.
//
//	Paremeters
//		char *szDest	: 치환이 끝난 문자열을 담을 포인터
//		char *szSrc		: 치환시킬 문자열
//		int nMaxLength	: 치환시킨 후의 내용을 담을 최대 길이
//	Return Values
//		bool			: 하나라도 치환을 했는지 여부
//	Remark
//		치환후 길이가 nMaxLength 보다 길어지면 ''로 치환시킨다.
//		ReplaceWord에서 szDest에 들어갈 문자열이 szSrc의 문자열보다 10배 이상
//		길면 에러가 나게 된다. 주의!! (예 : A를 ABCDEFGHIJK로 치환시키면 에러!)
//		무한 치환이 되지 않도록 주의할 것! (예 : A를 AA로 치환하면 무한 치환한다!)
//*****************************************************************************
bool	ITextFilter::Replace(char *szDest, char *szSrc, int nMaxLength)
{
	if (!IsHaveReplace(szSrc))
	{
		GetStringPart(szDest, szSrc, nMaxLength);
		return false;
	}

	char *l_szStr = (char*) malloc(strlen(szSrc) + 1);
	strcpy(l_szStr, szSrc);

	while (IsHaveReplace(l_szStr))
	{
		char *l_szTargetOffset = NULL, *l_szTargetString = NULL, *l_szReplaceString = NULL;
		int l_nTargetLength = 0;

		//	바꿔야 할 스트링을 l_szTargetString에 저장.
		l_szTargetOffset = GetReplaceTarget(&l_nTargetLength, l_szStr);
		l_szTargetString = (char*) malloc(l_nTargetLength + 1);
		GetStringPart(l_szTargetString, l_szTargetOffset, l_nTargetLength);

		//	바뀐 뒤의 스트링을 l_szReplaceString에 저장.
		l_szReplaceString = (char*) malloc(l_nTargetLength * 10 + 1);
		ReplaceWord(l_szReplaceString, l_szTargetString, l_nTargetLength * 10);

		//	치환했을 경우 nMaxLength를 넘어가지 않는지 검사.
		if (strlen(l_szStr) + strlen(l_szReplaceString) - strlen(l_szTargetString) > nMaxLength)
			strcpy(l_szReplaceString, "");

		//	치환
		strcpy(l_szTargetOffset + strlen(l_szReplaceString), l_szTargetOffset + strlen(l_szTargetString));
		memcpy(l_szTargetOffset, l_szReplaceString, strlen(l_szReplaceString));

		free(l_szTargetString);
		free(l_szReplaceString);
	}
	GetStringPart(szDest, l_szStr, nMaxLength);
	free (l_szStr);
	return true;
}
예제 #2
0
int main(){
	char id[12], temp[12], valid = 1;
	int i;

	scanf("%s", id);
	for(i = 0; i < strlen(id); i++)
		if(!isdigit(id[i])){
			valid = 0;
			break;
		}
	if(i > 10)
		valid = 0;

	if(valid == 1){
		GetStringPart(id, temp, 0, 2);
		int year = atoi(temp);
		GetStringPart(id, temp, 2, 2);
		int month = atoi(temp);
		if(!((month >= 1 && month <= 12) ||
			(month >= 1+20 && month <= 12+20) ||
			(month >= 1+40 && month <= 12+40))){
				valid = 0;
			}

			GetStringPart(id, temp, 4, 2);
			if(atoi(temp) > GetMaxDateForMonth(month, year)){
				valid = 0;
			}

			int ctrlNum = ControlNum(id);
			if(atoi(&id[9]) != ctrlNum)
				valid = 0;

	}

	printf("%d", valid);

	return 0;
}
예제 #3
0
파일: TextFilter.cpp 프로젝트: JCGit/Ggame
//*****************************************************************************
//	욕 DATA 파일을 불러온다.
//
//	Paremeters
//		const char *szFName	: 불러올 파일 이름
//	Return Values
//		void
//	Remark
//*****************************************************************************
HRESULT	CNSlangTextFilter::Load(const char *szFName)
{
	FILE *pFile = fopen(szFName, "r");
	if (pFile == NULL)
		return false;

	char l_szStr[1024];
	m_nSlangNumber = 0;
	while (fgets(l_szStr, 1023, pFile) != NULL)
	{
		Trim(l_szStr, l_szStr);
		if (l_szStr[0] != '/'&&l_szStr[1] != '/' && strlen(l_szStr) != 0)
			m_nSlangNumber++;
	}

	m_szaSlangTarget = new char*[m_nSlangNumber];
	m_szaSlangReplace = new char*[m_nSlangNumber];
	for (int n = 0; n < m_nSlangNumber; n++)
	{
		m_szaSlangTarget[n] = new char[SLANG_LENGTH_MAX];
		m_szaSlangReplace[n] = new char[SLANG_LENGTH_MAX];
	}

	fseek(pFile, 0, 0);
	int n = 0;
	while (fgets(l_szStr, 1023, pFile) != NULL)
	{
		Trim(l_szStr, l_szStr);
		if (l_szStr[0] != '/' && l_szStr[1] != '/' &&strlen(l_szStr) != 0)
		{
			if (strstr(l_szStr, ":") == NULL)
			{
				strcpy(m_szaSlangTarget[n], l_szStr);
				strcpy(m_szaSlangReplace[n], "");
			}
			else
			{
				GetStringPart(m_szaSlangTarget[n], l_szStr, strstr(l_szStr, ":") - l_szStr);
				strcpy(m_szaSlangReplace[n], strstr(l_szStr, ":") + 1);
			}
			n++;
		}
	}
	fclose(pFile);
	return true;
}
예제 #4
0
파일: TextFilter.cpp 프로젝트: JCGit/Ggame
//*****************************************************************************
//	특정 문자열을 무엇으로 치환해야 하는지 찾아낸다.
//
//	Paremeters
//		char *szDest		: 치환한 뒤의 문자열을 저장할 포인터
//		const char *szSrc	: 치환할 문자열
//		int nMaxLength		: szDest 버퍼의 최대 크기
//	Return Values
//		void				:
//	Remark
//		치환한 문자열이 없으면 ""이 들어간다.
//*****************************************************************************
void	CNSlangTextFilter::ReplaceWord(char *szDest, const char *szSrc, int nMaxLength)
{
	if (!IsInit())
		return;

	char *l_szStr = (char*) malloc(strlen(szSrc) + 1);
	Trim(l_szStr, szSrc);

	for (int n = 0; n < m_nSlangNumber; n++)
	{
		if (strcmp(l_szStr, m_szaSlangTarget[n]) == 0)
		{
			GetStringPart(szDest, m_szaSlangReplace[n], nMaxLength);
			free(l_szStr);
			return;
		}
	}
	strcpy(szDest, "");
	free(l_szStr);
}
예제 #5
0
파일: TextFilter.cpp 프로젝트: JCGit/Ggame
//*****************************************************************************
//	한 문자열에서 특정 문자열의 위치를 찾아낸다.
//
//	Paremeters
//		char *szStr		: 검색할 문자열 (ex : ABCDEFG)
//		char *szCharSet	: 찾는 대상		(ex : EF)
//	Return Values
//		char*			: szChatSet의 위치 포인터. 없으면 NULL.
//	Remark
//		strstr과 기능과 사용법이 같으나 한글 find의 문제점을 해결
//*****************************************************************************
char*	ITextFilter::FindString(char *szStr, const char *szCharSet)
{
	if (strlen(szStr) < strlen(szCharSet))
		return NULL;

	for (int n = 0; n < strlen(szStr) - strlen(szCharSet) + 1;)
	{
		char *l_szStr = (char*) malloc(strlen(szCharSet) + 1);
		GetStringPart(l_szStr, szStr + n, strlen(szCharSet));
		
		if ( CSTR_EQUAL == CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, l_szStr,_tcslen(l_szStr), szCharSet, _tcslen(szCharSet)) )
		{
			free(l_szStr);
			return (szStr + n);
		}
		free(l_szStr);
		if (ISHANGUL(szStr[n]))
			n += 2;
		else
			n++;
	}
	return NULL;
}