[Libreoffice] [PATCH] BUG 36594

Eike Rathke ooo at erack.de
Mon Aug 22 12:47:58 PDT 2011


Hi Jenei,

On Sunday, 2011-08-21 14:59:26 +0200, Jenei Gábor wrote:

> +    ::rtl::OUStringBuffer sTemp;

Construct the buffer with a sufficient capacity beforehand so no memory
allocation needs to be done in between:

       ::rtl::OUStringBuffer sTemp( nQueryLen);

> [...]
> +    return (::rtl::OUString)sTemp;

Make that instead

       return sTemp.makeStringAndClear();

With your C-style cast (please don't use those anyhow, this is C++)
a temporary string instance is created and the buffer is copied, which
it isn't when using makeStringAndClear().


> +std::vector< ::rtl::OUStringBuffer > getComment(const ::rtl::OUString& sQuery){

Why return vector<OUStringBuffer> ? vector<OUString> seems to be more
straight forward.

> +    const sal_Unicode* sCopy=sQuery.getStr();
> +    int nQueryLen=sQuery.getLength();
> +    bool bIsText1=false;
> +    bool bIsText2=false;
> +    bool bComment=false;
> +    std::vector< ::rtl::OUStringBuffer > sRet;
> +    ::rtl::OUStringBuffer sTemp;
> +    for(int i=0;i<nQueryLen;i++){
> +        if(sCopy[i]=='\"' && !bIsText2 && !bComment) bIsText1=!bIsText1;
> +        if(sCopy[i]=='\'' && !bIsText1 && !bComment) bIsText2=!bIsText2;
> +        if(sCopy[i]=='\n' || i==nQueryLen-1){
> +            if(bComment) bComment=false;
> +            sTemp.append((sal_Unicode)'\n');

> +            sRet.push_back(sTemp);
> +            sTemp=::rtl::OUString();

Provided that vector<OUString> is returned, change that to

               sRet.push_back( sTemp.makeStringAndClear());

then there's also no need to assign sTemp an empty OUString anymore.

> +        }
> +        if(!bIsText1 && !bIsText2 && (i+1)<nQueryLen && sCopy[i]=='-' && sCopy[i+1]=='-') bComment=true;
> +        if(!bIsText1 && !bIsText2 && (i+1)<nQueryLen && sCopy[i]=='/' && sCopy[i+1]=='/') bComment=true;
> +        if(bComment) sTemp.append(&sCopy[i],1);
> +    }
> +    sTemp=::rtl::OUString();

That one is superfluous, sTemp as a stack local variable will be
destructed upon return anyway.

> +    return sRet;
> +}


> +//------------------------------------------------------------------------------
> +::rtl::OUString ConcatComment(const ::rtl::OUString& sQuery,std::vector< ::rtl::OUStringBuffer > sComments){

Pass sComments as const reference so it doesn't need to be copied when
ConcatComment() is called. And use vector<OUString> instead, as above.

> +    ::rtl::OUStringBuffer sRet;
> +    int nIndLF=0;
> +    int nIndBeg=0;
> +    for(unsigned int i=0;i<sComments.size();i++){
> +        nIndBeg=nIndLF;
> +        if(sQuery.indexOf('\n')==-1){
> +            nIndLF=sQuery.getLength();

This conditional gets executed for each element of sComments, but
clearly sQuery can't change in between, so doing this over and over
again is unnecessary.

> +        }
> +        else{
> +            nIndLF=sQuery.indexOf('\n',nIndLF);
> +        }
> +        sRet.append(sQuery.copy(nIndBeg,nIndLF-nIndBeg));

What if sQuery doesn't contain as many LFs as there are elements in
sComments? nIndLF will be -1 and in the next loop run nIndBeg will also
be -1.

The append(copy()) construct could be optimized as the copy creates
a temporary OUString instance that then is appended to sRet. More
effective would be something like

           sRet.append( sQuery.getStr() + nIndBeg, nIndLF - nIndBeg));

> +        sRet.append(sComments[i]);
> +    }
> +    return (::rtl::OUString)sRet;

Same here, use

       return sRet.makeStringAndClear();



Btw,

> +            sTranslatedStmt=ConcatComment(sTranslatedStmt,sComments);

blanks increase legibility, maybe it's just me but I'd much prefer a

               sTranslatedStmt = ConcatComment( sTranslatedStmt, sComments);

style instead.

Thanks
  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/20110822/3517b3c0/attachment.pgp>


More information about the LibreOffice mailing list