diff -r 000000000000 -r 1fb32624e06b textrendering/texthandling/sfields/FLDNUMS.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textrendering/texthandling/sfields/FLDNUMS.CPP Tue Feb 02 02:02:46 2010 +0200 @@ -0,0 +1,170 @@ +/* +* Copyright (c) 1997-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: +* +*/ + + +#include +#include "FLDSTD.H" + +#include "FLDNUMS.H" + +LOCAL_D const TInt sDeneryArray[13] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; +LOCAL_D const TText* const LsRomanArray[13] = { _S("M"), _S("CM"), _S("D"), _S("CD"),_S("C"), _S("XC"),_S("L"),_S("XL"),_S("X"),_S("IX"),_S("V"),_S("IV"),_S("I") }; + +////////////////////////////// +// TDeneryToCharBase +////////////////////////////// + +EXPORT_C TInt TDeneryToCharBase::DeneryToChar(TPtr& aValueText,TInt aDenary)const +// if aValueText is big enough to hold the result then the Roman Numeral representation of aDenery is inserted +// else the required size of aValueText is returned +// + { + aValueText.SetLength(0); + TInt numChars = NumChars(aDenary); + if (aValueText.MaxLength() < numChars) + return numChars; + else + { + DoDeneryToChar(aValueText,aDenary); + return KErrNone; + } + } + + +////////////////////////////// +// TRomanNumeral +////////////////////////////// + +EXPORT_C TInt TRomanNumeral::NumChars(TInt aDenery)const +// returns the number of characters in a given "roman number" +// + { + TInt numChars=0; + TInt i=0; + + while (aDenery > 0) + { + if (sDeneryArray[i] <= aDenery) + { + numChars += _L(sRomanArray[i]).Length(); + aDenery -= sDeneryArray[i]; + } + else + i++; + } + + return numChars; + } + + +EXPORT_C void TRomanNumeral::DoDeneryToChar(TPtr& aValueText,TInt aDenery)const +// sets aValueText to the Roman Numeral representation of aDenery +// + { + aValueText.SetLength(0); + TInt i=0; + + while (aDenery > 0) + { + if (sDeneryArray[i] <= aDenery) + { + aValueText.Append(_L(sRomanArray[i])); + aDenery -= sDeneryArray[i]; + } + else + i++; + } + } + + +///////////////////////// +// TArabicNumeral +///////////////////////// + +EXPORT_C TInt TArabicNumeral::NumChars(TInt aNum)const +// returns num digits in an integer (including sign bit if negative) +// + { + TInt chars=1; + if (aNum<0) + { + chars++; + aNum = aNum*(-1); + } + while (aNum>=10) + { + aNum = aNum/10; + chars++; + } + return chars; + } + + +EXPORT_C void TArabicNumeral::DoDeneryToChar(TPtr& aValueText,TInt aDenery)const + { + aValueText.Num(aDenery); + } + + +///////////////////////// +// TAlphabeticNumeral +///////////////////////// + +EXPORT_C TInt TAlphabeticNumeral::NumChars(TInt aNum)const +// returns num digits in an integer (including sign bit if negative) +// + { + TInt chars=1; + if (aNum<0) + { + chars++; + aNum = aNum*(-1); + } + while (aNum>26) + { + aNum = aNum/26; + chars++; + } + return chars; + } + + +EXPORT_C void TAlphabeticNumeral::DoDeneryToChar(TPtr& aValueText,TInt aDenery)const + { + TInt digit=0; + while (aDenery>0) + { + digit = aDenery%26; // remainder gives least significant figure + PropendDigitAsChar(aValueText,digit); + aDenery -= digit; + aDenery = aDenery/26; + } + } + + +void TAlphabeticNumeral::PropendDigitAsChar(TPtr& aValueText,TInt aDigit)const + { + __ASSERT_ALWAYS(aDigit>0,Panic(ECharOutOfRange)); + __ASSERT_ALWAYS(aDigit<27,Panic(ECharOutOfRange)); + __ASSERT_ALWAYS(aValueText.Length() buf; + buf.Append(TChar(aDigit+64)); + aValueText.Insert(0,buf); // insert at position zero, ie propend + } + +