--- /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 <e32std.h>
+#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()<aValueText.MaxLength(),Panic(EBufferFull));
+
+ TBuf<1> buf;
+ buf.Append(TChar(aDigit+64));
+ aValueText.Insert(0,buf); // insert at position zero, ie propend
+ }
+
+