From: <bi...@us...> - 2007-02-24 17:04:44
|
Revision: 151 http://svn.sourceforge.net/oorexx/?rev=151&view=rev Author: bigrixx Date: 2007-02-24 09:04:44 -0800 (Sat, 24 Feb 2007) Log Message: ----------- Retrofit of RFE 1667838 to the 64-bit code. Modified Paths: -------------- interpreter/trunk/kernel/classes/MutableBufferClass.cpp interpreter/trunk/kernel/classes/MutableBufferClass.hpp interpreter/trunk/kernel/classes/StringClass.hpp interpreter/trunk/kernel/classes/StringClassSub.cpp interpreter/trunk/kernel/runtime/GlobalData.cpp interpreter/trunk/kernel/runtime/RexxConstants.hpp interpreter/trunk/kernel/runtime/Setup.cpp interpreter/trunk/kernel/runtime/Version.cpp Modified: interpreter/trunk/kernel/classes/MutableBufferClass.cpp =================================================================== --- interpreter/trunk/kernel/classes/MutableBufferClass.cpp 2007-02-24 17:03:24 UTC (rev 150) +++ interpreter/trunk/kernel/classes/MutableBufferClass.cpp 2007-02-24 17:04:44 UTC (rev 151) @@ -532,3 +532,33 @@ return retval; } + + +/** + * Extract a single character from a string object. + * Returns a null string if the specified position is + * beyond the bounds of the string. + * + * @param positionArg + * The position of the target character. Must be a positive + * whole number. + * + * @return Returns the single character at the target position. + * Returns a null string if the position is beyond the end + * of the string. + */ +RexxString *RexxMutableBuffer::subchar(RexxInteger *positionArg) +{ + // the starting position isn't optional + stringsize_t position = get_position(positionArg, ARG_ONE) - 1; + stringsize_t stringLength = this->length; + + // beyond the bounds, this is a null string + if (position >= stringLength) + { + return OREF_NULLSTRING; + } + // return the single character + return new_string(data->address() + position, substrLength); + return this->extract(position, 1); +} Modified: interpreter/trunk/kernel/classes/MutableBufferClass.hpp =================================================================== --- interpreter/trunk/kernel/classes/MutableBufferClass.hpp 2007-02-24 17:03:24 UTC (rev 150) +++ interpreter/trunk/kernel/classes/MutableBufferClass.hpp 2007-02-24 17:04:44 UTC (rev 151) @@ -46,6 +46,7 @@ #include "StringClass.hpp" #include "IntegerClass.hpp" +#include "RexxBuffer.hpp" class RexxMutableBuffer : public RexxObject { public: @@ -76,11 +77,15 @@ RexxString *makeString(); RexxArray *makeArray(RexxString *div); + stringchar_t *getData() { return data->address(); } + RexxString *extract(stringsize_t offset, stringsize_t sublength) { return newString(this->getData() + offset, sublength); } + RexxMutableBuffer *append(RexxObject*); RexxMutableBuffer *insert(RexxObject*, RexxObject*, RexxObject*, RexxObject*); RexxMutableBuffer *overlay(RexxObject*, RexxObject*, RexxObject*, RexxObject*); RexxMutableBuffer *mydelete(RexxObject*, RexxObject*); RexxString *substr(RexxInteger *startPosition, RexxInteger *len, RexxString *pad); + RexxString *subchar(RexxInteger *startPosition); RexxInteger *getBufferSize() { return new_integer(bufferLength); } RexxObject *setBufferSize(RexxInteger*); Modified: interpreter/trunk/kernel/classes/StringClass.hpp =================================================================== --- interpreter/trunk/kernel/classes/StringClass.hpp 2007-02-24 17:03:24 UTC (rev 150) +++ interpreter/trunk/kernel/classes/StringClass.hpp 2007-02-24 17:04:44 UTC (rev 151) @@ -192,6 +192,7 @@ RexxString *right(RexxInteger *, RexxString *); RexxString *strip(RexxString *, RexxString *); RexxString *substr(RexxInteger *, RexxInteger *, RexxString *); + RexxString *subchar(RexxInteger *); RexxString *delWord(RexxInteger *, RexxInteger *); RexxString *space(RexxInteger *, RexxString *); RexxString *subWord(RexxInteger *, RexxInteger *); Modified: interpreter/trunk/kernel/classes/StringClassSub.cpp =================================================================== --- interpreter/trunk/kernel/classes/StringClassSub.cpp 2007-02-24 17:03:24 UTC (rev 150) +++ interpreter/trunk/kernel/classes/StringClassSub.cpp 2007-02-24 17:04:44 UTC (rev 151) @@ -627,3 +627,32 @@ return Retval; /* return extracted string */ } + + +/** + * Extract a single character from a string object. + * Returns a null string if the specified position is + * beyond the bounds of the string. + * + * @param positionArg + * The position of the target character. Must be a positive + * whole number. + * + * @return Returns the single character at the target position. + * Returns a null string if the position is beyond the end + * of the string. + */ +RexxString *RexxString::subchar(RexxInteger *positionArg) +{ + // the starting position isn't optional + stringsize_t position = get_position(positionArg, ARG_ONE) - 1; + stringsize_t stringLength = this->length; + + // beyond the bounds, this is a null string + if (position >= stringLength) + { + return OREF_NULLSTRING; + } + // return the single character + return this->extract(position, 1); +} Modified: interpreter/trunk/kernel/runtime/GlobalData.cpp =================================================================== --- interpreter/trunk/kernel/runtime/GlobalData.cpp 2007-02-24 17:03:24 UTC (rev 150) +++ interpreter/trunk/kernel/runtime/GlobalData.cpp 2007-02-24 17:04:44 UTC (rev 151) @@ -328,6 +328,7 @@ CPPM(RexxString::right), CPPM(RexxString::strip), CPPM(RexxString::substr), +CPPM(RexxString::subchar), CPPM(RexxString::delWord), CPPM(RexxString::space), @@ -383,6 +384,7 @@ CPPM(RexxMutableBuffer::overlay), CPPM(RexxMutableBuffer::mydelete), CPPM(RexxMutableBuffer::substr), +CPPM(RexxMutableBuffer::subchar), CPPM(RexxMutableBuffer::getBufferSize), CPPM(RexxMutableBuffer::setBufferSize), Modified: interpreter/trunk/kernel/runtime/RexxConstants.hpp =================================================================== --- interpreter/trunk/kernel/runtime/RexxConstants.hpp 2007-02-24 17:03:24 UTC (rev 150) +++ interpreter/trunk/kernel/runtime/RexxConstants.hpp 2007-02-24 17:04:44 UTC (rev 151) @@ -436,6 +436,7 @@ CHARCONSTANT(STREAM, "STREAM"); CHARCONSTANT(STRIP, "STRIP"); CHARCONSTANT(SUBSTR, "SUBSTR"); +CHARCONSTANT(SUBCHAR, "SUBCHAR"); CHARCONSTANT(SUBWORD, "SUBWORD"); CHARCONSTANT(SYMBOL, "SYMBOL"); CHARCONSTANT(TIME, "TIME"); Modified: interpreter/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter/trunk/kernel/runtime/Setup.cpp 2007-02-24 17:03:24 UTC (rev 150) +++ interpreter/trunk/kernel/runtime/Setup.cpp 2007-02-24 17:04:44 UTC (rev 151) @@ -611,6 +611,7 @@ defineKernelMethod(CHAR_RIGHT ,TheStringBehaviour, CPPM(RexxString::right), 2); defineKernelMethod(CHAR_STRIP ,TheStringBehaviour, CPPM(RexxString::strip), 2); defineKernelMethod(CHAR_SUBSTR ,TheStringBehaviour, CPPM(RexxString::substr), 3); + defineKernelMethod(CHAR_SUBCHAR ,TheStringBehaviour, CPPM(RexxString::subchar), 1); defineKernelMethod(CHAR_DELWORD ,TheStringBehaviour, CPPM(RexxString::delWord), 2); defineKernelMethod(CHAR_SPACE ,TheStringBehaviour, CPPM(RexxString::space), 2); defineKernelMethod(CHAR_EXTRACTWORDS ,TheStringBehaviour, CPPM(RexxString::extractWords), 2); @@ -710,6 +711,7 @@ defineKernelMethod(CHAR_OVERLAY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::overlay), 4); defineKernelMethod(CHAR_DELETE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::mydelete), 2); defineKernelMethod(CHAR_SUBSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::substr), 3); + defineKernelMethod(CHAR_SUBCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::subchar), 1); defineKernelMethod(CHAR_GETBUFFERSIZE , TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::getBufferSize), 0); defineKernelMethod(CHAR_SETBUFFERSIZE , TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::setBufferSize), 1); Modified: interpreter/trunk/kernel/runtime/Version.cpp =================================================================== --- interpreter/trunk/kernel/runtime/Version.cpp 2007-02-24 17:03:24 UTC (rev 150) +++ interpreter/trunk/kernel/runtime/Version.cpp 2007-02-24 17:04:44 UTC (rev 151) @@ -70,9 +70,9 @@ day++; /* step over it */ /* format the result */ #ifdef NOTHREADSUPPORT - sprintf(buffer, "REXX-ooRexx_%d.%d 6.00 %s %s %s", ORX_VER, ORX_REL, day, month, year); + sprintf(buffer, "REXX-ooRexx_%d.%d 6.01 %s %s %s", ORX_VER, ORX_REL, day, month, year); #else - sprintf(buffer, "REXX-ooRexx_%d.%d(MT) 6.00 %s %s %s", ORX_VER, ORX_REL, day, month, year); + sprintf(buffer, "REXX-ooRexx_%d.%d(MT) 6.01 %s %s %s", ORX_VER, ORX_REL, day, month, year); #endif singleInstance->versionID = new_string(buffer); /* return as a rexx string */ } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |