os/textandloc/charconvfw/charconvplugins/src/shared/JISBASE_SHARED_2.CPP
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description:       
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include "PictographObserver.h"
sl@0
    20
#include <e32std.h>
sl@0
    21
#include <charconv.h>
sl@0
    22
#include <convdata.h>
sl@0
    23
#include <convutils.h>
sl@0
    24
#include "jisx0201.h"
sl@0
    25
#include "jisx0208.h"
sl@0
    26
#include "jisx0212.h"
sl@0
    27
#include "jisbase.h"
sl@0
    28
#include "featmgr/featmgr.h"
sl@0
    29
sl@0
    30
const TUint KControlCharacterEscape=0x1b;
sl@0
    31
const TUint KControlCharacterShiftOut=0x0e;
sl@0
    32
const TUint KControlCharacterShiftIn=0x0f;
sl@0
    33
const TUint KBitsForNonStandardStates=0x03;
sl@0
    34
sl@0
    35
_LIT8(KLit8EscapeSequenceForJisRoman, "\x1b\x28\x4a");
sl@0
    36
_LIT8(KLit8EscapeSequenceForJisRomanIncorrect, "\x1b\x28\x48");
sl@0
    37
_LIT8(KLit8EscapeSequenceForAscii, "\x1b\x28\x42");
sl@0
    38
_LIT8(KLit8EscapeSequenceForHalfWidthKatakana, "\x1b\x28\x49");
sl@0
    39
_LIT8(KLit8EscapeSequenceForJisC6226_1978, "\x1b\x24\x40");
sl@0
    40
_LIT8(KLit8EscapeSequenceForJisX0208_1983, "\x1b\x24\x42");
sl@0
    41
_LIT8(KLit8EscapeSequenceForJisX0208_199x, "\x1b\x26\x40\x1b\x24\x42");
sl@0
    42
_LIT8(KLit8EscapeSequenceForJisX0212_1990, "\x1b\x24\x28\x44");
sl@0
    43
sl@0
    44
typedef TInt (*FChangeState)(TInt aState);
sl@0
    45
typedef TInt (*FAppendConvertToUnicode)(CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, TDes16& aUnicode, const TDesC8& aForeign, TInt& aState, TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter, const TArray<CnvUtilities::SState>& aArrayOfStates, TUint& aOutputConversionFlags, TUint aInputConversionFlags);
sl@0
    46
sl@0
    47
enum TNonStandardState // each of these values must fit into KBitsForNonStandardStates and each must also be non-zero
sl@0
    48
	{
sl@0
    49
	ENonStandardStateJis7=1,
sl@0
    50
	ENonStandardStateJis8
sl@0
    51
	};
sl@0
    52
sl@0
    53
sl@0
    54
LOCAL_D const SCnvConversionData::SVariableByteData::SRange halfWidthKatakana7VariableByteDataRange=
sl@0
    55
	{
sl@0
    56
	0x00,
sl@0
    57
	0xff,
sl@0
    58
	0,
sl@0
    59
	0
sl@0
    60
	};
sl@0
    61
sl@0
    62
LOCAL_D const SCnvConversionData::SOneDirectionData::SRange halfWidthKatakana7ToUnicodeDataRange=
sl@0
    63
	{
sl@0
    64
	0x21,
sl@0
    65
	0x5f,
sl@0
    66
	SCnvConversionData::SOneDirectionData::SRange::EOffset,
sl@0
    67
	0,
sl@0
    68
	0,
sl@0
    69
		{
sl@0
    70
		STATIC_CAST(TUint, 65344),
sl@0
    71
		0
sl@0
    72
		}
sl@0
    73
	};
sl@0
    74
sl@0
    75
LOCAL_D const SCnvConversionData::SOneDirectionData::SRange unicodeToHalfWidthKatakana7DataRange=
sl@0
    76
	{
sl@0
    77
	0xff61,
sl@0
    78
	0xff9f,
sl@0
    79
	SCnvConversionData::SOneDirectionData::SRange::EOffset,
sl@0
    80
	1,
sl@0
    81
	0,
sl@0
    82
		{
sl@0
    83
		STATIC_CAST(TUint, -65344),
sl@0
    84
		0
sl@0
    85
		}
sl@0
    86
	};
