charconvfw/charconvplugins/src/plugins/j5eucjp.cpp
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/charconvfw/charconvplugins/src/plugins/j5eucjp.cpp	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,376 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* J5 charconv character converter
+* converts from EUC_JP to unicode
+* based on code in EUCJP_PACKED
+*
+*/
+
+
+#include <e32std.h>
+#include <charconv.h>
+#include <ecom/implementationproxy.h>
+#include <convutils.h>
+#include "shiftjis.h"
+#include "jisbase.h"
+#include "jisx0201.h"
+#include "jisx0208.h"
+#include "jisx0212.h"
+
+const TUint KSingleShift2=0x8e;
+const TUint KSingleShift3=0x8f;
+
+		
+#if defined(_DEBUG)
+
+_LIT(KLitPanicText, "EUCJP_PACKED");
+
+enum TPanic
+	{
+	EPanicNothingToConvert1=1,
+	EPanicNothingToConvert2,
+	EPanicNothingToConvert3,
+	EPanicNothingToConvert4,
+	EPanicNothingToConvert5,
+	EPanicNothingToConvert6,
+	EPanicOddNumberOfBytes1,
+	EPanicOddNumberOfBytes2,
+	EPanicOddNumberOfBytes3,
+	EPanicOddNumberOfBytes4,
+	EPanicOddNumberOfBytes5,
+	EPanicOddNumberOfBytes6,
+	EPanicBadHighBit1,
+	EPanicBadHighBit2,
+	EPanicBadHighBit3,
+	EPanicBadHighBit4,
+	EPanicBadHighBit5,
+	EPanicBadHighBit6,
+	EPanicBadHighBit7,
+	EPanicBadPointers1,
+	EPanicBadPointers2,
+	EPanicBadPointers3,
+	EPanicBadPointers4,
+	EPanicBadPointers5,
+	EPanicBadPointers6,
+	EPanicBadPointers7,
+	EPanicBadPointers8,
+	EPanicBadPointers9,
+	EPanicBadPointers10,
+	EPanicBadPointers11,
+	EPanicBadPointers12,
+	EPanicBadPointers13,
+	EPanicBadPointers14,
+	EPanicBadPointers15,
+	EPanicBadPointers16,
+	EPanicBadPointers17,
+	EPanicBadPointers18,
+	EPanicBadPointers19,
+	EPanicBadPointers20,
+	EPanicBadPointers21,
+	EPanicBadPointers22,
+	EPanicBadPointers23,
+	EPanicBadPointers24,
+	EPanicBadPointers25,
+	EPanicBadPointers26,
+	EPanicBadPointers27,
+	EPanicBadPointers28,
+	EPanicBadPointers29,
+	EPanicBadPointers30,
+	EPanicBadPointers31,
+	EPanicBadPointers32,
+	EPanicBadPointers33,
+	EPanicBadPointers34,
+	EPanicBadPointers35,
+	EPanicBadPointers36,
+	EPanicBadCalculation1,
+	EPanicBadCalculation2,
+	EPanicNumberOfBytesIsNotMultipleOfThree1,
+	EPanicNumberOfBytesIsNotMultipleOfThree2,
+	EPanicSingleShift2Expected,
+	EPanicSingleShift3Expected
+	};
+
+LOCAL_C void Panic(TPanic aPanic)
+	{
+	User::Panic(KLitPanicText, aPanic);
+	}
+
+#endif
+	
+/**
+ @return The number of bytes that can be converted from aDescriptor to JisRoman
+ @internalTechnology 
+ */
+TInt NumberOfBytesAbleToConvertToJisRoman(const TDesC8& aDescriptor)
+	{
+	const TUint8* pointerToPreviousByte=aDescriptor.Ptr()-1;
+	const TUint8* const pointerToLastByte=pointerToPreviousByte+aDescriptor.Length();
+	if (pointerToPreviousByte==pointerToLastByte)
+		{
+		return 0;
+		}
+		
+	FOREVER
+		{
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers14));
+		const TUint currentByte=*(pointerToPreviousByte+1);
+		if (currentByte&0x80)
+			{
+			break;
+			}
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers15));
+		++pointerToPreviousByte;
+		__ASSERT_DEBUG(pointerToPreviousByte<=pointerToLastByte, Panic(EPanicBadPointers16));
+		if (pointerToPreviousByte>=pointerToLastByte)
+			{
+			break;
+			}
+		}
+	return (pointerToPreviousByte+1)-aDescriptor.Ptr();
+	}
+
+/**
+ @return The number of bytes that can be converted from aDescriptor to Jis X208
+ @internalTechnology 
+ */
+ TInt NumberOfBytesAbleToConvertToJisX0208(const TDesC8& aDescriptor)
+	{
+	const TUint8* pointerToPreviousByte=aDescriptor.Ptr()-1;
+	const TUint8* const pointerToLastByte=pointerToPreviousByte+aDescriptor.Length();
+	if (pointerToPreviousByte==pointerToLastByte)
+		{
+		return 0;
+		}
+	FOREVER
+		{
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers17));
+		TUint currentByte=*(pointerToPreviousByte+1);
+		if (currentByte<0xa0)
+			{
+			break;
+			}
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers18));
+		if (pointerToLastByte-pointerToPreviousByte<2)
+			{
+			break;
+			}
+		++pointerToPreviousByte;
+		currentByte=*(pointerToPreviousByte+1);
+		if (currentByte<0xa0)
+			{
+			return CCnvCharacterSetConverter::EErrorIllFormedInput;
+			}
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers19));
+		++pointerToPreviousByte;
+		__ASSERT_DEBUG(pointerToPreviousByte<=pointerToLastByte, Panic(EPanicBadPointers20));
+		if (pointerToPreviousByte>=pointerToLastByte)
+			{
+			break;
+			}
+		}
+	return (pointerToPreviousByte+1)-aDescriptor.Ptr();
+	}
+	
+/**
+ @return The number of bytes that can be converted from aDescriptor to HalfWidthKatakana
+ @internalTechnology 
+ */
+ TInt NumberOfBytesAbleToConvertToHalfWidthKatakana8(const TDesC8& aDescriptor)
+	{
+	const TUint8* pointerToPreviousByte=aDescriptor.Ptr()-1;
+	const TUint8* const pointerToLastByte=pointerToPreviousByte+aDescriptor.Length();
+	if (pointerToPreviousByte==pointerToLastByte)
+		{
+		return 0;
+		}
+	FOREVER
+		{
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers21));
+		TUint currentByte=*(pointerToPreviousByte+1);
+		if (currentByte!=KSingleShift2)
+			{
+			break;
+			}
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers22));
+		if (pointerToLastByte-pointerToPreviousByte<2)
+			{
+			break;
+			}
+		++pointerToPreviousByte;
+		currentByte=*(pointerToPreviousByte+1);
+		if (currentByte<0xa0)
+			{
+			return CCnvCharacterSetConverter::EErrorIllFormedInput;
+			}
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers23));
+		++pointerToPreviousByte;
+		__ASSERT_DEBUG(pointerToPreviousByte<=pointerToLastByte, Panic(EPanicBadPointers24));
+		if (pointerToPreviousByte>=pointerToLastByte)
+			{
+			break;
+			}
+		}
+	return (pointerToPreviousByte+1)-aDescriptor.Ptr();
+	}
+
+/**
+ @return The number of bytes that can be converted from aDescriptor to JISX0212
+ @internalTechnology 
+ */
+TInt NumberOfBytesAbleToConvertToJisX0212(const TDesC8& aDescriptor)
+	{
+	const TUint8* pointerToPreviousByte=aDescriptor.Ptr()-1;
+	const TUint8* const pointerToLastByte=pointerToPreviousByte+aDescriptor.Length();
+	if (pointerToPreviousByte==pointerToLastByte)
+		{
+		return 0;
+		}
+		
+	FOREVER
+		{
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers25));
+		TUint currentByte=*(pointerToPreviousByte+1);
+		if (currentByte!=KSingleShift3)
+			{
+			break;
+			}
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers26));
+		if (pointerToLastByte-pointerToPreviousByte<3)
+			{
+			break;
+			}
+		++pointerToPreviousByte;
+		currentByte=*(pointerToPreviousByte+1);
+		if (currentByte<0xa0)
+			{
+			return CCnvCharacterSetConverter::EErrorIllFormedInput;
+			}
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers27));
+		++pointerToPreviousByte;
+		currentByte=*(pointerToPreviousByte+1);
+		if (currentByte<0xa0)
+			{
+			return CCnvCharacterSetConverter::EErrorIllFormedInput;
+			}
+		__ASSERT_DEBUG(pointerToPreviousByte<pointerToLastByte, Panic(EPanicBadPointers28));
+		++pointerToPreviousByte;
+		__ASSERT_DEBUG(pointerToPreviousByte<=pointerToLastByte, Panic(EPanicBadPointers29));
+		if (pointerToPreviousByte>=pointerToLastByte)
+			{
+			break;
+			}
+		}
+	return (pointerToPreviousByte+1)-aDescriptor.Ptr();
+	}
+
+void DummyConvertToIntermediateBufferInPlace(TDes8&)
+	{
+	}
+	
+/**
+ Converts to JISX0212
+ @internalTechnology 
+ */
+void ConvertToJisX0212FromEucJpPackedInPlace(TDes8& aDescriptor)
+	{
+	const TInt descriptorLength=aDescriptor.Length();
+	__ASSERT_DEBUG(descriptorLength>0, Panic(EPanicNothingToConvert6));
+	__ASSERT_DEBUG(descriptorLength%3==0, Panic(EPanicNumberOfBytesIsNotMultipleOfThree2));
+	TUint8* pointerToTargetByte=CONST_CAST(TUint8*, aDescriptor.Ptr());
+	const TUint8* pointerToSourceByte=pointerToTargetByte;
+	const TUint8* const pointerToLastByte=pointerToSourceByte+(descriptorLength-1);
+	FOREVER
+		{
+		__ASSERT_DEBUG(*pointerToSourceByte==KSingleShift3, Panic(EPanicSingleShift3Expected));
+		__ASSERT_DEBUG(pointerToSourceByte<pointerToLastByte, Panic(EPanicBadPointers33));
+		++pointerToSourceByte;
+		TUint sourceByte=*pointerToSourceByte;
+		__ASSERT_DEBUG(sourceByte&0x80, Panic(EPanicBadHighBit6));
+		*pointerToTargetByte=STATIC_CAST(TUint8, sourceByte&~0x80);
+		__ASSERT_DEBUG(pointerToSourceByte<pointerToLastByte, Panic(EPanicBadPointers34));
+		++pointerToSourceByte;
+		sourceByte=*pointerToSourceByte;
+		__ASSERT_DEBUG(sourceByte&0x80, Panic(EPanicBadHighBit7));
+		__ASSERT_DEBUG(pointerToTargetByte<pointerToLastByte, Panic(EPanicBadPointers35));
+		++pointerToTargetByte;
+		*pointerToTargetByte=STATIC_CAST(TUint8, sourceByte&~0x80);
+		__ASSERT_DEBUG(pointerToSourceByte<=pointerToLastByte, Panic(EPanicBadPointers36));
+		if (pointerToSourceByte>=pointerToLastByte)
+			{
+			break;
+			}
+		++pointerToSourceByte;
+		++pointerToTargetByte;
+		}
+	aDescriptor.SetLength((descriptorLength/3)*2);
+	}
+	
+/**
+ Converts to JISX0208
+ @internalTechnology 
+ */
+void ConvertToJisX0208FromEucJpPackedInPlace(TDes8& aDescriptor)
+	{
+	const TInt descriptorLength=aDescriptor.Length();
+	__ASSERT_DEBUG(descriptorLength>0, Panic(EPanicNothingToConvert4));
+	__ASSERT_DEBUG(descriptorLength%2==0, Panic(EPanicOddNumberOfBytes5));
+	TUint8* pointerToCurrentByte=CONST_CAST(TUint8*, aDescriptor.Ptr());
+	const TUint8* const pointerToLastByte=pointerToCurrentByte+(descriptorLength-1);
+	FOREVER
+		{
+		const TUint currentByte=*pointerToCurrentByte;
+		__ASSERT_DEBUG(currentByte&0x80, Panic(EPanicBadHighBit4));
+		*pointerToCurrentByte=STATIC_CAST(TUint8, currentByte&~0x80);
+		__ASSERT_DEBUG(pointerToCurrentByte<=pointerToLastByte, Panic(EPanicBadPointers30));
+		if (pointerToCurrentByte>=pointerToLastByte)
+			{
+			break;
+			}
+		++pointerToCurrentByte;
+		}
+	}
+	
+/**
+ Converts to Half Width Katakana
+ @internalTechnology 
+ */
+void ConvertToHalfWidthKatakana8FromEucJpPackedInPlace(TDes8& aDescriptor)
+	{
+	const TInt descriptorLength=aDescriptor.Length();
+	__ASSERT_DEBUG(descriptorLength>0, Panic(EPanicNothingToConvert5));
+	__ASSERT_DEBUG(descriptorLength%2==0, Panic(EPanicOddNumberOfBytes6));
+	TUint8* pointerToTargetByte=CONST_CAST(TUint8*, aDescriptor.Ptr());
+	const TUint8* pointerToSourceByte=pointerToTargetByte;
+	const TUint8* const pointerToLastByte=pointerToSourceByte+(descriptorLength-1);
+	FOREVER
+		{
+		__ASSERT_DEBUG(*pointerToSourceByte==KSingleShift2, Panic(EPanicSingleShift2Expected));
+		__ASSERT_DEBUG(pointerToSourceByte<pointerToLastByte, Panic(EPanicBadPointers31));
+		++pointerToSourceByte;
+		const TUint sourceByte=*pointerToSourceByte;
+		__ASSERT_DEBUG(sourceByte&0x80, Panic(EPanicBadHighBit5));
+		*pointerToTargetByte=STATIC_CAST(TUint8, sourceByte);
+		__ASSERT_DEBUG(pointerToSourceByte<=pointerToLastByte, Panic(EPanicBadPointers32));
+		if (pointerToSourceByte>=pointerToLastByte)
+			{
+			break;
+			}
+		++pointerToSourceByte;
+		++pointerToTargetByte;
+		}
+	aDescriptor.SetLength(descriptorLength/2);
+	}
+	
+