textrendering/texthandling/sfields/FLDNUMS.CPP
changeset 0 1fb32624e06b
--- /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
+	}
+
+