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. |