sl@0
    87
sl@0
    88
LOCAL_D const SCnvConversionData halfWidthKatakana7ConversionData=
sl@0
    89
	{
sl@0
    90
	SCnvConversionData::EUnspecified,
sl@0
    91
		{
sl@0
    92
		1,
sl@0
    93
		&halfWidthKatakana7VariableByteDataRange
sl@0
    94
		},
sl@0
    95
		{
sl@0
    96
		1,
sl@0
    97
		&halfWidthKatakana7ToUnicodeDataRange
sl@0
    98
		},
sl@0
    99
		{
sl@0
   100
		1,
sl@0
   101
		&unicodeToHalfWidthKatakana7DataRange
sl@0
   102
		}
sl@0
   103
	};
sl@0
   104
sl@0
   105
#if defined(_DEBUG)
sl@0
   106
sl@0
   107
_LIT(KLitPanicText, "JISBASE_SHARED");
sl@0
   108
sl@0
   109
enum TPanic
sl@0
   110
	{
sl@0
   111
	EPanicNotAppending1=1,
sl@0
   112
	EPanicNotAppending2,
sl@0
   113
	EPanicNotAppending3,
sl@0
   114
	EPanicBadNonStandardState,
sl@0
   115
	EPanicBadPointers1,
sl@0
   116
	EPanicBadPointers2,
sl@0
   117
	EPanicBadPointers3,
sl@0
   118
	EPanicBadPointers4,
sl@0
   119
	EPanicBadFunctionPointer
sl@0
   120
	};
sl@0
   121
sl@0
   122
LOCAL_C void Panic(TPanic aPanic)
sl@0
   123
	{
sl@0
   124
	User::Panic(KLitPanicText, aPanic);
sl@0
   125
	}
sl@0
   126
sl@0
   127
#endif
sl@0
   128
sl@0
   129
TInt CnvJisBase::ChangeToNonStandardStateJis7(TInt aState)
sl@0
   130
	{
sl@0
   131
	return (aState&~KBitsForNonStandardStates)|ENonStandardStateJis7;
sl@0
   132
	}
sl@0
   133
sl@0
   134
TInt CnvJisBase::ChangeToNonStandardStateJis8(TInt aState)
sl@0
   135
	{
sl@0
   136
	return (aState&~KBitsForNonStandardStates)|ENonStandardStateJis8;
sl@0
   137
	}
sl@0
   138
sl@0
   139
TInt CnvJisBase::ChangeToStandardState(TInt)
sl@0
   140
	{
sl@0
   141
	return CCnvCharacterSetConverter::KStateDefault; // I actually thought that the correct behaviour for this would be to return "aState&~KBitsForNonStandardStates", but I asked Ken Lunde about it in an email and he said that after a run of JIS7 or JIS8, the bytes should always be interpreted as JIS-Roman
sl@0
   142
	}
sl@0
   143
sl@0
   144
TInt CnvJisBase::AppendConvertToUnicodeFromModalForeign(CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, TDes16& aUnicode, const TDesC8& aModalForeign, TInt& aState, TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter, const TArray<CnvUtilities::SState>& aArrayOfStates, TUint& aOutputConversionFlags, TUint aInputConversionFlags)
sl@0
   145
	{
sl@0
   146
	__ASSERT_DEBUG(aInputConversionFlags&CCnvCharacterSetConverter::EInputConversionFlagAppend, Panic(EPanicNotAppending1));
sl@0
   147
	return CnvUtilities::ConvertToUnicodeFromModalForeign(aDefaultEndiannessOfForeignCharacters, aUnicode, aModalForeign, aState, aNumberOfUnconvertibleCharacters, aIndexOfFirstByteOfFirstUnconvertibleCharacter, aArrayOfStates, aOutputConversionFlags, aInputConversionFlags);
sl@0
   148
	}
sl@0
   149
sl@0
   150
