Xerces 2.8.0 and 3.0.1: Bug in RegularExpression::matches(txt, pMatch)
----------------------------------------------------------------------

                 Key: XERCESC-1870
                 URL: https://issues.apache.org/jira/browse/XERCESC-1870
             Project: Xerces-C++
          Issue Type: Bug
          Components: Utilities
    Affects Versions: 2.8.0, 3.0.1
         Environment: Platform Windows XP
MSVC 7.1, 8.0, 9.0
            Reporter: mark hermann
             Fix For: 2.7.0


RegularExpression::matches(txt, pMatch) does not work anymore in 2.8, 3.0.1 
since pMatch is not updated correctly anymore.


// Test code - works with 2.7.0

XMLCh * txt = L"2004-06-17";
Match m;
RegularExpression 
r("(\\-?\\d+(\\-\\d{2}(\\-\\d{2})?)?)?(T\\d{2}(:\\d{2}(:\\d{2}(:\\d+)?)?)?)?(F\\d+)?((\\-|\\+)\\d{2}:\\d{2})?");
if(r.matches(txt, &m))
{
  for(int i = 1; i < m.getNoGroups(); i++)
        {
    int i1 = m.getStartPos(i); // Should be 0
    int i2 = Mp7JrsUtil::GetNextEndPos(m, i); // Should be 4
    
    if(i1 == i2) // Is -1 
                {
                        printf("This is wrong!\n");
                        return;
                }
        }
}

Problem can be tracked via

bool RegularExpression::matches(const XMLCh* const expression, const XMLSize_t 
start
                                , const XMLSize_t end, Match* const pMatch
                                , MemoryManager* const manager) const;


which does

    Match* lMatch = pMatch; // use our pMatch
    context.fMatch = lMatch; // put pMatch into context


            /*
             *    Straightforward matching
             */
            for (matchStart=context.fStart; matchStart<=limit; matchStart++) {

                if (0 <= (matchEnd = match(&context,fOperations,matchStart)))
                    break;
            }
            
and at the end updates the context fMatch data

    if (matchEnd >= 0) {

        if (context.fMatch != 0) {

            context.fMatch->setStartPos(0, (int)matchStart);
            context.fMatch->setEndPos(0, matchEnd);
        }
        return true;
    }

But: context.fMatch is NOT the original match pointer (pMatch), but a temporal 
one.
So the correct result is not propagated back to the caller anymore.


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to