tdf#50950 sort out Calc (ISO)WEEKNUM functions

Eike Rathke erack at
Thu Sep 17 06:00:06 PDT 2015

Hi Winfried,

On Thursday, 2015-09-17 12:07:59 +0200, Winfried Donkers wrote:

> I want to change the opcode from ocIsoWeeknum to ocWeek when it is an ODF-document and when the number of arguments is 2. 
> I currently tried formula/source/core/api/token.cxx because there I can get type (ODF), opcode and argument count. But I can't change the opcode. I tried the dirty FormulaToken;;NewOpCode(), but encounter problems with the const PrivateAccess& argument.

As the comment says "only the compiler should use it" and that's why the
PrivateAccess parameter is there ;-) Modifying the OpCode within the
token array could have nasty side effects. It *might* be ok in this
case, but..

The proper place to use that if the formula string is already compiled
is in the RPN code generation
formula/source/core/api/FormulaCompiler.cxx FormulaCompiler::Factor()
where in line 1177 there's also an example of the NewOpCode() usage

    pFacToken->NewOpCode( ocUnion, FormulaToken::PrivateAccess());

In the long else{} branch there's

    else if ((SC_OPCODE_START_2_PAR <= eOp && eOp < SC_OPCODE_STOP_2_PAR)

and there at the end a pFacToken->SetByte( nSepCount ); followed by a
PutCode( pFacToken );
Before the PutCode(), when compiling ODFF and the pFacToken's OpCode is
ocIsoWeeknum and nSepCount==2 (actually nSepCount is the argument count)
you could do
    pFacToken->NewOpCode( ocWeek, FormulaToken::PrivateAccess());

All untried..

Hope that helps


LibreOffice Calc developer. Number formatter stricken i18n transpositionizer.
GPG key "ID" 0x65632D3A - 2265 D7F3 A7B0 95CC 3918  630B 6A6C D5B7 6563 2D3A
Better use 64-bit 0x6A6CD5B765632D3A here is why:
Care about Free Software, support the FSFE
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <>

More information about the LibreOffice mailing list