TInt CnvJisBase::AppendConvertToUnicodeFromJis7(CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, TDes16& aUnicode, const TDesC8& aJis7, TInt&, TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter, const TArray<CnvUtilities::SState>&, TUint& aOutputConversionFlags, TUint aInputConversionFlags)
sl@0
   151
	{
sl@0
   152
	__ASSERT_DEBUG(aInputConversionFlags&CCnvCharacterSetConverter::EInputConversionFlagAppend, Panic(EPanicNotAppending2));
sl@0
   153
	return CCnvCharacterSetConverter::DoConvertToUnicode(halfWidthKatakana7ConversionData, aDefaultEndiannessOfForeignCharacters, aUnicode, aJis7, aNumberOfUnconvertibleCharacters, aIndexOfFirstByteOfFirstUnconvertibleCharacter, aOutputConversionFlags, aInputConversionFlags);
sl@0
   154
	}
sl@0
   155
sl@0
   156
TInt CnvJisBase::AppendConvertToUnicodeFromJis8(CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, TDes16& aUnicode, const TDesC8& aJis8, TInt&, TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter, const TArray<CnvUtilities::SState>&, TUint& aOutputConversionFlags, TUint aInputConversionFlags)
sl@0
   157
	{
sl@0
   158
	__ASSERT_DEBUG(aInputConversionFlags&CCnvCharacterSetConverter::EInputConversionFlagAppend, Panic(EPanicNotAppending3));
sl@0
   159
	return CCnvCharacterSetConverter::DoConvertToUnicode(CnvHalfWidthKatakana8::ConversionData(), aDefaultEndiannessOfForeignCharacters, aUnicode, aJis8, aNumberOfUnconvertibleCharacters, aIndexOfFirstByteOfFirstUnconvertibleCharacter, aOutputConversionFlags, aInputConversionFlags);
sl@0
   160
	}
sl@0
   161
sl@0
   162
