From: <bi...@us...> - 2008-08-18 17:27:46
|
Revision: 2999 http://oorexx.svn.sourceforge.net/oorexx/?rev=2999&view=rev Author: bigrixx Date: 2008-08-18 17:27:50 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2057806 ] add verify to mutablebuffer Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/classes/StringClassMisc.cpp main/trunk/interpreter/classes/StringUtil.cpp main/trunk/interpreter/classes/StringUtil.hpp main/trunk/interpreter/execution/CPPCode.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 16:39:52 UTC (rev 2998) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 17:27:50 UTC (rev 2999) @@ -1316,3 +1316,18 @@ } return TheFalseObject; } + + +/** + * Perform a character verify operation on a mutable buffer. + * + * @param ref The reference string. + * @param option The match/nomatch option. + * @param _start The start position for the verify. + * + * @return The offset of the first match/mismatch within the buffer. + */ +RexxInteger *RexxMutableBuffer::verify(RexxString *ref, RexxString *option, RexxInteger *_start) +{ + return StringUtil::verify(getStringData(), getLength(), ref, option, _start); +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 16:39:52 UTC (rev 2998) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 17:27:50 UTC (rev 2999) @@ -106,6 +106,7 @@ bool primitiveCaselessMatch(stringsize_t start, RexxString *other, stringsize_t offset, stringsize_t len); RexxInteger *matchChar(RexxInteger *position_, RexxString *matchSet); RexxInteger *caselessMatchChar(RexxInteger *position_, RexxString *matchSet); + RexxInteger *verify(RexxString *, RexxString *, RexxInteger *); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/classes/StringClassMisc.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-18 16:39:52 UTC (rev 2998) +++ main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-18 17:27:50 UTC (rev 2999) @@ -818,6 +818,7 @@ return Retval; /* return translated string */ } + RexxInteger *RexxString::verify( RexxString *ref, /* compare reference string */ RexxString *option, /* Match/NoMatch option */ @@ -826,86 +827,7 @@ /* Function: String class VERIFY function */ /******************************************************************************/ { - size_t StartPos; /* start position */ - size_t StringLen; /* length of string */ - size_t Position; /* returned position */ - size_t ReferenceLen; /* length of reference set */ - size_t Temp; /* temporary scan length */ - RexxInteger *Retval; /* return value */ - char Option; /* verify option */ - const char *Reference; /* reference pointer */ - const char *Current; /* current scan position */ - char ch; /* scan character */ - bool Match; /* found a match */ - - ref = stringArgument(ref, ARG_ONE); /* get the reference string */ - ReferenceLen = ref->getLength(); /* get a length also */ - /* get the option, default 'Nomatch' */ - Option = optionalOptionArgument(option, VERIFY_NOMATCH, ARG_TWO); - if (Option != VERIFY_MATCH && /* options are 'Match' and */ - Option != VERIFY_NOMATCH) /* 'NoMatch' */ - { - /* not that either, then its an error*/ - reportException(Error_Incorrect_method_option, "MN", option); - } - - /* get starting position */ - StartPos = optionalPositionArgument(_start, 1, ARG_THREE); - StringLen = this->getLength(); /* get the string length */ - if (StartPos > StringLen) /* beyond end of string? */ - { - Retval = IntegerZero; /* couldn't find it */ - } - else - { - /* point at start position */ - Current = this->getStringData() + StartPos - 1; - StringLen -= (StartPos - 1); /* reduce the length */ - Position = 0; /* haven't found it yet */ - - if (!ReferenceLen) - { /* if verifying a nullstring */ - if (Option == VERIFY_MATCH) /* can't match at all */ - { - Retval = IntegerZero; /* so return zero */ - } - else - { - Retval = new_integer(StartPos);/* non-match at start position */ - } - } - else - { /* need to really search */ - while (StringLen--) - { /* while input left */ - ch = *Current++; /* get next char */ - /* get reference string */ - Reference = ref->getStringData(); - Temp = ReferenceLen; /* copy the reference length */ - Match = false; /* no match yet */ - - while (Temp--) - { /* spin thru reference */ - if (ch == *Reference++) - { /* in reference ? */ - Match = true; /* had a match */ - break; /* quit the loop */ - } - } - /* have needed matching? */ - if ((Match && Option == VERIFY_MATCH) || - (!Match && Option == VERIFY_NOMATCH)) - { - /* calculate the position */ - Position = Current - this->getStringData(); - break; /* done searching */ - } - } - /* format the position */ - Retval = Position ? new_integer(Position) : IntegerZero; - } - } - return Retval; /* return formatted number */ + return StringUtil::verify(getStringData(), getLength(), ref, option, _start); } Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 16:39:52 UTC (rev 2998) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 17:27:50 UTC (rev 2999) @@ -1348,3 +1348,111 @@ } return -1; // no match position } + + +/** + * Perform a verify operation on a section of data. + * + * @param data The data pointer + * @param stringLen The length of the string to match + * @param ref The reference search string. + * @param option The match/nomatch option. + * @param _start The starting offset for the match. + * + * @return The match/nomatch position, or 0 if nothing was found. + */ +RexxInteger *StringUtil::verify(const char *data, size_t stringLen, RexxString *ref, RexxString *option, RexxInteger *_start) +{ + // get the reference string information + ref = stringArgument(ref, ARG_ONE); + size_t referenceLen = ref->getLength(); + /* get the option, default 'Nomatch' */ + char opt = optionalOptionArgument(option, VERIFY_NOMATCH, ARG_TWO); + // validate the possibilities + if (opt != VERIFY_MATCH && opt != VERIFY_NOMATCH) + { + /* not that either, then its an error*/ + reportException(Error_Incorrect_method_option, "MN", option); + } + + /* get starting position */ + size_t startPos = optionalPositionArgument(_start, 1, ARG_THREE); + if (startPos > stringLen) /* beyond end of string? */ + { + return IntegerZero; /* couldn't find it */ + } + else + { + /* point at start position */ + const char *current = data + startPos - 1; + stringLen -= (startPos - 1); /* reduce the length */ + size_t position = 0; /* haven't found it yet */ + + if (referenceLen == 0) + { /* if verifying a nullstring */ + if (opt == VERIFY_MATCH) /* can't match at all */ + { + return IntegerZero; /* so return zero */ + } + else + { + return new_integer(startPos);/* non-match at start position */ + } + } + else + { + // we're verifying that all characters are members of the reference set, so + // return the first non-matching character + if (opt == VERIFY_NOMATCH) + { + while (stringLen-- != 0) + { /* while input left */ + char ch = *current++; /* get next char */ + /* get reference string */ + const char *reference = ref->getStringData(); + size_t temp = referenceLen; /* copy the reference length */ + + while (temp != 0) + { /* spin thru reference */ + if (ch == *reference++) + { + // we have a match, so we can leave + break; + } + temp--; + } + // terminate because we tested all characters? + if (temp == 0) + { + // mismatch at this offset + return new_integer(current - data); + } + } + // this is always a non matching situation to get here + return IntegerZero; + } + else + { + while (stringLen-- != 0) + { /* while input left */ + char ch = *current++; /* get next char */ + /* get reference string */ + const char *reference = ref->getStringData(); + size_t temp = referenceLen; /* copy the reference length */ + + while (temp != 0) + { /* spin thru reference */ + if (ch == *reference++) + { + // we found a matching character, return that position + return new_integer(current - data); + } + temp--; + } + } + // this is always a non matching situation to get here + return IntegerZero; + } + } + } +} Modified: main/trunk/interpreter/classes/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 16:39:52 UTC (rev 2998) +++ main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 17:27:50 UTC (rev 2999) @@ -80,6 +80,7 @@ static size_t countStr(const char *hayStack, size_t hayStackLength, RexxString *needle); static size_t caselessCountStr(const char *hayStack, size_t hayStackLength, RexxString *needle); static size_t memPos(const char *string, size_t length, char target); + static RexxInteger *verify(const char *data, size_t stringLen, RexxString *ref, RexxString *option, RexxInteger *_start); }; #endif Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 16:39:52 UTC (rev 2998) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 17:27:50 UTC (rev 2999) @@ -864,6 +864,7 @@ CPPM(RexxMutableBuffer::caselessMatch), CPPM(RexxMutableBuffer::matchChar), CPPM(RexxMutableBuffer::caselessMatchChar), +CPPM(RexxMutableBuffer::verify), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-18 16:39:52 UTC (rev 2998) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 17:27:50 UTC (rev 2999) @@ -952,6 +952,7 @@ defineKernelMethod(CHAR_CASELESSMATCH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessMatch), 4); defineKernelMethod(CHAR_MATCHCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::matchChar), 2); defineKernelMethod(CHAR_CASELESSMATCHCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessMatchChar), 2); + defineKernelMethod(CHAR_VERIFY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::verify), 3); /* set the scope of the methods to */ /* this classes oref */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |