From: <bi...@us...> - 2008-08-18 20:06:08
|
Revision: 3004 http://oorexx.svn.sourceforge.net/oorexx/?rev=3004&view=rev Author: bigrixx Date: 2008-08-18 20:06:09 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2058018 ] add wordlength() to mutablebuffer Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/classes/StringClassWord.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 19:40:45 UTC (rev 3003) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 20:06:09 UTC (rev 3004) @@ -1367,9 +1367,24 @@ * * @param position The target word position. * - * @return The extracted word, as a string. + * @return The position of the target word. */ RexxInteger *RexxMutableBuffer::wordIndex(RexxInteger *position) { return StringUtil::wordIndex(getStringData(), getLength(), position); } + + +/** + * return the length of a given word position in a mutable + * buffer + * + * + * @param position The target word position. + * + * @return The length of the target word. + */ +RexxInteger *RexxMutableBuffer::wordLength(RexxInteger *position) +{ + return StringUtil::wordLength(getStringData(), getLength(), position); +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 19:40:45 UTC (rev 3003) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 20:06:09 UTC (rev 3004) @@ -110,6 +110,7 @@ RexxString *subWord(RexxInteger *, RexxInteger *); RexxString *word(RexxInteger *); RexxInteger *wordIndex(RexxInteger *); + RexxInteger *wordLength(RexxInteger *); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/classes/StringClassWord.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassWord.cpp 2008-08-18 19:40:45 UTC (rev 3003) +++ main/trunk/interpreter/classes/StringClassWord.cpp 2008-08-18 20:06:09 UTC (rev 3004) @@ -259,26 +259,7 @@ /******************************************************************************/ RexxInteger *RexxString::wordLength(RexxInteger *position) { - const char *Word; /* current word pointer */ - const char *NextSite; /* next word */ - size_t Length; /* string length */ - size_t WordLength; /* word length */ - size_t WordPos; /* desired word position */ - - Length = this->getLength(); /* get the string length */ - /* convert count to binary */ - WordPos = positionArgument(position , ARG_ONE); - Word = this->getStringData(); /* point to word data */ - - /* get the first word */ - WordLength = StringUtil::nextWord(&Word, &Length, &NextSite); - while (--WordPos && WordLength) - { /* loop until we reach target */ - Word = NextSite; /* copy the start pointer */ - /* get the next word */ - WordLength = StringUtil::nextWord(&Word, &Length, &NextSite); - } - return new_integer(WordLength); /* return the word length */ + return StringUtil::wordIndex(getStringData(), getLength(), position); } /* the WORDPOS function */ Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 19:40:45 UTC (rev 3003) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 20:06:09 UTC (rev 3004) @@ -1583,3 +1583,32 @@ } return new_integer(word - data + 1); } + + +/** + * Return the length of the word located at a given index. + * + * @param data The data containing the word list. + * @param length The length of the data buffer + * @param position The target word position. + * + * @return The length of the given word at the target index. Returns + * 0 if no word is found. + */ +RexxInteger *StringUtil::wordLength(const char *data, size_t length, RexxInteger *position) +{ + /* convert count to binary */ + size_t wordPos = positionArgument(position , ARG_ONE); + const char *word = data; /* point to word data */ + const char *nextSite = NULL; + + /* get the first word */ + size_t wordLength = nextWord(&word, &length, &nextSite); + while (--wordPos > 0 && wordLength != 0) + { /* loop until we reach target */ + word = nextSite; /* copy the start pointer */ + /* get the next word */ + wordLength = nextWord(&word, &length, &nextSite); + } + return new_integer(wordLength); /* return the word length */ +} Modified: main/trunk/interpreter/classes/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 19:40:45 UTC (rev 3003) +++ main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 20:06:09 UTC (rev 3004) @@ -84,6 +84,7 @@ static RexxString *subWord(const char *data, size_t length, RexxInteger *position, RexxInteger *plength); static RexxString *word(const char *data, size_t length, RexxInteger *position); static RexxInteger *wordIndex(const char *data, size_t length, RexxInteger *position); + static RexxInteger *wordLength(const char *data, size_t length, RexxInteger *position); }; #endif Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 19:40:45 UTC (rev 3003) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 20:06:09 UTC (rev 3004) @@ -868,6 +868,7 @@ CPPM(RexxMutableBuffer::subWord), CPPM(RexxMutableBuffer::word), CPPM(RexxMutableBuffer::wordIndex), +CPPM(RexxMutableBuffer::wordLength), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-18 19:40:45 UTC (rev 3003) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 20:06:09 UTC (rev 3004) @@ -956,6 +956,7 @@ defineKernelMethod(CHAR_SUBWORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::subWord), 2); defineKernelMethod(CHAR_WORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::word), 1); defineKernelMethod(CHAR_WORDINDEX ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordIndex), 1); + defineKernelMethod(CHAR_WORDLENGTH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordLength), 1); /* 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. |