EXPORT_C TInt CnvJisBase::ConvertToUnicode(CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, TDes16& aUnicode, const TDesC8& aForeign, TInt& aState, TInt& aNumberOfUnconvertibleCharacters, TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter)
sl@0
   163
	{
sl@0
   164
    TInt ret =KErrNone;
sl@0
   165
    TBool pictographsSupported = FeatureManager::FeatureSupported(KFeatureIdJapanesePicto);
sl@0
   166
    RArray<CnvUtilities::SState> states;
sl@0
   167
    if ( pictographsSupported )
sl@0
   168
        {        
sl@0
   169
sl@0
   170
        CnvUtilities::SState state;
sl@0
   171
        state.iEscapeSequence=&KLit8EscapeSequenceForJisRoman; // Jis-Roman is the default state, so it must come first in the array
sl@0
   172
        state.iConversionData=&CnvJisRoman::ConversionData();
sl@0
   173
        ret |= states.Append(state);
sl@0
   174
        state.iEscapeSequence=&KLit8EscapeSequenceForJisRomanIncorrect;
sl@0
   175
        state.iConversionData=&CnvJisRoman::ConversionData();
sl@0
   176
        ret |= states.Append(state);
sl@0
   177
        state.iEscapeSequence=&KLit8EscapeSequenceForAscii;
sl@0
   178
        state.iConversionData=&CCnvCharacterSetConverter::AsciiConversionData();
sl@0
   179
        ret |= states.Append(state);
sl@0
   180
    
sl@0
   181
        SetStatesForPictograph(states);
sl@0
   182
sl@0
   183
        state.iEscapeSequence=&KLit8EscapeSequenceForHalfWidthKatakana;
sl@0
   184
        state.iConversionData=&halfWidthKatakana7ConversionData;
sl@0
   185
        ret |= states.Append(state);
sl@0
   186
        state.iEscapeSequence=&KLit8EscapeSequenceForJisC6226_1978;
sl@0
   187
        state.iConversionData=&CnvJisX0208::ConversionData();
sl@0
   188
        ret |= states.Append(state);
sl@0
   189
        state.iEscapeSequence=&KLit8EscapeSequenceForJisX0208_1983;
sl@0
   190
        state.iConversionData=&CnvJisX0208::ConversionData();
sl@0
   191
        ret |= states.Append(state);
sl@0
   192
        state.iEscapeSequence=&KLit8EscapeSequenceForJisX0208_199x;
sl@0
   193
        state.iConversionData=&CnvJisX0208::ConversionData();
sl@0
   194
        ret |= states.Append(state);
sl@0
   195
        state.iEscapeSequence=&KLit8EscapeSequenceForJisX0212_1990;
sl@0
   196
        state.iConversionData=&CnvJisX0212::ConversionData();
sl@0
   197
        ret |= states.Append(state);
sl@0
   198
        }
sl@0
   199
    else
sl@0
   200
        {            
sl@0
   201
        CnvUtilities::SState state;
sl@0
   202
    	state.iEscapeSequence=&KLit8EscapeSequenceForJisRoman; // Jis-Roman is the default state, so it must come first in the array
sl@0
   203
    	state.iConversionData=&CnvJisRoman::ConversionData();
sl@0
   204
    	ret |= states.Append(state);
sl@0
   205
        state.iEscapeSequence=&KLit8EscapeSequenceForJisRomanIncorrect;
sl@0
   206
    	state.iConversionData=&CnvJisRoman::ConversionData();	
sl@0
   207
    	ret |= states.Append(state);
sl@0
   208
    	state.iEscapeSequence=&KLit8EscapeSequenceForAscii;
sl@0
   209
    	state.iConversionData=&CCnvCharacterSetConverter::AsciiConversionData();
sl@0
   210
    	ret |= states.Append(state);
sl@0
   211
    	state.iEscapeSequence=&KLit8EscapeSequenceForHalfWidthKatakana;
sl@0
   212
    	state.iConversionData=&halfWidthKatakana7ConversionData;
sl@0
   213
    	ret |= states.Append(state);
sl@0
   214
    	state.iEscapeSequence=&KLit8EscapeSequenceForJisC6226_1978;
sl@0
   215
    	state.iConversionData=&CnvJisX0208::ConversionData();
sl@0
   216
    	ret |= states.Append(state);
sl@0
   217
    	state.iEscapeSequence=&KLit8EscapeSequenceForJisX0208_1983;
sl@0
   218
    	state.iConversionData=&CnvJisX0208::ConversionData();
sl@0
   219
    	ret |= states.Append(state);
sl@0
   220
    	state.iEscapeSequence=&KLit8EscapeSequenceForJisX0208_199x;
sl@0
   221
    	state.iConversionData=&CnvJisX0208::ConversionData();
sl@0
   222
    	ret |= states.Append(state);
sl@0
   223
    	state.iEscapeSequence=&KLit8EscapeSequenceForJisX0212_1990;
sl@0
   224
    	state.iConversionData=&CnvJisX0212::ConversionData();
sl@0
   225
    	ret |= states.Append(state);
sl@0
   226
        }
sl@0
   227
    __ASSERT_DEBUG(!ret, User::Panic(_L("RArray append failure"), ret));
sl@0
   228
    
sl@0
   229
	const TArray<CnvUtilities::SState> arrayOfStates(states.Array());
sl@0
   230
	aUnicode.SetLength(0);
sl@0
   231
	const TUint8* const pointerToFirstByte=aForeign.Ptr();
sl@0
   232
	const TUint8* pointerToCurrentByte=pointerToFirstByte;
sl@0
   233
	const TUint8* pointerToStartOfNextRunToConvert=pointerToFirstByte;
sl@0
   234
	const TUint8* const pointerToLastByte=pointerToFirstByte+(aForeign.Length()-1);
sl@0
   235
	TUint outputConversionFlags=0;
sl@0
   236
	TUint inputConversionFlags=CCnvCharacterSetConverter::EInputConversionFlagAppend;
sl@0
   237
	FOREVER
sl@0
   238
		{
sl@0
   239
		FChangeState changeState=NULL;
sl@0
   240
		FAppendConvertToUnicode appendConvertToUnicode=NULL;
sl@0
   241
		TBool skipThisByte=EFalse;
sl@0
   242
		const TUint currentByte=*pointerToCurrentByte;
sl@0
   243
		switch (aState&KBitsForNonStandardStates)
sl@0
   244
			{
sl@0
   245
		case 0:
sl@0
   246
			if (currentByte==KControlCharacterShiftOut)
sl@0
   247
				{
sl@0
   248
				changeState=ChangeToNonStandardStateJis7;
sl@0
   249
				skipThisByte=ETrue;
sl@0
   250
				}
sl@0
   251
            else if (pictographsSupported && (currentByte==KControlCharacterShiftIn))
sl@0
   252
                {
sl@0
   253
                changeState=ChangeToStandardState;
sl@0
   254
                skipThisByte=ETrue;
sl@0
   255
                }
sl@0
   256
			else if (currentByte&0x80)
sl@0
   257
				{
sl@0
   258
				changeState=ChangeToNonStandardStateJis8;
sl@0
   259
				}
sl@0
   260
			appendConvertToUnicode=AppendConvertToUnicodeFromModalForeign;
sl@0
   261
			break;
sl@0
   262
		case ENonStandardStateJis7:
sl@0
   263
			if (currentByte==KControlCharacterEscape)
sl@0
   264
				{
sl@0
   265
				changeState=ChangeToStandardState; // it doesn't matter what function changeState is set to (as its return value won't actually be used), as long as changeState!=NULL so that the test below (after the end of this switch) passes
sl@0
   266
				}
sl@0
   267
			else if (currentByte==KControlCharacterShiftIn)
sl@0
   268
				{
sl@0
   269
				changeState=ChangeToStandardState;
sl@0
   270
				skipThisByte=ETrue;
sl@0
   271
				}
sl@0
   272
			else if (currentByte&0x80)
sl@0
   273
				{
sl@0
   274
				changeState=ChangeToNonStandardStateJis8;
sl@0
   275
				}
sl@0
   276
			appendConvertToUnicode=AppendConvertToUnicodeFromJis7;
sl@0
   277
			break;
sl@0
   278
		case ENonStandardStateJis8:
sl@0
   279
			if (currentByte==KControlCharacterEscape)
sl@0
   280
				{
sl@0
   281
				changeState=ChangeToStandardState; // it doesn't matter what function changeState is set to (as its return value won't actually be used), as long as changeState!=NULL so that the test below (after the end of this switch) passes
sl@0
   282
				}
sl@0
   283
			else if (currentByte==KControlCharacterShiftOut)
sl@0
   284
				{
sl@0
   285
				changeState=ChangeToNonStandardStateJis7;
sl@0
   286
				skipThisByte=ETrue;
sl@0
   287
				}
sl@0
   288
			else if ((currentByte&0x80)==0)
sl@0
   289
				{
sl@0
   290
				changeState=ChangeToStandardState;
sl@0
   291
				}
sl@0
   292
			appendConvertToUnicode=AppendConvertToUnicodeFromJis8;
sl@0
   293
			break;
sl@0
   294
#if defined(_DEBUG)
sl@0
   295
		default:
sl@0
   296
			Panic(EPanicBadNonStandardState);
sl@0
   297
			break;
sl@0
   298
#endif
sl@0
   299
			}
sl@0
   300
		__ASSERT_DEBUG(pointerToCurrentByte<=pointerToLastByte, Panic(EPanicBadPointers1));
sl@0
   301
		if ((pointerToCurrentByte>=pointerToLastByte) || (changeState!=NULL))
sl@0
   302
			{
sl@0
   303
			TBool lastIteration=EFalse;
sl@0
   304
			__ASSERT_DEBUG(pointerToCurrentByte>=pointerToStartOfNextRunToConvert, Panic(EPanicBadPointers2));
sl@0
   305
			if (changeState==NULL)
sl@0
   306
				{
sl@0
   307
				++pointerToCurrentByte; // this may make pointerToCurrentByte greater than pointerToLastByte
sl@0
   308
				lastIteration=ETrue;
sl@0
   309
				}
sl@0
   310
			if (pointerToCurrentByte>pointerToStartOfNextRunToConvert)
sl@0
   311
				{
sl@0
   312
				TPtrC8 runToConvert(pointerToStartOfNextRunToConvert, pointerToCurrentByte-pointerToStartOfNextRunToConvert);
sl@0
   313
				TInt numberOfUnconvertibleCharacters;
sl@0
   314
				TInt indexOfFirstByteOfFirstUnconvertibleCharacter;
sl@0
   315
				__ASSERT_DEBUG(appendConvertToUnicode!=NULL, Panic(EPanicBadFunctionPointer));
sl@0
   316
				const TInt returnValue=(*appendConvertToUnicode)(aDefaultEndiannessOfForeignCharacters, aUnicode, runToConvert, aState, numberOfUnconvertibleCharacters, indexOfFirstByteOfFirstUnconvertibleCharacter, arrayOfStates, outputConversionFlags, inputConversionFlags);
sl@0
   317
				if (returnValue<0)
sl@0
   318
					{
sl@0
   319
                    states.Close();
sl@0
   320
					return returnValue; // this is an error-code
sl@0
   321
					}
sl@0
   322
				if (numberOfUnconvertibleCharacters>0)
sl@0
   323
					{
sl@0
   324
					if (aNumberOfUnconvertibleCharacters==0)
sl@0
   325
						{
sl@0
   326
						aIndexOfFirstByteOfFirstUnconvertibleCharacter=(pointerToStartOfNextRunToConvert-pointerToFirstByte)+indexOfFirstByteOfFirstUnconvertibleCharacter;
sl@0
   327
						}
sl@0
   328
					aNumberOfUnconvertibleCharacters+=numberOfUnconvertibleCharacters;
sl@0
   329
					}
sl@0
   330
				if (returnValue>0)
sl@0
   331
					{
sl@0
   332
					pointerToCurrentByte-=returnValue; // pointerToStartOfNextRunToConvert (which also needs adjusting in the same way) gets set below
sl@0
   333
					lastIteration=ETrue;
sl@0
   334
					changeState=NULL;
sl@0
   335
					skipThisByte=EFalse;
sl@0
   336
					}
sl@0
   337
				__ASSERT_DEBUG(pointerToCurrentByte>=pointerToFirstByte, Panic(EPanicBadPointers3));
sl@0
   338
				if (pointerToCurrentByte>pointerToFirstByte)
sl@0
   339
					{
sl@0
   340
					inputConversionFlags|=CCnvCharacterSetConverter::EInputConversionFlagAllowTruncatedInputNotEvenPartlyConsumable;
sl@0
   341
					}
sl@0
   342
				}
sl@0
   343
			if (changeState!=NULL)
sl@0
   344
				{
sl@0
   345
				aState=(*changeState)(aState);
sl@0
   346
				}
sl@0
   347
			if (skipThisByte)
sl@0
   348
				{
sl@0
   349
				if (pointerToCurrentByte==pointerToLastByte) // pointerToCurrentByte may already be greater than pointerToLastByte, in which case lastIteration will already be ETrue
sl@0
   350
					{
sl@0
   351
					lastIteration=ETrue;
sl@0
   352
					}
sl@0
   353
				++pointerToCurrentByte;
sl@0
   354
				}
sl@0
   355
			pointerToStartOfNextRunToConvert=pointerToCurrentByte;
sl@0
   356
			if (lastIteration) // check this first as pointerToCurrentByte may be greater than pointerToLastByte (but it will only be if lastIteration is EFalse)
sl@0
   357
				{
sl@0
   358
				break;
sl@0
   359
				}
sl@0
   360
			__ASSERT_DEBUG(pointerToCurrentByte<=pointerToLastByte, Panic(EPanicBadPointers4));
sl@0
   361
			if (pointerToCurrentByte>=pointerToLastByte)
sl@0
   362
				{
sl@0
   363
				break;
sl@0
   364
				}
sl@0
   365
			}
sl@0
   366
		++pointerToCurrentByte;
sl@0
   367
		}
sl@0
   368
sl@0
   369
    states.Close();
sl@0
   370
	// no checking with outputConversionFlags need to be done here
sl@0
   371
	return pointerToLastByte-(pointerToCurrentByte-1);
sl@0
   372
	}
