From: <bi...@us...> - 2008-08-12 14:12:39
|
Revision: 2947 http://oorexx.svn.sourceforge.net/oorexx/?rev=2947&view=rev Author: bigrixx Date: 2008-08-12 14:12:46 +0000 (Tue, 12 Aug 2008) Log Message: ----------- fix uninit problem caused by DetachThread cleanup Modified Paths: -------------- main/trunk/interpreter/concurrency/RexxActivity.hpp main/trunk/interpreter/runtime/InterpreterInstance.cpp Modified: main/trunk/interpreter/concurrency/RexxActivity.hpp =================================================================== --- main/trunk/interpreter/concurrency/RexxActivity.hpp 2008-08-12 04:29:59 UTC (rev 2946) +++ main/trunk/interpreter/concurrency/RexxActivity.hpp 2008-08-12 14:12:46 UTC (rev 2947) @@ -238,6 +238,9 @@ void detachThread(); inline InterpreterInstance *getInstance() { return instance; } + inline void nestAttach() { attachCount++; } + inline bool isNestedAttach() { return attachCount != 0; } + inline void returnAttach() { attachCount--; } inline void activate() { nestedCount++; } inline void deactivate() { nestedCount--; } inline bool isActive() { return nestedCount > 0; } @@ -361,6 +364,7 @@ bool interpreterRoot; // This is the root activity for an interpreter instance bool attached; // this is attached to an instance (vs. created directly) size_t nestedCount; /* extent of the nesting */ + size_t attachCount; // extent of nested attaches char *stackBase; /* pointer to base of C stack */ bool clauseExitUsed; /* halt/trace sys exit not set ==> 1 */ size_t randomSeed; /* random number seed */ Modified: main/trunk/interpreter/runtime/InterpreterInstance.cpp =================================================================== --- main/trunk/interpreter/runtime/InterpreterInstance.cpp 2008-08-12 04:29:59 UTC (rev 2946) +++ main/trunk/interpreter/runtime/InterpreterInstance.cpp 2008-08-12 14:12:46 UTC (rev 2947) @@ -181,11 +181,17 @@ // do we have this? we can just return it if (activity != OREF_NULL) { + // make sure we mark this as attached...we might be nested and don't want to + // clean this up until we complete + activity->nestAttach(); return activity; } // we need to get a new activity set up for this particular thread activity = ActivityManager::attachThread(); + // this is still attached, but we'll release it once it is detached. We start with + // a count of 1 and cleanup once we hit zero. + activity->nestAttach(); // resource lock must come AFTER we attach the thread, otherwise // we can create a deadlock situation when we attempt to get the kernel // lock @@ -213,6 +219,16 @@ { return false; } + + // if we reused the activity because of a nested callback attach, then + // we just decrement the nesting count and return without cleaning up + // any resources. + activity->returnAttach(); + if (activity->isNestedAttach()) + { + return true; + } + ResourceSection lock; allActivities->removeItem((RexxObject *)activity); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-13 19:34:06
|
Revision: 2961 http://oorexx.svn.sourceforge.net/oorexx/?rev=2961&view=rev Author: bigrixx Date: 2008-08-13 19:34:11 +0000 (Wed, 13 Aug 2008) Log Message: ----------- fix time(o) resolution problem Modified Paths: -------------- main/trunk/interpreter/classes/support/RexxDateTime.cpp main/trunk/interpreter/classes/support/RexxDateTime.hpp main/trunk/interpreter/platform/windows/TimeSupport.cpp Modified: main/trunk/interpreter/classes/support/RexxDateTime.cpp =================================================================== --- main/trunk/interpreter/classes/support/RexxDateTime.cpp 2008-08-13 19:23:40 UTC (rev 2960) +++ main/trunk/interpreter/classes/support/RexxDateTime.cpp 2008-08-13 19:34:11 UTC (rev 2961) @@ -727,7 +727,7 @@ * @return true if the time was set properly. false if the * value was invalid. */ -bool RexxDateTime::adjustTimeZone(wholenumber_t o) +bool RexxDateTime::adjustTimeZone(int64_t o) { // we set the time using a UTC time adjusted by the offset, int64_t base = getUTCBaseTime(); @@ -1361,5 +1361,5 @@ void RexxDateTime::formatTimeZone(char *buffer) { // the time zone is a sized value - sprintf(buffer, "%d", timeZoneOffset); + Numerics::formatInt64(timeZoneOffset, (char *)buffer); } Modified: main/trunk/interpreter/classes/support/RexxDateTime.hpp =================================================================== --- main/trunk/interpreter/classes/support/RexxDateTime.hpp 2008-08-13 19:23:40 UTC (rev 2960) +++ main/trunk/interpreter/classes/support/RexxDateTime.hpp 2008-08-13 19:34:11 UTC (rev 2961) @@ -148,7 +148,7 @@ bool setHours(wholenumber_t h); bool setSeconds(wholenumber_t s); bool setMinutes(wholenumber_t m); - bool adjustTimeZone(wholenumber_t o); + bool adjustTimeZone(int64_t o); void formatBaseDate(char *buffer); void formatBaseTime(char *buffer); void formatUnixTime(char *buffer); @@ -167,8 +167,8 @@ void formatNormalTime(char *buffer); void formatSeconds(char *buffer); void formatTimeZone(char *buffer); - inline void setTimeZoneOffset(wholenumber_t o) { timeZoneOffset = o; } - inline wholenumber_t getTimeZoneOffset() { return timeZoneOffset; } + inline void setTimeZoneOffset(int64_t o) { timeZoneOffset = o; } + inline int64_t getTimeZoneOffset() { return timeZoneOffset; } wholenumber_t year; // current year @@ -179,7 +179,7 @@ wholenumber_t seconds; // second of the minute wholenumber_t microseconds; // microseconds wholenumber_t valid; // valid time stamp marker - wholenumber_t timeZoneOffset; // offset from UTC for this time stamp + int64_t timeZoneOffset; // offset from UTC for this time stamp protected: Modified: main/trunk/interpreter/platform/windows/TimeSupport.cpp =================================================================== --- main/trunk/interpreter/platform/windows/TimeSupport.cpp 2008-08-13 19:23:40 UTC (rev 2960) +++ main/trunk/interpreter/platform/windows/TimeSupport.cpp 2008-08-13 19:34:11 UTC (rev 2961) @@ -86,17 +86,17 @@ sysTimeStamp |= systemFileTime.dwHighDateTime; sysTimeStamp <<= 32; sysTimeStamp |= systemFileTime.dwLowDateTime; - // the resolution of this is in tenths of micro seconds. Convert to seconds, + // the resolution of this is in tenths of micro seconds. Convert to microseconds // which is a more realistic value - sysTimeStamp = sysTimeStamp / 10000000UL; + sysTimeStamp = sysTimeStamp / 10UL; localTimeStamp |= localFileTime.dwHighDateTime; localTimeStamp <<= 32; localTimeStamp |= localFileTime.dwLowDateTime; - localTimeStamp = localTimeStamp / 10000000UL; + localTimeStamp = localTimeStamp / 10UL; // ok, we can use this to calculate the timestamp directly - Date->timeZoneOffset = (wholenumber_t)(localTimeStamp - sysTimeStamp); + Date->timeZoneOffset = localTimeStamp - sysTimeStamp; SYSTEMTIME localTime; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-15 15:49:23
|
Revision: 2970 http://oorexx.svn.sourceforge.net/oorexx/?rev=2970&view=rev Author: bigrixx Date: 2008-08-15 15:49:31 +0000 (Fri, 15 Aug 2008) Log Message: ----------- add replactAt() methods to string and mutablebuffer Modified Paths: -------------- main/trunk/interpreter/classes/BufferClass.hpp main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/classes/StringClass.hpp main/trunk/interpreter/classes/StringClassSub.cpp main/trunk/interpreter/execution/CPPCode.cpp main/trunk/interpreter/memory/Setup.cpp main/trunk/interpreter/runtime/RexxConstants.hpp Modified: main/trunk/interpreter/classes/BufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/BufferClass.hpp 2008-08-15 09:59:06 UTC (rev 2969) +++ main/trunk/interpreter/classes/BufferClass.hpp 2008-08-15 15:49:31 UTC (rev 2970) @@ -65,6 +65,11 @@ { memmove(getData() + offset, getData() + offset + _size, tailSize); } + + inline void adjustGap(size_t offset, size_t _size, size_t _newSize) + { + memmove(getData() + offset + _newSize, getData() + offset + _size, getLength() - (offset + _size)); + } inline void setData(size_t offset, char character, size_t l) { memset(getData() + offset, character, l); Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-15 09:59:06 UTC (rev 2969) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-15 15:49:31 UTC (rev 2970) @@ -390,6 +390,80 @@ } +/** + * Replace a target substring within a string with + * a new string value. This is similar overlay, but + * replacing might cause the characters following the + * replacement position to be shifted to the left or + * right. + * + * @param str The replacement string. + * @param pos The target position (required). + * @param len The target length (optional). If not specified, the + * length of the replacement string is used, and this + * is essentially an overlay operation. + * @param pad A padding character if padding is required. The default + * pad is a ' '. Padding only occurs if the replacement + * position is beyond the current data length. + * + * @return The target mutablebuffer object. + */ +RexxMutableBuffer *RexxMutableBuffer::replaceAt(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad) +{ + RexxString *string = stringArgument(str, ARG_ONE); + size_t begin = positionArgument(pos, ARG_TWO) - 1; + size_t newLength = string->getLength(); + size_t replaceLength = optionalLengthArgument(len, newLength, ARG_THREE); + + char padChar = optionalPadArgument(pad, ' ', ARG_FOUR); + size_t finalLength; + + // will this extend beyond the end of the string, we require + // space for the position + the replacement string length + if (begin + newLength > dataLength) + { + finalLength = begin + newLength; + } + else + { + // we need to add the delta between the excised string and the inserted + // replacement string + finalLength = dataLength - replaceLength + newLength; + } + + // make sure we have room for this + ensureCapacity(finalLength); + + // is our start position beyond the current data end? + // NB: Even though we've adjusted the buffer size, the dataLength is still + // the original entry length. + if (begin > dataLength) + { + // add padding to the gap + data->setData(dataLength, padChar, begin - dataLength); + // now overlay the string data + data->copyData(begin, string->getStringData(), newLength); + } + else + { + // if the strings are of different lengths, we need to adjust the size + // of the gap we're copying into + if (replaceLength != newLength) + { + // snip out the original string + data->adjustGap(begin, replaceLength, newLength); + } + // now overlay the string data + data->copyData(begin, string->getStringData(), newLength); + } + + // and finally adjust the length + dataLength = finalLength; + // our return value is always the target mutable buffer + return this; +} + + RexxMutableBuffer *RexxMutableBuffer::mydelete(RexxObject *_start, RexxObject *len) /******************************************************************************/ /* Function: delete character range in buffer */ Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-15 09:59:06 UTC (rev 2969) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-15 15:49:31 UTC (rev 2970) @@ -80,6 +80,7 @@ RexxMutableBuffer *append(RexxObject*); RexxMutableBuffer *insert(RexxObject*, RexxObject*, RexxObject*, RexxObject*); RexxMutableBuffer *overlay(RexxObject*, RexxObject*, RexxObject*, RexxObject*); + RexxMutableBuffer *replaceAt(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad); RexxMutableBuffer *mydelete(RexxObject*, RexxObject*); RexxString *substr(RexxInteger *startPosition, RexxInteger *len, RexxString *pad); RexxInteger *lastPos(RexxString *needle, RexxInteger *_start); Modified: main/trunk/interpreter/classes/StringClass.hpp =================================================================== --- main/trunk/interpreter/classes/StringClass.hpp 2008-08-15 09:59:06 UTC (rev 2969) +++ main/trunk/interpreter/classes/StringClass.hpp 2008-08-15 15:49:31 UTC (rev 2970) @@ -234,6 +234,7 @@ RexxString *insert(RexxString *, RexxInteger *, RexxInteger *, RexxString *); RexxString *left(RexxInteger *, RexxString *); RexxString *overlay(RexxString *, RexxInteger *, RexxInteger *, RexxString *); + RexxString *replaceAt(RexxString *, RexxInteger *, RexxInteger *, RexxString *); RexxString *reverse(); RexxString *right(RexxInteger *, RexxString *); RexxString *strip(RexxString *, RexxString *); Modified: main/trunk/interpreter/classes/StringClassSub.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassSub.cpp 2008-08-15 09:59:06 UTC (rev 2969) +++ main/trunk/interpreter/classes/StringClassSub.cpp 2008-08-15 15:49:31 UTC (rev 2970) @@ -429,6 +429,88 @@ return Retval; /* return new string */ } + +/** + * Replace a substring starting at a given position and + * length with another string. This operation is essentially + * a delstr() followed by an insert() operation. + * + * @param newStrObj The replacement string + * @param position The replacement position (required) + * @param _length The length of string to replace (optional). If omitted, + * the length of the replacement string is used and this + * is essentially an overlay operation. + * @param pad The padding character if padding is required. The default + * is a ' ' + * + * @return A new instance of the string with the value replace. + */ +RexxString *RexxString::replaceAt(RexxString *newStrObj, RexxInteger *position, RexxInteger *_length, RexxString *pad) +{ + size_t targetLen = this->getLength(); // get the length of the replacement target + // the replacement value is required and must be a string + RexxString *newStr = stringArgument(newStrObj, ARG_ONE); + // the length of the replacement string is the default replacement length + size_t newLen = newStr->getLength(); + // the overlay position is required + size_t replacePos = positionArgument(position, ARG_TWO); + // the replacement length is optional, and defaults to the length of the replacement string + size_t replaceLen = optionalLengthArgument(_length, newLen, ARG_THREE); + // we only pad if the start position is past the end of the string + char padChar = optionalPadArgument(pad, ' ', ARG_FOUR); + size_t padding = 0; + size_t frontLen = 0; + size_t backLen = 0; + // the only time we need to pad is if the replacement position is past the + // end of the string + if (replacePos > targetLen) + { + padding = replacePos - targetLen - 1; + frontLen = targetLen; + } + else + { + // this is within bounds, so we copy up to that position + frontLen = replacePos - 1; + } + // is this within the bounds of the string? + if (replacePos + replaceLen < targetLen) + { + // calculate the back part we need to copy + backLen = targetLen - (replacePos + replaceLen - 1); + } + // allocate a result string + RexxString *retval = raw_string(frontLen + backLen + padding + newLen); + // and get a copy location + char *current = retval->getWritableData(); + + if (frontLen > 0) + { /* something in front? */ + /* copy the front part */ + memcpy(current, this->getStringData(), frontLen); + current += frontLen; /* step the pointer */ + } + // padding only happens if we've copy the entire front portion + if (padding > 0) + { + memset(current, padChar, padding); + current += padding; + } + // replace with a non-null string? copy into the current position + if (newLen > 0) + { + memcpy(current, newStr->getStringData(), newLen); + current += newLen; + } + // the remainder, if there is any, get's copied after the + // replacement string with no padding + if (backLen > 0) + { + memcpy(current, this->getStringData() + replacePos + replaceLen - 1, backLen); + } + return retval; +} + /* the REVERSE function */ /******************************************************************************/ /* Arguments: none */ Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-15 09:59:06 UTC (rev 2969) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-15 15:49:31 UTC (rev 2970) @@ -772,6 +772,7 @@ CPPM(RexxString::strip), CPPM(RexxString::substr), CPPM(RexxString::subchar), +CPPM(RexxString::replaceAt), /* following methods are in OKBWORD */ CPPM(RexxString::delWord), @@ -849,6 +850,7 @@ CPPM(RexxMutableBuffer::lastPos), CPPM(RexxMutableBuffer::getBufferSize), CPPM(RexxMutableBuffer::setBufferSize), +CPPM(RexxMutableBuffer::replaceAt), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-15 09:59:06 UTC (rev 2969) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-15 15:49:31 UTC (rev 2970) @@ -812,6 +812,7 @@ defineKernelMethod(CHAR_INSERT ,TheStringBehaviour, CPPM(RexxString::insert), 4); defineKernelMethod(CHAR_LEFT ,TheStringBehaviour, CPPM(RexxString::left), 2); defineKernelMethod(CHAR_OVERLAY ,TheStringBehaviour, CPPM(RexxString::overlay), 4); + defineKernelMethod(CHAR_REPLACEAT ,TheStringBehaviour, CPPM(RexxString::replaceAt), 4); defineKernelMethod(CHAR_REVERSE ,TheStringBehaviour, CPPM(RexxString::reverse), 0); defineKernelMethod(CHAR_RIGHT ,TheStringBehaviour, CPPM(RexxString::right), 2); defineKernelMethod(CHAR_STRIP ,TheStringBehaviour, CPPM(RexxString::strip), 2); @@ -926,6 +927,7 @@ defineKernelMethod(CHAR_APPEND ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::append), 1); defineKernelMethod(CHAR_INSERT ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::insert), 4); defineKernelMethod(CHAR_OVERLAY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::overlay), 4); + defineKernelMethod(CHAR_REPLACEAT ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::replaceAt), 4); defineKernelMethod(CHAR_DELETE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::mydelete), 2); defineKernelMethod(CHAR_SUBSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::substr), 3); defineKernelMethod(CHAR_POS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::posRexx), 2); Modified: main/trunk/interpreter/runtime/RexxConstants.hpp =================================================================== --- main/trunk/interpreter/runtime/RexxConstants.hpp 2008-08-15 09:59:06 UTC (rev 2969) +++ main/trunk/interpreter/runtime/RexxConstants.hpp 2008-08-15 15:49:31 UTC (rev 2970) @@ -260,6 +260,7 @@ CHARCONSTANT(RELATION, "RELATION"); CHARCONSTANT(REMOVE, "REMOVE"); CHARCONSTANT(REMOVEITEM, "REMOVEITEM"); +CHARCONSTANT(REPLACEAT, "REPLACEAT"); CHARCONSTANT(REQUEST, "REQUEST"); CHARCONSTANT(REQUIRES, "REQUIRES"); CHARCONSTANT(RESULT, "RESULT"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-15 17:20:23
|
Revision: 2972 http://oorexx.svn.sourceforge.net/oorexx/?rev=2972&view=rev Author: bigrixx Date: 2008-08-15 17:20:26 +0000 (Fri, 15 Aug 2008) Log Message: ----------- make method argument validation a little more consistent Modified Paths: -------------- main/trunk/interpreter/behaviour/RexxBehaviour.cpp main/trunk/interpreter/classes/ArrayClass.cpp main/trunk/interpreter/classes/ClassClass.cpp main/trunk/interpreter/classes/DirectoryClass.cpp main/trunk/interpreter/classes/MessageClass.cpp main/trunk/interpreter/classes/MethodClass.cpp main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/ObjectClass.cpp main/trunk/interpreter/classes/PackageClass.cpp main/trunk/interpreter/classes/RoutineClass.cpp main/trunk/interpreter/classes/StemClass.cpp main/trunk/interpreter/classes/StringClass.cpp main/trunk/interpreter/classes/StringClassMisc.cpp main/trunk/interpreter/classes/StringClassUtil.cpp main/trunk/interpreter/classes/StringUtil.cpp main/trunk/interpreter/execution/RexxNativeActivation.cpp main/trunk/interpreter/platform/unix/ValueFunction.cpp main/trunk/interpreter/platform/windows/ValueFunction.cpp main/trunk/interpreter/runtime/RexxCore.h Modified: main/trunk/interpreter/behaviour/RexxBehaviour.cpp =================================================================== --- main/trunk/interpreter/behaviour/RexxBehaviour.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/behaviour/RexxBehaviour.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -349,7 +349,7 @@ { /* force to a string version (upper */ /* case required) */ - messageName = REQUIRED_STRING(messageName, ARG_ONE)->upper(); + messageName = stringArgument(messageName, ARG_ONE)->upper(); /* now just do a method lookup */ return this->methodLookup(messageName); } Modified: main/trunk/interpreter/classes/ArrayClass.cpp =================================================================== --- main/trunk/interpreter/classes/ArrayClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/ArrayClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -1292,7 +1292,7 @@ if (format != OREF_NULL) { // a string value is required here - format = REQUIRED_STRING(format, ARG_ONE); + format = stringArgument(format, ARG_ONE); } if (format == OREF_NULL) @@ -1337,7 +1337,7 @@ { if (separator != OREF_NULL) { - line_end_string = REQUIRED_STRING(separator, ARG_TWO); + line_end_string = stringArgument(separator, ARG_TWO); } else { Modified: main/trunk/interpreter/classes/ClassClass.cpp =================================================================== --- main/trunk/interpreter/classes/ClassClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/ClassClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -559,7 +559,7 @@ } /* make sure there is at least one */ /* parameter */ - method_name = REQUIRED_STRING(method_name, ARG_ONE)->upper(); + method_name = stringArgument(method_name, ARG_ONE)->upper(); if ( OREF_NULL == method_object) /* 2nd arg omitted? */ { /* Yes, remove all message with this */ @@ -650,7 +650,7 @@ reportNomethod(lastMessageName(), this); } /* and that it can be a string */ - method_name = REQUIRED_STRING(method_name, ARG_ONE)->upper(); + method_name = stringArgument(method_name, ARG_ONE)->upper(); /* make a copy of the instance */ /* behaviour so any previous objects */ /* aren't enhanced */ @@ -673,7 +673,7 @@ /*****************************************************************************/ { /* make sure we have a proper name */ - method_name = REQUIRED_STRING(method_name, ARG_ONE)->upper(); + method_name = stringArgument(method_name, ARG_ONE)->upper(); RexxMethod *method_object = (RexxMethod *)this->instanceBehaviour->getMethodDictionary()->stringGet(method_name); /* check if it is in the mdict */ if ( OREF_NULL == method_object) @@ -1445,7 +1445,7 @@ reportException(Error_Incorrect_method_minarg, IntegerOne); } RexxString *class_id = (RexxString *)args[0]; /* get the id parameter */ - class_id = REQUIRED_STRING(class_id, ARG_ONE); /* and that it can be a string */ + class_id = stringArgument(class_id, ARG_ONE); /* and that it can be a string */ /* get a copy of this class object */ RexxClass *new_class = (RexxClass *)this->clone(); Modified: main/trunk/interpreter/classes/DirectoryClass.cpp =================================================================== --- main/trunk/interpreter/classes/DirectoryClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/DirectoryClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -304,7 +304,7 @@ /******************************************************************************/ { /* get a string parameter (uppercase)*/ - entryName = REQUIRED_STRING(entryName, ARG_ONE)->upper(); + entryName = stringArgument(entryName, ARG_ONE)->upper(); RexxObject *temp = this->at(entryName); /* retrieve the name */ /* if we found nothing or the method */ @@ -323,7 +323,7 @@ /******************************************************************************/ { /* get as a string parameter */ - indexName = REQUIRED_STRING(indexName, ARG_ONE); + indexName = stringArgument(indexName, ARG_ONE); /* got a value? */ if (this->contents->stringGet(indexName) != OREF_NULL) { @@ -355,7 +355,7 @@ /******************************************************************************/ { /* get as a string parameter */ - entryName = REQUIRED_STRING(entryName, ARG_ONE)->upper(); + entryName = stringArgument(entryName, ARG_ONE)->upper(); /* in the table? */ if (this->contents->stringGet(entryName) != OREF_NULL) { @@ -387,7 +387,7 @@ /******************************************************************************/ { /* get as a string parameter */ - entryname = REQUIRED_STRING(entryname, ARG_ONE)->upper(); + entryname = stringArgument(entryname, ARG_ONE)->upper(); if (entryobj != OREF_NULL) { /* have a new value? */ /* try to place in existing hashtab */ @@ -416,7 +416,7 @@ /******************************************************************************/ { /* get as a string parameter */ - entryname = REQUIRED_STRING(entryname, ARG_ONE); + entryname = stringArgument(entryname, ARG_ONE); RexxObject *oldVal = this->at(entryname); /* go get the directory value */ if (oldVal == OREF_NULL) /* nothing to return? */ { @@ -447,7 +447,7 @@ /******************************************************************************/ { /* validate the name */ - RexxString *message_value = REQUIRED_STRING(msgname, ARG_ONE); + RexxString *message_value = stringArgument(msgname, ARG_ONE); required_arg(arguments, TWO); /* need an argument array */ /* get the length */ stringsize_t message_length = message_value->getLength(); @@ -483,7 +483,7 @@ /******************************************************************************/ { /* get as a string parameter */ - entryname = REQUIRED_STRING(entryname, ARG_ONE)->upper(); + entryname = stringArgument(entryname, ARG_ONE)->upper(); if (methodobj != OREF_NULL) /* have a method object? */ { if (!isOfClass(Method, methodobj)) /* given as a string? */ @@ -598,7 +598,7 @@ RexxObject *temp; /* Temporary holder for return value */ /* get as a string parameter */ - _index = REQUIRED_STRING(_index, ARG_ONE); + _index = stringArgument(_index, ARG_ONE); // is this the .local object? We'll need to check with the security manager if ((RexxDirectory *)(ActivityManager::localEnvironment) == this) { @@ -626,7 +626,7 @@ /******************************************************************************/ { /* get as a string parameter */ - _index = REQUIRED_STRING(_index, ARG_TWO); + _index = stringArgument(_index, ARG_TWO); if (this->method_table != OREF_NULL) /* have a table? */ { this->method_table->remove(_index);/* remove any method */ Modified: main/trunk/interpreter/classes/MessageClass.cpp =================================================================== --- main/trunk/interpreter/classes/MessageClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/MessageClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -582,7 +582,7 @@ else /* not an array as message. */ { /* force to a string value */ - _message = REQUIRED_STRING(_message, ARG_TWO); + _message = stringArgument(_message, ARG_TWO); /* Message to be sent. */ } @@ -602,7 +602,7 @@ else { /* Convert it into a string. */ - optionString = REQUIRED_STRING(optionString, ARG_THREE); + optionString = stringArgument(optionString, ARG_THREE); /* char and make it lower case */ char option = tolower(optionString->getChar(0)); if (option == 'a') /* args passed as an array? */ Modified: main/trunk/interpreter/classes/MethodClass.cpp =================================================================== --- main/trunk/interpreter/classes/MethodClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/MethodClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -595,7 +595,7 @@ RexxClass::processNewArgs(init_args, argCount, &init_args, &initCount, 2, (RexxObject **)&pgmname, (RexxObject **)&_source); /* get the method name as a string */ - RexxString *nameString = REQUIRED_STRING(pgmname, ARG_ONE); + RexxString *nameString = stringArgument(pgmname, ARG_ONE); required_arg(_source, TWO); /* make sure we have the second too */ RexxSource *sourceContext = OREF_NULL; @@ -647,7 +647,7 @@ /******************************************************************************/ { /* get the method name as a string */ - filename = REQUIRED_STRING(filename, ARG_ONE); + filename = stringArgument(filename, ARG_ONE); /* create a source object */ RexxMethod *newMethod = new RexxMethod(filename); ProtectedObject p(newMethod); Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -273,7 +273,7 @@ /* Function: append to the mutable buffer */ /******************************************************************************/ { - RexxString *string = REQUIRED_STRING(obj, ARG_ONE); + RexxString *string = stringArgument(obj, ARG_ONE); ProtectedObject p(string); // make sure we have enough room ensureCapacity(string->getLength()); @@ -290,7 +290,7 @@ /******************************************************************************/ { // force this into string form - RexxString * string = REQUIRED_STRING(str, ARG_ONE); + RexxString * string = stringArgument(str, ARG_ONE); // we're using optional length because 0 is valid for insert. size_t begin = optionalNonNegative(pos, 0, ARG_TWO); Modified: main/trunk/interpreter/classes/ObjectClass.cpp =================================================================== --- main/trunk/interpreter/classes/ObjectClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/ObjectClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -269,7 +269,7 @@ RexxMethod *RexxObject::instanceMethod(RexxString *method_name) { // the name must be a string...and we use it in upper case - method_name = REQUIRED_STRING(method_name, ARG_ONE)->upper(); + method_name = stringArgument(method_name, ARG_ONE)->upper(); // retrieve the method from the dictionary RexxMethod *method_object = (RexxMethod *)this->behaviour->getMethodDictionary()->stringGet(method_name); // this is an error if it doesn't exist @@ -1437,7 +1437,7 @@ required_arg(name, ONE); /* must have a name */ scope = lastMethod()->getScope(); /* get the method's scope */ /* get this as a string */ - name = (RexxObject *)REQUIRED_STRING(name, ARG_ONE); + name = (RexxObject *)stringArgument(name, ARG_ONE); /* set the name */ this->setObjectVariable(OREF_NAME, name, scope); return OREF_NULL; /* no return value */ @@ -1508,10 +1508,10 @@ /******************************************************************************/ { /* get the message name as a string */ - msgname = REQUIRED_STRING(msgname, ARG_ONE)->upper(); + msgname = stringArgument(msgname, ARG_ONE)->upper(); if (option) { - option = REQUIRED_STRING(option, ARG_THREE); + option = stringArgument(option, ARG_THREE); if (!Utilities::strCaselessCompare("OBJECT",option->getStringData())) { // do nothing if OBJECT @@ -1548,7 +1548,7 @@ /******************************************************************************/ { /* get the message name as a string */ - msgname = REQUIRED_STRING(msgname, ARG_ONE)->upper(); + msgname = stringArgument(msgname, ARG_ONE)->upper(); /* now just go remove this */ this->behaviour->removeMethod(msgname); return OREF_NULL; /* no return value */ @@ -1562,7 +1562,7 @@ /******************************************************************************/ { /* Verify we have a string parm */ - className = REQUIRED_STRING(className, ARG_ONE)->upper(); + className = stringArgument(className, ARG_ONE)->upper(); RexxString *class_id = this->id()->upper(); /* get the class name in uppercase */ /* of the same class? */ if (className->strictEqual(class_id) == TheTrueObject) @@ -1646,7 +1646,7 @@ reportException(Error_Incorrect_method_message); } /* get the message as a string */ - newMsgName = REQUIRED_STRING(messageArray->get(1), ARG_ONE); + newMsgName = stringArgument(messageArray->get(1), ARG_ONE); /* Was starting scope omitted ? */ if (OREF_NULL == messageArray->get(2)) { @@ -1675,7 +1675,7 @@ else /* not an array as message. */ { /* force to a string value */ - message = REQUIRED_STRING(message, ARG_ONE); + message = stringArgument(message, ARG_ONE); } /* Create the new message object. */ newMessage = new RexxMessage(this, message, new (argCount - 1, arguments + 1) RexxArray); @@ -1742,7 +1742,7 @@ /* get the 1st one, its the option */ RexxString *option = (RexxString *)arguments[1]; /* this is now required */ - option = REQUIRED_STRING(option, ARG_TWO); + option = stringArgument(option, ARG_TWO); /* process the different options */ switch (toupper(option->getChar(0))) { @@ -2310,7 +2310,7 @@ /* Function: Exported access to an object virtual function */ /******************************************************************************/ { - message = REQUIRED_STRING(message, ARG_ONE)->upper(); + message = stringArgument(message, ARG_ONE)->upper(); return this->hasMethod(message); /* forward to the virtual function */ } Modified: main/trunk/interpreter/classes/PackageClass.cpp =================================================================== --- main/trunk/interpreter/classes/PackageClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/PackageClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -351,7 +351,7 @@ PackageClass *PackageClass::loadPackage(RexxString *name, RexxArray *s) { // make sure we have a valid name and delegate to the source object - name = REQUIRED_STRING(name, 1); + name = stringArgument(name, 1); // if no source provided, this comes from a file if (s == OREF_NULL) { @@ -359,7 +359,7 @@ } else { - s = REQUIRED_ARRAY(s, "source"); + s = arrayArgument(s, "source"); return source->loadRequired(name, s); } } @@ -374,7 +374,7 @@ */ RexxObject *PackageClass::addPackage(PackageClass *package) { - REQUIRED_INSTANCE(package, ThePackageClass, "package"); + classArgument(package, ThePackageClass, "package"); source->addPackage(package); return this; } @@ -389,8 +389,8 @@ */ RexxObject *PackageClass::addRoutine(RexxString *name, RoutineClass *routine) { - name = REQUIRED_STRING(name, "name"); - REQUIRED_INSTANCE(routine, TheRoutineClass, "routine"); + name = stringArgument(name, "name"); + classArgument(routine, TheRoutineClass, "routine"); source->addInstalledRoutine(name, routine, false); return this; } @@ -405,8 +405,8 @@ */ RexxObject *PackageClass::addPublicRoutine(RexxString *name, RoutineClass *routine) { - name = REQUIRED_STRING(name, "name"); - REQUIRED_INSTANCE(routine, TheRoutineClass, "routine"); + name = stringArgument(name, "name"); + classArgument(routine, TheRoutineClass, "routine"); source->addInstalledRoutine(name, routine, true); return this; } @@ -421,8 +421,8 @@ */ RexxObject *PackageClass::addClass(RexxString *name, RexxClass *clazz) { - name = REQUIRED_STRING(name, "name"); - REQUIRED_INSTANCE(clazz, TheClassClass, "class"); + name = stringArgument(name, "name"); + classArgument(clazz, TheClassClass, "class"); source->addInstalledClass(name, clazz, false); return this; } @@ -437,8 +437,8 @@ */ RexxObject *PackageClass::addPublicClass(RexxString *name, RexxClass *clazz) { - name = REQUIRED_STRING(name, "name"); - REQUIRED_INSTANCE(clazz, TheClassClass, "class"); + name = stringArgument(name, "name"); + classArgument(clazz, TheClassClass, "class"); source->addInstalledClass(name, clazz, true); return this; } @@ -505,7 +505,7 @@ ProtectedObject p; /* get the package name as a string */ - RexxString *nameString = REQUIRED_STRING(pgmname, "name"); + RexxString *nameString = stringArgument(pgmname, "name"); if (_source == OREF_NULL) { RexxString *resolvedName = ActivityManager::currentActivity->getInstance()->resolveProgramName(nameString, OREF_NULL, OREF_NULL); @@ -513,7 +513,7 @@ } else { - RexxArray *sourceArray = REQUIRED_ARRAY(_source, "source"); + RexxArray *sourceArray = arrayArgument(_source, "source"); package = PackageManager::loadRequires(ActivityManager::currentActivity, nameString, sourceArray, p); } Modified: main/trunk/interpreter/classes/RoutineClass.cpp =================================================================== --- main/trunk/interpreter/classes/RoutineClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/RoutineClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -282,7 +282,7 @@ RexxObject *RoutineClass::callWithRexx(RexxArray *args) { // this is required and must be an array - args = REQUIRED_ARRAY(args, 1); + args = arrayArgument(args, 1); ProtectedObject result; @@ -565,7 +565,7 @@ RexxClass::processNewArgs(init_args, argCount, &init_args, &initCount, 2, (RexxObject **)&pgmname, (RexxObject **)&_source); /* get the method name as a string */ - RexxString *nameString = REQUIRED_STRING(pgmname, ARG_ONE); + RexxString *nameString = stringArgument(pgmname, ARG_ONE); required_arg(_source, TWO); /* make sure we have the second too */ RexxSource *sourceContext = OREF_NULL; @@ -618,7 +618,7 @@ /******************************************************************************/ { /* get the method name as a string */ - filename = REQUIRED_STRING(filename, ARG_ONE); + filename = stringArgument(filename, ARG_ONE); /* finish up processing of this */ RoutineClass * newMethod = new RoutineClass(filename); ProtectedObject p2(newMethod); Modified: main/trunk/interpreter/classes/StemClass.cpp =================================================================== --- main/trunk/interpreter/classes/StemClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/StemClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -79,7 +79,7 @@ else { /* must get a string here */ - name = REQUIRED_STRING(name, ARG_ONE); + name = stringArgument(name, ARG_ONE); } OrefSet(this, this->stemName, name); /* fill in the name */ OrefSet(this, this->value, name); /* fill in the default value */ @@ -190,7 +190,7 @@ /******************************************************************************/ { /* validate the name */ - msgname = REQUIRED_STRING(msgname, ARG_ONE); + msgname = stringArgument(msgname, ARG_ONE); required_arg(arguments, TWO); /* need an argument array */ /* get this as an array */ arguments = (RexxArray *)REQUEST_ARRAY(arguments); @@ -482,7 +482,7 @@ { ProtectedObject result; /* Verify we have a string parm */ - makeclass = REQUIRED_STRING(makeclass, ARG_ONE)->upper(); + makeclass = stringArgument(makeclass, ARG_ONE)->upper(); /* array request? */ if (makeclass->strCompare(CHAR_ARRAY)) { Modified: main/trunk/interpreter/classes/StringClass.cpp =================================================================== --- main/trunk/interpreter/classes/StringClass.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/StringClass.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -2018,7 +2018,7 @@ /* break up the arguments */ RexxClass::processNewArgs(init_args, argCount, &init_args, &argCount, 1, (RexxObject **)&stringObj, NULL); /* force argument to string value */ - RexxString *string = (RexxString *)REQUIRED_STRING(stringObj, ARG_ONE); + RexxString *string = (RexxString *)stringArgument(stringObj, ARG_ONE); /* create a new string object */ string = new_string(string->getStringData(), string->getLength()); string->setBehaviour(((RexxClass *)this)->getInstanceBehaviour()); Modified: main/trunk/interpreter/classes/StringClassMisc.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -462,7 +462,7 @@ RexxInteger *RexxString::caselessLastPosRexx(RexxString *needle, RexxInteger *_start) { // validate that this is a good string argument - needle = REQUIRED_STRING(needle, ARG_ONE); + needle = stringArgument(needle, ARG_ONE); // find out where to start the search. The default is at the very end. size_t startPos = optionalPositionArgument(_start, getLength(), ARG_TWO); // now perform the actual search. @@ -551,7 +551,7 @@ /******************************************************************************/ { /* force needle to a string */ - needle = REQUIRED_STRING(needle, ARG_ONE); + needle = stringArgument(needle, ARG_ONE); size_t count = this->countStr(needle); /* do the counting */ return new_integer(count); /* return the count as an object */ } @@ -581,7 +581,7 @@ /******************************************************************************/ { /* force needle to a string */ - needle = REQUIRED_STRING(needle, ARG_ONE); + needle = stringArgument(needle, ARG_ONE); size_t count = this->caselessCountStr(needle); /* do the counting */ return new_integer(count); /* return the count as an object */ } @@ -604,9 +604,9 @@ size_t i; /* force needle to a string */ - needle = REQUIRED_STRING(needle, ARG_ONE); + needle = stringArgument(needle, ARG_ONE); /* newneedle must be a string two */ - newNeedle = REQUIRED_STRING(newNeedle, ARG_TWO); + newNeedle = stringArgument(newNeedle, ARG_TWO); // we'll only change up to a specified count. If not there, we do everything. size_t count = optionalPositive(countArg, Numerics::MAX_WHOLENUMBER, ARG_THREE); @@ -671,9 +671,9 @@ size_t i; /* force needle to a string */ - needle = REQUIRED_STRING(needle, ARG_ONE); + needle = stringArgument(needle, ARG_ONE); /* newneedle must be a string two */ - newNeedle = REQUIRED_STRING(newNeedle, ARG_TWO); + newNeedle = stringArgument(newNeedle, ARG_TWO); // we'll only change up to a specified count. If not there, we do everything. size_t count = optionalPositive(countArg, Numerics::MAX_WHOLENUMBER, ARG_THREE); @@ -740,7 +740,7 @@ /******************************************************************************/ { /* force needle to a string */ - needle = REQUIRED_STRING(needle, ARG_ONE); + needle = stringArgument(needle, ARG_ONE); /* get the starting position */ size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); /* pass on to the primitive function */ Modified: main/trunk/interpreter/classes/StringClassUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassUtil.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/StringClassUtil.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -106,7 +106,7 @@ RexxObject *argument, /* method argument */ size_t position ) /* argument position */ { - RexxString *parameter = (RexxString *)REQUIRED_STRING(argument, position); + RexxString *parameter = (RexxString *)stringArgument(argument, position); /* is the string only 1 character? */ if (parameter->getLength() != 1) { @@ -128,7 +128,7 @@ size_t position ) /* argument position */ { /* force option to string */ - RexxString *parameter = (RexxString *)REQUIRED_STRING(argument, position); + RexxString *parameter = (RexxString *)stringArgument(argument, position); /* return the first character */ return toupper(parameter->getChar(0)); } Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -130,7 +130,7 @@ RexxInteger *StringUtil::posRexx(const char *stringData, size_t length, RexxString *needle, RexxInteger *pstart) { /* force needle to a string */ - needle = REQUIRED_STRING(needle, ARG_ONE); + needle = stringArgument(needle, ARG_ONE); /* get the starting position */ size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); /* pass on to the primitive function */ @@ -200,7 +200,7 @@ */ RexxInteger *StringUtil::lastPosRexx(const char *stringData, size_t haystackLen, RexxString *needle, RexxInteger *_start) { - needle = REQUIRED_STRING(needle, ARG_ONE); + needle = stringArgument(needle, ARG_ONE); // find out where to start the search. The default is at the very end. size_t startPos = optionalPositionArgument(_start, haystackLen, ARG_TWO); // now perform the actual search. @@ -373,7 +373,7 @@ if (separator != OREF_NULL) { // make sure this is really a string value - separator = REQUIRED_STRING(separator, ARG_ONE); + separator = stringArgument(separator, ARG_ONE); sepData = separator->getStringData(); sepSize = separator->getLength(); checkCR = false; // if explicitly given, only use the given one Modified: main/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/execution/RexxNativeActivation.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -400,7 +400,7 @@ case REXX_VALUE_RexxStringObject: /* Required STRING object */ { /* force to a string value */ - RexxString *temp = REQUIRED_STRING(argument, inputIndex + 1) ; + RexxString *temp = stringArgument(argument, inputIndex + 1) ; // if this forced a string object to be created, // we need to protect it here. if (temp != argument) @@ -417,7 +417,7 @@ case REXX_VALUE_RexxArrayObject: /* Required ARRAY object */ { /* force to a string value */ - RexxArray *temp = REQUIRED_ARRAY(argument, inputIndex + 1) ; + RexxArray *temp = arrayArgument(argument, inputIndex + 1) ; // if this forced a string object to be created, // we need to protect it here. if (temp != argument) @@ -456,7 +456,7 @@ } /* force to a string value */ - RexxString *temp = REQUIRED_STRING(argument, inputIndex + 1) ; + RexxString *temp = stringArgument(argument, inputIndex + 1) ; // if this forced a string object to be created, // we need to protect it here. if (temp != argument) @@ -914,7 +914,7 @@ case REXX_VALUE_RexxStringObject: /* Required STRING object */ { /* force to a string value */ - RexxString *temp = REQUIRED_STRING(o, 1) ; + RexxString *temp = stringArgument(o, 1) ; // if this forced a string object to be created, // we need to protect it here. if (temp != o) @@ -931,7 +931,7 @@ case REXX_VALUE_RexxArrayObject: /* Required ARRAY object */ { /* force to a string value */ - RexxArray *temp = REQUIRED_ARRAY(o, 1) ; + RexxArray *temp = arrayArgument(o, 1) ; // if this forced a string object to be created, // we need to protect it here. if (temp != o) @@ -970,7 +970,7 @@ } /* force to a string value */ - RexxString *temp = REQUIRED_STRING(o, 1) ; + RexxString *temp = stringArgument(o, 1) ; // if this forced a string object to be created, // we need to protect it here. if (temp != o) @@ -2300,7 +2300,7 @@ } /* force to a string value */ - RexxString *temp = REQUIRED_STRING(s, 1); + RexxString *temp = stringArgument(s, 1); // see if we can retrieve this stem return (RexxStem *)getContextStem(temp); } Modified: main/trunk/interpreter/platform/unix/ValueFunction.cpp =================================================================== --- main/trunk/interpreter/platform/unix/ValueFunction.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/platform/unix/ValueFunction.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -144,7 +144,7 @@ } else { - SetEnvironmentVariable(Name, REQUIRED_STRING(NewValue, ARG_TWO)); + SetEnvironmentVariable(Name, stringArgument(NewValue, ARG_TWO)); } } return true; Modified: main/trunk/interpreter/platform/windows/ValueFunction.cpp =================================================================== --- main/trunk/interpreter/platform/windows/ValueFunction.cpp 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/platform/windows/ValueFunction.cpp 2008-08-15 17:20:26 UTC (rev 2972) @@ -92,7 +92,7 @@ SetEnvironmentVariable((LPCTSTR)Name->getStringData(), NULL); else SetEnvironmentVariable((LPCTSTR)Name->getStringData(), - (LPCTSTR)REQUIRED_STRING(NewValue,ARG_TWO)->getStringData()); + (LPCTSTR)stringArgument(NewValue,ARG_TWO)->getStringData()); } return true; } Modified: main/trunk/interpreter/runtime/RexxCore.h =================================================================== --- main/trunk/interpreter/runtime/RexxCore.h 2008-08-15 16:47:51 UTC (rev 2971) +++ main/trunk/interpreter/runtime/RexxCore.h 2008-08-15 17:20:26 UTC (rev 2972) @@ -320,7 +320,7 @@ /* The next routine is specifically for REQUESTing a STRING needed as a method*/ /* argument. This raises an error if the object cannot be converted to a */ /* string value. */ -inline RexxString * REQUIRED_STRING(RexxObject *object, size_t position) +inline RexxString * stringArgument(RexxObject *object, size_t position) { if (object == OREF_NULL) /* missing argument? */ { @@ -330,16 +330,33 @@ return object->requiredString(position); } -inline RexxString *stringArgument(RexxObject *s, size_t p) + +/* The next routine is specifically for REQUESTing a STRING needed as a method*/ +/* argument. This raises an error if the object cannot be converted to a */ +/* string value. */ +inline RexxString * stringArgument(RexxObject *object, const char *name) { - return REQUIRED_STRING(s, p); + if (object == OREF_NULL) /* missing argument? */ + { + reportException(Error_Invalid_argument_noarg, name); + } + /* force to a string value */ + return object->requiredString(name); } + inline RexxString *optionalStringArgument(RexxObject *o, RexxString *d, size_t p) { return (o == OREF_NULL ? d : stringArgument(o, p)); } + +inline RexxString *optionalStringArgument(RexxObject *o, RexxString *d, const char *p) +{ + return (o == OREF_NULL ? d : stringArgument(o, p)); +} + + // resides in the string class util size_t lengthArgument(RexxObject *o, size_t p); @@ -383,7 +400,7 @@ /* The next routine is specifically for REQUESTing an ARRAY needed as a method*/ /* argument. This raises an error if the object cannot be converted to a */ /* single dimensional array item */ -inline RexxArray * REQUIRED_ARRAY(RexxObject *object, size_t position) +inline RexxArray *arrayArgument(RexxObject *object, size_t position) { if (object == OREF_NULL) /* missing argument? */ { @@ -401,7 +418,7 @@ } -inline RexxArray * REQUIRED_ARRAY(RexxObject *object, const char *name) +inline RexxArray * arrayArgument(RexxObject *object, const char *name) { if (object == OREF_NULL) /* missing argument? */ { @@ -423,27 +440,13 @@ /* The next routine is specifically for REQUESTing a STRING needed as a method*/ /* argument. This raises an error if the object cannot be converted to a */ /* string value. */ -inline RexxString * REQUIRED_STRING(RexxObject *object, const char *name) +inline void classArgument(RexxObject *object, RexxClass *clazz, const char *name) { if (object == OREF_NULL) /* missing argument? */ { reportException(Error_Invalid_argument_noarg, name); } - /* force to a string value */ - return object->requiredString(name); -} - -/* The next routine is specifically for REQUESTing a STRING needed as a method*/ -/* argument. This raises an error if the object cannot be converted to a */ -/* string value. */ -inline void REQUIRED_INSTANCE(RexxObject *object, RexxClass *clazz, const char *name) -{ - if (object == OREF_NULL) /* missing argument? */ - { - reportException(Error_Invalid_argument_noarg, name); - } - if (!object->isInstanceOf(clazz)) { reportException(Error_Invalid_argument_noclass, name, clazz->getId()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-15 20:32:21
|
Revision: 2974 http://oorexx.svn.sourceforge.net/oorexx/?rev=2974&view=rev Author: bigrixx Date: 2008-08-15 20:32:28 +0000 (Fri, 15 Aug 2008) Log Message: ----------- [ 2053719 ] Add countStr and caselessCountStr to mutable buffer. Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/classes/StringClass.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/expression/BuiltinFunctions.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-15 17:32:39 UTC (rev 2973) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-15 20:32:28 UTC (rev 2974) @@ -590,3 +590,26 @@ { return StringUtil::makearray(getStringData(), getLength(), div); } + + +RexxInteger *RexxMutableBuffer::countStrRexx(RexxString *needle) +/******************************************************************************/ +/* Function: Count occurrences of one string in another. */ +/******************************************************************************/ +{ + /* force needle to a string */ + needle = stringArgument(needle, ARG_ONE); + // delegate the counting to the string util + return new_integer(StringUtil::countStr(getStringData(), getLength(), needle)); +} + +RexxInteger *RexxMutableBuffer::caselessCountStrRexx(RexxString *needle) +/******************************************************************************/ +/* Function: Count occurrences of one string in another. */ +/******************************************************************************/ +{ + /* force needle to a string */ + needle = stringArgument(needle, ARG_ONE); + // delegate the counting to the string util + return new_integer(StringUtil::caselessCountStr(getStringData(), getLength(), needle)); +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-15 17:32:39 UTC (rev 2973) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-15 20:32:28 UTC (rev 2974) @@ -91,6 +91,8 @@ RexxObject *setBufferSize(RexxInteger*); RexxArray *makearray(RexxString *div); RexxString *makeString(); + RexxInteger *countStrRexx(RexxString *needle); + RexxInteger *caselessCountStrRexx(RexxString *needle); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/classes/StringClass.hpp =================================================================== --- main/trunk/interpreter/classes/StringClass.hpp 2008-08-15 17:32:39 UTC (rev 2973) +++ main/trunk/interpreter/classes/StringClass.hpp 2008-08-15 20:32:28 UTC (rev 2974) @@ -274,7 +274,6 @@ RexxString *translate(RexxString *, RexxString *, RexxString *); RexxInteger *verify(RexxString *, RexxString *, RexxInteger *); RexxInteger *countStrRexx(RexxString *); - size_t countStr(RexxString *); RexxInteger *caselessCountStrRexx(RexxString *); size_t caselessCountStr(RexxString *); /* the following methods are in */ Modified: main/trunk/interpreter/classes/StringClassMisc.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-15 17:32:39 UTC (rev 2973) +++ main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-15 20:32:28 UTC (rev 2974) @@ -453,12 +453,29 @@ } +/** + * Do a lastpos() search for a string. + * + * @param needle The search needle. + * @param _start The starting position. + * + * @return the offset of the match position (origin 1). Returns 0 + * if no match was found. + */ RexxInteger *RexxString::lastPosRexx(RexxString *needle, RexxInteger *_start) { return StringUtil::lastPosRexx(getStringData(), getLength(), needle, _start); } +/** + * Rexx exported version of the caselessLastPos() method. + * + * @param needle The search needle. + * @param _start The starting position. + * + * @return The match position. 0 means not found. + */ RexxInteger *RexxString::caselessLastPosRexx(RexxString *needle, RexxInteger *_start) { // validate that this is a good string argument @@ -470,7 +487,6 @@ } - /** * Primitive implementation of a lastpos search. * @@ -501,50 +517,9 @@ */ size_t RexxString::caselessLastPos(RexxString *needle, size_t _start) { - size_t haystackLen = this->getLength(); /* get the haystack length */ - size_t needleLen = needle->getLength(); /* and get the length too */ - - // no match possible if either string is null - if (needleLen == 0 || haystackLen == 0) - { - return 0; - } - else - { - // get the start position for the search. - haystackLen = Numerics::minVal(_start, haystackLen); - /* do the search */ - const char *matchLocation = StringUtil::caselessLastPos(needle->getStringData(), needleLen, this->getStringData(), haystackLen); - if (matchLocation == NULL) - { - return 0; - } - else - { - return matchLocation - this->getStringData() + 1; - } - } + return StringUtil::caselessLastPos(getStringData(), getLength(), needle, _start); } -size_t RexxString::countStr(RexxString *needle) -/******************************************************************************/ -/* Function: Count occurrences of one string in another. */ -/******************************************************************************/ -{ - size_t count = 0; /* no matches yet */ - /* get the length of the needle */ - size_t needlelength = needle->getLength(); - /* get the first match position */ - size_t matchPos = this->pos(needle, 0); - while (matchPos != 0) - { /* while we're getting matches */ - count = count + 1; /* count this match */ - /* do the next search */ - matchPos = this->pos(needle, matchPos + needlelength - 1); - } - return count; /* return the match count */ -} - RexxInteger *RexxString::countStrRexx(RexxString *needle) /******************************************************************************/ /* Function: Count occurrences of one string in another. */ @@ -552,28 +527,10 @@ { /* force needle to a string */ needle = stringArgument(needle, ARG_ONE); - size_t count = this->countStr(needle); /* do the counting */ - return new_integer(count); /* return the count as an object */ + // delegate the counting to the string util + return new_integer(StringUtil::countStr(getStringData(), getLength(), needle)); } -size_t RexxString::caselessCountStr(RexxString *needle) -/******************************************************************************/ -/* Function: Count occurrences of one string in another. */ -/******************************************************************************/ -{ - size_t count = 0; /* no matches yet */ - /* get the length of the needle */ - size_t needlelength = needle->getLength(); - /* get the first match position */ - size_t matchPos = this->caselessPos(needle, 0); - while (matchPos != 0) - { /* while we're getting matches */ - count = count + 1; /* count this match */ - /* do the next search */ - matchPos = this->caselessPos(needle, matchPos + needlelength - 1); - } - return count; /* return the match count */ -} RexxInteger *RexxString::caselessCountStrRexx(RexxString *needle) /******************************************************************************/ @@ -582,8 +539,8 @@ { /* force needle to a string */ needle = stringArgument(needle, ARG_ONE); - size_t count = this->caselessCountStr(needle); /* do the counting */ - return new_integer(count); /* return the count as an object */ + // delegate the counting to the string util + return new_integer(StringUtil::caselessCountStr(getStringData(), getLength(), needle)); } RexxString *RexxString::changeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg) @@ -610,7 +567,7 @@ // we'll only change up to a specified count. If not there, we do everything. size_t count = optionalPositive(countArg, Numerics::MAX_WHOLENUMBER, ARG_THREE); - matches = this->countStr(needle); /* find the number of replacements */ + matches = StringUtil::countStr(getStringData(), getLength(), needle); /* find the number of replacements */ if (matches > count) // the matches are bounded by the count { matches = count; @@ -626,8 +583,8 @@ _start = 0; /* set a zero starting point */ for (i = 0; i < matches; i++) { /* until we hit count or run out */ - matchPos = this->pos(needle, _start); /* look for the next occurrence */ - if (matchPos == 0) /* not found? */ + matchPos = pos(needle, _start); /* look for the next occurrence */ + if (matchPos == 0) /* not found? */ { break; /* get out of here */ } @@ -677,7 +634,7 @@ // we'll only change up to a specified count. If not there, we do everything. size_t count = optionalPositive(countArg, Numerics::MAX_WHOLENUMBER, ARG_THREE); - matches = this->caselessCountStr(needle); /* find the number of replacements */ + matches = StringUtil::caselessCountStr(getStringData(), getLength(), needle); /* find the number of replacements */ if (matches > count) // the matches are bounded by the count { matches = count; @@ -745,74 +702,37 @@ size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); /* pass on to the primitive function */ /* and return as an integer object */ - return new_integer(this->caselessPos(needle, _start - 1)); + return new_integer(StringUtil::caselessPos(getStringData(), getLength(),needle , _start - 1)); } +/** + * Do a primitive level pos() search on a string. + * + * @param needle The search needle. + * @param _start The starting position (origin 0) + * + * @return The match position (origin 1). Returns 0 for no match. + */ size_t RexxString::pos(RexxString *needle, size_t _start) { return StringUtil::pos(getStringData(), getLength(), needle, _start); } +/** + * Do a primitive level pos() search on a string. + * + * @param needle The search needle. + * @param _start The starting position (origin 0) + * + * @return The match position (origin 1). Returns 0 for no match. + */ size_t RexxString::caselessPos(RexxString *needle, size_t _start) { - // get the two working lengths - size_t haystack_length = getLength(); - size_t needle_length = needle->getLength(); - - // ok, there are a few quick checks we can perform. If the needle is - // bigger than the haystack, or the needle is a null string or - // our haystack length after adjusting to the starting position - // zero, then we can quickly return zero. - if (needle_length > haystack_length + _start || needle_length == 0 || _start + needle_length > haystack_length) - { - return 0; - } - - // address the string value - const char *haypointer = getStringData() + _start; - const char *needlepointer = needle->getStringData(); - size_t location = _start + 1; // this is the match location as an index - // calculate the number of probes we can make in this string - size_t count = (haystack_length - _start) - needle_length + 1; - - // now scan - while (count--) - { - /* get a hit? */ - if (StringUtil::caselessCompare(haypointer, needlepointer, needle_length) == 0) - { - return location; - } - // step our pointers accordingly - location++; - haypointer++; - } - return 0; // we got nothing... + return StringUtil::caselessPos(getStringData(), getLength(), needle, _start); } -size_t MemPos( - const char *String, /* search string */ - size_t Length, /* string length */ - char Char ) /* target character */ -/*********************************************************************/ -/* Function: offset of first occurrence of char in string */ -/*********************************************************************/ -{ - size_t Position = -1; /* default to no match */ - /* while in the string */ - for (const char *Scan = String; Length; Length--) - { - if (*Scan == Char) - { /* find a match? */ - Position = Scan - String; /* return difference */ - break; /* quit the loop */ - } - Scan++; /* step the position */ - } - return Position; /* return match position */ -} RexxString *RexxString::translate( RexxString *tableo, /* output table */ @@ -862,7 +782,7 @@ if (tablei != OREF_NULLSTRING) /* input table specified? */ { /* search for the character */ - Position = MemPos(InTable, InTableLength, ch); + Position = StringUtil::memPos(InTable, InTableLength, ch); } else { Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-15 17:32:39 UTC (rev 2973) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-15 20:32:28 UTC (rev 2974) @@ -188,6 +188,54 @@ /** + * Primitive level search withint a string buffer. + * + * @param stringData The maystack buffer. + * @param haystack_length + * The length of the haystack. + * @param needle The search needle. + * @param _start The starting position. + * + * @return The offset of the located needle, or 0 if the needle doesn't exist. + */ +size_t StringUtil::caselessPos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start) +{ + // get the two working lengths + size_t needle_length = needle->getLength(); + + // ok, there are a few quick checks we can perform. If the needle is + // bigger than the haystack, or the needle is a null string or + // our haystack length after adjusting to the starting position + // zero, then we can quickly return zero. + if (needle_length > haystack_length + _start || needle_length == 0 || _start + needle_length > haystack_length) + { + return 0; + } + + // address the string value + const char *haypointer = stringData + _start; + const char *needlepointer = needle->getStringData(); + size_t location = _start + 1; // this is the match location as an index + // calculate the number of probes we can make in this string + size_t count = (haystack_length - _start) - needle_length + 1; + + // now scan + while (count--) + { + /* get a hit? */ + if (caselessCompare(haypointer, needlepointer, needle_length) == 0) + { + return location; + } + // step our pointers accordingly + location++; + haypointer++; + } + return 0; // we got nothing... +} + + +/** * Locate the last positon of a string within the designated * string buffer. * @@ -287,6 +335,45 @@ /** + * Primitive level caseless lastpos search within a string + * buffer. + * + * @param stringData The maystack buffer. + * @param haystack_length + * The length of the haystack. + * @param needle The search needle. + * @param _start The starting position. + * + * @return The offset of the located needle, or 0 if the needle doesn't exist. + */ +size_t StringUtil::caselessLastPos(const char *stringData, size_t haystackLen, RexxString *needle, size_t _start) +{ + size_t needleLen = needle->getLength(); /* and get the length too */ + + // no match possible if either string is null + if (needleLen == 0 || haystackLen == 0) + { + return 0; + } + else + { + // get the start position for the search. + haystackLen = Numerics::minVal(_start, haystackLen); + /* do the search */ + const char *matchLocation = caselessLastPos(needle->getStringData(), needleLen, stringData, haystackLen); + if (matchLocation == NULL) + { + return 0; + } + else + { + return matchLocation - stringData + 1; + } + } +} + + +/** * Absolutely most primitive version of a caseless lastpos * search. This version searches directly in a buffer rather * than a Rexx String. @@ -1189,3 +1276,75 @@ } return WordStart; /* return word length */ } + + +/** + * Count the occurences of a string within another string. + * + * @param hayStack Pointer to the haystack data. + * @param hayStackLength + * Length of the haystack data. + * @param needle The needle we're searching for + * + * @return The count of needle occurrences located in the string. + */ +size_t StringUtil::countStr(const char *hayStack, size_t hayStackLength, RexxString *needle) +{ + size_t count = 0; /* no matches yet */ + /* get the first match position */ + size_t matchPos = pos(hayStack, hayStackLength, needle, 0); + while (matchPos != 0) + { + count = count + 1; /* count this match */ + // step to the new position and search + matchPos = pos(hayStack, hayStackLength, needle, matchPos + needle->getLength() - 1); + } + return count; /* return the match count */ +} + + +/** + * Count the occurences of a string within another string. + * + * @param hayStack Pointer to the haystack data. + * @param hayStackLength + * Length of the haystack data. + * @param needle The needle we're searching for + * + * @return The count of needle occurrences located in the string. + */ +size_t StringUtil::caselessCountStr(const char *hayStack, size_t hayStackLength, RexxString *needle) +{ + size_t count = 0; /* no matches yet */ + /* get the first match position */ + size_t matchPos = pos(hayStack, hayStackLength, needle, 0); + while (matchPos != 0) + { + count = count + 1; /* count this match */ + // step to the new position and search + matchPos = caselessPos(hayStack, hayStackLength, needle, matchPos + needle->getLength() - 1); + } + return count; /* return the match count */ +} + + +size_t StringUtil::memPos( + const char *string, /* search string */ + size_t length, /* string length */ + char target ) /* target character */ +/*********************************************************************/ +/* Function: offset of first occurrence of char in string */ +/*********************************************************************/ +{ + /* while in the string */ + for (const char *scan = string; length; length--) + { + // if we have a match, return the offset + if (*scan == target) + { + return scan - string; + } + scan++; /* step the position */ + } + return -1; // no match position +} Modified: main/trunk/interpreter/classes/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.hpp 2008-08-15 17:32:39 UTC (rev 2973) +++ main/trunk/interpreter/classes/StringUtil.hpp 2008-08-15 20:32:28 UTC (rev 2974) @@ -53,11 +53,13 @@ static RexxString *substr(const char *, size_t, RexxInteger *, RexxInteger *, RexxString *); static RexxInteger *posRexx(const char *stringData, size_t length, RexxString *needle, RexxInteger *pstart); static size_t pos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start); + static size_t caselessPos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start); static RexxInteger *lastPosRexx(const char *stringData, size_t haystackLen, RexxString *needle, RexxInteger *_start); static size_t lastPos(const char *stringData, size_t hastackLen, RexxString *needle, size_t _start); static const char *lastPos(const char *needle, size_t needleLen, const char *haystack, size_t haystackLen); static RexxString *subchar(const char *stringData, size_t stringLength, RexxInteger *positionArg); static RexxArray *makearray(const char *start, size_t length, RexxString *separator); + static size_t caselessLastPos(const char *stringData, size_t hastackLen, RexxString *needle, size_t _start); static const char * caselessLastPos(const char *needle, size_t needleLen, const char *haystack, size_t haystackLen); static int caselessCompare(const char *, const char *, size_t); static int hexDigitToInt(char ch); @@ -75,6 +77,9 @@ static void skipNonBlanks(const char **String, size_t *StringLength); static void skipBlanks(const char **String, size_t *StringLength); static size_t nextWord(const char **String, size_t *StringLength, const char **NextString ); + 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); }; #endif Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-15 17:32:39 UTC (rev 2973) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-15 20:32:28 UTC (rev 2974) @@ -851,6 +851,8 @@ CPPM(RexxMutableBuffer::getBufferSize), CPPM(RexxMutableBuffer::setBufferSize), CPPM(RexxMutableBuffer::replaceAt), +CPPM(RexxMutableBuffer::countStrRexx), +CPPM(RexxMutableBuffer::caselessCountStrRexx), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/expression/BuiltinFunctions.cpp =================================================================== --- main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-15 17:32:39 UTC (rev 2973) +++ main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-15 20:32:28 UTC (rev 2974) @@ -2543,8 +2543,7 @@ needle = required_string(COUNTSTR, needle); /* get string for target */ haystack = required_string(COUNTSTR, haystack); - count = haystack->countStr(needle); /* go perform the countstr function */ - return new_integer(count); /* return the new count */ + return haystack->countStrRexx(needle); /* go perform the countstr function */ } Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-15 17:32:39 UTC (rev 2973) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-15 20:32:28 UTC (rev 2974) @@ -933,12 +933,14 @@ defineKernelMethod(CHAR_POS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::posRexx), 2); defineKernelMethod(CHAR_LASTPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lastPos), 2); defineKernelMethod(CHAR_SUBCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::subchar), 1); - defineKernelMethod(CHAR_GETBUFFERSIZE , TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::getBufferSize), 0); - defineKernelMethod(CHAR_SETBUFFERSIZE , TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::setBufferSize), 1); + defineKernelMethod(CHAR_GETBUFFERSIZE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::getBufferSize), 0); + defineKernelMethod(CHAR_SETBUFFERSIZE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::setBufferSize), 1); defineKernelMethod(CHAR_LENGTH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lengthRexx), 0); defineKernelMethod(CHAR_MAKEARRAY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::makearray), 1); defineKernelMethod(CHAR_STRING ,TheMutableBufferBehaviour, CPPM(RexxObject::makeStringRexx), 0); + defineKernelMethod(CHAR_COUNTSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::countStrRexx), 1); + defineKernelMethod(CHAR_CASELESSCOUNTSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessCountStrRexx), 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. |
From: <bi...@us...> - 2008-08-15 23:47:45
|
Revision: 2975 http://oorexx.svn.sourceforge.net/oorexx/?rev=2975&view=rev Author: bigrixx Date: 2008-08-15 23:47:54 +0000 (Fri, 15 Aug 2008) Log Message: ----------- [ 2053721 ] add chageStr and caselessChangeStr to mutable buffer class. Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/classes/StringUtil.cpp 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-15 20:32:28 UTC (rev 2974) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-15 23:47:54 UTC (rev 2975) @@ -613,3 +613,278 @@ // delegate the counting to the string util return new_integer(StringUtil::caselessCountStr(getStringData(), getLength(), needle)); } + +/** + * Do an inplace changeStr operation on a mutablebuffer. + * + * @param needle The search needle. + * @param newNeedle The replacement string. + * @param countArg The number of occurrences to replace. + * + * @return The target MutableBuffer + */ +RexxMutableBuffer *RexxMutableBuffer::changeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg) +{ + /* force needle to a string */ + needle = stringArgument(needle, ARG_ONE); + /* newneedle must be a string two */ + newNeedle = stringArgument(newNeedle, ARG_TWO); + + // we'll only change up to a specified count. If not there, we do everything. + size_t count = optionalPositive(countArg, Numerics::MAX_WHOLENUMBER, ARG_THREE); + // find the number of matches in the string + size_t matches = StringUtil::countStr(getStringData(), getLength(), needle); + if (matches > count) // the matches are bounded by the count + { + matches = count; + } + // no matches is easy! + if (matches == 0) + { + return this; + } + size_t needleLength = needle->getLength(); /* get the length of the needle */ + size_t newLength = newNeedle->getLength(); /* and the replacement length */ + // calculate the final length and make sure we have enough space + size_t resultLength = this->getLength() - (matches * needleLength) + (matches * newLength); + ensureCapacity(resultLength); + + // an inplace update has complications, depending on whether the new string is shorter, + // the same length, or longer + + // simplest case...same length strings. We can just overlay the existing occurrences + if (needleLength == newLength) + { + const char *source = getStringData(); + size_t sourceLength = getLength(); + size_t _start = 0; /* set a zero starting point */ + for (size_t i = 0; i < matches; i++) + { + // search for the next occurrence...which should be there because we + // already know the count + size_t matchPos = StringUtil::pos(source, sourceLength, needle, _start); + copyData(matchPos - 1, newNeedle->getStringData(), newLength); + // step to the next search position + _start = matchPos + newLength - 1; + } + } + // this will be a shorter thing, so we can do things in place as if we were using two buffers + else if (needleLength > newLength) + { + // we start building from the beginning + size_t copyOffset = 0; + size_t _start = 0; + // get our string bounds + const char *source = getStringData(); + size_t sourceLength = getLength(); + const char *newPtr = newNeedle->getStringData(); + // this is our scan offset + for (size_t i = 0; i < matches; i++) + { + // look for each instance and replace + size_t matchPos = StringUtil::pos(source, sourceLength, needle, _start); + size_t copyLength = (matchPos - 1) - _start; /* get the next length to copy */ + // if this skipped over characters, we need to copy those + if (copyLength != 0) + { + copyData(copyOffset, source + _start, copyLength); + copyOffset += copyLength; + } + // replacing with a non-null string, copy the replacement string in + if (newLength != 0) + { + copyData(copyOffset, newPtr, newLength); + copyOffset += newLength; + } + _start = matchPos + needleLength - 1; /* step to the next position */ + } + // we likely have some remainder that needs copying + if (_start < sourceLength) + { + copyData(copyOffset, source + _start, sourceLength - _start); + } + } + // hardest case...the string gets longer. We need to shift all of the data + // to the end and then pull the pieces back in as we go + else + { + size_t growth = (newLength - needleLength) * matches; + + // we start building from the beginning + size_t copyOffset = 0; + size_t _start = 0; + // get our string bounds + const char *source = getStringData() + growth; + size_t sourceLength = getLength(); + // this shifts everything to the end of the buffer. From there, + // we pull pieces back into place. + openGap(0, growth, sourceLength); + const char *newPtr = newNeedle->getStringData(); + // this is our scan offset + for (size_t i = 0; i < matches; i++) + { + // look for each instance and replace + size_t matchPos = StringUtil::pos(source, sourceLength, needle, _start); + size_t copyLength = (matchPos - 1) - _start; /* get the next length to copy */ + // if this skipped over characters, we need to copy those + if (copyLength != 0) + { + copyData(copyOffset, source + _start, copyLength); + copyOffset += copyLength; + } + // replacing with a non-null string, copy the replacement string in + if (newLength != 0) + { + copyData(copyOffset, newPtr, newLength); + copyOffset += newLength; + } + _start = matchPos + needleLength - 1; /* step to the next position */ + } + // we likely have some remainder that needs copying + if (_start < sourceLength) + { + copyData(copyOffset, source + _start, sourceLength - _start); + } + } + // update the result length, and return + dataLength = resultLength; + return this; +} + +/** + * Do an inplace caseless changeStr operation on a + * mutablebuffer. + * + * @param needle The search needle. + * @param newNeedle The replacement string. + * @param countArg The number of occurrences to replace. + * + * @return The target MutableBuffer + */ +RexxMutableBuffer *RexxMutableBuffer::caselessChangeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg) +{ + /* force needle to a string */ + needle = stringArgument(needle, ARG_ONE); + /* newneedle must be a string two */ + newNeedle = stringArgument(newNeedle, ARG_TWO); + + // we'll only change up to a specified count. If not there, we do everything. + size_t count = optionalPositive(countArg, Numerics::MAX_WHOLENUMBER, ARG_THREE); + // find the number of matches in the string + size_t matches = StringUtil::caselessCountStr(getStringData(), getLength(), needle); + if (matches > count) // the matches are bounded by the count + { + matches = count; + } + // no matches is easy! + if (matches == 0) + { + return this; + } + size_t needleLength = needle->getLength(); /* get the length of the needle */ + size_t newLength = newNeedle->getLength(); /* and the replacement length */ + // calculate the final length and make sure we have enough space + size_t resultLength = this->getLength() - (matches * needleLength) + (matches * newLength); + ensureCapacity(resultLength); + + // an inplace update has complications, depending on whether the new string is shorter, + // the same length, or longer + + // simplest case...same length strings. We can just overlay the existing occurrences + if (needleLength == newLength) + { + const char *source = getStringData(); + size_t sourceLength = getLength(); + size_t _start = 0; /* set a zero starting point */ + for (size_t i = 0; i < matches; i++) + { + // search for the next occurrence...which should be there because we + // already know the count + size_t matchPos = StringUtil::caselessPos(source, sourceLength, needle, _start); + copyData(matchPos - 1, newNeedle->getStringData(), newLength); + // step to the next search position + _start = matchPos + newLength - 1; + } + } + // this will be a shorter thing, so we can do things in place as if we were using two buffers + else if (needleLength > newLength) + { + // we start building from the beginning + size_t copyOffset = 0; + size_t _start = 0; + // get our string bounds + const char *source = getStringData(); + size_t sourceLength = getLength(); + const char *newPtr = newNeedle->getStringData(); + // this is our scan offset + for (size_t i = 0; i < matches; i++) + { + // look for each instance and replace + size_t matchPos = StringUtil::caselessPos(source, sourceLength, needle, _start); + size_t copyLength = (matchPos - 1) - _start; /* get the next length to copy */ + // if this skipped over characters, we need to copy those + if (copyLength != 0) + { + copyData(copyOffset, source + _start, copyLength); + copyOffset += copyLength; + } + // replacing with a non-null string, copy the replacement string in + if (newLength != 0) + { + copyData(copyOffset, newPtr, newLength); + copyOffset += newLength; + } + _start = matchPos + needleLength - 1; /* step to the next position */ + } + // we likely have some remainder that needs copying + if (_start < sourceLength) + { + copyData(copyOffset, source + _start, sourceLength - _start); + } + } + // hardest case...the string gets longer. We need to shift all of the data + // to the end and then pull the pieces back in as we go + else + { + size_t growth = (newLength - needleLength) * matches; + + // we start building from the beginning + size_t copyOffset = 0; + size_t _start = 0; + // get our string bounds + const char *source = getStringData() + growth; + size_t sourceLength = getLength(); + // this shifts everything to the end of the buffer. From there, + // we pull pieces back into place. + openGap(0, growth, sourceLength); + const char *newPtr = newNeedle->getStringData(); + // this is our scan offset + for (size_t i = 0; i < matches; i++) + { + // look for each instance and replace + size_t matchPos = StringUtil::caselessPos(source, sourceLength, needle, _start); + size_t copyLength = (matchPos - 1) - _start; /* get the next length to copy */ + // if this skipped over characters, we need to copy those + if (copyLength != 0) + { + copyData(copyOffset, source + _start, copyLength); + copyOffset += copyLength; + } + // replacing with a non-null string, copy the replacement string in + if (newLength != 0) + { + copyData(copyOffset, newPtr, newLength); + copyOffset += newLength; + } + _start = matchPos + needleLength - 1; /* step to the next position */ + } + // we likely have some remainder that needs copying + if (_start < sourceLength) + { + copyData(copyOffset, source + _start, sourceLength - _start); + } + } + // update the result length, and return + dataLength = resultLength; + return this; +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-15 20:32:28 UTC (rev 2974) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-15 23:47:54 UTC (rev 2975) @@ -93,9 +93,17 @@ RexxString *makeString(); RexxInteger *countStrRexx(RexxString *needle); RexxInteger *caselessCountStrRexx(RexxString *needle); + RexxMutableBuffer *changeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg); + RexxMutableBuffer *caselessChangeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } + inline char * getData() { return data->getData(); } + inline void copyData(size_t offset, const char *string, size_t l) { data->copyData(offset, string, l); } + inline void openGap(size_t offset, size_t _size, size_t tailSize) { data->openGap(offset, _size, tailSize); } + inline void closeGap(size_t offset, size_t _size, size_t tailSize) { data->closeGap(offset, _size, tailSize); } + inline void adjustGap(size_t offset, size_t _size, size_t _newSize) { data->adjustGap(offset, _size, _newSize); } + inline void setData(size_t offset, char character, size_t l) { data->setData(offset, character, l); } static void createInstance(); static RexxClass *classInstance; Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-15 20:32:28 UTC (rev 2974) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-15 23:47:54 UTC (rev 2975) @@ -1317,7 +1317,7 @@ { size_t count = 0; /* no matches yet */ /* get the first match position */ - size_t matchPos = pos(hayStack, hayStackLength, needle, 0); + size_t matchPos = caselessPos(hayStack, hayStackLength, needle, 0); while (matchPos != 0) { count = count + 1; /* count this match */ Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-15 20:32:28 UTC (rev 2974) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-15 23:47:54 UTC (rev 2975) @@ -853,6 +853,8 @@ CPPM(RexxMutableBuffer::replaceAt), CPPM(RexxMutableBuffer::countStrRexx), CPPM(RexxMutableBuffer::caselessCountStrRexx), +CPPM(RexxMutableBuffer::changeStr), +CPPM(RexxMutableBuffer::caselessChangeStr), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-15 20:32:28 UTC (rev 2974) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-15 23:47:54 UTC (rev 2975) @@ -941,6 +941,8 @@ defineKernelMethod(CHAR_STRING ,TheMutableBufferBehaviour, CPPM(RexxObject::makeStringRexx), 0); defineKernelMethod(CHAR_COUNTSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::countStrRexx), 1); defineKernelMethod(CHAR_CASELESSCOUNTSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessCountStrRexx), 1); + defineKernelMethod(CHAR_CHANGESTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::changeStr), 3); + defineKernelMethod(CHAR_CASELESSCHANGESTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessChangeStr), 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. |
From: <bi...@us...> - 2008-08-16 00:06:33
|
Revision: 2976 http://oorexx.svn.sourceforge.net/oorexx/?rev=2976&view=rev Author: bigrixx Date: 2008-08-16 00:06:42 +0000 (Sat, 16 Aug 2008) Log Message: ----------- [ 2053961 ] Add caseless pos and lastpos 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/execution/CPPCode.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-15 23:47:54 UTC (rev 2975) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-16 00:06:42 UTC (rev 2976) @@ -552,12 +552,31 @@ } +/** + * Perform a search for a string within the buffer. + * + * @param needle The search needle. + * @param pstart the starting position. + * + * @return The index of the located string. Returns 0 if no matches + * are found. + */ RexxInteger *RexxMutableBuffer::posRexx(RexxString *needle, RexxInteger *pstart) { return StringUtil::posRexx(getStringData(), getLength(), needle, pstart); } +/** + * Perform a search for the last position of a string within the + * buffer. + * + * @param needle The search needle. + * @param pstart the starting position. + * + * @return The index of the located string. Returns 0 if no matches + * are found. + */ RexxInteger *RexxMutableBuffer::lastPos(RexxString *needle, RexxInteger *_start) { return StringUtil::lastPosRexx(getStringData(), getLength(), needle, _start); @@ -565,6 +584,49 @@ /** + * Perform a caseless search for a string within the buffer. + * + * @param needle The search needle. + * @param pstart the starting position. + * + * @return The index of the located string. Returns 0 if no matches + * are found. + */ +RexxInteger *RexxMutableBuffer::caselessPos(RexxString *needle, RexxInteger *pstart) +{ + /* force needle to a string */ + needle = stringArgument(needle, ARG_ONE); + /* get the starting position */ + size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); + /* pass on to the primitive function */ + /* and return as an integer object */ + return new_integer(StringUtil::caselessPos(getStringData(), getLength(), needle , _start - 1)); +} + + +/** + * Perform a caseless search for the last position of a string + * within the buffer. + * + * @param needle The search needle. + * @param pstart the starting position. + * + * @return The index of the located string. Returns 0 if no matches + * are found. + */ +RexxInteger *RexxMutableBuffer::caselessLastPos(RexxString *needle, RexxInteger *pstart) +{ + /* force needle to a string */ + needle = stringArgument(needle, ARG_ONE); + /* get the starting position */ + size_t _start = optionalPositionArgument(pstart, getLength(), ARG_TWO); + /* pass on to the primitive function */ + /* and return as an integer object */ + return new_integer(StringUtil::caselessLastPos(getStringData(), getLength(), needle , _start - 1)); +} + + +/** * Extract a single character from a string object. * Returns a null string if the specified position is * beyond the bounds of the string. Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-15 23:47:54 UTC (rev 2975) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-16 00:06:42 UTC (rev 2976) @@ -85,6 +85,8 @@ RexxString *substr(RexxInteger *startPosition, RexxInteger *len, RexxString *pad); RexxInteger *lastPos(RexxString *needle, RexxInteger *_start); RexxInteger *posRexx(RexxString *needle, RexxInteger *_start); + RexxInteger *caselessLastPos(RexxString *needle, RexxInteger *_start); + RexxInteger *caselessPos(RexxString *needle, RexxInteger *_start); RexxString *subchar(RexxInteger *startPosition); RexxInteger *getBufferSize() { return new_integer(bufferLength); } Modified: main/trunk/interpreter/classes/StringClassMisc.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-15 23:47:54 UTC (rev 2975) +++ main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-16 00:06:42 UTC (rev 2976) @@ -702,7 +702,7 @@ size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); /* pass on to the primitive function */ /* and return as an integer object */ - return new_integer(StringUtil::caselessPos(getStringData(), getLength(),needle , _start - 1)); + return new_integer(StringUtil::caselessPos(getStringData(), getLength(), needle , _start - 1)); } Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-15 23:47:54 UTC (rev 2975) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-16 00:06:42 UTC (rev 2976) @@ -848,6 +848,8 @@ CPPM(RexxMutableBuffer::subchar), CPPM(RexxMutableBuffer::posRexx), CPPM(RexxMutableBuffer::lastPos), +CPPM(RexxMutableBuffer::caselessPos), +CPPM(RexxMutableBuffer::caselessLastPos), CPPM(RexxMutableBuffer::getBufferSize), CPPM(RexxMutableBuffer::setBufferSize), CPPM(RexxMutableBuffer::replaceAt), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-15 23:47:54 UTC (rev 2975) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-16 00:06:42 UTC (rev 2976) @@ -932,6 +932,8 @@ defineKernelMethod(CHAR_SUBSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::substr), 3); defineKernelMethod(CHAR_POS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::posRexx), 2); defineKernelMethod(CHAR_LASTPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lastPos), 2); + defineKernelMethod(CHAR_CASELESSPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessPos), 2); + defineKernelMethod(CHAR_CASELESSLASTPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessLastPos), 2); defineKernelMethod(CHAR_SUBCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::subchar), 1); defineKernelMethod(CHAR_GETBUFFERSIZE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::getBufferSize), 0); defineKernelMethod(CHAR_SETBUFFERSIZE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::setBufferSize), 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-16 09:54:27
|
Revision: 2977 http://oorexx.svn.sourceforge.net/oorexx/?rev=2977&view=rev Author: bigrixx Date: 2008-08-16 09:54:36 +0000 (Sat, 16 Aug 2008) Log Message: ----------- [ 2054519 ] Add upper and lower to mutablebuffer Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.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-16 00:06:42 UTC (rev 2976) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-16 09:54:36 UTC (rev 2977) @@ -950,3 +950,83 @@ dataLength = resultLength; return this; } + + +/** + * Rexx exported method stub for the lower() method. + * + * @param start The optional starting location. Defaults to the first character + * if not specified. + * @param length The length to convert. Defaults to the segment from the start + * position to the end of the string. + * + * @return A new string object with the case conversion applied. + */ +RexxMutableBuffer *RexxMutableBuffer::lower(RexxInteger *_start, RexxInteger *_length) +{ + size_t startPos = optionalPositionArgument(_start, 1, ARG_ONE) - 1; + size_t rangeLength = optionalLengthArgument(_length, getLength(), ARG_TWO); + + // if we're starting beyond the end bounds, return unchanged + if (startPos >= getLength()) + { + return this; + } + + rangeLength = Numerics::minVal(rangeLength, getLength() - startPos); + + // a zero length value is also a non-change. + if (rangeLength == 0) + { + return this; + } + + char *data = getData() + startPos; + // now uppercase in place + for (size_t i = 0; i < rangeLength; i++) + { + *data = tolower(*data); + data++; + } + return this; +} + + +/** + * Rexx exported method stub for the upper() method. + * + * @param start The optional starting location. Defaults to the first character + * if not specified. + * @param length The length to convert. Defaults to the segment from the start + * position to the end of the string. + * + * @return A new string object with the case conversion applied. + */ +RexxMutableBuffer *RexxMutableBuffer::upper(RexxInteger *_start, RexxInteger *_length) +{ + size_t startPos = optionalPositionArgument(_start, 1, ARG_ONE) - 1; + size_t rangeLength = optionalLengthArgument(_length, getLength(), ARG_TWO); + + // if we're starting beyond the end bounds, return unchanged + if (startPos >= getLength()) + { + return this; + } + + rangeLength = Numerics::minVal(rangeLength, getLength() - startPos); + + // a zero length value is also a non-change. + if (rangeLength == 0) + { + return this; + } + + char *data = getData() + startPos; + // now uppercase in place + for (size_t i = 0; i < rangeLength; i++) + { + *data = toupper(*data); + data++; + } + return this; +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-16 00:06:42 UTC (rev 2976) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-16 09:54:36 UTC (rev 2977) @@ -97,6 +97,8 @@ RexxInteger *caselessCountStrRexx(RexxString *needle); RexxMutableBuffer *changeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg); RexxMutableBuffer *caselessChangeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg); + RexxMutableBuffer *upper(RexxInteger *_start, RexxInteger *_length); + RexxMutableBuffer *lower(RexxInteger *_start, RexxInteger *_length); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-16 00:06:42 UTC (rev 2976) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-16 09:54:36 UTC (rev 2977) @@ -857,6 +857,8 @@ CPPM(RexxMutableBuffer::caselessCountStrRexx), CPPM(RexxMutableBuffer::changeStr), CPPM(RexxMutableBuffer::caselessChangeStr), +CPPM(RexxMutableBuffer::upper), +CPPM(RexxMutableBuffer::lower), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-16 00:06:42 UTC (rev 2976) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-16 09:54:36 UTC (rev 2977) @@ -945,6 +945,8 @@ defineKernelMethod(CHAR_CASELESSCOUNTSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessCountStrRexx), 1); defineKernelMethod(CHAR_CHANGESTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::changeStr), 3); defineKernelMethod(CHAR_CASELESSCHANGESTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessChangeStr), 3); + defineKernelMethod(CHAR_UPPER ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::upper), 2); + defineKernelMethod(CHAR_LOWER ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lower), 2); /* 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. |
From: <bi...@us...> - 2008-08-16 10:41:11
|
Revision: 2978 http://oorexx.svn.sourceforge.net/oorexx/?rev=2978&view=rev Author: bigrixx Date: 2008-08-16 10:41:18 +0000 (Sat, 16 Aug 2008) Log Message: ----------- [ 2054544 ] Add translate method to mutablebuffer Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.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-16 09:54:36 UTC (rev 2977) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-16 10:41:18 UTC (rev 2978) @@ -1030,3 +1030,64 @@ } return this; } + + +/** + * translate characters in the buffer using a translation table. + * + * @param tableo The output table specification + * @param tablei The input table specification + * @param pad An optional padding character (default is a space). + * + * @return The target mutable buffer. + */ +RexxMutableBuffer *RexxMutableBuffer::translate(RexxString *tableo, RexxString *tablei, RexxString *pad) +{ + // just a simple uppercase? + if (tableo == OREF_NULL && tablei == OREF_NULL && pad == OREF_NULL) + { + return this->upper(OREF_NULL, OREF_NULL); + } + /* validate the tables */ + tableo = optionalStringArgument(tableo, OREF_NULLSTRING, ARG_ONE); + size_t outTableLength = tableo->getLength(); /* get the table length */ + /* input table too */ + tablei = optionalStringArgument(tablei, OREF_NULLSTRING, ARG_TWO); + size_t inTableLength = tablei->getLength(); /* get the table length */ + const char *inTable = tablei->getStringData(); /* point at the input table */ + const char *outTable = tableo->getStringData(); /* and the output table */ + /* get the pad character */ + char padChar = optionalPadArgument(pad, ' ', ARG_THREE); + char *scanPtr = getData(); /* point to data */ + size_t scanLength = getLength(); /* get the length too */ + + while (scanLength--) + { /* spin thru input */ + char ch = *scanPtr; /* get a character */ + size_t position; + + if (tablei != OREF_NULLSTRING) /* input table specified? */ + { + /* search for the character */ + position = StringUtil::memPos(inTable, inTableLength, ch); + } + else + { + position = (size_t)ch; /* position is the character value */ + } + if (position != (size_t)(-1)) + { /* found in the table? */ + if (position < outTableLength) /* in the output table? */ + { + /* convert the character */ + *scanPtr = *(outTable + position); + } + else + { + *scanPtr = padChar; /* else use the pad character */ + } + } + scanPtr++; /* step the pointer */ + } + return this; +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-16 09:54:36 UTC (rev 2977) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-16 10:41:18 UTC (rev 2978) @@ -99,6 +99,7 @@ RexxMutableBuffer *caselessChangeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg); RexxMutableBuffer *upper(RexxInteger *_start, RexxInteger *_length); RexxMutableBuffer *lower(RexxInteger *_start, RexxInteger *_length); + RexxMutableBuffer *translate(RexxString *tableo, RexxString *tablei, RexxString *pad); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-16 09:54:36 UTC (rev 2977) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-16 10:41:18 UTC (rev 2978) @@ -859,6 +859,7 @@ CPPM(RexxMutableBuffer::caselessChangeStr), CPPM(RexxMutableBuffer::upper), CPPM(RexxMutableBuffer::lower), +CPPM(RexxMutableBuffer::translate), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-16 09:54:36 UTC (rev 2977) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-16 10:41:18 UTC (rev 2978) @@ -947,6 +947,7 @@ defineKernelMethod(CHAR_CASELESSCHANGESTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessChangeStr), 3); defineKernelMethod(CHAR_UPPER ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::upper), 2); defineKernelMethod(CHAR_LOWER ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lower), 2); + defineKernelMethod(CHAR_TRANSLATE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::translate), 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. |
From: <bi...@us...> - 2008-08-17 19:36:52
|
Revision: 2981 http://oorexx.svn.sourceforge.net/oorexx/?rev=2981&view=rev Author: bigrixx Date: 2008-08-17 19:37:01 +0000 (Sun, 17 Aug 2008) Log Message: ----------- [ 2054543 ] Add a start and range argument to translate Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/classes/StringClass.hpp main/trunk/interpreter/classes/StringClassMisc.cpp main/trunk/interpreter/expression/BuiltinFunctions.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-17 16:32:19 UTC (rev 2980) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-17 19:37:01 UTC (rev 2981) @@ -1038,15 +1038,17 @@ * @param tableo The output table specification * @param tablei The input table specification * @param pad An optional padding character (default is a space). + * @param _start The starting position to translate. + * @param _range The length to translate * * @return The target mutable buffer. */ -RexxMutableBuffer *RexxMutableBuffer::translate(RexxString *tableo, RexxString *tablei, RexxString *pad) +RexxMutableBuffer *RexxMutableBuffer::translate(RexxString *tableo, RexxString *tablei, RexxString *pad, RexxInteger *_start, RexxInteger *_range) { // just a simple uppercase? if (tableo == OREF_NULL && tablei == OREF_NULL && pad == OREF_NULL) { - return this->upper(OREF_NULL, OREF_NULL); + return this->upper(_start, _range); } /* validate the tables */ tableo = optionalStringArgument(tableo, OREF_NULLSTRING, ARG_ONE); @@ -1058,9 +1060,19 @@ const char *outTable = tableo->getStringData(); /* and the output table */ /* get the pad character */ char padChar = optionalPadArgument(pad, ' ', ARG_THREE); - char *scanPtr = getData(); /* point to data */ - size_t scanLength = getLength(); /* get the length too */ + size_t start = optionalPositionArgument(_start, 1, ARG_FOUR); + size_t range = optionalLengthArgument(_range, getLength() - start + 1, ARG_FOUR); + // if nothing to translate, we can return now + if (start > getLength() || range == 0) + { + return this; + } + // cape the real range + range = Numerics::maxVal(range, getLength() - start + 1); + char *scanPtr = getData() + start - 1; /* point to data */ + size_t scanLength = range; /* get the length too */ + while (scanLength--) { /* spin thru input */ char ch = *scanPtr; /* get a character */ Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-17 16:32:19 UTC (rev 2980) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-17 19:37:01 UTC (rev 2981) @@ -99,7 +99,7 @@ RexxMutableBuffer *caselessChangeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg); RexxMutableBuffer *upper(RexxInteger *_start, RexxInteger *_length); RexxMutableBuffer *lower(RexxInteger *_start, RexxInteger *_length); - RexxMutableBuffer *translate(RexxString *tableo, RexxString *tablei, RexxString *pad); + RexxMutableBuffer *translate(RexxString *tableo, RexxString *tablei, RexxString *pad, RexxInteger *, RexxInteger *); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/classes/StringClass.hpp =================================================================== --- main/trunk/interpreter/classes/StringClass.hpp 2008-08-17 16:32:19 UTC (rev 2980) +++ main/trunk/interpreter/classes/StringClass.hpp 2008-08-17 19:37:01 UTC (rev 2981) @@ -271,7 +271,7 @@ size_t pos(RexxString *, size_t); size_t caselessPos(RexxString *, size_t); - RexxString *translate(RexxString *, RexxString *, RexxString *); + RexxString *translate(RexxString *, RexxString *, RexxString *, RexxInteger *, RexxInteger *); RexxInteger *verify(RexxString *, RexxString *, RexxInteger *); RexxInteger *countStrRexx(RexxString *); RexxInteger *caselessCountStrRexx(RexxString *); Modified: main/trunk/interpreter/classes/StringClassMisc.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-17 16:32:19 UTC (rev 2980) +++ main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-17 19:37:01 UTC (rev 2981) @@ -737,7 +737,9 @@ RexxString *RexxString::translate( RexxString *tableo, /* output table */ RexxString *tablei, /* input table */ - RexxString *pad) /* pad character */ + RexxString *pad, /* pad character */ + RexxInteger *_start, // start position to translate + RexxInteger *_range) // length to translate /******************************************************************************/ /* Function: String class TRANSLATE method/function */ /******************************************************************************/ @@ -756,7 +758,7 @@ /* just a simple uppercase? */ if (tableo == OREF_NULL && tablei == OREF_NULL && pad == OREF_NULL) { - return this->upper(); /* return the uppercase version */ + return this->upperRexx(_start, _range); /* return the uppercase version */ } /* validate the tables */ /* validate the tables */ @@ -769,11 +771,22 @@ OutTable = tableo->getStringData(); /* and the output table */ /* get the pad character */ PadChar = optionalPadArgument(pad, ' ', ARG_THREE); + size_t start = optionalPositionArgument(_start, 1, ARG_FOUR); + size_t range = optionalLengthArgument(_range, getLength() - start + 1, ARG_FOUR); + + // if nothing to translate, we can return now + if (start > getLength() || range == 0) + { + return this; + } + // cape the real range + range = Numerics::maxVal(range, getLength() - start + 1); + /* allocate space for answer */ /* and copy the string */ Retval = new_string(this->getStringData(), this->getLength()); - ScanPtr = Retval->getWritableData(); /* point to data */ - ScanLength = this->getLength(); /* get the length too */ + ScanPtr = Retval->getWritableData() + start - 1; /* point to data */ + ScanLength = range; /* get the length too */ while (ScanLength--) { /* spin thru input */ Modified: main/trunk/interpreter/expression/BuiltinFunctions.cpp =================================================================== --- main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-17 16:32:19 UTC (rev 2980) +++ main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-17 19:37:01 UTC (rev 2981) @@ -794,30 +794,29 @@ } #define TRANSLATE_MIN 1 -#define TRANSLATE_MAX 4 +#define TRANSLATE_MAX 6 #define TRANSLATE_string 1 #define TRANSLATE_tableo 2 #define TRANSLATE_tablei 3 #define TRANSLATE_pad 4 +#define TRANSLATE_start 5 +#define TRANSLATE_range 6 BUILTIN(TRANSLATE) { - RexxString *string; /* target string */ - RexxString *tableo; /* output table */ - RexxString *tablei; /* input table */ - RexxString *pad; /* optional pad character */ - - fix_args(TRANSLATE); /* check on required number of args */ - /* must have a string */ - string = required_string(TRANSLATE, string); - /* output table is optional */ - tableo = optional_string(TRANSLATE, tableo); - /* input table is optional */ - tablei = optional_string(TRANSLATE, tablei); - /* pad is also optional */ - pad = optional_string(TRANSLATE, pad); - /* perform the translate */ - checkPadArgument(CHAR_TRANSLATE, IntegerFour, pad); - return string->translate(tableo, tablei, pad); + fix_args(TRANSLATE); /* check on required number of args */ + /* must have a string */ + RexxString *string = required_string(TRANSLATE, string); + /* output table is optional */ + RexxString *tableo = optional_string(TRANSLATE, tableo); + /* input table is optional */ + RexxString *tablei = optional_string(TRANSLATE, tablei); + /* pad is also optional */ + RexxString *pad = optional_string(TRANSLATE, pad); + /* perform the translate */ + checkPadArgument(CHAR_TRANSLATE, IntegerFour, pad); + RexxInteger *start = optional_integer(TRANSLATE, start); + RexxInteger *range = optional_integer(TRANSLATE, range); + return string->translate(tableo, tablei, pad, start, range); } #define VERIFY_MIN 2 @@ -2536,7 +2535,6 @@ BUILTIN(COUNTSTR) { RexxString *needle; /* needle to change */ RexxString *haystack; /* target haystack */ - size_t count; /* returned count */ fix_args(COUNTSTR); /* check on require number of args */ /* get string for new */ Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-17 16:32:19 UTC (rev 2980) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-17 19:37:01 UTC (rev 2981) @@ -841,7 +841,7 @@ defineKernelMethod(CHAR_POS ,TheStringBehaviour, CPPM(RexxString::posRexx), 2); defineKernelMethod(CHAR_CASELESSLASTPOS ,TheStringBehaviour, CPPM(RexxString::caselessLastPosRexx), 2); defineKernelMethod(CHAR_CASELESSPOS ,TheStringBehaviour, CPPM(RexxString::caselessPosRexx), 2); - defineKernelMethod(CHAR_TRANSLATE ,TheStringBehaviour, CPPM(RexxString::translate), 3); + defineKernelMethod(CHAR_TRANSLATE ,TheStringBehaviour, CPPM(RexxString::translate), 5); defineKernelMethod(CHAR_VERIFY ,TheStringBehaviour, CPPM(RexxString::verify), 3); defineKernelMethod(CHAR_BITAND ,TheStringBehaviour, CPPM(RexxString::bitAnd), 2); defineKernelMethod(CHAR_BITOR ,TheStringBehaviour, CPPM(RexxString::bitOr), 2); @@ -947,7 +947,7 @@ defineKernelMethod(CHAR_CASELESSCHANGESTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessChangeStr), 3); defineKernelMethod(CHAR_UPPER ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::upper), 2); defineKernelMethod(CHAR_LOWER ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lower), 2); - defineKernelMethod(CHAR_TRANSLATE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::translate), 3); + defineKernelMethod(CHAR_TRANSLATE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::translate), 5); /* 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. |
From: <bi...@us...> - 2008-08-18 16:18:15
|
Revision: 2996 http://oorexx.svn.sourceforge.net/oorexx/?rev=2996&view=rev Author: bigrixx Date: 2008-08-18 16:18:20 +0000 (Mon, 18 Aug 2008) Log Message: ----------- fix arg() bug and add match/caselessmatch Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/execution/CPPCode.cpp main/trunk/interpreter/expression/BuiltinFunctions.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 15:27:25 UTC (rev 2995) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 16:18:20 UTC (rev 2996) @@ -1103,3 +1103,142 @@ } return this; } + + +/** + * Test if regions within two strings match. + * + * @param start_ The starting compare position within the target string. This + * must be within the bounds of the string. + * @param other The other compare string. + * @param offset_ The starting offset of the compare string. This must be + * within the string bounds. The default start postion is 1. + * @param len_ The length of the compare substring. The length and the + * offset must specify a valid substring of other. If not + * specified, this defaults to the substring from the + * offset to the end of the string. + * + * @return True if the two regions match, false for any mismatch. + */ +RexxInteger *RexxMutableBuffer::match(RexxInteger *start_, RexxString *other, RexxInteger *offset_, RexxInteger *len_) +{ + stringsize_t _start = positionArgument(start_, ARG_ONE); + // the start position must be within the string bounds + if (_start > getLength()) + { + reportException(Error_Incorrect_method_position, start_); + } + other = stringArgument(other, ARG_TWO); + + stringsize_t offset = optionalPositionArgument(offset_, 1, ARG_THREE); + + if (offset > other->getLength()) + { + reportException(Error_Incorrect_method_position, offset); + } + + stringsize_t len = optionalLengthArgument(len_, other->getLength() - offset + 1, ARG_FOUR); + + if ((offset + len - 1) > other->getLength()) + { + reportException(Error_Incorrect_method_length, len); + } + + return primitiveMatch(_start, other, offset, len) ? TheTrueObject : TheFalseObject; +} + + +/** + * Test if regions within two strings match. + * + * @param start_ The starting compare position within the target string. This + * must be within the bounds of the string. + * @param other The other compare string. + * @param offset_ The starting offset of the compare string. This must be + * within the string bounds. The default start postion is 1. + * @param len_ The length of the compare substring. The length and the + * offset must specify a valid substring of other. If not + * specified, this defaults to the substring from the + * offset to the end of the string. + * + * @return True if the two regions match, false for any mismatch. + */ +RexxInteger *RexxMutableBuffer::caselessMatch(RexxInteger *start_, RexxString *other, RexxInteger *offset_, RexxInteger *len_) +{ + stringsize_t _start = positionArgument(start_, ARG_ONE); + // the start position must be within the string bounds + if (_start > getLength()) + { + reportException(Error_Incorrect_method_position, start_); + } + other = stringArgument(other, ARG_TWO); + + stringsize_t offset = optionalPositionArgument(offset_, 1, ARG_THREE); + + if (offset > other->getLength()) + { + reportException(Error_Incorrect_method_position, offset); + } + + stringsize_t len = optionalLengthArgument(len_, other->getLength() - offset + 1, ARG_FOUR); + + if ((offset + len - 1) > other->getLength()) + { + reportException(Error_Incorrect_method_length, len); + } + + return primitiveCaselessMatch(_start, other, offset, len) ? TheTrueObject : TheFalseObject; +} + + +/** + * Perform a compare of regions of two string objects. Returns + * true if the two regions match, returns false for mismatches. + * + * @param start The starting offset within the target string. + * @param other The source string for the compare. + * @param offset The offset of the substring of the other string to use. + * @param len The length of the substring to compare. + * + * @return True if the regions match, false otherwise. + */ +bool RexxMutableBuffer::primitiveMatch(stringsize_t _start, RexxString *other, stringsize_t offset, stringsize_t len) +{ + _start--; // make the starting point origin zero + offset--; + + // if the match is not possible in the target string, just return false now. + if ((_start + len) > getLength()) + { + return false; + } + + return memcmp(getStringData() + _start, other->getStringData() + offset, len) == 0; +} + + +/** + * Perform a caselesee compare of regions of two string objects. + * Returns true if the two regions match, returns false for + * mismatches. + * + * @param start The starting offset within the target string. + * @param other The source string for the compare. + * @param offset The offset of the substring of the other string to use. + * @param len The length of the substring to compare. + * + * @return True if the regions match, false otherwise. + */ +bool RexxMutableBuffer::primitiveCaselessMatch(stringsize_t _start, RexxString *other, stringsize_t offset, stringsize_t len) +{ + _start--; // make the starting point origin zero + offset--; + + // if the match is not possible in the target string, just return false now. + if ((_start + len) > getLength()) + { + return false; + } + + return StringUtil::caselessCompare(getStringData() + _start, other->getStringData() + offset, len) == 0; +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 15:27:25 UTC (rev 2995) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 16:18:20 UTC (rev 2996) @@ -100,6 +100,10 @@ RexxMutableBuffer *upper(RexxInteger *_start, RexxInteger *_length); RexxMutableBuffer *lower(RexxInteger *_start, RexxInteger *_length); RexxMutableBuffer *translate(RexxString *tableo, RexxString *tablei, RexxString *pad, RexxInteger *, RexxInteger *); + RexxInteger *match(RexxInteger *start_, RexxString *other, RexxInteger *offset_, RexxInteger *len_); + RexxInteger *caselessMatch(RexxInteger *start_, RexxString *other, RexxInteger *offset_, RexxInteger *len_); + bool primitiveMatch(stringsize_t start, RexxString *other, stringsize_t offset, stringsize_t len); + bool primitiveCaselessMatch(stringsize_t start, RexxString *other, stringsize_t offset, stringsize_t len); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 15:27:25 UTC (rev 2995) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 16:18:20 UTC (rev 2996) @@ -860,6 +860,8 @@ CPPM(RexxMutableBuffer::upper), CPPM(RexxMutableBuffer::lower), CPPM(RexxMutableBuffer::translate), +CPPM(RexxMutableBuffer::match), +CPPM(RexxMutableBuffer::caselessMatch), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/expression/BuiltinFunctions.cpp =================================================================== --- main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-18 15:27:25 UTC (rev 2995) +++ main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-18 16:18:20 UTC (rev 2996) @@ -879,6 +879,7 @@ { return OREF_NULLSTRING; /* this too is a null string */ } + return result; // return the argument stuff } } else Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-18 15:27:25 UTC (rev 2995) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 16:18:20 UTC (rev 2996) @@ -948,6 +948,8 @@ defineKernelMethod(CHAR_UPPER ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::upper), 2); defineKernelMethod(CHAR_LOWER ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lower), 2); defineKernelMethod(CHAR_TRANSLATE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::translate), 5); + defineKernelMethod(CHAR_MATCH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::match), 4); + defineKernelMethod(CHAR_CASELESSMATCH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessMatch), 4); /* 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. |
From: <bi...@us...> - 2008-08-18 16:39:46
|
Revision: 2998 http://oorexx.svn.sourceforge.net/oorexx/?rev=2998&view=rev Author: bigrixx Date: 2008-08-18 16:39:52 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2057804 ] add matchChar and caselessMatchChar to mutable buffer Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.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:21:41 UTC (rev 2997) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 16:39:52 UTC (rev 2998) @@ -1242,3 +1242,77 @@ return StringUtil::caselessCompare(getStringData() + _start, other->getStringData() + offset, len) == 0; } + + +/** + * Compare a single character at a give position against + * a set of characters to see if any of the characters is + * a match. + * + * @param position_ The character position + * @param matchSet The set to compare against. + * + * @return true if the character at the give position is any of the characters, + * false if none of them match. + */ +RexxInteger *RexxMutableBuffer::matchChar(RexxInteger *position_, RexxString *matchSet) +{ + stringsize_t position = positionArgument(position_, ARG_ONE); + // the start position must be within the string bounds + if (position > getLength()) + { + reportException(Error_Incorrect_method_position, position); + } + matchSet = stringArgument(matchSet, ARG_TWO); + + stringsize_t _setLength = matchSet->getLength(); + char _matchChar = getChar(position - 1); + + // iterate through the match set looking for a match + for (stringsize_t i = 0; i < _setLength; i++) + { + if (_matchChar == matchSet->getChar(i)) + { + return TheTrueObject; + } + } + return TheFalseObject; +} + + +/** + * Compare a single character at a give position against + * a set of characters to see if any of the characters is + * a match. + * + * @param position_ The character position + * @param matchSet The set to compare against. + * + * @return true if the character at the give position is any of the characters, + * false if none of them match. + */ +RexxInteger *RexxMutableBuffer::caselessMatchChar(RexxInteger *position_, RexxString *matchSet) +{ + stringsize_t position = positionArgument(position_, ARG_ONE); + // the start position must be within the string bounds + if (position > getLength()) + { + reportException(Error_Incorrect_method_position, position); + } + matchSet = stringArgument(matchSet, ARG_TWO); + + stringsize_t _setLength = matchSet->getLength(); + char _matchChar = getChar(position - 1); + _matchChar = toupper(_matchChar); + + // iterate through the match set looking for a match, using a + // caseless compare + for (stringsize_t i = 0; i < _setLength; i++) + { + if (_matchChar == toupper(matchSet->getChar(i))) + { + return TheTrueObject; + } + } + return TheFalseObject; +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 16:21:41 UTC (rev 2997) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 16:39:52 UTC (rev 2998) @@ -104,6 +104,8 @@ RexxInteger *caselessMatch(RexxInteger *start_, RexxString *other, RexxInteger *offset_, RexxInteger *len_); bool primitiveMatch(stringsize_t start, RexxString *other, stringsize_t offset, stringsize_t len); 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); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } @@ -113,6 +115,7 @@ inline void closeGap(size_t offset, size_t _size, size_t tailSize) { data->closeGap(offset, _size, tailSize); } inline void adjustGap(size_t offset, size_t _size, size_t _newSize) { data->adjustGap(offset, _size, _newSize); } inline void setData(size_t offset, char character, size_t l) { data->setData(offset, character, l); } + inline char getChar(size_t offset) { return getData()[offset]; } static void createInstance(); static RexxClass *classInstance; Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 16:21:41 UTC (rev 2997) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 16:39:52 UTC (rev 2998) @@ -862,6 +862,8 @@ CPPM(RexxMutableBuffer::translate), CPPM(RexxMutableBuffer::match), CPPM(RexxMutableBuffer::caselessMatch), +CPPM(RexxMutableBuffer::matchChar), +CPPM(RexxMutableBuffer::caselessMatchChar), 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:21:41 UTC (rev 2997) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 16:39:52 UTC (rev 2998) @@ -950,6 +950,8 @@ defineKernelMethod(CHAR_TRANSLATE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::translate), 5); defineKernelMethod(CHAR_MATCH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::match), 4); defineKernelMethod(CHAR_CASELESSMATCH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessMatch), 4); + defineKernelMethod(CHAR_MATCHCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::matchChar), 2); + defineKernelMethod(CHAR_CASELESSMATCHCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessMatchChar), 2); /* 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. |
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. |
From: <bi...@us...> - 2008-08-18 17:52:43
|
Revision: 3000 http://oorexx.svn.sourceforge.net/oorexx/?rev=3000&view=rev Author: bigrixx Date: 2008-08-18 17:52:46 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2058015 ] Add verifcation length to verify() Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/classes/StringClass.hpp main/trunk/interpreter/classes/StringClassMisc.cpp main/trunk/interpreter/classes/StringUtil.cpp main/trunk/interpreter/classes/StringUtil.hpp main/trunk/interpreter/expression/BuiltinFunctions.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 17:27:50 UTC (rev 2999) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 17:52:46 UTC (rev 3000) @@ -1324,10 +1324,11 @@ * @param ref The reference string. * @param option The match/nomatch option. * @param _start The start position for the verify. + * @param range The range to search * * @return The offset of the first match/mismatch within the buffer. */ -RexxInteger *RexxMutableBuffer::verify(RexxString *ref, RexxString *option, RexxInteger *_start) +RexxInteger *RexxMutableBuffer::verify(RexxString *ref, RexxString *option, RexxInteger *_start, RexxInteger *range) { - return StringUtil::verify(getStringData(), getLength(), ref, option, _start); + return StringUtil::verify(getStringData(), getLength(), ref, option, _start, range); } Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 17:27:50 UTC (rev 2999) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 17:52:46 UTC (rev 3000) @@ -106,7 +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 *); + RexxInteger *verify(RexxString *, RexxString *, RexxInteger *, RexxInteger *); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/classes/StringClass.hpp =================================================================== --- main/trunk/interpreter/classes/StringClass.hpp 2008-08-18 17:27:50 UTC (rev 2999) +++ main/trunk/interpreter/classes/StringClass.hpp 2008-08-18 17:52:46 UTC (rev 3000) @@ -272,7 +272,7 @@ size_t caselessPos(RexxString *, size_t); RexxString *translate(RexxString *, RexxString *, RexxString *, RexxInteger *, RexxInteger *); - RexxInteger *verify(RexxString *, RexxString *, RexxInteger *); + RexxInteger *verify(RexxString *, RexxString *, RexxInteger *, RexxInteger *); RexxInteger *countStrRexx(RexxString *); RexxInteger *caselessCountStrRexx(RexxString *); size_t caselessCountStr(RexxString *); Modified: main/trunk/interpreter/classes/StringClassMisc.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-18 17:27:50 UTC (rev 2999) +++ main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-18 17:52:46 UTC (rev 3000) @@ -822,12 +822,13 @@ RexxInteger *RexxString::verify( RexxString *ref, /* compare reference string */ RexxString *option, /* Match/NoMatch option */ - RexxInteger *_start) /* optional starg position */ + RexxInteger *_start, /* optional starg position */ + RexxInteger *range) // length to search /******************************************************************************/ /* Function: String class VERIFY function */ /******************************************************************************/ { - return StringUtil::verify(getStringData(), getLength(), ref, option, _start); + return StringUtil::verify(getStringData(), getLength(), ref, option, _start, range); } Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 17:27:50 UTC (rev 2999) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 17:52:46 UTC (rev 3000) @@ -1361,7 +1361,7 @@ * * @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) +RexxInteger *StringUtil::verify(const char *data, size_t stringLen, RexxString *ref, RexxString *option, RexxInteger *_start, RexxInteger *range) { // get the reference string information ref = stringArgument(ref, ARG_ONE); @@ -1377,15 +1377,18 @@ /* get starting position */ size_t startPos = optionalPositionArgument(_start, 1, ARG_THREE); + size_t stringRange = optionalLengthArgument(range, stringLen - startPos + 1, ARG_FOUR); if (startPos > stringLen) /* beyond end of string? */ { return IntegerZero; /* couldn't find it */ } else { + // adjust the range for seaching + stringRange = Numerics::minVal(stringRange, stringLen - startPos + 1); + /* 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) @@ -1405,7 +1408,7 @@ // return the first non-matching character if (opt == VERIFY_NOMATCH) { - while (stringLen-- != 0) + while (stringRange-- != 0) { /* while input left */ char ch = *current++; /* get next char */ /* get reference string */ Modified: main/trunk/interpreter/classes/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 17:27:50 UTC (rev 2999) +++ main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 17:52:46 UTC (rev 3000) @@ -80,7 +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); + static RexxInteger *verify(const char *data, size_t stringLen, RexxString *ref, RexxString *option, RexxInteger *_start, RexxInteger *range); }; #endif Modified: main/trunk/interpreter/expression/BuiltinFunctions.cpp =================================================================== --- main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-18 17:27:50 UTC (rev 2999) +++ main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-18 17:52:46 UTC (rev 3000) @@ -730,11 +730,12 @@ } #define VERIFY_MIN 2 -#define VERIFY_MAX 4 +#define VERIFY_MAX 5 #define VERIFY_string 1 #define VERIFY_reference 2 #define VERIFY_option 3 #define VERIFY_start 4 +#define VERIFY_range 5 BUILTIN(VERIFY) { @@ -747,8 +748,10 @@ RexxString *option = optional_string(VERIFY, option); /* start is optional */ RexxInteger *start = optional_integer(VERIFY, start); + /* start is optional */ + RexxInteger *range = optional_integer(VERIFY, range); /* do the verify function */ - return string->verify(reference, option, start); + return string->verify(reference, option, start, range); } #define DATATYPE_MIN 1 Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-18 17:27:50 UTC (rev 2999) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 17:52:46 UTC (rev 3000) @@ -842,7 +842,7 @@ defineKernelMethod(CHAR_CASELESSLASTPOS ,TheStringBehaviour, CPPM(RexxString::caselessLastPosRexx), 2); defineKernelMethod(CHAR_CASELESSPOS ,TheStringBehaviour, CPPM(RexxString::caselessPosRexx), 2); defineKernelMethod(CHAR_TRANSLATE ,TheStringBehaviour, CPPM(RexxString::translate), 5); - defineKernelMethod(CHAR_VERIFY ,TheStringBehaviour, CPPM(RexxString::verify), 3); + defineKernelMethod(CHAR_VERIFY ,TheStringBehaviour, CPPM(RexxString::verify), 4); defineKernelMethod(CHAR_BITAND ,TheStringBehaviour, CPPM(RexxString::bitAnd), 2); defineKernelMethod(CHAR_BITOR ,TheStringBehaviour, CPPM(RexxString::bitOr), 2); defineKernelMethod(CHAR_BITXOR ,TheStringBehaviour, CPPM(RexxString::bitXor), 2); @@ -952,7 +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); + defineKernelMethod(CHAR_VERIFY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::verify), 4); /* 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. |
From: <bi...@us...> - 2008-08-18 19:00:03
|
Revision: 3001 http://oorexx.svn.sourceforge.net/oorexx/?rev=3001&view=rev Author: bigrixx Date: 2008-08-18 18:59:58 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2058009 ] add subword 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 17:52:46 UTC (rev 3000) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 18:59:58 UTC (rev 3001) @@ -1332,3 +1332,17 @@ { return StringUtil::verify(getStringData(), getLength(), ref, option, _start, range); } + + +/** + * Perform a subword extraction from a mutable buffer. + * + * @param position The first word to be extracted. + * @param plength The number of words to extract. + * + * @return The substring containing the extacted words. + */ +RexxString *RexxMutableBuffer::subWord(RexxInteger *position, RexxInteger *plength) +{ + return StringUtil::subWord(getStringData(), getLength(), position, plength); +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 17:52:46 UTC (rev 3000) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 18:59:58 UTC (rev 3001) @@ -107,6 +107,7 @@ RexxInteger *matchChar(RexxInteger *position_, RexxString *matchSet); RexxInteger *caselessMatchChar(RexxInteger *position_, RexxString *matchSet); RexxInteger *verify(RexxString *, RexxString *, RexxInteger *, RexxInteger *); + RexxString *subWord(RexxInteger *, 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 17:52:46 UTC (rev 3000) +++ main/trunk/interpreter/classes/StringClassWord.cpp 2008-08-18 18:59:58 UTC (rev 3001) @@ -215,6 +215,7 @@ return Retval; /* return spaced string */ } + /* the SUBWORD function */ /******************************************************************************/ /* Arguments: Starting word postion */ @@ -222,64 +223,12 @@ /* */ /* Returned: string, contains the requested number of words from source */ /******************************************************************************/ -RexxString *RexxString::subWord(RexxInteger *position, - RexxInteger *plength) +RexxString *RexxString::subWord(RexxInteger *position, RexxInteger *plength) { - const char *Word; /* current word pointer */ - const char *WordStart; /* start of substring */ - const char *WordEnd; /* end of the substring */ - const char *NextSite; /* next word */ - size_t WordPos; /* needed word position */ - size_t Count; /* count of words */ - size_t Length; /* remaining length */ - size_t WordLength; /* word size */ - RexxString *Retval; /* return value */ - - /* convert position to binary */ - WordPos = positionArgument(position, ARG_ONE); - /* get num of words to delete, the */ - /* default is "a very large number" */ - Count = optionalLengthArgument(plength, MAXNUM, ARG_TWO); - - Length = this->getLength(); /* get Argument length */ - if (!Length || !Count) /* null string? */ - { - Retval = OREF_NULLSTRING; /* result is null also */ - } - else - { - Word = this->getStringData(); /* point to the string */ - /* 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); - } - if (WordPos) /* run out of words first */ - { - Retval = OREF_NULLSTRING; /* again a null string */ - } - else - { /* count off number of words */ - WordStart = Word; /* save start position */ - WordEnd = Word; /* default end is the same */ - /* loop until we reach tArget */ - while (Count-- && WordLength) - { - WordEnd = Word + WordLength; /* point to the word end */ - Word = NextSite; /* copy the start pointer */ - /* get the next word */ - WordLength = StringUtil::nextWord(&Word, &Length, &NextSite); - } - /* extract the substring */ - Retval = (RexxString *)new_string(WordStart, WordEnd - WordStart); - } - } - return Retval; /* return extracted string */ + return StringUtil::subWord(getStringData(), getLength(), position, plength); } + /* the WORD function */ /******************************************************************************/ /* Arguments: which word we want. */ Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 17:52:46 UTC (rev 3000) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 18:59:58 UTC (rev 3001) @@ -1459,3 +1459,57 @@ } } } + + +/** + * Do a subword operation on a buffer of data + * + * @param data The start of the data buffer. + * @param length The length of the buffer + * @param position The starting word position. + * @param plength the count of words to return. + * + * @return The string containing the indicated subwords. + */ +RexxString *StringUtil::subWord(const char *data, size_t length, RexxInteger *position, RexxInteger *plength) +{ + /* convert position to binary */ + size_t wordPos = positionArgument(position, ARG_ONE); + // get num of words to extract. The default is a "very large number + size_t count = optionalLengthArgument(plength, MAXNUM, ARG_TWO); + + // handle cases that will always result in a null string + if (length == 0 || count == 0) + { + return OREF_NULLSTRING; + } + const char *nextSite = NULL; + const char *word = data; + /* 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); + } + // we terminated because there was no word found before we reached the + // count position + if (wordPos != 0) + { + return OREF_NULLSTRING; /* again a null string */ + } + + const char *wordStart = data; /* save start position */ + const char *wordEnd = data; /* default end is the same */ + /* loop until we reach tArget */ + while (count-- > 0 && wordLength != 0) + { + wordEnd = word + wordLength; /* point to the word end */ + word = nextSite; /* copy the start pointer */ + /* get the next word */ + wordLength = nextWord(&word, &length, &nextSite); + } + /* extract the substring */ + return new_string(wordStart, wordEnd - wordStart); +} Modified: main/trunk/interpreter/classes/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 17:52:46 UTC (rev 3000) +++ main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 18:59:58 UTC (rev 3001) @@ -81,6 +81,7 @@ 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, RexxInteger *range); + static RexxString *subWord(const char *data, size_t length, RexxInteger *position, RexxInteger *plength); }; #endif Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 17:52:46 UTC (rev 3000) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 18:59:58 UTC (rev 3001) @@ -865,6 +865,7 @@ CPPM(RexxMutableBuffer::matchChar), CPPM(RexxMutableBuffer::caselessMatchChar), CPPM(RexxMutableBuffer::verify), +CPPM(RexxMutableBuffer::subWord), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-18 17:52:46 UTC (rev 3000) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 18:59:58 UTC (rev 3001) @@ -953,6 +953,7 @@ defineKernelMethod(CHAR_MATCHCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::matchChar), 2); defineKernelMethod(CHAR_CASELESSMATCHCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessMatchChar), 2); defineKernelMethod(CHAR_VERIFY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::verify), 4); + defineKernelMethod(CHAR_SUBWORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::subWord), 2); /* 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. |
From: <bi...@us...> - 2008-08-18 19:24:42
|
Revision: 3002 http://oorexx.svn.sourceforge.net/oorexx/?rev=3002&view=rev Author: bigrixx Date: 2008-08-18 19:24:40 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2058022 ] add word() 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 18:59:58 UTC (rev 3001) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 19:24:40 UTC (rev 3002) @@ -1346,3 +1346,16 @@ { return StringUtil::subWord(getStringData(), getLength(), position, plength); } + + +/** + * Extract a given word from a mutable buffer. + * + * @param position The target word position. + * + * @return The extracted word, as a string. + */ +RexxString *RexxMutableBuffer::word(RexxInteger *position) +{ + return StringUtil::word(getStringData(), getLength(), position); +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 18:59:58 UTC (rev 3001) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 19:24:40 UTC (rev 3002) @@ -108,6 +108,7 @@ RexxInteger *caselessMatchChar(RexxInteger *position_, RexxString *matchSet); RexxInteger *verify(RexxString *, RexxString *, RexxInteger *, RexxInteger *); RexxString *subWord(RexxInteger *, RexxInteger *); + RexxString *word(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 18:59:58 UTC (rev 3001) +++ main/trunk/interpreter/classes/StringClassWord.cpp 2008-08-18 19:24:40 UTC (rev 3002) @@ -237,43 +237,7 @@ /******************************************************************************/ RexxString *RexxString::word(RexxInteger *position) { - const char *Word; /* current word pointer */ - const char *NextSite; /* next word */ - size_t WordPos; /* needed word position */ - size_t Length; /* remaining length */ - size_t WordLength; /* word size */ - RexxString *Retval; /* return value */ - - /* convert position to binary */ - WordPos = positionArgument(position, ARG_ONE); - - Length = this->getLength(); /* get Argument length */ - if (Length == 0) /* null string? */ - { - Retval = OREF_NULLSTRING; /* result is null also */ - } - else - { - Word = this->getStringData(); /* point to the string */ - /* 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); - } - if (WordLength) /* have a word */ - { - /* extract the string */ - Retval = (RexxString *)new_string(Word, WordLength); - } - else - { - Retval = OREF_NULLSTRING; /* no word, return a null */ - } - } - return Retval; /* return extracted string */ + return StringUtil::word(getStringData(), getLength(), position); } /* the WORDINDEX function */ Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 18:59:58 UTC (rev 3001) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 19:24:40 UTC (rev 3002) @@ -1513,3 +1513,40 @@ /* extract the substring */ return new_string(wordStart, wordEnd - wordStart); } + + +/** + * Extract a word from a buffer + * + * @param data The data pointer + * @param length the length of the data buffer. + * @param position the target word position. + * + * @return The string value of the word at the indicated position. + */ +RexxString *StringUtil::word(const char *data, size_t length, RexxInteger *position) +{ + /* convert position to binary */ + size_t wordPos = positionArgument(position, ARG_ONE); + + if (length == 0) /* null string? */ + { + return OREF_NULLSTRING; /* result is null also */ + } + const char *word = data; /* point to the string */ + 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); + } + if (wordLength != 0) /* have a word */ + { + /* extract the string */ + return new_string(word, wordLength); + } + return OREF_NULLSTRING; /* no word, return a null */ +} Modified: main/trunk/interpreter/classes/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 18:59:58 UTC (rev 3001) +++ main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 19:24:40 UTC (rev 3002) @@ -82,6 +82,7 @@ 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, RexxInteger *range); static RexxString *subWord(const char *data, size_t length, RexxInteger *position, RexxInteger *plength); + static RexxString *word(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 18:59:58 UTC (rev 3001) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 19:24:40 UTC (rev 3002) @@ -866,6 +866,7 @@ CPPM(RexxMutableBuffer::caselessMatchChar), CPPM(RexxMutableBuffer::verify), CPPM(RexxMutableBuffer::subWord), +CPPM(RexxMutableBuffer::word), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-18 18:59:58 UTC (rev 3001) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 19:24:40 UTC (rev 3002) @@ -954,6 +954,7 @@ defineKernelMethod(CHAR_CASELESSMATCHCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessMatchChar), 2); defineKernelMethod(CHAR_VERIFY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::verify), 4); defineKernelMethod(CHAR_SUBWORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::subWord), 2); + defineKernelMethod(CHAR_WORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::word), 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. |
From: <bi...@us...> - 2008-08-18 19:40:45
|
Revision: 3003 http://oorexx.svn.sourceforge.net/oorexx/?rev=3003&view=rev Author: bigrixx Date: 2008-08-18 19:40:45 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2058012 ] add wordindex 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:24:40 UTC (rev 3002) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 19:40:45 UTC (rev 3003) @@ -1359,3 +1359,17 @@ { return StringUtil::word(getStringData(), getLength(), position); } + + +/** + * return the index of a given word position in a mutable buffer + * + * + * @param position The target word position. + * + * @return The extracted word, as a string. + */ +RexxInteger *RexxMutableBuffer::wordIndex(RexxInteger *position) +{ + return StringUtil::wordIndex(getStringData(), getLength(), position); +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 19:24:40 UTC (rev 3002) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 19:40:45 UTC (rev 3003) @@ -109,6 +109,7 @@ RexxInteger *verify(RexxString *, RexxString *, RexxInteger *, RexxInteger *); RexxString *subWord(RexxInteger *, RexxInteger *); RexxString *word(RexxInteger *); + RexxInteger *wordIndex(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:24:40 UTC (rev 3002) +++ main/trunk/interpreter/classes/StringClassWord.cpp 2008-08-18 19:40:45 UTC (rev 3003) @@ -248,37 +248,7 @@ /******************************************************************************/ RexxInteger *RexxString::wordIndex(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 */ - RexxInteger *Retval; /* return value */ - size_t tempIndex; - - 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); - } - if (WordLength == 0) /* ran out of string */ - { - Retval = IntegerZero; /* no index */ - } - else - { /* calc the word index */ - tempIndex = Word - this->getStringData() + 1; - Retval = new_integer(tempIndex); - } - return Retval; /* return appopriate position */ + return StringUtil::wordIndex(getStringData(), getLength(), position); } /* the WORDLENGTH function */ Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 19:24:40 UTC (rev 3002) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 19:40:45 UTC (rev 3003) @@ -1550,3 +1550,36 @@ } return OREF_NULLSTRING; /* no word, return a null */ } + + +/** + * Return the index position for a given word + * + * @param data The data containing the words + * @param length The length of the data buffer + * @param position The target word position + * + * @return The offset of the start of the indicated word. + */ +RexxInteger *StringUtil::wordIndex(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); + } + + if (wordLength == 0) /* ran out of string */ + { + return IntegerZero; /* no index */ + } + return new_integer(word - data + 1); +} Modified: main/trunk/interpreter/classes/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 19:24:40 UTC (rev 3002) +++ main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 19:40:45 UTC (rev 3003) @@ -83,6 +83,7 @@ static RexxInteger *verify(const char *data, size_t stringLen, RexxString *ref, RexxString *option, RexxInteger *_start, RexxInteger *range); 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); }; #endif Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 19:24:40 UTC (rev 3002) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 19:40:45 UTC (rev 3003) @@ -867,6 +867,7 @@ CPPM(RexxMutableBuffer::verify), CPPM(RexxMutableBuffer::subWord), CPPM(RexxMutableBuffer::word), +CPPM(RexxMutableBuffer::wordIndex), 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:24:40 UTC (rev 3002) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 19:40:45 UTC (rev 3003) @@ -955,6 +955,7 @@ defineKernelMethod(CHAR_VERIFY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::verify), 4); defineKernelMethod(CHAR_SUBWORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::subWord), 2); defineKernelMethod(CHAR_WORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::word), 1); + defineKernelMethod(CHAR_WORDINDEX ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordIndex), 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. |
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. |
From: <bi...@us...> - 2008-08-18 20:11:23
|
Revision: 3005 http://oorexx.svn.sourceforge.net/oorexx/?rev=3005&view=rev Author: bigrixx Date: 2008-08-18 20:11:27 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2058023 ] add words() to mutable buffer Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.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 20:06:09 UTC (rev 3004) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 20:11:27 UTC (rev 3005) @@ -1388,3 +1388,14 @@ { return StringUtil::wordLength(getStringData(), getLength(), position); } + +/** + * Return the count of words in the buffer. + * + * @return The buffer word count. + */ +RexxInteger *RexxMutableBuffer::words() +{ + size_t tempCount = StringUtil::wordCount(this->getStringData(), this->getLength()); + return new_integer(tempCount); +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 20:06:09 UTC (rev 3004) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 20:11:27 UTC (rev 3005) @@ -111,6 +111,7 @@ RexxString *word(RexxInteger *); RexxInteger *wordIndex(RexxInteger *); RexxInteger *wordLength(RexxInteger *); + RexxInteger *words(); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 20:06:09 UTC (rev 3004) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 20:11:27 UTC (rev 3005) @@ -869,6 +869,7 @@ CPPM(RexxMutableBuffer::word), CPPM(RexxMutableBuffer::wordIndex), CPPM(RexxMutableBuffer::wordLength), +CPPM(RexxMutableBuffer::words), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-18 20:06:09 UTC (rev 3004) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 20:11:27 UTC (rev 3005) @@ -957,6 +957,7 @@ defineKernelMethod(CHAR_WORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::word), 1); defineKernelMethod(CHAR_WORDINDEX ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordIndex), 1); defineKernelMethod(CHAR_WORDLENGTH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordLength), 1); + defineKernelMethod(CHAR_WORDS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::words), 0); /* 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. |
From: <bi...@us...> - 2008-08-18 20:35:29
|
Revision: 3007 http://oorexx.svn.sourceforge.net/oorexx/?rev=3007&view=rev Author: bigrixx Date: 2008-08-18 20:35:29 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2058010 ] add wordpos 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 20:13:42 UTC (rev 3006) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 20:35:29 UTC (rev 3007) @@ -1399,3 +1399,31 @@ size_t tempCount = StringUtil::wordCount(this->getStringData(), this->getLength()); return new_integer(tempCount); } + + +/** + * Perform a wordpos search on a mutablebuffer object. + * + * @param phrase The search phrase + * @param pstart The starting search position. + * + * @return The index of the match location. + */ +RexxInteger *RexxMutableBuffer::wordPos(RexxString *phrase, RexxInteger *pstart) +{ + return StringUtil::wordPos(getStringData(), getLength(), phrase, pstart); +} + + +/** + * Perform a caseless wordpos search on a string object. + * + * @param phrase The search phrase + * @param pstart The starting search position. + * + * @return The index of the match location. + */ +RexxInteger *RexxMutableBuffer::caselessWordPos(RexxString *phrase, RexxInteger *pstart) +{ + return StringUtil::caselessWordPos(getStringData(), getLength(), phrase, pstart); +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 20:13:42 UTC (rev 3006) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 20:35:29 UTC (rev 3007) @@ -112,6 +112,8 @@ RexxInteger *wordIndex(RexxInteger *); RexxInteger *wordLength(RexxInteger *); RexxInteger *words(); + RexxInteger *wordPos(RexxString *, RexxInteger *); + RexxInteger *caselessWordPos(RexxString *, 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 20:13:42 UTC (rev 3006) +++ main/trunk/interpreter/classes/StringClassWord.cpp 2008-08-18 20:35:29 UTC (rev 3007) @@ -262,240 +262,32 @@ return StringUtil::wordIndex(getStringData(), getLength(), position); } -/* the WORDPOS function */ -/******************************************************************************/ -/* Arguments: phrase of words to lookfor */ -/* which word to satrt looking at. */ -/* */ -/* Returned: position of 1st word in source matching phrase */ -/******************************************************************************/ -RexxInteger *RexxString::wordPos(RexxString *phrase, - RexxInteger *pstart) -{ - RexxInteger *Retval; /* return value */ - const char *Needle; /* start of needle string */ - const char *Haystack; /* current haystack positon */ - const char *NextNeedle; /* next search position */ - const char *NextHaystack; /* next search position */ - size_t Count; /* current haystack word pos */ - size_t NeedleWords; /* needle word count */ - size_t HaystackWords; /* haystack word count */ - size_t HaystackScanLength; /* length to scan */ - size_t NeedleScanLength; /* length of scan */ - size_t HaystackWordLength; /* haystack word length */ - size_t NeedleWordLength; /* needle word length */ - size_t SearchCount; /* possible searches to do */ - size_t FirstNeedle; /* length of first needle word */ - size_t NeedleLength; /* length of needle */ - size_t HaystackLength; /* length of haystack */ - const char *NeedlePosition; /* temporary pointers for */ - const char *HaystackPosition; /* the searches */ - const char *NextHaystackPtr; /* pointer to next word */ - const char *NextNeedlePtr; /* pointer to next word */ - size_t i; /* loop counter */ - phrase = stringArgument(phrase, ARG_ONE);/* get the phrase we are looking for */ - NeedleLength = phrase->getLength(); /* get the length also */ - /* get starting position, the default*/ - /* is the first word */ - Count = optionalPositionArgument(pstart, 1, ARG_TWO); - - Needle = phrase->getStringData(); /* get friendly pointer */ - Haystack = this->getStringData(); /* and the second also */ - HaystackLength = this->getLength(); /* get the haystack length */ - /* count the words in needle */ - NeedleWords = StringUtil::wordCount(Needle, NeedleLength); - /* and haystack */ - HaystackWords = StringUtil::wordCount(Haystack, HaystackLength); - /* if search string is longer */ - /* or no words in search */ - /* or count is longer than */ - /* haystack */ - if (NeedleWords > (HaystackWords - Count + 1) || - NeedleWords == 0 || - Count > HaystackWords) - { - Retval = IntegerZero; /* can't find anything, */ - } - else - { /* need to search */ - /* point at first word */ - HaystackWordLength = StringUtil::nextWord(&Haystack, &HaystackLength, &NextHaystack); - /* now skip over count-1 */ - for (i = Count - 1; i && HaystackWordLength != 0; i--) - { - Haystack = NextHaystack; /* step past current word */ - /* find the next word */ - HaystackWordLength = StringUtil::nextWord(&Haystack, &HaystackLength, &NextHaystack); - } - /* get number of searches */ - SearchCount = (HaystackWords - NeedleWords - Count) + 2; - /* position at first needle */ - FirstNeedle = StringUtil::nextWord(&Needle, &NeedleLength, &NextNeedle); - /* loop for the possible times */ - for (; SearchCount; SearchCount--) - { - NeedleWordLength = FirstNeedle; /* set the length */ - NeedlePosition = Needle; /* get the start of phrase */ - HaystackPosition = Haystack; /* and the target string loop */ - /* for needlewords */ - NextHaystackPtr = NextHaystack; /* copy nextword information */ - NextNeedlePtr = NextNeedle; - /* including the lengths */ - HaystackScanLength = HaystackLength; - NeedleScanLength = NeedleLength; - - for (i = NeedleWords; i; i--) - { /* possible times */ - - if (HaystackWordLength != /* if wrong length, then it */ - NeedleWordLength) /* can't be a match...just */ - { - break; /* leave the loop */ - } - - if (memcmp(NeedlePosition, /* if the two words don't */ - HaystackPosition, /* match, then no sense */ - NeedleWordLength)) /* checking the rest */ - { - break; /* get out fast. */ - } - - /* the last words matched, so */ - /* continue searching. */ - - /* set new search information */ - HaystackPosition = NextHaystackPtr; - NeedlePosition = NextNeedlePtr; - /* Scan off the next word */ - HaystackWordLength = StringUtil::nextWord(&HaystackPosition, - &HaystackScanLength, - &NextHaystackPtr); - /* repeat for the needle */ - NeedleWordLength = StringUtil::nextWord(&NeedlePosition, - &NeedleScanLength, - &NextNeedlePtr); - } - - if (!i) /* all words matched, we */ - { - break; /* found it */ - } - Haystack = NextHaystack; /* set the search position */ - /* step to next haytack pos */ - HaystackWordLength = StringUtil::nextWord(&Haystack, - &HaystackLength, - &NextHaystack); - Count++; /* remember the word position */ - } - - if (SearchCount != 0) /* if we haven't scanned the */ - { - /* entire string */ - Retval = new_integer(Count); /* return the position */ - } - else /* it wasn't found, just */ - { - Retval = IntegerZero; /* return a zero. */ - } - } - return Retval; /* return the position */ +/** + * Perform a wordpos search on a string object. + * + * @param phrase The search phrase + * @param pstart The starting search position. + * + * @return The index of the match location. + */ +RexxInteger *RexxString::wordPos(RexxString *phrase, RexxInteger *pstart) +{ + return StringUtil::wordPos(getStringData(), getLength(), phrase, pstart); } +/** + * Perform a caseless wordpos search on a string object. + * + * @param phrase The search phrase + * @param pstart The starting search position. + * + * @return The index of the match location. + */ RexxInteger *RexxString::caselessWordPos(RexxString *phrase, RexxInteger *pstart) { - phrase = stringArgument(phrase, ARG_ONE);/* get the phrase we are looking for */ - stringsize_t needleLength = phrase->getLength(); /* get the length also */ - /* get starting position, the default*/ - /* is the first word */ - stringsize_t count = optionalPositionArgument(pstart, 1, ARG_TWO); - - const char *needle = phrase->getStringData(); /* get friendly pointer */ - const char *haystack = this->getStringData(); /* and the second also */ - stringsize_t haystackLength = this->getLength(); /* get the haystack length */ - /* count the words in needle */ - stringsize_t needleWords = StringUtil::wordCount(needle, needleLength); - /* and haystack */ - stringsize_t haystackWords = StringUtil::wordCount(haystack, haystackLength); - /* if search string is longer */ - /* or no words in search */ - /* or count is longer than */ - /* haystack, this is a failure */ - if (needleWords > (haystackWords - count + 1) || needleWords == 0 || count > haystackWords) - { - return IntegerZero; - } - - const char *nextHaystack; - const char *nextNeedle; - /* point at first word */ - stringsize_t haystackWordLength = StringUtil::nextWord(&haystack, &haystackLength, &nextHaystack); - /* now skip over count-1 */ - for (stringsize_t i = count - 1; i && haystackWordLength != 0; i--) - { - haystack = nextHaystack; /* step past current word */ - /* find the next word */ - haystackWordLength = StringUtil::nextWord(&haystack, &haystackLength, &nextHaystack); - } - /* get number of searches */ - stringsize_t searchCount = (haystackWords - needleWords - count) + 2; - /* position at first needle */ - stringsize_t firstNeedle = StringUtil::nextWord(&needle, &needleLength, &nextNeedle); - /* loop for the possible times */ - for (; searchCount; searchCount--) - { - stringsize_t needleWordLength = firstNeedle; /* set the length */ - const char *needlePosition = needle; /* get the start of phrase */ - const char *haystackPosition = haystack; /* and the target string loop */ - /* for needlewords */ - const char *nextHaystackPtr = nextHaystack; /* copy nextword information */ - const char *nextNeedlePtr = nextNeedle; - /* including the lengths */ - stringsize_t haystackScanLength = haystackLength; - stringsize_t needleScanLength = needleLength; - - stringsize_t i; - - for (i = needleWords; i; i--) - { - // length mismatch, can't be a match - - if (haystackWordLength != needleWordLength) - { - break; - } - - // now compare the two words, using a caseless comparison - // if the words don't match, terminate now - if (StringUtil::caselessCompare(needlePosition, haystackPosition, needleWordLength)) - { - break; /* get out fast. */ - } - - /* the last words matched, so */ - /* continue searching. */ - - /* set new search information */ - haystackPosition = nextHaystackPtr; - needlePosition = nextNeedlePtr; - /* Scan off the next word */ - haystackWordLength = StringUtil::nextWord(&haystackPosition, &haystackScanLength, &nextHaystackPtr); - /* repeat for the needle */ - needleWordLength = StringUtil::nextWord(&needlePosition, &needleScanLength, &nextNeedlePtr); - } - - if (i == 0) /* all words matched, we */ - { - return new_integer(count); // return the position - } - haystack = nextHaystack; /* set the search position */ - /* step to next haytack pos */ - haystackWordLength = StringUtil::nextWord(&haystack, &haystackLength, &nextHaystack); - count++; /* remember the word position */ - } - - return IntegerZero; // not found + return StringUtil::caselessWordPos(getStringData(), getLength(), phrase, pstart); } /* the WORDS function */ Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 20:13:42 UTC (rev 3006) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-18 20:35:29 UTC (rev 3007) @@ -1612,3 +1612,215 @@ } return new_integer(wordLength); /* return the word length */ } + + +/** + * Execute a wordpos search on a buffer of data. + * + * @param data the source data buffer. + * @param length the length of the buffer + * @param phrase the search phrase. + * @param pstart the starting position. + * + * @return the location of the start of the search phrase. + */ +RexxInteger *StringUtil::wordPos(const char *data, size_t length, RexxString *phrase, RexxInteger *pstart) +{ + phrase = stringArgument(phrase, ARG_ONE);/* get the phrase we are looking for */ + stringsize_t needleLength = phrase->getLength(); /* get the length also */ + /* get starting position, the default*/ + /* is the first word */ + stringsize_t count = optionalPositionArgument(pstart, 1, ARG_TWO); + + const char *needle = phrase->getStringData(); /* get friendly pointer */ + const char *haystack = data; /* and the second also */ + stringsize_t haystackLength = length; /* get the haystack length */ + /* count the words in needle */ + stringsize_t needleWords = wordCount(needle, needleLength); + /* and haystack */ + stringsize_t haystackWords = wordCount(haystack, haystackLength); + /* if search string is longer */ + /* or no words in search */ + /* or count is longer than */ + /* haystack, this is a failure */ + if (needleWords > (haystackWords - count + 1) || needleWords == 0 || count > haystackWords) + { + return IntegerZero; + } + + const char *nextHaystack; + const char *nextNeedle; + /* point at first word */ + stringsize_t haystackWordLength = nextWord(&haystack, &haystackLength, &nextHaystack); + /* now skip over count-1 */ + for (stringsize_t i = count - 1; i && haystackWordLength != 0; i--) + { + haystack = nextHaystack; /* step past current word */ + /* find the next word */ + haystackWordLength = nextWord(&haystack, &haystackLength, &nextHaystack); + } + /* get number of searches */ + stringsize_t searchCount = (haystackWords - needleWords - count) + 2; + /* position at first needle */ + stringsize_t firstNeedle = nextWord(&needle, &needleLength, &nextNeedle); + /* loop for the possible times */ + for (; searchCount; searchCount--) + { + stringsize_t needleWordLength = firstNeedle; /* set the length */ + const char *needlePosition = needle; /* get the start of phrase */ + const char *haystackPosition = haystack; /* and the target string loop */ + /* for needlewords */ + const char *nextHaystackPtr = nextHaystack; /* copy nextword information */ + const char *nextNeedlePtr = nextNeedle; + /* including the lengths */ + stringsize_t haystackScanLength = haystackLength; + stringsize_t needleScanLength = needleLength; + + stringsize_t i; + + for (i = needleWords; i; i--) + { + // length mismatch, can't be a match + + if (haystackWordLength != needleWordLength) + { + break; + } + + // now compare the two words, using a caseless comparison + // if the words don't match, terminate now + if (memcmp(needlePosition, haystackPosition, needleWordLength) != 0) + { + break; /* get out fast. */ + } + + /* the last words matched, so */ + /* continue searching. */ + + /* set new search information */ + haystackPosition = nextHaystackPtr; + needlePosition = nextNeedlePtr; + /* Scan off the next word */ + haystackWordLength = nextWord(&haystackPosition, &haystackScanLength, &nextHaystackPtr); + /* repeat for the needle */ + needleWordLength = nextWord(&needlePosition, &needleScanLength, &nextNeedlePtr); + } + + if (i == 0) /* all words matched, we */ + { + return new_integer(count); // return the position + } + haystack = nextHaystack; /* set the search position */ + /* step to next haytack pos */ + haystackWordLength = nextWord(&haystack, &haystackLength, &nextHaystack); + count++; /* remember the word position */ + } + + return IntegerZero; // not found +} + + +/** + * Execute a caseless wordpos search on a buffer of data. + * + * @param data the source data buffer. + * @param length the length of the buffer + * @param phrase the search phrase. + * @param pstart the starting position. + * + * @return the location of the start of the search phrase. + */ +RexxInteger *StringUtil::caselessWordPos(const char *data, size_t length, RexxString *phrase, RexxInteger *pstart) +{ + phrase = stringArgument(phrase, ARG_ONE);/* get the phrase we are looking for */ + stringsize_t needleLength = phrase->getLength(); /* get the length also */ + /* get starting position, the default*/ + /* is the first word */ + stringsize_t count = optionalPositionArgument(pstart, 1, ARG_TWO); + + const char *needle = phrase->getStringData(); /* get friendly pointer */ + const char *haystack = data; /* and the second also */ + stringsize_t haystackLength = length; /* get the haystack length */ + /* count the words in needle */ + stringsize_t needleWords = wordCount(needle, needleLength); + /* and haystack */ + stringsize_t haystackWords = wordCount(haystack, haystackLength); + /* if search string is longer */ + /* or no words in search */ + /* or count is longer than */ + /* haystack, this is a failure */ + if (needleWords > (haystackWords - count + 1) || needleWords == 0 || count > haystackWords) + { + return IntegerZero; + } + + const char *nextHaystack; + const char *nextNeedle; + /* point at first word */ + stringsize_t haystackWordLength = nextWord(&haystack, &haystackLength, &nextHaystack); + /* now skip over count-1 */ + for (stringsize_t i = count - 1; i && haystackWordLength != 0; i--) + { + haystack = nextHaystack; /* step past current word */ + /* find the next word */ + haystackWordLength = nextWord(&haystack, &haystackLength, &nextHaystack); + } + /* get number of searches */ + stringsize_t searchCount = (haystackWords - needleWords - count) + 2; + /* position at first needle */ + stringsize_t firstNeedle = nextWord(&needle, &needleLength, &nextNeedle); + /* loop for the possible times */ + for (; searchCount; searchCount--) + { + stringsize_t needleWordLength = firstNeedle; /* set the length */ + const char *needlePosition = needle; /* get the start of phrase */ + const char *haystackPosition = haystack; /* and the target string loop */ + /* for needlewords */ + const char *nextHaystackPtr = nextHaystack; /* copy nextword information */ + const char *nextNeedlePtr = nextNeedle; + /* including the lengths */ + stringsize_t haystackScanLength = haystackLength; + stringsize_t needleScanLength = needleLength; + + stringsize_t i; + + for (i = needleWords; i; i--) + { + // length mismatch, can't be a match + + if (haystackWordLength != needleWordLength) + { + break; + } + + // now compare the two words, using a caseless comparison + // if the words don't match, terminate now + if (caselessCompare(needlePosition, haystackPosition, needleWordLength)) + { + break; /* get out fast. */ + } + + /* the last words matched, so */ + /* continue searching. */ + + /* set new search information */ + haystackPosition = nextHaystackPtr; + needlePosition = nextNeedlePtr; + /* Scan off the next word */ + haystackWordLength = nextWord(&haystackPosition, &haystackScanLength, &nextHaystackPtr); + /* repeat for the needle */ + needleWordLength = nextWord(&needlePosition, &needleScanLength, &nextNeedlePtr); + } + + if (i == 0) /* all words matched, we */ + { + return new_integer(count); // return the position + } + haystack = nextHaystack; /* set the search position */ + /* step to next haytack pos */ + haystackWordLength = nextWord(&haystack, &haystackLength, &nextHaystack); + count++; /* remember the word position */ + } + + return IntegerZero; // not found +} Modified: main/trunk/interpreter/classes/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 20:13:42 UTC (rev 3006) +++ main/trunk/interpreter/classes/StringUtil.hpp 2008-08-18 20:35:29 UTC (rev 3007) @@ -85,6 +85,8 @@ 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); + static RexxInteger *wordPos(const char *data, size_t length, RexxString *phrase, RexxInteger *pstart); + static RexxInteger *caselessWordPos(const char *data, size_t length, RexxString *phrase, RexxInteger *pstart); }; #endif Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 20:13:42 UTC (rev 3006) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 20:35:29 UTC (rev 3007) @@ -870,6 +870,8 @@ CPPM(RexxMutableBuffer::wordIndex), CPPM(RexxMutableBuffer::wordLength), CPPM(RexxMutableBuffer::words), +CPPM(RexxMutableBuffer::wordPos), +CPPM(RexxMutableBuffer::caselessWordPos), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-18 20:13:42 UTC (rev 3006) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 20:35:29 UTC (rev 3007) @@ -958,6 +958,8 @@ defineKernelMethod(CHAR_WORDINDEX ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordIndex), 1); defineKernelMethod(CHAR_WORDLENGTH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordLength), 1); defineKernelMethod(CHAR_WORDS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::words), 0); + defineKernelMethod(CHAR_WORDPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordPos), 2); + defineKernelMethod(CHAR_CASELESSWORDPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessWordPos), 2); /* 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. |
From: <bi...@us...> - 2008-08-18 21:02:56
|
Revision: 3008 http://oorexx.svn.sourceforge.net/oorexx/?rev=3008&view=rev Author: bigrixx Date: 2008-08-18 21:02:57 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 2058055 ] Add delword to mutablebuffer Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.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 20:35:29 UTC (rev 3007) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-18 21:02:57 UTC (rev 3008) @@ -1427,3 +1427,64 @@ { return StringUtil::caselessWordPos(getStringData(), getLength(), phrase, pstart); } + + +/** + * Perform a delword operation on a mutable buffer + * + * @param position The position to delete. + * @param plength The number of words to delete + * + * @return Always returns the target mutable buffer. + */ +RexxMutableBuffer *RexxMutableBuffer::delWord(RexxInteger *position, RexxInteger *plength) +{ + /* convert position to binary */ + size_t wordPos = positionArgument(position, ARG_ONE); + /* get num of words to delete, the */ + /* default is "a very large number" */ + size_t count = optionalLengthArgument(plength, MAXNUM, ARG_TWO); + + size_t length = getLength(); /* get string length */ + if (length == 0) /* null string? */ + { + return this; /* nothing to delete */ + } + if (count == 0) /* deleting zero words? */ + { + return this; /* also very easy */ + } + const char *word = getStringData(); /* point to the string */ + const char *nextSite = NULL; + /* get the first word */ + size_t wordLength = StringUtil::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 = StringUtil::nextWord(&word, &length, &nextSite); + } + if (wordPos != 0) /* run out of words first */ + { + return this; /* return the buffer unaltered */ + } + // get the deletion point as an offset + size_t deletePosition = word - this->getStringData(); + while (--count > 0 && wordLength != 0) + { /* loop until we reach tArget */ + word = nextSite; /* copy the start pointer */ + /* get the next word */ + wordLength = StringUtil::nextWord(&word, &length, &nextSite); + } + if (length != 0) /* didn't use up the string */ + { + StringUtil::skipBlanks(&nextSite, &length);/* skip over trailing blanks */ + } + + size_t gapSize = (nextSite - getStringData()) - deletePosition; + // close up the delete part + closeGap(deletePosition, gapSize, length); + // adjust for the deleted data + dataLength -= gapSize; + return this; +} Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 20:35:29 UTC (rev 3007) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-18 21:02:57 UTC (rev 3008) @@ -114,6 +114,7 @@ RexxInteger *words(); RexxInteger *wordPos(RexxString *, RexxInteger *); RexxInteger *caselessWordPos(RexxString *, RexxInteger *); + RexxMutableBuffer *delWord(RexxInteger *position, RexxInteger *plength); inline const char *getStringData() { return data->getData(); } inline size_t getLength() { return dataLength; } Modified: main/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 20:35:29 UTC (rev 3007) +++ main/trunk/interpreter/execution/CPPCode.cpp 2008-08-18 21:02:57 UTC (rev 3008) @@ -872,6 +872,7 @@ CPPM(RexxMutableBuffer::words), CPPM(RexxMutableBuffer::wordPos), CPPM(RexxMutableBuffer::caselessWordPos), +CPPM(RexxMutableBuffer::delWord), CPPM(RexxSupplier::available), /* Supplier methods */ CPPM(RexxSupplier::next), Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-18 20:35:29 UTC (rev 3007) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-18 21:02:57 UTC (rev 3008) @@ -960,6 +960,7 @@ defineKernelMethod(CHAR_WORDS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::words), 0); defineKernelMethod(CHAR_WORDPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordPos), 2); defineKernelMethod(CHAR_CASELESSWORDPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessWordPos), 2); + defineKernelMethod(CHAR_DELWORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::delWord), 2); /* 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. |
From: <bi...@us...> - 2008-08-18 21:42:59
|
Revision: 3009 http://oorexx.svn.sourceforge.net/oorexx/?rev=3009&view=rev Author: bigrixx Date: 2008-08-18 21:43:03 +0000 (Mon, 18 Aug 2008) Log Message: ----------- [ 1503291 ] Add QUALIFY BIF Modified Paths: -------------- main/trunk/interpreter/expression/BuiltinFunctions.cpp main/trunk/interpreter/parser/KeywordConstants.cpp main/trunk/interpreter/parser/Token.hpp main/trunk/interpreter/runtime/RexxConstants.hpp Modified: main/trunk/interpreter/expression/BuiltinFunctions.cpp =================================================================== --- main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-18 21:02:57 UTC (rev 3008) +++ main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-18 21:43:03 UTC (rev 3009) @@ -59,6 +59,7 @@ #include "ProtectedObject.hpp" #include "PackageManager.hpp" #include "SystemInterpreter.hpp" +#include "SysFileSystem.hpp" /* checks if pad is a single character string */ @@ -2607,6 +2608,25 @@ return SystemInterpreter::popEnvironment(context); } +#define QUALIFY_MIN 0 +#define QUALIFY_MAX 1 +#define QUALIFY_name 1 + +/** + * Qualify a stream name. + */ +BUILTIN(QUALIFY) +{ + check_args(QUALIFY); /* check on required number of args */ + RexxString *name = optional_string(QUALIFY, name); + + char qualified_name[SysFileSystem::MaximumFileNameLength]; + // qualifyStreamName will not expand if not a null string on entry. + qualified_name[0] = '\0'; + SysFileSystem::qualifyStreamName(name->getStringData(), qualified_name, sizeof(qualified_name)); + return new_string(qualified_name); +} + /* the following builtin function */ /* table must maintain the same order*/ /* as the builtin function codes used*/ @@ -2693,5 +2713,6 @@ &builtin_function_ENDLOCAL , &builtin_function_SETLOCAL , &builtin_function_QUEUEEXIT , + &builtin_function_QUALIFY , }; Modified: main/trunk/interpreter/parser/KeywordConstants.cpp =================================================================== --- main/trunk/interpreter/parser/KeywordConstants.cpp 2008-08-18 21:02:57 UTC (rev 3008) +++ main/trunk/interpreter/parser/KeywordConstants.cpp 2008-08-18 21:43:03 UTC (rev 3009) @@ -205,6 +205,7 @@ KeywordEntry(CHAR_MIN, BUILTIN_MIN), KeywordEntry(CHAR_OVERLAY, BUILTIN_OVERLAY), KeywordEntry(CHAR_POS, BUILTIN_POS), + KeywordEntry(CHAR_QUALIFY, BUILTIN_QUALIFY), KeywordEntry(CHAR_QUEUED, BUILTIN_QUEUED), KeywordEntry(CHAR_RANDOM, BUILTIN_RANDOM), KeywordEntry(CHAR_REVERSE, BUILTIN_REVERSE), @@ -285,6 +286,7 @@ KeywordEntry(CHAR_MIN, BUILTIN_MIN), KeywordEntry(CHAR_OVERLAY, BUILTIN_OVERLAY), KeywordEntry(CHAR_POS, BUILTIN_POS), + KeywordEntry(CHAR_QUALIFY, BUILTIN_QUALIFY), KeywordEntry(CHAR_QUEUED, BUILTIN_QUEUED), KeywordEntry(CHAR_RANDOM, BUILTIN_RANDOM), KeywordEntry(CHAR_REVERSE, BUILTIN_REVERSE), Modified: main/trunk/interpreter/parser/Token.hpp =================================================================== --- main/trunk/interpreter/parser/Token.hpp 2008-08-18 21:02:57 UTC (rev 3008) +++ main/trunk/interpreter/parser/Token.hpp 2008-08-18 21:43:03 UTC (rev 3009) @@ -375,6 +375,7 @@ #define BUILTIN_ENDLOCAL BUILTIN_RXFUNCQUERY + 1 #define BUILTIN_SETLOCAL BUILTIN_ENDLOCAL + 1 #define BUILTIN_QUEUEEXIT BUILTIN_SETLOCAL + 1 +#define BUILTIN_QUALIFY BUILTIN_QUEUEEXIT + 1 Modified: main/trunk/interpreter/runtime/RexxConstants.hpp =================================================================== --- main/trunk/interpreter/runtime/RexxConstants.hpp 2008-08-18 21:02:57 UTC (rev 3008) +++ main/trunk/interpreter/runtime/RexxConstants.hpp 2008-08-18 21:43:03 UTC (rev 3009) @@ -250,6 +250,7 @@ CHARCONSTANT(PUBLICCLASSES, "PUBLICCLASSES"); CHARCONSTANT(PUBLICROUTINES, "PUBLICROUTINES"); CHARCONSTANT(PUT, "PUT"); +CHARCONSTANT(QUALIFY, "QUALIFY"); CHARCONSTANT(QUEUE, "QUEUE"); CHARCONSTANT(QUEUEEXIT, "!QUEUEEXIT"); CHARCONSTANT(QUERYMIXINCLASS, "QUERYMIXINCLASS"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-19 03:42:30
|
Revision: 3014 http://oorexx.svn.sourceforge.net/oorexx/?rev=3014&view=rev Author: bigrixx Date: 2008-08-19 03:42:38 +0000 (Tue, 19 Aug 2008) Log Message: ----------- [ 1739607 ] Please add string (Last-)Pos length parameter Modified Paths: -------------- main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/MutableBufferClass.hpp main/trunk/interpreter/classes/StringClass.hpp main/trunk/interpreter/classes/StringClassMisc.cpp main/trunk/interpreter/classes/StringUtil.cpp main/trunk/interpreter/classes/StringUtil.hpp main/trunk/interpreter/expression/BuiltinFunctions.cpp main/trunk/interpreter/memory/Setup.cpp Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-19 03:19:42 UTC (rev 3013) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-19 03:42:38 UTC (rev 3014) @@ -561,9 +561,9 @@ * @return The index of the located string. Returns 0 if no matches * are found. */ -RexxInteger *RexxMutableBuffer::posRexx(RexxString *needle, RexxInteger *pstart) +RexxInteger *RexxMutableBuffer::posRexx(RexxString *needle, RexxInteger *pstart, RexxInteger *range) { - return StringUtil::posRexx(getStringData(), getLength(), needle, pstart); + return StringUtil::posRexx(getStringData(), getLength(), needle, pstart, range); } @@ -577,9 +577,9 @@ * @return The index of the located string. Returns 0 if no matches * are found. */ -RexxInteger *RexxMutableBuffer::lastPos(RexxString *needle, RexxInteger *_start) +RexxInteger *RexxMutableBuffer::lastPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range) { - return StringUtil::lastPosRexx(getStringData(), getLength(), needle, _start); + return StringUtil::lastPosRexx(getStringData(), getLength(), needle, _start, _range); } @@ -592,15 +592,16 @@ * @return The index of the located string. Returns 0 if no matches * are found. */ -RexxInteger *RexxMutableBuffer::caselessPos(RexxString *needle, RexxInteger *pstart) +RexxInteger *RexxMutableBuffer::caselessPos(RexxString *needle, RexxInteger *pstart, RexxInteger *range) { /* force needle to a string */ needle = stringArgument(needle, ARG_ONE); /* get the starting position */ size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); + size_t _range = optionalLengthArgument(range, getLength() - _start + 1, ARG_THREE); /* pass on to the primitive function */ /* and return as an integer object */ - return new_integer(StringUtil::caselessPos(getStringData(), getLength(), needle , _start - 1)); + return new_integer(StringUtil::caselessPos(getStringData(), getLength(), needle , _start - 1, _range)); } @@ -614,15 +615,16 @@ * @return The index of the located string. Returns 0 if no matches * are found. */ -RexxInteger *RexxMutableBuffer::caselessLastPos(RexxString *needle, RexxInteger *pstart) +RexxInteger *RexxMutableBuffer::caselessLastPos(RexxString *needle, RexxInteger *pstart, RexxInteger *range) { /* force needle to a string */ needle = stringArgument(needle, ARG_ONE); /* get the starting position */ size_t _start = optionalPositionArgument(pstart, getLength(), ARG_TWO); + size_t _range = optionalPositionArgument(range, getLength(), ARG_THREE); /* pass on to the primitive function */ /* and return as an integer object */ - return new_integer(StringUtil::caselessLastPos(getStringData(), getLength(), needle , _start - 1)); + return new_integer(StringUtil::caselessLastPos(getStringData(), getLength(), needle , _start - 1, _range)); } @@ -724,7 +726,7 @@ { // search for the next occurrence...which should be there because we // already know the count - size_t matchPos = StringUtil::pos(source, sourceLength, needle, _start); + size_t matchPos = StringUtil::pos(source, sourceLength, needle, _start, sourceLength); copyData(matchPos - 1, newNeedle->getStringData(), newLength); // step to the next search position _start = matchPos + newLength - 1; @@ -744,7 +746,7 @@ for (size_t i = 0; i < matches; i++) { // look for each instance and replace - size_t matchPos = StringUtil::pos(source, sourceLength, needle, _start); + size_t matchPos = StringUtil::pos(source, sourceLength, needle, _start, sourceLength); size_t copyLength = (matchPos - 1) - _start; /* get the next length to copy */ // if this skipped over characters, we need to copy those if (copyLength != 0) @@ -786,7 +788,7 @@ for (size_t i = 0; i < matches; i++) { // look for each instance and replace - size_t matchPos = StringUtil::pos(source, sourceLength, needle, _start); + size_t matchPos = StringUtil::pos(source, sourceLength, needle, _start, sourceLength); size_t copyLength = (matchPos - 1) - _start; /* get the next length to copy */ // if this skipped over characters, we need to copy those if (copyLength != 0) @@ -862,7 +864,7 @@ { // search for the next occurrence...which should be there because we // already know the count - size_t matchPos = StringUtil::caselessPos(source, sourceLength, needle, _start); + size_t matchPos = StringUtil::caselessPos(source, sourceLength, needle, _start, sourceLength); copyData(matchPos - 1, newNeedle->getStringData(), newLength); // step to the next search position _start = matchPos + newLength - 1; @@ -882,7 +884,7 @@ for (size_t i = 0; i < matches; i++) { // look for each instance and replace - size_t matchPos = StringUtil::caselessPos(source, sourceLength, needle, _start); + size_t matchPos = StringUtil::caselessPos(source, sourceLength, needle, _start, sourceLength); size_t copyLength = (matchPos - 1) - _start; /* get the next length to copy */ // if this skipped over characters, we need to copy those if (copyLength != 0) @@ -924,7 +926,7 @@ for (size_t i = 0; i < matches; i++) { // look for each instance and replace - size_t matchPos = StringUtil::caselessPos(source, sourceLength, needle, _start); + size_t matchPos = StringUtil::caselessPos(source, sourceLength, needle, _start, sourceLength); size_t copyLength = (matchPos - 1) - _start; /* get the next length to copy */ // if this skipped over characters, we need to copy those if (copyLength != 0) Modified: main/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-19 03:19:42 UTC (rev 3013) +++ main/trunk/interpreter/classes/MutableBufferClass.hpp 2008-08-19 03:42:38 UTC (rev 3014) @@ -83,10 +83,10 @@ RexxMutableBuffer *replaceAt(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad); RexxMutableBuffer *mydelete(RexxObject*, RexxObject*); RexxString *substr(RexxInteger *startPosition, RexxInteger *len, RexxString *pad); - RexxInteger *lastPos(RexxString *needle, RexxInteger *_start); - RexxInteger *posRexx(RexxString *needle, RexxInteger *_start); - RexxInteger *caselessLastPos(RexxString *needle, RexxInteger *_start); - RexxInteger *caselessPos(RexxString *needle, RexxInteger *_start); + RexxInteger *lastPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range); + RexxInteger *posRexx(RexxString *needle, RexxInteger *_start, RexxInteger *_range); + RexxInteger *caselessLastPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range); + RexxInteger *caselessPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range); RexxString *subchar(RexxInteger *startPosition); RexxInteger *getBufferSize() { return new_integer(bufferLength); } Modified: main/trunk/interpreter/classes/StringClass.hpp =================================================================== --- main/trunk/interpreter/classes/StringClass.hpp 2008-08-19 03:19:42 UTC (rev 3013) +++ main/trunk/interpreter/classes/StringClass.hpp 2008-08-19 03:42:38 UTC (rev 3014) @@ -260,14 +260,14 @@ RexxString *copies(RexxInteger *); RexxObject *dataType(RexxString *); - RexxInteger *lastPosRexx(RexxString *, RexxInteger *); - RexxInteger *caselessLastPosRexx(RexxString *, RexxInteger *); + RexxInteger *lastPosRexx(RexxString *, RexxInteger *, RexxInteger *); + RexxInteger *caselessLastPosRexx(RexxString *, RexxInteger *, RexxInteger *); size_t lastPos(RexxString *needle, size_t start); size_t caselessLastPos(RexxString *needle, size_t start); const char * caselessLastPos(const char *needle, size_t needleLen, const char *haystack, size_t haystackLen); - RexxInteger *posRexx(RexxString *, RexxInteger *); - RexxInteger *caselessPosRexx(RexxString *, RexxInteger *); + RexxInteger *posRexx(RexxString *, RexxInteger *, RexxInteger *); + RexxInteger *caselessPosRexx(RexxString *, RexxInteger *, RexxInteger *); size_t pos(RexxString *, size_t); size_t caselessPos(RexxString *, size_t); Modified: main/trunk/interpreter/classes/StringClassMisc.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-19 03:19:42 UTC (rev 3013) +++ main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-19 03:42:38 UTC (rev 3014) @@ -462,9 +462,9 @@ * @return the offset of the match position (origin 1). Returns 0 * if no match was found. */ -RexxInteger *RexxString::lastPosRexx(RexxString *needle, RexxInteger *_start) +RexxInteger *RexxString::lastPosRexx(RexxString *needle, RexxInteger *_start, RexxInteger *_range) { - return StringUtil::lastPosRexx(getStringData(), getLength(), needle, _start); + return StringUtil::lastPosRexx(getStringData(), getLength(), needle, _start, _range); } @@ -476,14 +476,15 @@ * * @return The match position. 0 means not found. */ -RexxInteger *RexxString::caselessLastPosRexx(RexxString *needle, RexxInteger *_start) +RexxInteger *RexxString::caselessLastPosRexx(RexxString *needle, RexxInteger *_start, RexxInteger *_range) { // validate that this is a good string argument needle = stringArgument(needle, ARG_ONE); // find out where to start the search. The default is at the very end. size_t startPos = optionalPositionArgument(_start, getLength(), ARG_TWO); + size_t range = optionalPositionArgument(_range, getLength(), ARG_THREE); // now perform the actual search. - return new_integer(caselessLastPos(needle, startPos)); + return new_integer(StringUtil::caselessLastPos(getStringData(), getLength(), needle, startPos, range)); } @@ -500,7 +501,7 @@ */ size_t RexxString::lastPos(RexxString *needle, size_t _start) { - return StringUtil::lastPos(getStringData(), getLength(), needle, _start); + return StringUtil::lastPos(getStringData(), getLength(), needle, _start, getLength()); } @@ -517,7 +518,7 @@ */ size_t RexxString::caselessLastPos(RexxString *needle, size_t _start) { - return StringUtil::caselessLastPos(getStringData(), getLength(), needle, _start); + return StringUtil::caselessLastPos(getStringData(), getLength(), needle, _start, getLength()); } RexxInteger *RexxString::countStrRexx(RexxString *needle) @@ -678,31 +679,34 @@ } -RexxInteger *RexxString::posRexx( - RexxString *needle, /* search string */ - RexxInteger *pstart) /* starting position */ +RexxInteger *RexxString::posRexx(RexxString *needle, RexxInteger *pstart, RexxInteger *range) /******************************************************************************/ /* Function: String class POS method/function */ /******************************************************************************/ { - return StringUtil::posRexx(getStringData(), getLength(), needle, pstart); + return StringUtil::posRexx(getStringData(), getLength(), needle, pstart, range); } -RexxInteger *RexxString::caselessPosRexx( - RexxString *needle, /* search string */ - RexxInteger *pstart) /* starting position */ -/******************************************************************************/ -/* Function: String class POS method/function */ -/******************************************************************************/ +/** + * Do a caseless search for one string in another. + * + * @param needle The search string. + * @param pstart The starting position for the search. + * @param range A maximum range for the search. + * + * @return The index of any match position, or 0 if not found. + */ +RexxInteger *RexxString::caselessPosRexx(RexxString *needle, RexxInteger *pstart, RexxInteger *range) { /* force needle to a string */ needle = stringArgument(needle, ARG_ONE); /* get the starting position */ size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); + size_t _range = optionalLengthArgument(range, getLength() - _start + 1, ARG_THREE); /* pass on to the primitive function */ /* and return as an integer object */ - return new_integer(StringUtil::caselessPos(getStringData(), getLength(), needle , _start - 1)); + return new_integer(StringUtil::caselessPos(getStringData(), getLength(), needle , _start - 1, _range)); } @@ -716,7 +720,7 @@ */ size_t RexxString::pos(RexxString *needle, size_t _start) { - return StringUtil::pos(getStringData(), getLength(), needle, _start); + return StringUtil::pos(getStringData(), getLength(), needle, _start, getLength()); } @@ -730,7 +734,7 @@ */ size_t RexxString::caselessPos(RexxString *needle, size_t _start) { - return StringUtil::caselessPos(getStringData(), getLength(), needle, _start); + return StringUtil::caselessPos(getStringData(), getLength(), needle, _start, getLength()); } Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-19 03:19:42 UTC (rev 3013) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-19 03:42:38 UTC (rev 3014) @@ -127,15 +127,16 @@ * * @return An integer object giving the located position. */ -RexxInteger *StringUtil::posRexx(const char *stringData, size_t length, RexxString *needle, RexxInteger *pstart) +RexxInteger *StringUtil::posRexx(const char *stringData, size_t length, RexxString *needle, RexxInteger *pstart, RexxInteger *range) { /* force needle to a string */ needle = stringArgument(needle, ARG_ONE); /* get the starting position */ size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); + size_t _range = optionalLengthArgument(range, length - _start + 1, ARG_THREE); /* pass on to the primitive function */ /* and return as an integer object */ - return new_integer(pos(stringData, length, needle, _start - 1)); + return new_integer(pos(stringData, length, needle, _start - 1, _range)); } @@ -150,16 +151,18 @@ * * @return The offset of the located needle, or 0 if the needle doesn't exist. */ -size_t StringUtil::pos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start) +size_t StringUtil::pos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start, size_t _range) { // get the two working lengths size_t needle_length = needle->getLength(); + // make sure the range is capped + _range = Numerics::minVal(_range, haystack_length - _start + 1); // ok, there are a few quick checks we can perform. If the needle is // bigger than the haystack, or the needle is a null string or // our haystack length after adjusting to the starting position // zero, then we can quickly return zero. - if (needle_length > haystack_length + _start || needle_length == 0 || _start + needle_length > haystack_length) + if (_start > haystack_length || needle_length > _range || needle_length == 0) { return 0; } @@ -169,7 +172,7 @@ const char *needlepointer = needle->getStringData(); size_t location = _start + 1; // this is the match location as an index // calculate the number of probes we can make in this string - size_t count = (haystack_length - _start) - needle_length + 1; + size_t count = _range - needle_length + 1; // now scan while (count--) @@ -198,16 +201,18 @@ * * @return The offset of the located needle, or 0 if the needle doesn't exist. */ -size_t StringUtil::caselessPos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start) +size_t StringUtil::caselessPos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start, size_t _range) { // get the two working lengths size_t needle_length = needle->getLength(); + // make sure the range is capped + _range = Numerics::minVal(_range, haystack_length - _start + 1); // ok, there are a few quick checks we can perform. If the needle is // bigger than the haystack, or the needle is a null string or // our haystack length after adjusting to the starting position // zero, then we can quickly return zero. - if (needle_length > haystack_length + _start || needle_length == 0 || _start + needle_length > haystack_length) + if (_start > haystack_length || needle_length > _range || needle_length == 0) { return 0; } @@ -217,7 +222,7 @@ const char *needlepointer = needle->getStringData(); size_t location = _start + 1; // this is the match location as an index // calculate the number of probes we can make in this string - size_t count = (haystack_length - _start) - needle_length + 1; + size_t count = _range - needle_length + 1; // now scan while (count--) @@ -246,13 +251,14 @@ * * @return An integer object giving the located position. */ -RexxInteger *StringUtil::lastPosRexx(const char *stringData, size_t haystackLen, RexxString *needle, RexxInteger *_start) +RexxInteger *StringUtil::lastPosRexx(const char *stringData, size_t haystackLen, RexxString *needle, RexxInteger *_start, RexxInteger *_range) { needle = stringArgument(needle, ARG_ONE); // find out where to start the search. The default is at the very end. size_t startPos = optionalPositionArgument(_start, haystackLen, ARG_TWO); + size_t range = optionalPositionArgument(_range, haystackLen, ARG_THREE); // now perform the actual search. - return new_integer(lastPos(stringData, haystackLen, needle, startPos)); + return new_integer(lastPos(stringData, haystackLen, needle, startPos, range)); } @@ -267,12 +273,12 @@ * * @return The offset of the located needle, or 0 if the needle doesn't exist. */ -size_t StringUtil::lastPos(const char *stringData, size_t haystackLen, RexxString *needle, size_t _start) +size_t StringUtil::lastPos(const char *stringData, size_t haystackLen, RexxString *needle, size_t _start, size_t range) { size_t needleLen = needle->getLength(); /* and get the length too */ // no match possible if either string is null - if (needleLen == 0 || haystackLen == 0) + if (needleLen == 0 || haystackLen == 0 || needleLen > range) { return 0; } @@ -280,8 +286,11 @@ { // get the start position for the search. haystackLen = Numerics::minVal(_start, haystackLen); + range = Numerics::minVal(range, haystackLen); + // adjust the starting point + const char *startPoint = stringData + haystackLen - range; /* do the search */ - const char *matchLocation = lastPos(needle->getStringData(), needleLen, stringData, haystackLen); + const char *matchLocation = lastPos(needle->getStringData(), needleLen, startPoint, haystackLen); if (matchLocation == NULL) { return 0; @@ -346,12 +355,12 @@ * * @return The offset of the located needle, or 0 if the needle doesn't exist. */ -size_t StringUtil::caselessLastPos(const char *stringData, size_t haystackLen, RexxString *needle, size_t _start) +size_t StringUtil::caselessLastPos(const char *stringData, size_t haystackLen, RexxString *needle, size_t _start, size_t range) { size_t needleLen = needle->getLength(); /* and get the length too */ // no match possible if either string is null - if (needleLen == 0 || haystackLen == 0) + if (needleLen == 0 || haystackLen == 0 || needleLen > range) { return 0; } @@ -359,8 +368,11 @@ { // get the start position for the search. haystackLen = Numerics::minVal(_start, haystackLen); + range = Numerics::minVal(range, haystackLen); + // adjust the starting point + const char *startPoint = stringData + haystackLen - range; /* do the search */ - const char *matchLocation = caselessLastPos(needle->getStringData(), needleLen, stringData, haystackLen); + const char *matchLocation = caselessLastPos(needle->getStringData(), needleLen, startPoint, haystackLen); if (matchLocation == NULL) { return 0; @@ -1292,12 +1304,12 @@ { size_t count = 0; /* no matches yet */ /* get the first match position */ - size_t matchPos = pos(hayStack, hayStackLength, needle, 0); + size_t matchPos = pos(hayStack, hayStackLength, needle, 0, hayStackLength); while (matchPos != 0) { count = count + 1; /* count this match */ // step to the new position and search - matchPos = pos(hayStack, hayStackLength, needle, matchPos + needle->getLength() - 1); + matchPos = pos(hayStack, hayStackLength, needle, matchPos + needle->getLength() - 1, hayStackLength); } return count; /* return the match count */ } @@ -1317,12 +1329,12 @@ { size_t count = 0; /* no matches yet */ /* get the first match position */ - size_t matchPos = caselessPos(hayStack, hayStackLength, needle, 0); + size_t matchPos = caselessPos(hayStack, hayStackLength, needle, 0, hayStackLength); while (matchPos != 0) { count = count + 1; /* count this match */ // step to the new position and search - matchPos = caselessPos(hayStack, hayStackLength, needle, matchPos + needle->getLength() - 1); + matchPos = caselessPos(hayStack, hayStackLength, needle, matchPos + needle->getLength() - 1, hayStackLength); } return count; /* return the match count */ } Modified: main/trunk/interpreter/classes/StringUtil.hpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.hpp 2008-08-19 03:19:42 UTC (rev 3013) +++ main/trunk/interpreter/classes/StringUtil.hpp 2008-08-19 03:42:38 UTC (rev 3014) @@ -51,15 +51,15 @@ { public: static RexxString *substr(const char *, size_t, RexxInteger *, RexxInteger *, RexxString *); - static RexxInteger *posRexx(const char *stringData, size_t length, RexxString *needle, RexxInteger *pstart); - static size_t pos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start); - static size_t caselessPos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start); - static RexxInteger *lastPosRexx(const char *stringData, size_t haystackLen, RexxString *needle, RexxInteger *_start); - static size_t lastPos(const char *stringData, size_t hastackLen, RexxString *needle, size_t _start); + static RexxInteger *posRexx(const char *stringData, size_t length, RexxString *needle, RexxInteger *pstart, RexxInteger *range); + static size_t pos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start, size_t _range); + static size_t caselessPos(const char *stringData, size_t haystack_length, RexxString *needle, size_t _start, size_t _range); + static RexxInteger *lastPosRexx(const char *stringData, size_t haystackLen, RexxString *needle, RexxInteger *_start, RexxInteger *_range); + static size_t lastPos(const char *stringData, size_t hastackLen, RexxString *needle, size_t _start, size_t _range); static const char *lastPos(const char *needle, size_t needleLen, const char *haystack, size_t haystackLen); static RexxString *subchar(const char *stringData, size_t stringLength, RexxInteger *positionArg); static RexxArray *makearray(const char *start, size_t length, RexxString *separator); - static size_t caselessLastPos(const char *stringData, size_t hastackLen, RexxString *needle, size_t _start); + static size_t caselessLastPos(const char *stringData, size_t hastackLen, RexxString *needle, size_t _start, size_t range); static const char * caselessLastPos(const char *needle, size_t needleLen, const char *haystack, size_t haystackLen); static int caselessCompare(const char *, const char *, size_t); static int hexDigitToInt(char ch); Modified: main/trunk/interpreter/expression/BuiltinFunctions.cpp =================================================================== --- main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-19 03:19:42 UTC (rev 3013) +++ main/trunk/interpreter/expression/BuiltinFunctions.cpp 2008-08-19 03:42:38 UTC (rev 3014) @@ -212,10 +212,11 @@ } #define POS_MIN 2 -#define POS_MAX 3 +#define POS_MAX 4 #define POS_needle 1 #define POS_haystack 2 #define POS_start 3 +#define POS_range 4 BUILTIN(POS) { @@ -225,8 +226,9 @@ /* get string for target */ RexxString *haystack = required_string(POS, haystack); RexxInteger *start = optional_integer(POS, start);/* start position is optional */ + RexxInteger *range = optional_integer(POS, range); /* go perform the pos function */ - return haystack->posRexx(needle, start); + return haystack->posRexx(needle, start, range); } #define LASTPOS_MIN 2 @@ -234,6 +236,7 @@ #define LASTPOS_needle 1 #define LASTPOS_haystack 2 #define LASTPOS_start 3 +#define LASTPOS_range 4 BUILTIN(LASTPOS) { @@ -244,8 +247,9 @@ RexxString *haystack = required_string(LASTPOS, haystack); /* start position is optional */ RexxInteger *start = optional_integer(LASTPOS, start); + RexxInteger *range = optional_integer(LASTPOS, range); /* go perform the lastpos function */ - return haystack->lastPosRexx(needle, start); + return haystack->lastPosRexx(needle, start, range); } #define REVERSE_MIN 1 Modified: main/trunk/interpreter/memory/Setup.cpp =================================================================== --- main/trunk/interpreter/memory/Setup.cpp 2008-08-19 03:19:42 UTC (rev 3013) +++ main/trunk/interpreter/memory/Setup.cpp 2008-08-19 03:42:38 UTC (rev 3014) @@ -837,10 +837,10 @@ defineKernelMethod(CHAR_COPIES ,TheStringBehaviour, CPPM(RexxString::copies), 1); defineKernelMethod(CHAR_COUNTSTR ,TheStringBehaviour, CPPM(RexxString::countStrRexx), 1); defineKernelMethod(CHAR_CASELESSCOUNTSTR ,TheStringBehaviour, CPPM(RexxString::caselessCountStrRexx), 1); - defineKernelMethod(CHAR_LASTPOS ,TheStringBehaviour, CPPM(RexxString::lastPosRexx), 2); - defineKernelMethod(CHAR_POS ,TheStringBehaviour, CPPM(RexxString::posRexx), 2); - defineKernelMethod(CHAR_CASELESSLASTPOS ,TheStringBehaviour, CPPM(RexxString::caselessLastPosRexx), 2); - defineKernelMethod(CHAR_CASELESSPOS ,TheStringBehaviour, CPPM(RexxString::caselessPosRexx), 2); + defineKernelMethod(CHAR_LASTPOS ,TheStringBehaviour, CPPM(RexxString::lastPosRexx), 3); + defineKernelMethod(CHAR_POS ,TheStringBehaviour, CPPM(RexxString::posRexx), 3); + defineKernelMethod(CHAR_CASELESSLASTPOS ,TheStringBehaviour, CPPM(RexxString::caselessLastPosRexx), 3); + defineKernelMethod(CHAR_CASELESSPOS ,TheStringBehaviour, CPPM(RexxString::caselessPosRexx), 3); defineKernelMethod(CHAR_TRANSLATE ,TheStringBehaviour, CPPM(RexxString::translate), 5); defineKernelMethod(CHAR_VERIFY ,TheStringBehaviour, CPPM(RexxString::verify), 4); defineKernelMethod(CHAR_BITAND ,TheStringBehaviour, CPPM(RexxString::bitAnd), 2); @@ -930,10 +930,10 @@ defineKernelMethod(CHAR_REPLACEAT ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::replaceAt), 4); defineKernelMethod(CHAR_DELETE ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::mydelete), 2); defineKernelMethod(CHAR_SUBSTR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::substr), 3); - defineKernelMethod(CHAR_POS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::posRexx), 2); - defineKernelMethod(CHAR_LASTPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lastPos), 2); - defineKernelMethod(CHAR_CASELESSPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessPos), 2); - defineKernelMethod(CHAR_CASELESSLASTPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessLastPos), 2); + defineKernelMethod(CHAR_POS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::posRexx), 3); + defineKernelMethod(CHAR_LASTPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::lastPos), 3); + defineKernelMethod(CHAR_CASELESSPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessPos), 3); + defineKernelMethod(CHAR_CASELESSLASTPOS ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessLastPos), 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); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-28 14:51:26
|
Revision: 3100 http://oorexx.svn.sourceforge.net/oorexx/?rev=3100&view=rev Author: bigrixx Date: 2008-08-28 14:51:36 +0000 (Thu, 28 Aug 2008) Log Message: ----------- Add some more descriptor files Modified Paths: -------------- main/trunk/interpreter/files.html Added Paths: ----------- main/trunk/interpreter/concurrency/files.html main/trunk/interpreter/execution/files.html main/trunk/interpreter/expression/files.html main/trunk/interpreter/instructions/files.html Added: main/trunk/interpreter/concurrency/files.html =================================================================== --- main/trunk/interpreter/concurrency/files.html (rev 0) +++ main/trunk/interpreter/concurrency/files.html 2008-08-28 14:51:36 UTC (rev 3100) @@ -0,0 +1,39 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter Concurrency Source Files</h1> + + <p>This directory contains files used to implement the underlying ooRexx + thread management. Many of the classes here a just supporting role + players used for initiating calls into the interpreter or callouts from + the interpreter. + </p> + + <p>The following is a partial list of the files to be found in this subdirectory.</p> + + <dl> + <dt><b>ActivityManager.*</b></dt> + <dd>The master subsystem form managing threading issues. ooRexx uses a + cooperative threading model, with only a single thread capable of + running interpreter code at one time. The ActivityManager handles the + thread synchronization, scheduling, and dispatching needed to implement + the multi-threaded behavior. + </dd> + <dt><b>RexxActivity.*</b></dt> + <dd>A RexxActivity instance represents a thread of execution inside of an + interpreter instance. Each active thread that the interpreter knows + about will have a RexxActivity object allocated for it. The + RexxActivity manages the execution stack and also performs some memory + management functions on behalf of the memory subsystem. + </dd> + </dl> + +</body> +</html> Added: main/trunk/interpreter/execution/files.html =================================================================== --- main/trunk/interpreter/execution/files.html (rev 0) +++ main/trunk/interpreter/execution/files.html 2008-08-28 14:51:36 UTC (rev 3100) @@ -0,0 +1,72 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter Execution Source Files</h1> + + <p>This directory contains files used to implement the underlying ooRexx + execution model. This includes elements of the call stack, ooRexx + variable management, and various code objects that implement + method/routine calls. + </p> + + <p>The following is a partial list of the files to be found in this subdirectory.</p> + + <dl> + <dt><b>RexxActivation.*</b></dt> + <dd>RexxActivation represents a single stack frame context for running + ooRexx code. The activation is the context in which ooRexx code + executes, holding the ooRexx variables, current settings (digits, + trace, etc.), as well as managing all of the source code functions. + </dd> + <dt><b>RexxNativeActivation.*</b></dt> + <dd>RexxNativeActivation represents a native code stack frame. There will + be a RexxNativeActivation at the base of every RexxActivity call stack, + and additional native activations will be created for every call out to + library method or routine code. The native activation acts as the + context used by the different context APIs to retrieve current + execution information. The native activation is also responsible for + releasing exclusive interpreter access before callouts are made and + then reacquiring access upon return. + </dd> + <dt><b>RexxCode.*</b></dt> + <dd>RexxCode manages a single routine or method written in ooRexx code. + </dd> + <dt><b>CppCode.*</b></dt> + <dd>CppCode manages a methods written as native C++ methods. This handles + the transition from ooRexx method invocations into the backing C++ + method. + </dd> + <dt><b>NativeCode.*</b></dt> + <dd>NativeCode manages methods and routines written as external library + code. The native code classes work with RexxNativeActivation to + orchestrate library callouts. + </dd> + <dt><b>RexxActivationStack.*</b></dt> + <dd>RexxActivationStack manages the execution stack for running ooRexx + code. All operators, functions, etc. push intermediate results on to + the activation stack for the current running ooRexx context. + </dd> + <dt><b>RexxLocalVariables.*</b></dt> + <dd>RexxLocalVariables manages the the local variable pool for an active + RexxActivation instance. + </dd> + <dt><b>RexxVariableDictionary.*</b></dt> + <dd>RexxVariableDictionary implments a searchable dictionary of variables. + This class is also used by RexxObject to hold the object variables of + an object instance. + </dd> + <dt><b>RexxVariable.*</b></dt> + <dd>RexxVariable represents a single instance of an ooRexx variable. + </dd> + </dl> + +</body> +</html> + Added: main/trunk/interpreter/expression/files.html =================================================================== --- main/trunk/interpreter/expression/files.html (rev 0) +++ main/trunk/interpreter/expression/files.html 2008-08-28 14:51:36 UTC (rev 3100) @@ -0,0 +1,57 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter Expression Source Files</h1> + + <p>This directory contains files for different entities that are expression + execution elements. That is, each of the term types that can appear in an + ooRexx expression are represented here. Also included are the + implementations of the individual builtin functions. + </p> + + <p>The following is a partial list of the files to be found in this subdirectory.</p> + + <dl> + <dt><b>BuiltinFunction.*</b></dt> + <dd>The implementations of the builtin functions. Many of the builtins + are just stubs around the string methods. + </dd> + <dt><b>CommonExternalFunctions.cpp</b></dt> + <dd>Extension functions implemented as native library code. These are the + functions that are common to all platforms (RxFuncAdd, etc.). + </dd> + <dt><b>ExpressionStack.*</b></dt> + <dd>Implements the activation expression stack.</dd> + <dt><b>ExpressionVariable.*</b></dt> + <dd>Implements expression variable terms.</dd> + <dt><b>ExpressionStem.*</b></dt> + <dd>Implements expression stem variable terms.</dd> + <dt><b>ExpressionStem.*</b></dt> + <dd>Implements expression stem variable terms.</dd> + <dt><b>ExpressionCompoundVariable.*</b></dt> + <dd>Implements expression compound variable terms.</dd> + <dt><b>ExpressionDotVariable.*</b></dt> + <dd>Implements expression dot variable terms.</dd> + <dt><b>IndirectVariableReference.*</b></dt> + <dd>Implements indirect variable references for things like + PROCEDURE EXPOSE.</dd> + <dt><b>ExpressionOperator.*</b></dt> + <dd>Implements expression operator invocation.</dd> + <dt><b>ExpressionLogicalOperator.*</b></dt> + <dd>Implements expression logical list operator invocation.</dd> + <dt><b>ExpressionFunction.*</b></dt> + <dd>Implements expression function calls.</dd> + <dt><b>ExpressionMessage.*</b></dt> + <dd>Implements expression message invocations.</dd> + </dl> + +</body> +</html> + Modified: main/trunk/interpreter/files.html =================================================================== --- main/trunk/interpreter/files.html 2008-08-28 14:03:14 UTC (rev 3099) +++ main/trunk/interpreter/files.html 2008-08-28 14:51:36 UTC (rev 3100) @@ -36,17 +36,23 @@ classes visible to ooRexx programs.</td> </tr> <tr> - <td valign="top"><a href="./execution">execution</a></td> + <td valign="top"><a + href="./concurrency/files.html">concurrency</a></td> + <td valign="top">Interpreter synchronization and threading support.</td> + </tr> + <tr> + <td valign="top"><a href="./execution/files.html">execution</a></td> <td valign="top">Classes used to manage the execution state of running ooRexx code. This includes call contexts, variable management, etc.</td> </tr> <tr> - <td valign="top"><a href="expression">expression</a></td> + <td valign="top"><a href="expression/files.html">expression</a></td> <td valign="top">Runtime support for different categories of expression terms (operators, method calls, functions, variables, etc.)</td> </tr> <tr> - <td valign="top"><a href="./instructions">instructions</a></td> + <td valign="top"><a + href="./instructions/files.html">instructions</a></td> <td valign="top">The implementations of the ooRexx keyword instructions and directives.</td> </tr> Added: main/trunk/interpreter/instructions/files.html =================================================================== --- main/trunk/interpreter/instructions/files.html (rev 0) +++ main/trunk/interpreter/instructions/files.html 2008-08-28 14:51:36 UTC (rev 3100) @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter Instruction Source Files</h1> + + <p>This directory contains files that implement each of the ooRexx keyword + instructions. Generally, there will be a single set of source for each + implemented instruction. For example, to find the code that implements + SAY, look in the SayInstruction.cpp and SayInstruction.hpp source files. + Also contained in here are classes for implementing some of the directives + instructions and a few support classes for some of the instructions. Note + that for the most part, these classes handle on execution-time details of + the instructions. Source code translation is managed in the parser + component. + </p> + + <p>The following is a partial list of the files to be found in this + subdirectory. Not all of the files are listed here as intent is + generally apparent from the name (e.g., SayInstruction is the SAY + instruction).</p> + + <dl> + <dt><b>RexxInstruction.*</b></dt> + <dd>The implementations the base class for all ooRexx instructions. Each + of the indidual instruction classes are subclass of RexxInstruction. + </dd> + <dt><b>RexxDirective.hpp</b></dt> + <dd>Defines a base class for directive instructions. All directive + implementations will subclass RexxDirective. + </dd> + <dt><b>DoBlock.*</b></dt> + <dd>Runtime information about an active DO block.</dd> + <dt><b>EndIf.*</b></dt> + <dd>A synthetic instruction representing the end of an IF construct. + This is used to manage jumping to the end of conditions.</dd> + <dt><b>ParseTrigger.*</b></dt> + <dd>A parse instruction expresses the parse template as a list of trigger + elements that are processed at runtime. There will be a single + ParseTrigger value for each parsing trigger in the template.</dd> + <dt><b>ParseTarget.*</b></dt> + <dd>Manages the runtime state of an active parse instruction. This + manages the data to be parsed and all of the internal pointers used + during parsing..</dd> + </dl> + +</body> +</html> + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-28 18:16:27
|
Revision: 3102 http://oorexx.svn.sourceforge.net/oorexx/?rev=3102&view=rev Author: bigrixx Date: 2008-08-28 18:16:37 +0000 (Thu, 28 Aug 2008) Log Message: ----------- Add some more descriptor files, also delete some long obsolete message files Modified Paths: -------------- main/trunk/interpreter/files.html Added Paths: ----------- main/trunk/interpreter/memory/files.html main/trunk/interpreter/messages/files.html main/trunk/interpreter/package/files.html Removed Paths: ------------- main/trunk/interpreter/messages/RexxErrorCodes.tpl main/trunk/interpreter/messages/RexxMessageNumbers.tpl main/trunk/interpreter/messages/RexxMessageTable.tpl main/trunk/interpreter/messages/rexxmsg.src Modified: main/trunk/interpreter/files.html =================================================================== --- main/trunk/interpreter/files.html 2008-08-28 17:24:08 UTC (rev 3101) +++ main/trunk/interpreter/files.html 2008-08-28 18:16:37 UTC (rev 3102) @@ -57,19 +57,19 @@ directives.</td> </tr> <tr> - <td valign="top"><a href="./memory">memory</a></td> + <td valign="top"><a href="./memory/files.html">memory</a></td> <td valign="top">The ooRexx garbage collector and memory manager. The memory management functions include the initial image bootstrap processing.</td> </tr> <tr> - <td valign="top"><a href="./messages">messages</a></td> + <td valign="top"><a href="./messages/files.html">messages</a></td> <td valign="top">Platform-independent error message files. The error message files are generated from a single source XML file using XSLT transforms.</td> </tr> <tr> - <td valign="top"><a href="./package">package</a></td> + <td valign="top"><a href="./package/files.html">package</a></td> <td valign="top">Source files for package/external library management subsystem.</td> </tr> @@ -87,6 +87,30 @@ contained in a subdirectory of platform. </td> </tr> + <tr> + <td valign="top"><a href="./RexxClasses">RexxClasses</a></td> + <td valign="top">The portion of the interpreter core that is + implemented on ooRexx code. These files are loaded during the + rexximage build step, and are saved in ready-to-use form inside the + generated rexx.img file. + </td> + </tr> + <tr> + <td valign="top"><a href="./runtime">runtime</a></td> + <td valign="top">Core interpreter runtime support. This is the portion + of code that defines the core interpreter and manages active + interpreter instances. This is also where many of the core + interpreter data areas and constant definitions are located. + </td> + </tr> + <tr> + <td valign="top"><a href="./streamlibrary">streamlibrary</a></td> + <td valign="top">The native methods that implement the .Stream class. + These are implemented as external library methods so that + interpreter I/O does not block multi-threaded execution while + reading/writing. + </td> + </tr> </table> Added: main/trunk/interpreter/memory/files.html =================================================================== --- main/trunk/interpreter/memory/files.html (rev 0) +++ main/trunk/interpreter/memory/files.html 2008-08-28 18:16:37 UTC (rev 3102) @@ -0,0 +1,57 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter Memory Source Files</h1> + + <p>This directory contains the ooRexx memory manager and garbage collector. + Also included here is the code that manages building, saving, and + restoring of the initial rexx.img file and also support for saving + translated ooRexx program files (aka, "compiled"). + </p> + + <p>The following is a partial list of the files to be found in this subdirectory.</p> + + <dl> + <dt><b>RexxMemory.*</b></dt> + <dd>This the main memory manager/garbage collector. + </dd> + <dt><b>Setup.cpp</b></dt> + <dd>Portion of the RexxMemory class responsible for building the intial + ooRexx rexx.img file. This is responsible for hand constructing the + initial set of ooRexx classes. + </dd> + <dt><b>MemorySegment.*</b></dt> + <dd>Object classes for managing each of the segments of memory requested + by RexxMemory. + <dt><b>DeadObject.*</b></dt> + <dd>A class for defining a block of memory existing in the free memory + chains. + </dd> + <dt><b>RexxInternalStack.*</b></dt> + <dd>A highly tuned stack that used for the memory hold object stack and + also for the mark stack during the garbage collection operations. + </dd> + <dt><b>ProtectedObject.*</b></dt> + <dd>A class for implementing the type-accurate support. Protected object + is used to protect object instances that are not anchored within other + objects that are part of the root set. ProtectedObject will ensure + these objects to not get garbage collected unexpectedly. + </dd> + <dt><b>RexxEnvelope.*</b></dt> + <dd>Support for serializing an ooRexx reference graph into a file. + </dd> + <dt><b>RexxSmartBuffer.*</b></dt> + <dd>An intelligent buffer class that can expand its size as necessary. + </dd> + </dl> + +</body> +</html> + Deleted: main/trunk/interpreter/messages/RexxErrorCodes.tpl =================================================================== --- main/trunk/interpreter/messages/RexxErrorCodes.tpl 2008-08-28 17:24:08 UTC (rev 3101) +++ main/trunk/interpreter/messages/RexxErrorCodes.tpl 2008-08-28 18:16:37 UTC (rev 3102) @@ -1,57 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ -/******************************************************************************/ -/* REXX Support */ -/* */ -/* Definition of Rexx error conditions */ -/* */ -/******************************************************************************/ - -#ifndef RexxErrorCodes_INCLUDED -#define RexxErrorCodes_INCLUDED - /* NULL to denote end of the table */ -#define Table_end_msg NULL - -/* error subcodes and message numbers */ -/* message identifier ----------------------------------- message number */ - -#imbed <<<<< TEMPLATE first and second part >>>>>>> - -#endif - - Deleted: main/trunk/interpreter/messages/RexxMessageNumbers.tpl =================================================================== --- main/trunk/interpreter/messages/RexxMessageNumbers.tpl 2008-08-28 17:24:08 UTC (rev 3101) +++ main/trunk/interpreter/messages/RexxMessageNumbers.tpl 2008-08-28 18:16:37 UTC (rev 3102) @@ -1,65 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ -/******************************************************************************/ -/* REXX Support */ -/* */ -/* */ -/* Error subcodes */ -/* */ -/* Note: The base codes are defined in document ANSI X3.274-1996 */ -/* ANS for Information Technology - Programming Language REXX */ -/* */ -/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ -/* -- FILE WAS GENERATED BY genrxmsg -- */ -/******************************************************************************/ - -#ifndef RexxMessageNumbers_INCLUDED -#define RexxMessageNumbers_INCLUDED - -/* Reserved for ansi, not used by OREXX. 0001 */ -/* Reserved for ansi, not used by OREXX. 0002 */ -/* Reserved for ansi, not used by OREXX. 0003 */ - -/* Reserved for ansi, not used by OREXX. 2000 */ -/* Reserved for ansi, not used by OREXX. 2001 */ - -#imbed <<<<< TEMPLATE first and second part >>>>>>> - -#endif - - Deleted: main/trunk/interpreter/messages/RexxMessageTable.tpl =================================================================== --- main/trunk/interpreter/messages/RexxMessageTable.tpl 2008-08-28 17:24:08 UTC (rev 3101) +++ main/trunk/interpreter/messages/RexxMessageTable.tpl 2008-08-28 18:16:37 UTC (rev 3102) @@ -1,57 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ -/******************************************************************************/ -/* REXX Kernel okerrtxt.h */ -/* */ -/* Create table of mappings between Rexx errors and error messages */ -/* */ -/******************************************************************************/ - -#ifdef ERROR_TABLE - -#define Table_end 0 /* constant to mark end of table */ - -ERROR_MESSAGE Message_table[] = { /* table of major and minor errors */ - -#imbed <<<<< TEMPLATE first and second part >>>>>>> - -MAJOR(Table_end) /* make sure table is ended */ -}; -#endif - - Added: main/trunk/interpreter/messages/files.html =================================================================== --- main/trunk/interpreter/messages/files.html (rev 0) +++ main/trunk/interpreter/messages/files.html 2008-08-28 18:16:37 UTC (rev 3102) @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<title>Open Object Rexx - Interpreter Source Files</title> <meta +http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +</head> +<body> + + <h1>Open Object Rexx - Files</h1> + + <h1>Interpreter Message Source Files</h1> + + <p>This directory contains the ooRexx error message files. The ooRexx error + messages are contained in a master xml file, and the header files, + platform-specific message files, and documentation are generated using + XSLT transforms. + </p> + + <p>The following is a partial list of the files to be found in this subdirectory.</p> + + <dl> + <dt><b>rexxmsg.xml.*</b></dt> + <dd>This is the master error message files. All new errors are defined in + here, and then the build process uses Xalan to generate any headers or + message files necessary to build the interpreter. The generated files + are checked into SVN after an update. + </dd> + <dt><b>RexxErrorCodes.*</b></dt> + <dd>This is the header file that defines the symbolic error codes used for + raising ooRexx error conditions. + </dd> + <dt><b>RexxMessageNumbers.*</b></dt> + <dd>This is the header that creates symbolic error message numbers for + each of the ooRexx independent error conditions. When adding new error + message numbers to rexxmsg.xsl, looking in this header file will let + you know the next available message number to use. + </dd> + <dt><b>RexxMessageTable.*</b></dt> + <dd>This is the header that defines a mapping from the ooRexx portable + error condition numbers to the corresponding error message number. + </dd> + </dl> + +</body> +</html> + Deleted: main/trunk/interpreter/messages/rexxmsg.src =================================================================== --- main/trunk/interpreter/messages/rexxmsg.src 2008-08-28 17:24:08 UTC (rev 3101) +++ main/trunk/interpreter/messages/rexxmsg.src 2008-08-28 18:16:37 UTC (rev 3102) @@ -1,5612 +0,0 @@ -$---------------------------------------------------------------------------- -$ -$ Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. -$ Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. -$ -$ This program and the accompanying materials are made available under -$ the terms of the Common Public License v1.0 which accompanies this -$ distribution. A copy is also available at the following address: -$ http://www.oorexx.org/license.html -$ -$ Redistribution and use in source and binary forms, with or -$ without modification, are permitted provided that the following -$ conditions are met: -$ -$ Redistributions of source code must retain the above copyright -$ notice, this list of conditions and the following disclaimer. -$ Redistributions in binary form must reproduce the above copyright -$ notice, this list of conditions and the following disclaimer in -$ the documentation and/or other materials provided with the distribution. -$ -$ Neither the name of Rexx Language Association nor the names -$ of its contributors may be used to endorse or promote products -$ derived from this software without specific prior written permission. -$ -$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -$ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -$ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -$ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -$ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -$ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -$ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -$ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -$ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -$ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -$ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -$ -$---------------------------------------------------------------------------- -$-----------------------------------------------------------------------------*/ -$ FILE NAME...: rexxmsg.src | -$ DESCRIPTION.: Error messages for Object REXX for OS2/WIN/LINUX/AIX | -$ MODULE TYPE : Message catalogue | -$ | -$ | -$ - IBM OBJECT REXX FOR AIX - | -$ | -$ STATUS......: Version 1, Release 2, Modification level 0, Fix level 0 | -$ | -$ NOTES.......: msgp: KREX for Kernel REXx message | -$ msgp: AREX for Api REXx message | -$ msgp: XREX for NO REXx message in Messages and Codes | -$ msgp: SREX for SOM REXx message | -$ msgp: OREX for OSA REXx message | -$ | -$ | -$ Revision....: 1.0 Workfile: /CMVC/kernel.rexxmsg.src | -$ | -$ Date........: 98/02/23 13:22:00 | -$-----------------------------------------------------------------------------*/ -$ -$/* Reserved for ansi, not used by OREXX. 0001 */ /* @MAE007D */ -$/* Reserved for ansi, not used by OREXX. 0002 */ -$/* Reserved for ansi, not used by OREXX. 0003 */ -$ MSG OWNER: MIC -msg# 0003 3000 -msgp: KREX -msgc: Warning -snam: Error_Program_unreadable -txt: Failure during initialization%0 -exp: The REXX program could not be read from the disk. -sys: None -usr: Verify file's existence and make sure no other process - has it locked. -$ -$ MSG OWNER: MIC (not in win) -msg# 0004 4000 -msgp: KREX -msgc: Warning -snam: Error_Program_interrupted -txt: Program interrupted%0 -exp: The system interrupted the execution of your program - because of an error or a user request. -sys: None -usr: Trap interrupts via CALL ON HALT or SIGNAL ON HALT. -$ -$/* Reserved for ansi, not used by OREXX. 5001 */ -$ -$ MSG OWNER: MIC -msg# 0005 5000 -msgp: KREX -msgc: Warning -snam: Error_System_resources -txt: System resources exhausted%0 -exp: While trying to execute a program, the language - processor was unable to get the resources it needed - to continue. For example, it could not get the space - needed for its work areas or variables. The program - that called the language processor might itself have - already used up most of the available storage. Or a - request for storage might have been for more than the - implementation maximum. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0006 6000 -msgp: KREX -msgc: Warning -snam: Error_Unmatched_quote -txt: Unmatched "/*" or quote%0 -exp: A comment or literal string was started but never finished. - This could be because the language processor detected: -. - The end of the program (or the end of the string in an -. INTERPRET instruction) without finding the ending "*/" for -. a comment or the ending quotation mark for a literal string -. - The end of the line for a literal string. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0007 7000 -msgp: KREX -msgc: Warning -snam: Error_When_expected -txt: WHEN or OTHERWISE expected%0 -exp: At least one WHEN construct (and possibly an OTHERWISE clause) - is expected within a SELECT instruction. This message is - issued if any other instruction is found or there is no WHEN - construct before the OTHERWISE or all WHEN expressions are - false and an OTHERWISE is not present. A common cause of - this error is if you forget the DO and END around the list - of instructions following a WHEN. - For example: -. WRONG RIGHT -. Select Select -. When a=c then When a=c then DO -. Say 'A equals C' Say 'A equals C' -. exit exit -. Otherwise nop end -. end Otherwise nop -. end -sys: None -usr: Look for any instruction other than WHEN (or for any - missing WHEN construct before the OTHERWISE) in the - SELECT construct. -$ -$ MSG OWNER: MIC -msg# 0008 8000 -msgp: KREX -msgc: Warning -snam: Error_Unexpected_then -txt: Unexpected THEN or ELSE%0 -exp: A THEN or an ELSE clause was found that does not match - a corresponding IF or WHEN clause. This often occurs - because of a missing END or DO...END in the THEN part - of a complex IF...THEN...ELSE construction. For example: -. WRONG RIGHT -. If a=c then do; If a=c then do; -. Say EQUALS Say EQUALS -. exit exit -. else end -. Say NOT EQUALS else -. Say NOT EQUALS -sys: None -usr: Look for a missing END or DO...END in the THEN part - of a complex IF...THEN...ELSE construction. -$ -$ MSG OWNER: MIC -msg# 0009 9000 -msgp: KREX -msgc: Warning -snam: Error_Unexpected_when -txt: Unexpected WHEN or OTHERWISE%0 -exp: A WHEN or OTHERWISE was found outside of a SELECT - construction. You might have accidentally enclosed - the instruction in a DO...END construction by - leaving out an END, or you might have tried to branch - to it with a SIGNAL instruction (which does not work - because the SELECT is then ended). -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0010 10000 -msgp: KREX -msgc: Warning -snam: Error_Unexpected_end -txt: Unexpected or unmatched END%0 -exp: More ENDs were found in your program than DO or SELECT - instructions, or the ENDs did not match the DO or - SELECT instructions. - This message also occurs if you try to transfer control - into the middle of a loop using SIGNAL. In this case, - the language processor does not expect the END because - it did not process the previous DO instruction. Remember - also that SIGNAL deactivates any current loops, so it - cannot transfer control from one place inside a loop to - another. - Another cause for this message is placing an END - immediately after a THEN or ELSE subkeyword or specifying - a name on the END keyword that does not match the name - following DO. Putting the name of the control variable on - ENDs that close repetitive loops can also help locate this - kind of error. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0011 11000 -msgp: KREX -msgc: Warning -snam: Error_Control_stack -txt: Control stack full%0 -exp: Your program exceeds the nesting level limit for control - structures (for example, DO...END and IF...THEN...ELSE). - This could be because of a looping INTERPRET instruction, - such as: -. line='INTERPRET line' -. INTERPRET line - These lines loop until they exceed the nesting level - limit and the language processor issues this message. - Similarly, a recursive subroutine or internal function - that does not end correctly can loop until it causes - this message. -sys: None -usr: None -$ -$ MSG OWNER: MIC -$msg# 0012 0 -$msgp: KREX -$msgc: Warning -$snam: Error_Clause_too_long -$txt: Clause too long%0 -$exp: The length of the internal or external representation of -$ a clause has exceeded the interpreter's limit. -$sys: None -$usr: None -$ -$ MSG OWNER: MIC -msg# 0013 13000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_character -txt: Invalid character in program%0 -exp: A character was found outside a literal (quoted) - string that is not a blank or one of the valid - alphanumeric and special characters. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0014 14000 -msgp: KREX -msgc: Warning -snam: Error_Incomplete_do -txt: Incomplete DO/SELECT/IF%0 -exp: At the end of the program or the string for an INTERPRET - instruction, a DO or SELECT instruction was found - without a matching END or an IF clause that is not - followed by a THEN clause. Putting the name of the - control variable on each END closing a controlled loop - can help locate this kind of error. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0015 15000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_hex -txt: Invalid hexadecimal or binary string%0 -exp: Hexadecimal strings must not have leading or trailing - blanks and blanks can only be embedded at byte - boundaries. Only the digits 0-9 and the letters a-f - and A-F are allowed. The following are valid - hexadecimal strings: -. '13'x -. 'A3C2 1c34'x -. '1de8'x - Binary strings can have blanks only at the boundaries of - groups of four binary digits. Only the digits 0 and 1 - are allowed. These are valid binary strings: -. '1011'b -. '110 1101'b -. '101101 11010011'b - You might have mistyped one of the digits, for example, - typing a letter O instead of the number 0. Or you might - have used the one-character symbol X or B (the name of - the variable X or B, respectively) after a literal string - when the string is not intended as a hexadecimal or binary - specification. In this case, use the explicit concatenation - operator (||) to concatenate the string to the value of the symbol. -sys: None -usr: Use the explicit concatenation operator || in situations where - X or B is intended to represent a variable. -$ -$ MSG OWNER: MIC -msg# 0016 16000 -msgp: KREX -msgc: Warning -snam: Error_Label_not_found -txt: Label not found%0 -exp: A SIGNAL instruction has been executed or an event for - which a trap was set with SIGNAL ON has occurred, and the - language processor could not find the label specified. - You might have mistyped the label or forgotten to include - it. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0017 17000 -msgp: KREX -msgc: Warning -snam: Error_Unexpected_procedure -txt: Unexpected PROCEDURE%0 -exp: A PROCEDURE instruction was encountered at an - incorrect position. This could occur because no - internal routines are active or because the - PROCEDURE instruction was not the first instruction - processed after the CALL instruction or function call. - One cause for this error is dropping through to an - internal routine, rather than calling it with a CALL - instruction or a function call. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0018 18000 -msgp: KREX -msgc: Warning -snam: Error_Then_expected -txt: THEN expected%0 -exp: A THEN clause must follow each REXX IF or WHEN clause. - The language processor found another clause before it - found a THEN clause. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0019 19000 -msgp: KREX -msgc: Warning -snam: Error_Symbol_or_string -txt: String or symbol expected%0 -exp: A symbol or string was expected after the CALL or - SIGNAL keywords but none was found. You might have - omitted the string or symbol or inserted a special - character (such as a parenthesis). -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0020 20000 -msgp: KREX -msgc: Warning -snam: Error_Symbol_expected -txt: Symbol expected%0 -exp: A symbol is expected after CALL ON, CALL OFF, END, - ITERATE, LEAVE, NUMERIC, PARSE, SIGNAL ON, or SIGNAL OFF. - Also, a list of symbols or variable references is - expected after DROP, EXPOSE, and PROCEDURE EXPOSE. Either - there was no symbol when one was required or the language - processor found another token. -sys: None -usr: None -$/* Reserved for ansi, not used by OREXX. 20001 */ -$/* Reserved for ansi, not used by OREXX. 20002 */ -$ -$ MSG OWNER: MIC -msg# 0021 21000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_data -txt: Invalid data on end of clause%0 -exp: A clause such as SELECT or NOP is followed by a - token other than a comment. -sys: None -usr: None -$/* Reserved for ansi, not used by OREXX. 21001 */ -$ -$ MSG OWNER: MIC -msg# 0022 22000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_character_string -txt: Invalid character string%0 -exp: A literal string contains character codes that are not - valid. This might be because some characters are not - possible, or because the character set is extended and - certain character combinations are not allowed. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0023 23000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_data_string -txt: Invalid data string%0 -exp: A data string (that is, the result of an expression) - contains character codes that are not valid. - This might be because some characters are not possible, - or because the character set is extended and certain - character combinations are not allowed. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0024 24000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_trace -txt: Invalid TRACE request%0 -exp: This message is issued when: -. - The option on a TRACE instruction or the argument -. to the built-in function does not start with -. A, C, E, F, I, L, N, O, or R. -. - In interactive debugging, you entered a number -. that is not a whole number. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0025 25000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_subkeyword -txt: Invalid subkeyword found%0 -exp: An unexpected token was found at his position of - an instruction where a particular subkeyword was - expected. For example, in a NUMERIC instruction, - the second token must be DIGITS, FUZZ, or FORM. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0026 26000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_whole_number -txt: Invalid whole number%0 -exp: An expression was found that did not evaluate to a whole - number or is greater than the limit (the default is - 999 999 999): -. - The positional patterns in parsing templates (including -. variable positional patterns) -. - The operand to the right of the power operator -. - The values of exprr and exprf in the DO instruction -. - The values given for DIGITS or FUZZ in the NUMERIC -. instruction -. - The number used in the option of the TRACE setting - This error is also raised if the value is not permitted (for - example, a negative repetition count in a DO instruction), or - the division performed during an integer divide or - remainder operation does not result in a whole number. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0027 27000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_do -txt: Invalid DO syntax%0 -exp: A syntax error was found in the DO instruction. You - probably used BY, TO, FOR, WHILE, or UNTIL twice, - used a WHILE and an UNTIL, or used BY, TO, or FOR when - there is no control variable specified. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0028 28000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_leave -txt: Invalid LEAVE or ITERATE%0 -exp: A LEAVE or ITERATE instruction was found at an incorrect - position. Either no loop was active, or the name - specified on the instruction did not match the control - variable of any active loop. - Note that internal routine calls and the INTERPRET - instruction protect DO loops by making them inactive. - Therefore, for example, a LEAVE instruction in a subroutine - cannot affect a DO loop in the calling routine. - You probably tried to use the SIGNAL instruction to - transfer control within or into a loop. Because a SIGNAL - instruction ends all active loops, any ITERATE or LEAVE - instruction causes this message. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0029 29000 -msgp: KREX -msgc: Warning -snam: Error_Environment_name -txt: Environment name too long%0 -exp: The environment name specified on the ADDRESS instruction - is longer than permitted for the system under which the - interpreter is running. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0030 30000 -msgp: KREX -msgc: Warning -snam: Error_Name_too_long -txt: Name or string too long%0 -exp: A variable name, label name, literal (quoted) string - has exceeded the allowed limit of 250 characters. - The limit for names includes any substitutions. A - possible cause of this error is if you use a period (.) - in a name, causing an unexpected substitution. - Leaving off an ending quotation mark for a literal - string, or putting a single quotation mark in a string, - can cause this error because several clauses can be - included in the string. For example, write the string - 'don't' as 'don't' or "don't". -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0031 31000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_variable -txt: Name starts with number or "."%0 -exp: A variable was found whose name begins with a numeric - digit or a period. You cannot assign a value to such - a variable because you could then redefine numeric - constants. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0033 33000 -msgp: KREX -msgc: Warning -snam: Error_Expression_result -txt: Invalid expression result%0 -exp: The result of an expression was found not to be - valid in the context in which it was used. -sys: None -usr: Check for an illegal FUZZ or DIGITS value in a NUMERIC - instruction. FUZZ must not become larger than DIGITS. -$ -$ MSG OWNER: MIC -msg# 0034 34000 -msgp: KREX -msgc: Warning -snam: Error_Logical_value -txt: Logical value not 0 or 1%0 -exp: An expression was found in an IF, WHEN, DO WHILE, - or DO UNTIL phrase that did not result in a 0 or 1. - Any value operated on by a logical operator must - result in a 0 or 1. For example, the phrase - If result then exit rc - fails if result has a value other than 0 or 1. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0035 35000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_expression -txt: Invalid expression%0 -exp: An expression contains a grammatical error. Possible causes: -. - An expression is missing when one is required -. - You ended an expression with an operator -. - You specified, in an expression, two operators next to -. one another with nothing in between them -. - You did not specify a right parenthesis when one was -. required -. - You used special characters (such as operators) in an -. intended character expression without enclosing them -. in quotation marks -sys: None -usr: Check for special characters (such as operators) in an - intended character expression that are not enclosed - in quotes. -$ -$ MSG OWNER: MIC -msg# 0036 36000 -msgp: KREX -msgc: Warning -snam: Error_Unmatched_parenthesis -txt: Unmatched "(" or "[" in expression%0 -exp: A matched parenthesis or bracket was found within - an expression. There are more left parentheses - than right parentheses or more left brackets - than right brackets. To include a single parenthesis - in a command, enclose it in quotation marks. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0037 37000 -msgp: KREX -msgc: Warning -snam: Error_Unexpected_comma -txt: Unexpected ",", ")", or "]"%0 -exp: Either a comma was found outside a function - invocation, or there are too many right parentheses - or right square brackets in an expression. To include - a comma in a character expression, enclose it in - quotation marks. For example, write the instruction: - Say Enter A, B, or C - as follows: - Say 'Enter A, B, or C' -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0038 38000 -msgp: KREX -msgc: Warning -snam: Error_Invalid_template -txt: Invalid template or pattern%0 -exp: A special character that is not allowed within - a parsing template (for example, "%") has been - found, or the syntax of a variable pattern is incorrect - (that is, no symbol was found after a left parenthesis). - This message is also issued if you omit the WITH - subkeyword in a PARSE VALUE instruction. -sys: None -usr: None -$ -$ MSG OWNER: MIC (not in win) -msg# 0039 0000 -msgp: OREX -msgc: Warning -snam: Error_Evaluation_stack_overflow -txt: Evaluation stack overflow%0 -exp: The expression is too complex to be evaluated by the - language processor. -ACTION: Check for too many nested parentheses, functions, etc. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0040 40000 -msgp: KREX -msgc: Warning -snam: Error_Incorrect_call -txt: Incorrect call to routine%0 -exp: An incorrect call to a routine was found. Possible causes: -. - You passed incorrect data (arguments) to the built-in -. or external routine. -. - You passed too many arguments to the built-in, external, -. or internal routine. -. - The external routine called was not compatible with the -. language processor. - If you did not try to call a routine, you might have a - symbol or a string adjacent to a "(" when you meant it to - be separated by a blank or other operator. The language - processor would treat this as a function call. For example, - write TIME(4+5) as follows: TIME*(4+5) -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0041 41000 -msgp: KREX -msgc: Warning -snam: Error_Conversion -txt: Bad arithmetic conversion%0 -exp: A term in an arithmetic expression is not a valid - number or has an exponent outside the allowed range - of -999 999 999 to +999 999 999. - You might have mistyped a variable name, or included - an arithmetic operator in a character expression - without putting it in quotation marks. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0042 42000 -msgp: KREX -msgc: Warning -snam: Error_Overflow -txt: Arithmetic overflow/underflow%0 -exp: The result of an arithmetic operation requires - an exponent that is greater than the limit of - nine digits (more than 999 999 999 or less than - -999 999 999). - This error can occur during the evaluation of an - expression (often as a result of trying to divide - a number by 0) or while stepping a DO loop control - variable. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0043 43000 -msgp: KREX -msgc: Warning -snam: Error_Routine_not_found -txt: Routine not found%0 -exp: A function has been invoked within an expression - or a subroutine has been invoked by a CALL, but - it cannot be found. Possible reasons: -. - The specified label is not in the program -. - It is not the name of a built-in function -. - The language processor could not locate it externally - Check if you mistyped the name. - If you did not try to call a routine, you might have - put a symbol or string adjacent to a "(" when you meant - it to be separated by a blank or another operator. - The language processor then treats it as a function call. - For example, write the string 3(4+5) as 3*(4+5). -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0044 44000 -msgp: KREX -msgc: Warning -snam: Error_Function_no_data -txt: Function or message did not return data%0 -exp: The language processor called an external - routine within an expression. The routine seemed - to end without error, but it did not return data - for use in the expression. - You might have specified the name of a program that - is not intended for use as a REXX function. Call - it as a command or subroutine instead. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0045 45000 -msgp: KREX -msgc: Warning -snam: Error_No_data_on_return -txt: No data specified on function RETURN%0 -exp: A REXX program has been called as a function, but - returned without passing back any data. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0046 46000 -msgp: KREX -msgc: Warning -snam: Error_Variable_reference -txt: Invalid variable reference%0 -exp: Within an ARG, DROP, EXPOSE, PARSE, PULL, or PROCEDURE - instruction, the syntax of a variable reference (a - variable whose value is to be used, indicated by its - name being enclosed in parentheses) is incorrect. The - right parenthesis that must immediately follow - the variable name might be missing or the variable - name might be misspelled. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0047 47000 -msgp: KREX -msgc: Warning -snam: Error_Unexpected_label -txt: Unexpected label%0 -exp: A label was used in the expression being - evaluated for an INTERPRET instruction or - in an expression entered during interactive - debugging. -sys: None -usr: Remove the label from the interpreted data. -$ -$ MSG OWNER: MIC -msg# 0048 48000 -msgp: KREX -msgc: Warning -snam: Error_System_service -txt: Failure in system service%0 -exp: The language processor stopped processing the - program because a system service, such as stream - input or output or the manipulation of the - external data queue, has failed to work correctly. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0049 49000 -msgp: KREX -msgc: Warning -snam: Error_Interpretation -txt: Interpretation error%0 -exp: A severe error was detected in the - language processor or execution process - during internal self-consistency checks. -sys: None -usr: None -$ -$/* Reserved for ansi, not used by OREXX. 50000 */ -$/* Reserved for ansi, not used by OREXX. 50001 */ -$/* Reserved for ansi, not used by OREXX. 51000 */ -$/* Reserved for ansi, not used by OREXX. 51001 */ -$/* Reserved for ansi, not used by OREXX. 52000 */ -$/* Reserved for ansi, not used by OREXX. 53000 */ -$/* Reserved for ansi, not used by OREXX. 53001 */ -$/* Reserved for ansi, not used by OREXX. 53002 */ -$/* Reserved for ansi, not used by OREXX. 53003 */ -$/* Reserved for ansi, not used by OREXX. 54000 */ -$/* Reserved for ansi, not used by OREXX. 54001 */ -$/* ----------------- End of ANSI Rexx defined error codes -------------------*/ -$/* ----------------- Begin of Object Rexx defined error codes ---------------*/ -$ MSG OWNER: MIC -msg# 0090 90000 -msgp: KREX -msgc: Warning -snam: Error_External_name_not_found -txt: External name not found%0 -exp: An external class, method, or routine (specified - with the EXTERNAL option on a ::CLASS, ::METHOD, - or ::ROUTINE directive, or as a second argument - on a NEW message to the Method class) cannot be found. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0091 91000 -msgp: KREX -msgc: Warning -snam: Error_No_result_object -txt: No result object%0 -exp: A message term requires a result object, but the - method did not return one. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0093 93000 -msgp: KREX -msgc: Warning -snam: Error_Incorrect_method -txt: Incorrect call to method%0 -exp: The specified method or built-in or external routine - exists, but you used it incorrectly. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0097 97000 -msgp: KREX -msgc: Warning -snam: Error_No_method -txt: Object method not found%0 -exp: The object does not have a method with the given - name. A frequent cause of this error is an - uninitialized variable. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0098 98000 -msgp: KREX -msgc: Warning -snam: Error_Execution -txt: Execution error%0 -exp: The language processor detected a specific error - during execution. The associated error gives the - reason for the error. -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0099 99000 -msgp: KREX -msgc: Warning -snam: Error_Translation -txt: Translation error%0 -exp: An error was detected in the language syntax. The - associated error subcode identifies the syntax error. -sys: None -usr: None -$ -$ MSG OWNER: MIC (not in win, ANSI message! will substitute 524-526 @MAE007M) -msg# 0100 0 -msgp: OREX -msgc: Warning -snam: Error_at_line -parm: value source linenumber -txt: Error &1 running &2, line &3:%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0101 101000 -msgp: KREX -msgc: Warning -snam: Message_Translations -txt: General message text%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0102 101006 -msgp: KREX -msgc: Warning -snam: Message_Translations_January -txt: January%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0103 101007 -msgp: KREX -msgc: Warning -snam: Message_Translations_February -txt: February%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0104 101008 -msgp: KREX -msgc: Warning -snam: Message_Translations_March -txt: March%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0105 101009 -msgp: KREX -msgc: Warning -snam: Message_Translations_April -txt: April%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0106 101010 -msgp: KREX -msgc: Warning -snam: Message_Translations_May -txt: May%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0107 101011 -msgp: KREX -msgc: Warning -snam: Message_Translations_June -txt: June%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0108 101012 -msgp: KREX -msgc: Warning -snam: Message_Translations_July -txt: July%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0109 101013 -msgp: KREX -msgc: Warning -snam: Message_Translations_August -txt: August%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0110 101014 -msgp: KREX -msgc: Warning -snam: Message_Translations_September -txt: September%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0111 101015 -msgp: KREX -msgc: Warning -snam: Message_Translations_October -txt: October%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0112 101016 -msgp: KREX -msgc: Warning -snam: Message_Translations_November -txt: November%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0113 101017 -msgp: KREX -msgc: Warning -snam: Message_Translations_December -txt: December%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0114 101005 -msgp: KREX -msgc: Info -snam: Message_Translations_debug_prompt -txt: +++ Interactive trace. "Trace Off" to end debug, ENTER to Continue. +++%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0115 999020 -msgp: KREX -msgc: Error -snam: Error_RXSUBC_general -txt: The RXSUBCOM parameters are incorrect. -exp: RXSUBCOM accepts the following parameters: -. - To register a subcommand handler: -. RXSUBCOM REGISTER Environment_Name Dll_Name Procedure_Name - -. - To query the existence of a specific subcommand handler: -. RXSUBCOM QUERY [Environment_Name [Dll_Name]] - -. - To drop a subcommand handler: -. RXSUBCOM DROP Environment_Name [Dll_Name] - -. - To load a subcommand handler from disk: -. RXSUBCOM LOAD Environment_Name [Dll_Name] - -sys: None -usr: Check the RXSUBCOM parameters and retry the command. -$ -$ MSG OWNER: MIC -msg# 0116 0 -msgp: KREX -msgc: Error -snam: Error_RXSUBC_register -txt: The RXSUBCOM parameter REGISTER is incorrect. -exp: RXSUBCOM REGISTER requires the following parameters: - -. RXSUBCOM REGISTER Environment_Name Dll_Name Procedure_Name - -. Environment_Name is the name of the subcommand handler. -. Dll_Name is the name of the file containing -. the subcommand handler routine. -. Procedure_Name is the name of the procedure that REXX -. calls as a subcommand handler. - -sys: None -usr: Check the RXSUBCOM parameters and retry the command. -$ -$ MSG OWNER: MIC -msg# 0117 0 -msgp: KREX -msgc: Error -snam: Error_RXSUBC_drop -txt: The RXSUBCOM parameter DROP is incorrect. -exp: RXSUBCOM DROP requires that the subcommand handler name be specified. - -. RXSUBCOM DROP Environment_Name [Dll_Name] - -. Environment_Name is the name of the subcommand handler. -. Dll_Name is the name of the file containing the -. subcommand handler routine (optional). - -sys: None -usr: Check the RXSUBCOM parameters and retry the command. -$ -$ MSG OWNER: MIC -msg# 0118 0 -msgp: KREX -msgc: Error -snam: Error_RXSUBC_load -txt: The RXSUBCOM parameter LOAD is incorrect. -exp: RXSUBCOM LOAD requires thatn the subcommand handler name be specified. - -. RXSUBCOM LOAD Environment_Name [Dll_Name] - -. Environment_Name is the name of the subcommand handler. -. Dll_Name is the name of the file containing the -. subcommand handler routine (optional). - -sys: None -usr: Check the RXSUBCOM parameters and retry the command. -$ -$ MSG OWNER: MIC -msg# 0119 0 -msgp: KREX -msgc: Error -snam: Error_RXQUE_notinit -txt: The REXX queuing system is not initialized. -exp: The queuing system requires a housekeeping program to run. - This program usually runs under the Presentation Manager - shell. The program is not running. -sys: None -usr: Report this message to your IBM service representative. -$ -$ MSG OWNER: MIC -msg# 0120 0 -msgp: KREX -msgc: Error -snam: Error_RXQUE_size -txt: The size of the data is incorrect. -exp: The data supplied to the RXQUEUE command is too long. - The RXQUEUE program accepts data records containing - 0 - 65472 bytes. A record exceeded the allowable limits. -sys: None -usr: Use shorter data records. -$ -$ MSG OWNER: MIC -msg# 0121 0 -msgp: KREX -msgc: Error -snam: Error_RXQUE_nomem -txt: Storage for data queues is exhausted. -exp: The queuing system is out of memory. No more storage - is available to store queued data. -sys: None -usr: Delete some queues or remove queued data from the system. - Then retry your request. -$ -$ MSG OWNER: MIC -msg# 0122 0 -msgp: KREX -msgc: Error -snam: Error_RXQUE_name -parm: ofQUEUE -txt: The name %1 is not a valid queue name. -exp: The queue name contains an invalid character. Only the - following characters can appear in queue names: - - 'A' .. 'Z', '0' .. '9', '.', '!', '?', '_' - -sys: None -usr: Change the queue name and retry the command. -$ -$ MSG OWNER: MIC -msg# 0123 0 -msgp: KREX -msgc: Error -snam: Error_RXQUE_access -txt: The queue access mode is not correct. -exp: An internal error occurred in RXQUEUE. - The RXQUEUE program tried to access a queue with an - incorrect access mode. Correct access modes are - LIFO and FIFO. -sys: None -usr: Report this message to your IBM service representative. -$ -$ MSG OWNER: MIC -msg# 0124 0 -msgp: KREX -msgc: Error -snam: Error_RXQUE_exist -parm: QUEUE -txt: The queue %1 does not exist. -exp: The command attempted to access a nonexistent queue. -sys: None -usr: Create the queue and try again, or use a queue that has been - created. -$ -$ MSG OWNER: MIC -msg# 0125 0 -msgp: KREX -msgc: Error -snam: Error_RXSUBC_query -txt: The RXSUBCOM parameter QUERY is incorrect. -exp: RXSUBCOM QUERY requires the environment name be specified. - -. RXSUBCOM QUERY Environment_Name [Dll_Name] - -. Environment_Name is the name of the subcommand handler. -. Dll_Name is the name of the file containing -. the subcommand handler routine (optional). - -sys: None -usr: Check the RXSUBCOM parameters and retry the command. -$ -$ MSG OWNER: MIC /* @MAE007M */ -msg# 0126 101004 -msgp: KREX -msgc: Warning -snam: Message_Translations_debug_error -parm: -txt: +++ Interactive trace. Error%0 -exp: None -sys: None -usr: None -$ -$ MSG OWNER: MIC -msg# 0127 0 -msgp: KREX -msgc: Error -snam: Error_REXXC_cmd_parm_incorrect -txt: The REXXC command parameters are incorrect. -exp: The REXXC utility was invoked with zero or more than - three parameters. REXXC accepts the following parameters: - -. - To check the syntax of a REXX program: -. REXXC Program_name [/s] - -. - To convert a REXX program into a sourceless executable file: -. REXXC Program_name Output_file_name [/s] - -sys: None -usr: Check the REXXC parameters and retry the command. -$ -$ MSG OWNER: MIC -msg# 0128 0 -msgp: KREX -msgc: Error -snam: Error_REXXC_outDifferent -txt: Output file name must be different from input file name. -exp: None -sys: None -usr: None -$ -$----------------------------------------------------------- -$ MSG OWNER: MAE -msg# 0129 0 -msgp: KREX -msgc: Error -snam: Error_REXXC_wrongNrArg -txt: SYNTAX: REXXC InProgramName [OutProgramName] [/S] -exp: None -sys: None -usr: None ... [truncated message content] |