[Libreoffice] [PATCH] Add numbering type in persian word.

Eike Rathke ooo at erack.de
Sat Aug 27 12:22:27 PDT 2011


Hi Mohammad,

On Saturday, 2011-08-27 04:10:40 +0430, Mohammad Elahi wrote:

> Numbering in localized persian word is useful in some areas, at least
> for me it is necessary. Since it is not trivial a function and table
> is needed.

Good one, I'll also integrated this. I added quite a few spaces though
between variables and operators and keywords for better legibility.
I also changed some of the implementation, please see my comments on
below, for the results please see the commit once I will have pushed it.

> +// Tables used for numbering in persian words
> +static sal_Unicode *table_PersianWord_decade1[]={
> +    (sal_Unicode[]){0}, // 0
> +    (sal_Unicode[]){0x06cc, 0x06a9, 0}, // 1

I introduced a
typedef ArrUnicode sal_Unicode[];
and did
(ArrUnicode){...} for better legibility throught the entire patch. Also
nicely lined up the commented numbers in one column.

> +void lcl_formatPersianWord(unsigned int aNumber, OUString& rsResult)

Btw, I changed aNumber to nNumber to indicate the simple numeric type
instead of an object, that's one of our coding conventions.

> +{
> +    // Formats numbers in persian word up to 999999999999 which is high enough for showing int
> +    OUString asTemp;

Performance wise it pays to use an OUStringBuffer instead of an OUString
that is copied and recreated and reassigned all way long, initializing
the buffer with a sufficient capacity also gets rid of the memory
allocation bottlenecks. So, that now is

    OUStringBuffer aTemp(64);


> +    OUString asPersianWord_conjunction=OUString((sal_Unicode[]){0x20,0x0648,0x20,0});

<nitpick>
That can be constructed as

    OUString asPersianWord_conjunction( (ArrUnicode){0x20,0x0648,0x20,0});

without the assignment operator.
</nitpick>


> +    while(int anPart=aNumber%1000)

For example, that now is

    while (int nPart = nNumber % 1000)

looks much nicer, doesn't it? ;-)


To illustrate why to use an OUStringBuffer:

> +            asTemp=OUString(table_PersianWord_decadeX[anSection-1])+asPersianWord_conjunction+asTemp;

For that the compiler needs to

1. construct a temporary OUString instance of the expression
   OUString(table_PersianWord_decadeX[anSection-1])
2. construct and allocate a second temporary OUString for the
   concatenation of #1+asPersianWord_conjunction
3. construct and allocate a third temporary OUString for the
   concatenation of #2+asTemp
4. assign #3 to asTemp, hence deallocate the original asTemp and 
5. destruct all temporary instances

Instead,

            aTemp.insert( 0, asPersianWord_conjunction).insert( 0, table_PersianWord_decadeX[nSection-1]);

only needs to move some values for insert() in the preallocated buffer.
Note that insert() returns a OUStringBuffer& so while this looks
reversed at first hand the result is in the correct order. I changed all
those constructs to use insert() instead. Probably performance could be
enhanced if the algorithm would loop backwards and strings be appended
instead of inserted, but.. I don't think that's necessary here.


> +            if(!asTemp.isEmpty())

That then needs a change to

            if (aTemp.getLength())


> +                asTemp=OUString(0x0020)+asTemp;

Also this one can be written as

                aTemp.insert( 0, sal_Unicode(0x0020));

and so on..


> +    rsResult+=asTemp;

This one now is

    rsResult += aTemp.makeStringAndClear();


Thanks again, and keep on hacking ;)

  Eike

-- 
 PGP/OpenPGP/GnuPG encrypted mail preferred in all private communication.
 Key ID: 0x293C05FD - 997A 4C60 CE41 0149 0DB3  9E96 2F1A D073 293C 05FD
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/libreoffice/attachments/20110827/f6dea947/attachment.pgp>


More information about the LibreOffice mailing list