sl@0
   373
sl@0
   374
EXPORT_C const SCnvConversionData& CnvJisBase::HalfWidthKatakana7ConversionData()
sl@0
   375
	{
sl@0
   376
	return halfWidthKatakana7ConversionData;
sl@0
   377
	}
sl@0
   378
sl@0
   379
EXPORT_C void CnvJisBase::IsCharacterJISBased(TInt& aConfidenceLevel, const TDesC8& aSample) 
sl@0
   380
	{
sl@0
   381
	// JIS is modal... so start off with a confidence of 0 and to begin with look 
sl@0
   382
	// for JIS escape sequences....Escape sequences defined above in the KLITs
sl@0
   383
	// For each escape sequence, increase the confidenceLevel ..... 
sl@0
   384
	aConfidenceLevel = 55;
sl@0
   385
	TInt jisRomanResult = 0;
sl@0
   386
	TInt asciiResult = 0;
sl@0
   387
	TInt jisX0208Result = 0;
sl@0
   388
	TInt jisC6226Result = 0;
sl@0
   389
	TInt jixX0212Result = 0;
sl@0
   390
	TInt hwKanaResult = 0;
sl@0
   391
sl@0
   392
	TInt EscSequences = 0;
sl@0
   393
	
sl@0
   394
	TInt sampleLength = aSample.Length();
sl@0
   395
	for (TInt i = 0; i < sampleLength; ++i)
sl@0
   396
		{
sl@0
   397
	
sl@0
   398
		// JIS is 7 bit encoding
sl@0
   399
		if((aSample[i]&0x80)!=0x00)
sl@0
   400
			{
sl@0
   401
			aConfidenceLevel=0;
sl@0
   402
			break;
sl@0
   403
			}
sl@0
   404
		// JIS supports the following character sets 
sl@0
   405
		if (i > jisC6226Result)
sl@0
   406
			{
sl@0
   407
			jisC6226Result=(aSample.Right(sampleLength-i)).Find(KLit8EscapeSequenceForJisC6226_1978);
sl@0
   408
			if (jisC6226Result!=KErrNotFound)
sl@0
   409
				EscSequences += 15; 
sl@0
   410
			}
sl@0
   411
sl@0
   412
		if (i > jisRomanResult)
sl@0
   413
			{
sl@0
   414
			jisRomanResult=(aSample.Right(sampleLength-i)).Find(KLit8EscapeSequenceForJisRoman);
sl@0
   415
			if (jisRomanResult!=KErrNotFound)
sl@0
   416
				EscSequences += 15; 
sl@0
   417
			}
sl@0
   418
sl@0
   419
		if (i > asciiResult)
sl@0
   420
			{
sl@0
   421
			asciiResult=(aSample.Right(sampleLength-i)).Find(KLit8EscapeSequenceForAscii);
sl@0
   422
			if (asciiResult!=KErrNotFound)
sl@0
   423
				EscSequences += 15; 
sl@0
   424
			}
sl@0
   425
sl@0
   426
		if (i > jisX0208Result)
sl@0
   427
			{
sl@0
   428
			jisX0208Result=(aSample.Right(sampleLength-i)).Find(KLit8EscapeSequenceForJisX0208_1983);
sl@0
   429
			if (jisX0208Result!=KErrNotFound)
sl@0
   430
				EscSequences += 15; 
sl@0
   431
			}
sl@0
   432
sl@0
   433
		if (i > jixX0212Result)
sl@0
   434
			{
sl@0
   435
			jixX0212Result=(aSample.Right(sampleLength-i)).Find(KLit8EscapeSequenceForJisX0212_1990);
sl@0
   436
			if (jixX0212Result!=KErrNotFound)
sl@0
   437
				EscSequences += 15; 
sl@0
   438
			}
sl@0
   439
sl@0
   440
		if (i > hwKanaResult)
sl@0
   441
			{
sl@0
   442
			hwKanaResult=(aSample.Right(sampleLength-i)).Find(KLit8EscapeSequenceForHalfWidthKatakana);
sl@0
   443
			if (hwKanaResult!=KErrNotFound)
sl@0
   444
				EscSequences += 15; 
sl@0
   445
			}
sl@0
   446
		}
sl@0
   447
sl@0
   448
	aConfidenceLevel = 0 < sampleLength?
sl@0
   449
		aConfidenceLevel + ((EscSequences*100)/sampleLength) : 90;
sl@0
   450
	aConfidenceLevel=(aConfidenceLevel >100)?100:aConfidenceLevel;
sl@0
   451
	}