Resolves: tdf#159148 Accept int32 hours:minutes:seconds input

... and detect overflow to result in text instead of 00:00 input loss.

Change-Id: Ib2b9f16ab6c3c2963c5a2058c27366219f090096
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161977
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
(cherry picked from commit e69192b51fc00cbc38006230364af07983a9a827)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161995
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Tested-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx
index d29a6a0..c189810 100644
--- a/svl/source/numbers/zforfind.cxx
+++ b/svl/source/numbers/zforfind.cxx
@@ -983,9 +983,9 @@ bool ImpSvNumberInputScan::GetTimeRef( double& fOutNumber,
                                     ) const
{
    bool bRet = true;
    sal_uInt16 nHour;
    sal_uInt16 nMinute = 0;
    sal_uInt16 nSecond = 0;
    sal_Int32 nHour;
    sal_Int32 nMinute = 0;
    sal_Int32 nSecond = 0;
    double fSecond100 = 0.0;
    sal_uInt16 nStartIndex = nIndex;

@@ -1000,7 +1000,10 @@ bool ImpSvNumberInputScan::GetTimeRef( double& fOutNumber,
    }
    else if (nIndex - nStartIndex < nCnt)
    {
        nHour   = static_cast<sal_uInt16>(sStrArray[nNums[nIndex++]].toInt32());
        const OUString& rValStr = sStrArray[nNums[nIndex++]];
        nHour = rValStr.toInt32();
        if (nHour == 0 && rValStr != "0" && rValStr != "00")
            bRet = false;   // overflow -> Text
    }
    else
    {
@@ -1031,7 +1034,10 @@ bool ImpSvNumberInputScan::GetTimeRef( double& fOutNumber,
    }
    else if (nIndex - nStartIndex < nCnt)
    {
        nMinute = static_cast<sal_uInt16>(sStrArray[nNums[nIndex++]].toInt32());
        const OUString& rValStr = sStrArray[nNums[nIndex++]];
        nMinute = rValStr.toInt32();
        if (nMinute == 0 && rValStr != "0" && rValStr != "00")
            bRet = false;   // overflow -> Text
        if (!(eInputOptions & SvNumInputOptions::LAX_TIME) && !bAllowDuration
                && nIndex > 1 && nMinute > 59)
            bRet = false;   // 1:60 or 1:123 is invalid, 123:1 or 0:123 is valid
@@ -1040,7 +1046,10 @@ bool ImpSvNumberInputScan::GetTimeRef( double& fOutNumber,
    }
    if (nIndex - nStartIndex < nCnt)
    {
        nSecond = static_cast<sal_uInt16>(sStrArray[nNums[nIndex++]].toInt32());
        const OUString& rValStr = sStrArray[nNums[nIndex++]];
        nSecond = rValStr.toInt32();
        if (nSecond == 0 && rValStr != "0" && rValStr != "00")
            bRet = false;   // overflow -> Text
        if (!(eInputOptions & SvNumInputOptions::LAX_TIME) && !bAllowDuration
                && nIndex > 1 && nSecond > 59 && !(nHour == 23 && nMinute == 59 && nSecond == 60))
            bRet = false;   // 1:60 or 1:123 or 1:1:123 is invalid, 123:1 or 123:1:1 or 0:0:123 is valid, or leap second