Пример #1
0
BOOL CARIB8CharDecode::GR( const BYTE* pbSrc, DWORD* pdwReadSize )
{
	if( pbSrc == NULL || pdwReadSize == NULL ){
		return FALSE;
	}

	DWORD dwReadSize = 0;
	if( m_GR->iMode == MF_MODE_G ){
		//文字コード
		switch( m_GR->iMF ){
			case MF_ASCII:
			case MF_PROP_ASCII:
				{
				if( IsSmallCharMode() == FALSE ){
					//全角なのでテーブルからSJISコード取得
					m_strDecode += AsciiTable[(pbSrc[0]&0x7F)-0x21];
				}else{
					//半角なのでそのまま入れる
					m_strDecode += pbSrc[0]&0x7F;
				}
				dwReadSize = 1;
				}
				break;
			case MF_HIRA:
			case MF_PROP_HIRA:
				{
				//半角ひらがな
				//テーブルからSJISコード取得
				m_strDecode += HiraTable[(pbSrc[0]&0x7F)-0x21];
				dwReadSize = 1;
				}
				break;
			case MF_JISX_KANA:
				//JIX X0201の0x80以降は半角カナ
			case MF_KANA:
			case MF_PROP_KANA:
				{
				//半角カタカナ
				//テーブルからSJISコード取得
				m_strDecode += KanaTable[(pbSrc[0]&0x7F)-0x21];
				dwReadSize = 1;
				}
				break;
			case MF_MACRO:
				{
				DWORD dwTemp=0;
				//マクロ
				//PSI/SIでは未サポート
				switch(pbSrc[0]){
					case 0x60:
						Analyze(DefaultMacro0, sizeof(DefaultMacro0),&dwTemp);
						break;
					case 0x61:
						Analyze(DefaultMacro1, sizeof(DefaultMacro1),&dwTemp);
						break;
					case 0x62:
						Analyze(DefaultMacro2, sizeof(DefaultMacro2),&dwTemp);
						break;
					case 0x63:
						Analyze(DefaultMacro3, sizeof(DefaultMacro3),&dwTemp);
						break;
					case 0x64:
						Analyze(DefaultMacro4, sizeof(DefaultMacro4),&dwTemp);
						break;
					case 0x65:
						Analyze(DefaultMacro5, sizeof(DefaultMacro5),&dwTemp);
						break;
					case 0x66:
						Analyze(DefaultMacro6, sizeof(DefaultMacro6),&dwTemp);
						break;
					case 0x67:
						Analyze(DefaultMacro7, sizeof(DefaultMacro7),&dwTemp);
						break;
					case 0x68:
						Analyze(DefaultMacro8, sizeof(DefaultMacro8),&dwTemp);
						break;
					case 0x69:
						Analyze(DefaultMacro9, sizeof(DefaultMacro9),&dwTemp);
						break;
					case 0x6A:
						Analyze(DefaultMacroA, sizeof(DefaultMacroA),&dwTemp);
						break;
					case 0x6B:
						Analyze(DefaultMacroB, sizeof(DefaultMacroB),&dwTemp);
						break;
					case 0x6C:
						Analyze(DefaultMacroC, sizeof(DefaultMacroC),&dwTemp);
						break;
					case 0x6D:
						Analyze(DefaultMacroD, sizeof(DefaultMacroD),&dwTemp);
						break;
					case 0x6E:
						Analyze(DefaultMacroE, sizeof(DefaultMacroE),&dwTemp);
						break;
					case 0x6F:
						Analyze(DefaultMacroF, sizeof(DefaultMacroF),&dwTemp);
						break;
					default:
						break;
				}
				dwReadSize = 1;
				}
				break;
			case MF_KANJI:
			case MF_JIS_KANJI1:
			case MF_JIS_KANJI2:
			case MF_KIGOU:
				{
				//漢字
				if( ToSJIS( (pbSrc[0]&0x7F), (pbSrc[1]&0x7F) ) == FALSE ){
					ToCustomFont( (pbSrc[0]&0x7F), (pbSrc[1]&0x7F) );
				}
				dwReadSize = 2;
				}
				break;
			default:
				dwReadSize = m_GR->iByte;
				break;
		}
	}else{
		if( m_GR->iMF == MF_MACRO ){
			DWORD dwTemp=0;
			//マクロ
			//PSI/SIでは未サポート
			switch(pbSrc[0]){
				case 0x60:
					Analyze(DefaultMacro0, sizeof(DefaultMacro0),&dwTemp);
					break;
				case 0x61:
					Analyze(DefaultMacro1, sizeof(DefaultMacro1),&dwTemp);
					break;
				case 0x62:
					Analyze(DefaultMacro2, sizeof(DefaultMacro2),&dwTemp);
					break;
				case 0x63:
					Analyze(DefaultMacro3, sizeof(DefaultMacro3),&dwTemp);
					break;
				case 0x64:
					Analyze(DefaultMacro4, sizeof(DefaultMacro4),&dwTemp);
					break;
				case 0x65:
					Analyze(DefaultMacro5, sizeof(DefaultMacro5),&dwTemp);
					break;
				case 0x66:
					Analyze(DefaultMacro6, sizeof(DefaultMacro6),&dwTemp);
					break;
				case 0x67:
					Analyze(DefaultMacro7, sizeof(DefaultMacro7),&dwTemp);
					break;
				case 0x68:
					Analyze(DefaultMacro8, sizeof(DefaultMacro8),&dwTemp);
					break;
				case 0x69:
					Analyze(DefaultMacro9, sizeof(DefaultMacro9),&dwTemp);
					break;
				case 0x6A:
					Analyze(DefaultMacroA, sizeof(DefaultMacroA),&dwTemp);
					break;
				case 0x6B:
					Analyze(DefaultMacroB, sizeof(DefaultMacroB),&dwTemp);
					break;
				case 0x6C:
					Analyze(DefaultMacroC, sizeof(DefaultMacroC),&dwTemp);
					break;
				case 0x6D:
					Analyze(DefaultMacroD, sizeof(DefaultMacroD),&dwTemp);
					break;
				case 0x6E:
					Analyze(DefaultMacroE, sizeof(DefaultMacroE),&dwTemp);
					break;
				case 0x6F:
					Analyze(DefaultMacroF, sizeof(DefaultMacroF),&dwTemp);
					break;
				default:
					break;
			}
			dwReadSize = 1;
		}else{
			dwReadSize = m_GR->iByte;
		}
	}

	*pdwReadSize = dwReadSize;

	return TRUE;
}
Пример #2
0
BOOL CARIB8CharDecode::GL_GR( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize, const MF_MODE* mode )
{
	if( dwSrcSize == 0 || (pbSrc[0]&0x7F) <= 0x20 || 0x7F <= (pbSrc[0]&0x7F) ){
		return FALSE;
	}

	if( mode->iMode == MF_MODE_G ){
		//文字コード
		m_bSpacing = TRUE;
		switch( mode->iMF ){
			case MF_JISX_KANA:
				{
				//JIS X0201片仮名
				m_strDecode += JisXKanaTable[(pbSrc[0]&0x7F)-0x21];
				ActivePositionForward(1);
				}
				break;
			case MF_ASCII:
			case MF_PROP_ASCII:
				{
				//全角なのでテーブルからコード取得
				m_strDecode += AsciiTable[(pbSrc[0]&0x7F)-0x21];
				ActivePositionForward(1);
				}
				break;
			case MF_HIRA:
			case MF_PROP_HIRA:
				{
				//Gセットのひらがな系集合
				m_strDecode += HiraTable[(pbSrc[0]&0x7F)-0x21];
				ActivePositionForward(1);
				}
				break;
			case MF_KANA:
			case MF_PROP_KANA:
				{
				//Gセットのカタカナ系集合
				m_strDecode += KanaTable[(pbSrc[0]&0x7F)-0x21];
				ActivePositionForward(1);
				}
				break;
			case MF_MACRO:
				{
				ASSERT(FALSE);
				goto IGNORE_EXIT;
				}
			case MF_KANJI:
			case MF_JIS_KANJI1:
			case MF_JIS_KANJI2:
			case MF_KIGOU:
				{
				//漢字
				if( dwSrcSize < 2 ){
					return FALSE;
				}
				unsigned char ucFirst = pbSrc[0]&0x7F;
				unsigned char ucSecond = pbSrc[1]&0x7F;
				if( ToSJIS(&ucFirst, &ucSecond) == FALSE ){
					AddGaijiToString(pbSrc[0]&0x7F, pbSrc[1]&0x7F);
				}else{
					AddSJISToString(ucFirst, ucSecond);
				}
				}
				break;
			default:
				//モザイク等
				goto IGNORE_EXIT;
		}
	}else if( mode->iMode == MF_MODE_DRCS ){
		if( MF_DRCS_0 <= mode->iMF && mode->iMF <= MF_DRCS_15 ){
			//DRCS
			WORD cc;
			if( mode->iMF == MF_DRCS_0 ){
				if( dwSrcSize < 2 ){
					return FALSE;
				}
				cc = (pbSrc[0]&0x7F)<<8 | (pbSrc[1]&0x7F);
			}else{
				//1バイトDRCSは0x01xxから0x0Fxxに符号シフト
				cc = (BYTE)(mode->iMF-MF_DRCS_0)<<8 | (pbSrc[0]&0x7F);
			}
			m_strDecode += m_pDRCMap->MapUCS(cc);
			ActivePositionForward(1);
			m_bSpacing = TRUE;
		}else if( mode->iMF == MF_MACRO ){
			DWORD dwTemp=0;
			//マクロ
			if( 0x60 <= (pbSrc[0]&0x7F) && (pbSrc[0]&0x7F) <= 0x6F ){
				if( Analyze(DefaultMacro[pbSrc[0]&0x0F], sizeof(DefaultMacro[0]), &dwTemp) == FALSE ){
					return FALSE;
				}
				m_bSpacing = FALSE;
			}else{
				ASSERT(FALSE);
				goto IGNORE_EXIT;
			}
		}else{
			ASSERT(FALSE);
			goto IGNORE_EXIT;
		}
	}else{
		ASSERT(FALSE);
		goto IGNORE_EXIT;
	}

	*pdwReadSize = mode->iByte;
	return TRUE;

IGNORE_EXIT:
	if( (int)dwSrcSize < mode->iByte ) return FALSE;
	m_bSpacing = FALSE;
	*pdwReadSize = mode->iByte;
	return TRUE;
}