From: <bi...@us...> - 2007-02-20 18:55:15
|
Revision: 142 http://svn.sourceforge.net/oorexx/?rev=142&view=rev Author: bigrixx Date: 2007-02-20 10:55:16 -0800 (Tue, 20 Feb 2007) Log Message: ----------- Add back in the datatype('O') support. Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/StringClassMisc.cpp interpreter-3.x/trunk/kernel/runtime/RexxBuiltinFunctions.h Modified: interpreter-3.x/trunk/kernel/classes/StringClassMisc.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StringClassMisc.cpp 2007-02-20 15:32:38 UTC (rev 141) +++ interpreter-3.x/trunk/kernel/classes/StringClassMisc.cpp 2007-02-20 18:55:16 UTC (rev 142) @@ -364,8 +364,20 @@ Answer = (RexxObject *)TheTrueObject; break; + case DATATYPE_LOGICAL: // Test for a valid logical. + if (Len != 1 || (*Scanp != '1' && *Scanp != '0')) + { + Answer = TheFalseObject; + } + else + { + Answer = TheTrueObject; + } + + break; + default : /* unsupported option */ - report_exception2(Error_Incorrect_method_option, new_cstring("ABCDLMNSUVWX9"), new_string((PCHAR)&Option,1)); + report_exception2(Error_Incorrect_method_option, new_cstring("ABCDLMNOSUVWX9"), new_string((PCHAR)&Option,1)); } return Answer; /* return validation answer */ } Modified: interpreter-3.x/trunk/kernel/runtime/RexxBuiltinFunctions.h =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxBuiltinFunctions.h 2007-02-20 15:32:38 UTC (rev 141) +++ interpreter-3.x/trunk/kernel/runtime/RexxBuiltinFunctions.h 2007-02-20 18:55:16 UTC (rev 142) @@ -82,6 +82,7 @@ #define DATATYPE_WHOLE_NUMBER 'W' #define DATATYPE_HEX 'X' #define DATATYPE_9DIGITS '9' +#define DATATYPE_LOGICAL 'O' // lOgical. /* Verify function options */ #define VERIFY_MATCH 'M' #define VERIFY_NOMATCH 'N' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-02-21 19:20:37
|
Revision: 147 http://svn.sourceforge.net/oorexx/?rev=147&view=rev Author: bigrixx Date: 2007-02-21 11:20:38 -0800 (Wed, 21 Feb 2007) Log Message: ----------- [ 1605177 ] Error text for 25.906 incomplete Modified Paths: -------------- interpreter-3.x/trunk/kernel/messages/rexxmsg.xml interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc Modified: interpreter-3.x/trunk/kernel/messages/rexxmsg.xml =================================================================== --- interpreter-3.x/trunk/kernel/messages/rexxmsg.xml 2007-02-21 19:13:58 UTC (rev 146) +++ interpreter-3.x/trunk/kernel/messages/rexxmsg.xml 2007-02-21 19:20:38 UTC (rev 147) @@ -1378,7 +1378,7 @@ <Component>Rexx</Component> <Severity>Warning</Severity> <SymbolicName>Error_Invalid_subkeyword_raise</SymbolicName> - <Text>RAISE must be followed by one of the keywords ERROR, FAILURE, HALT, LOSTDIGITS, NOMETHOD, NOSTRING, NOTREADY, NOVALUE, or SYNTAX; found <q><Sub position="1" name="word"/></q></Text> + <Text>RAISE must be followed by one of the keywords ERROR, FAILURE, HALT, LOSTDIGITS, NOMETHOD, NOSTRING, NOTREADY, NOVALUE, SYNTAX, or USER; found <q><Sub position="1" name="word"/></q></Text> </SubMessage> <SubMessage> <Code>25</Code> Modified: interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc =================================================================== --- interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc 2007-02-21 19:13:58 UTC (rev 146) +++ interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc 2007-02-21 19:20:38 UTC (rev 147) @@ -235,7 +235,7 @@ Error_Invalid_subkeyword_signalonname "SIGNAL ON condition must be followed by the keyword NAME; found ""&1""" Error_Invalid_subkeyword_parse "PARSE must be followed by one of the keywords ARG, LINEIN, PULL, SOURCE, VALUE, VAR, or VERSION; found ""&1""" Error_Invalid_subkeyword_use "USE must be followed by the keyword ARG; found ""&1""" - Error_Invalid_subkeyword_raise "RAISE must be followed by one of the keywords ERROR, FAILURE, HALT, LOSTDIGITS, NOMETHOD, NOSTRING, NOTREADY, NOVALUE, or SYNTAX; found ""&1""" + Error_Invalid_subkeyword_raise "RAISE must be followed by one of the keywords ERROR, FAILURE, HALT, LOSTDIGITS, NOMETHOD, NOSTRING, NOTREADY, NOVALUE, SYNTAX, or USER; found ""&1""" Error_Invalid_subkeyword_raiseoption "Unknown keyword on RAISE instruction; found ""&1""" Error_Invalid_subkeyword_description "Duplicate DESCRIPTION keyword found" Error_Invalid_subkeyword_additional "Duplicate ADDITIONAL or ARRAY keyword found" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-02-24 17:03:24
|
Revision: 150 http://svn.sourceforge.net/oorexx/?rev=150&view=rev Author: bigrixx Date: 2007-02-24 09:03:24 -0800 (Sat, 24 Feb 2007) Log Message: ----------- Add subchar() method to String and MutableBuffer. NOTE: This also bumps the ooRexx language level to 6.01 Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/MutableBufferClass.hpp interpreter-3.x/trunk/kernel/classes/StringClass.hpp interpreter-3.x/trunk/kernel/classes/StringClassSub.cpp interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp interpreter-3.x/trunk/kernel/runtime/Version.cpp Modified: interpreter-3.x/trunk/kernel/classes/MutableBufferClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/MutableBufferClass.hpp 2007-02-23 05:50:10 UTC (rev 149) +++ interpreter-3.x/trunk/kernel/classes/MutableBufferClass.hpp 2007-02-24 17:03:24 UTC (rev 150) @@ -78,6 +78,7 @@ RexxMutableBuffer *overlay(RexxObject*, RexxObject*, RexxObject*, RexxObject*); RexxMutableBuffer *mydelete(RexxObject*, RexxObject*); RexxString *substr(RexxInteger *startPosition, RexxInteger *len, RexxString *pad) { return this->data->substr(startPosition,len,pad); } + RexxString *subchar(RexxInteger *startPosition) { return this->data->subchar(startPosition); } RexxInteger *getBufferSize() { return new_integer(bufferLength); } RexxObject *setBufferSize(RexxInteger*); Modified: interpreter-3.x/trunk/kernel/classes/StringClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StringClass.hpp 2007-02-23 05:50:10 UTC (rev 149) +++ interpreter-3.x/trunk/kernel/classes/StringClass.hpp 2007-02-24 17:03:24 UTC (rev 150) @@ -166,6 +166,7 @@ RexxString *right(RexxInteger *, RexxString *); RexxString *strip(RexxString *, RexxString *); RexxString *substr(RexxInteger *, RexxInteger *, RexxString *); + RexxString *subchar(RexxInteger *); RexxString *delWord(RexxInteger *, RexxInteger *); RexxString *space(RexxInteger *, RexxString *); RexxString *subWord(RexxInteger *, RexxInteger *); Modified: interpreter-3.x/trunk/kernel/classes/StringClassSub.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StringClassSub.cpp 2007-02-23 05:50:10 UTC (rev 149) +++ interpreter-3.x/trunk/kernel/classes/StringClassSub.cpp 2007-02-24 17:03:24 UTC (rev 150) @@ -646,3 +646,32 @@ return Retval; /* return extracted string */ } + +/** + * Extract a single character from a string object. + * Returns a null string if the specified position is + * beyond the bounds of the string. + * + * @param positionArg + * The position of the target character. Must be a positive + * whole number. + * + * @return Returns the single character at the target position. + * Returns a null string if the position is beyond the end + * of the string. + */ +RexxString *RexxString::subchar(RexxInteger *positionArg) +{ + // the starting position isn't optional + size_t position = get_position(positionArg, ARG_ONE) - 1; + size_t stringLength = this->length; + + // beyond the bounds, this is a null string + if (position >= stringLength) + { + return OREF_NULLSTRING; + } + // return the single character + return this->extract(position, 1); +} + Modified: interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-02-23 05:50:10 UTC (rev 149) +++ interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-02-24 17:03:24 UTC (rev 150) @@ -453,6 +453,7 @@ CHARCONSTANT(SPACE, "SPACE"); CHARCONSTANT(STREAM, "STREAM"); CHARCONSTANT(STRIP, "STRIP"); +CHARCONSTANT(SUBCHAR, "SUBCHAR"); CHARCONSTANT(SUBSTR, "SUBSTR"); CHARCONSTANT(SUBWORD, "SUBWORD"); CHARCONSTANT(SYMBOL, "SYMBOL"); Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-02-23 05:50:10 UTC (rev 149) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-02-24 17:03:24 UTC (rev 150) @@ -344,6 +344,7 @@ CPPMSTR(RexxString::right), CPPMSTR(RexxString::strip), CPPMSTR(RexxString::substr), +CPPMSTR(RexxString::subchar), /* following methods are in OKBWORD */ CPPMSTR(RexxString::delWord), @@ -401,6 +402,7 @@ CPPMMUTB(RexxMutableBuffer::overlay), CPPMMUTB(RexxMutableBuffer::mydelete), CPPMMUTB(RexxMutableBuffer::substr), +CPPMMUTB(RexxMutableBuffer::subchar), CPPMMUTB(RexxMutableBuffer::getBufferSize), CPPMMUTB(RexxMutableBuffer::setBufferSize), CPPMMUTB(RexxMutableBuffer::uninitMB), @@ -1109,6 +1111,7 @@ defineKernelMethod(CHAR_RIGHT ,TheStringBehaviour, CPPMSTR(RexxString::right), 2); defineKernelMethod(CHAR_STRIP ,TheStringBehaviour, CPPMSTR(RexxString::strip), 2); defineKernelMethod(CHAR_SUBSTR ,TheStringBehaviour, CPPMSTR(RexxString::substr), 3); + defineKernelMethod(CHAR_SUBCHAR ,TheStringBehaviour, CPPMSTR(RexxString::subchar), 1); defineKernelMethod(CHAR_DELWORD ,TheStringBehaviour, CPPMSTR(RexxString::delWord), 2); defineKernelMethod(CHAR_SPACE ,TheStringBehaviour, CPPMSTR(RexxString::space), 2); defineKernelMethod(CHAR_SUBWORD ,TheStringBehaviour, CPPMSTR(RexxString::subWord), 2); @@ -1203,6 +1206,7 @@ defineKernelMethod(CHAR_OVERLAY ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::overlay), 4); defineKernelMethod(CHAR_DELETE ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::mydelete), 2); defineKernelMethod(CHAR_SUBSTR ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::substr), 3); + defineKernelMethod(CHAR_SUBCHAR ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::subchar), 1); defineKernelMethod(CHAR_GETBUFFERSIZE , TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::getBufferSize), 0); defineKernelMethod(CHAR_SETBUFFERSIZE , TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::setBufferSize), 1); Modified: interpreter-3.x/trunk/kernel/runtime/Version.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Version.cpp 2007-02-23 05:50:10 UTC (rev 149) +++ interpreter-3.x/trunk/kernel/runtime/Version.cpp 2007-02-24 17:03:24 UTC (rev 150) @@ -67,9 +67,9 @@ day++; /* step over it */ /* format the result */ #ifdef NOTHREADSUPPORT - sprintf(buffer, "REXX-ooRexx_%d.%d 6.00 %s %s %s", ORX_VER, ORX_REL, day, month, year); + sprintf(buffer, "REXX-ooRexx_%d.%d 6.01 %s %s %s", ORX_VER, ORX_REL, day, month, year); #else - sprintf(buffer, "REXX-ooRexx_%d.%d(MT) 6.00 %s %s %s", ORX_VER, ORX_REL, day, month, year); + sprintf(buffer, "REXX-ooRexx_%d.%d(MT) 6.01 %s %s %s", ORX_VER, ORX_REL, day, month, year); #endif return new_cstring(buffer); /* return as a rexx string */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-03-18 12:57:32
|
Revision: 157 http://svn.sourceforge.net/oorexx/?rev=157&view=rev Author: bigrixx Date: 2007-03-17 16:35:23 -0700 (Sat, 17 Mar 2007) Log Message: ----------- [ 1682637 ] MESSAGE: access to target and arguments Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/MessageClass.cpp interpreter-3.x/trunk/kernel/classes/MessageClass.hpp interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/MessageClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/MessageClass.cpp 2007-03-12 14:37:12 UTC (rev 156) +++ interpreter-3.x/trunk/kernel/classes/MessageClass.cpp 2007-03-17 23:35:23 UTC (rev 157) @@ -450,6 +450,42 @@ } +/** + * Retrieve the target of the message object. This will be either + * the target object specified when the message object is created + * or a target override object specified on SEND or START. + * + * @return The current message target. + */ +RexxObject *RexxMessage::messageTarget() +{ + return receiver; + +} + + +/** + * Return the name of the message. + * + * @return The string name of the message. + */ +RexxString *RexxMessage::messageName() +{ + return message; +} + + +/** + * Return a copy of the message argument array. + * + * @return A copy of the message arguments array. + */ +RexxArray *RexxMessage::arguments() +{ + return (RexxArray *)args->copy(); +} + + void *RexxMessage::operator new(size_t size) /******************************************************************************/ /* Function: Construct a new message object */ @@ -463,6 +499,7 @@ return newMessage; /* return the new message object */ } + RexxObject *RexxMessage::newRexx( RexxObject **arguments, /* message argument array */ size_t argCount) /* the number of arguments */ Modified: interpreter-3.x/trunk/kernel/classes/MessageClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/MessageClass.hpp 2007-03-12 14:37:12 UTC (rev 156) +++ interpreter-3.x/trunk/kernel/classes/MessageClass.hpp 2007-03-17 23:35:23 UTC (rev 157) @@ -69,6 +69,9 @@ RexxObject *completed(); void sendNotification(); void error(RexxDirectory *); + RexxObject *messageTarget(); + RexxString *messageName(); + RexxArray *arguments(); RexxObject *hasError(); RexxObject *errorCondition(); RexxObject *newRexx(RexxObject **, size_t); Modified: interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-03-12 14:37:12 UTC (rev 156) +++ interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-03-17 23:35:23 UTC (rev 157) @@ -182,6 +182,7 @@ CHARCONSTANT(MEMORY, "MEMORY"); CHARCONSTANT(MERGE, "MERGE"); CHARCONSTANT(MESSAGE, "MESSAGE"); +CHARCONSTANT(MESSAGENAME, "MESSAGENAME"); CHARCONSTANT(METACLASS, "METACLASS"); CHARCONSTANT(METHOD, "METHOD"); CHARCONSTANT(METHODNAME, "METHOD"); @@ -330,6 +331,7 @@ CHARCONSTANT(SYSEXTERNALFUNCTION, "SYSEXTERNALFUNCTION"); CHARCONSTANT(SYSTEM, "SYSTEM"); CHARCONSTANT(TABLE, "TABLE"); +CHARCONSTANT(TARGET, "TARGET"); CHARCONSTANT(TOKENIZE_ONLY, "//T"); CHARCONSTANT(TRACEBACK, "TRACEBACK"); CHARCONSTANT(TRANSLATE, "TRANSLATE"); Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-03-12 14:37:12 UTC (rev 156) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-03-17 23:35:23 UTC (rev 157) @@ -230,6 +230,9 @@ CPPMSG(RexxMessage::completed), CPPMSG(RexxMessage::hasError), CPPMSG(RexxMessage::errorCondition), +CPPMSG(RexxMessage::messageTarget), +CPPMSG(RexxMessage::messageName), +CPPMSG(RexxMessage::arguments), CPPMSG(RexxMessage::newRexx), @@ -929,6 +932,9 @@ defineKernelMethod(CHAR_HASERROR, TheMessageBehaviour, CPPMSG(RexxMessage::hasError), 0); defineKernelMethod(CHAR_NOTIFY , TheMessageBehaviour, CPPMSG(RexxMessage::notify), 1); defineKernelMethod(CHAR_RESULT , TheMessageBehaviour, CPPMSG(RexxMessage::result), 0); + defineKernelMethod(CHAR_TARGET , TheMessageBehaviour, CPPMSG(RexxMessage::messageTarget), 0); + defineKernelMethod(CHAR_MESSAGENAME , TheMessageBehaviour, CPPMSG(RexxMessage::messageName), 0); + defineKernelMethod(CHAR_ARGUMENTS , TheMessageBehaviour, CPPMSG(RexxMessage::arguments), 0); defineKernelMethod(CHAR_ERRORCONDITION , TheMessageBehaviour, CPPMSG(RexxMessage::errorCondition), 0); defineKernelMethod(CHAR_SEND , TheMessageBehaviour, CPPMSG(RexxMessage::send), 1); defineKernelMethod(CHAR_START , TheMessageBehaviour, CPPMSG(RexxMessage::start), 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-03-18 12:57:40
|
Revision: 159 http://svn.sourceforge.net/oorexx/?rev=159&view=rev Author: bigrixx Date: 2007-03-17 17:13:00 -0700 (Sat, 17 Mar 2007) Log Message: ----------- [ 1675883 ] Add Pos Method to MutableBuffer Class Adding both pos() and lastpos() Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/MutableBufferClass.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/MutableBufferClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/MutableBufferClass.hpp 2007-03-17 23:36:32 UTC (rev 158) +++ interpreter-3.x/trunk/kernel/classes/MutableBufferClass.hpp 2007-03-18 00:13:00 UTC (rev 159) @@ -78,6 +78,8 @@ RexxMutableBuffer *overlay(RexxObject*, RexxObject*, RexxObject*, RexxObject*); RexxMutableBuffer *mydelete(RexxObject*, RexxObject*); RexxString *substr(RexxInteger *startPosition, RexxInteger *len, RexxString *pad) { return this->data->substr(startPosition,len,pad); } + RexxInteger *lastPos(RexxString *needle, RexxInteger *start) { return this->data->lastPos(needle, start); } + RexxInteger *posRexx(RexxString *needle, RexxInteger *start) { return this->data->posRexx(needle, start); } RexxString *subchar(RexxInteger *startPosition) { return this->data->subchar(startPosition); } RexxInteger *getBufferSize() { return new_integer(bufferLength); } Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-03-17 23:36:32 UTC (rev 158) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-03-18 00:13:00 UTC (rev 159) @@ -406,6 +406,8 @@ CPPMMUTB(RexxMutableBuffer::mydelete), CPPMMUTB(RexxMutableBuffer::substr), CPPMMUTB(RexxMutableBuffer::subchar), +CPPMMUTB(RexxMutableBuffer::posRexx), +CPPMMUTB(RexxMutableBuffer::lastPos), CPPMMUTB(RexxMutableBuffer::getBufferSize), CPPMMUTB(RexxMutableBuffer::setBufferSize), CPPMMUTB(RexxMutableBuffer::uninitMB), @@ -1212,6 +1214,8 @@ defineKernelMethod(CHAR_OVERLAY ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::overlay), 4); defineKernelMethod(CHAR_DELETE ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::mydelete), 2); defineKernelMethod(CHAR_SUBSTR ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::substr), 3); + defineKernelMethod(CHAR_POS ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::posRexx), 2); + defineKernelMethod(CHAR_LASTPOS ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::lastPos), 2); defineKernelMethod(CHAR_SUBCHAR ,TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::subchar), 1); defineKernelMethod(CHAR_GETBUFFERSIZE , TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::getBufferSize), 0); defineKernelMethod(CHAR_SETBUFFERSIZE , TheMutableBufferBehaviour, CPPMMUTB(RexxMutableBuffer::setBufferSize), 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-03-18 22:57:37
|
Revision: 164 http://svn.sourceforge.net/oorexx/?rev=164&view=rev Author: bigrixx Date: 2007-03-18 11:09:14 -0700 (Sun, 18 Mar 2007) Log Message: ----------- [ 1659861 ] Add a class like the Java Peroperties class. Initial checkin Modified Paths: -------------- interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h interpreter-3.x/trunk/kernel/messages/rexxmsg.xml interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp Modified: interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx =================================================================== --- interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx 2007-03-18 14:09:53 UTC (rev 163) +++ interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx 2007-03-18 18:09:14 UTC (rev 164) @@ -55,11 +55,13 @@ .Bag~!REXXDefined .Alarm~!REXXDefined .CircularQueue~!REXXDEfined +.Properties~!REXXDEfined .environment~setentry('MONITOR', .Monitor) .environment~setentry('SET', .Set) .environment~setentry('BAG', .Bag) .environment~setentry('CIRCULARQUEUE', .CircularQueue) +.environment~setentry('PROPERTIES', .Properties) parse version a b c /* if no thread support, no alarm class */ if '6.00' <= b then @@ -1101,3 +1103,188 @@ syntax: raise propagate + +::CLASS Properties subclass Directory public +::METHOD load class + use arg input + properties = .properties~new + forward to (properties) continue + return properties + + +::METHOD load + use arg input + + if (arg() > 1) then -- too many arguments given? + raise syntax 93.902 array (1) -- raise an error + + if arg(1, 'o') then + raise syntax 93.903 array (1) -- raise an error + + signal on notready + + do forever + line = input~linein~strip('L') + -- ignore comment lines + if line == "" | line~substr(1, 2) == "--" then + iterate + parse var line name '=' value + name = name~strip + + self~put(value, name) + + end + -- hit EOF, just return + notready: + return + +::METHOD save + use arg output + + if (arg() > 1) then -- too many arguments given? + raise syntax 93.902 array (1) -- raise an error + + if arg(1, 'o') then + raise syntax 93.903 array (1) -- raise an error + + supplier = self~supplier + + do while supplier~available + name = supplier~index + value = supplier~item + + output~lineout(name||"="||value) + + supplier~next + end + + +::METHOD setProperty + use arg name, value + + if (arg() > 2) then -- too many arguments given? + raise syntax 93.902 array (2) -- raise an error + + if arg(1, 'o') then + raise syntax 93.903 array (1) -- raise an error + + if arg(2, 'o') then + raise syntax 93.903 array (2) -- raise an error + + value = value~request('STRING') + + if .nil == value then do + raise syntax 93.938 array (2) -- raise an error + end + + self~put:super(value, name) + + +::METHOD getProperty + use arg name, default + + if (arg() > 2) then -- too many arguments given? + raise syntax 93.902 array (2) -- raise an error + + if arg(1, 'o') then + raise syntax 93.903 array (1) -- raise an error + + value = self~at(name) + if .nil == value then do + if arg(2, 'e') then + value = default + end + + return value + +::METHOD setWhole + args = arg(1, 'A') + + if \args~hasIndex(2) then + raise syntax 93.903 array (2) -- raise an error + + if \datatype(args[2], 'W') then + raise syntax 93.905 array (2, args[2]) -- raise an error + + forward message 'SETPROPERTY' + + +::METHOD getWhole + forward message 'GETPROPERTY' continue + + value = result + if \datatype(value, 'W') then + raise syntax 26.901 array (value) -- raise an error + + return value + + +::METHOD setLogical + args = arg(1, 'A') + + if \args~hasIndex(2) then + raise syntax 93.903 array (2) -- raise an error + + if \datatype(args[2], 'O') then + raise syntax 34.901 array (2, args[2]) -- raise an error + + if args[2] then + args[2] = "true" + else + args[2] = "false" + + forward message 'SETPROPERTY' arguments (args) + + +::METHOD getLogical + forward message 'GETPROPERTY' continue + + value = result + if value == '1' | value == 'true' then + return .true + else if value == '0' | value == 'false' then + return .false + raise syntax 26.901 array (value) -- raise an error + + +::METHOD "[]=" + use arg value, name + + if (arg() > 2) then -- too many arguments given? + raise syntax 93.902 array (2) -- raise an error + + if arg(1, 'o') then + raise syntax 93.903 array (1) -- raise an error + + if arg(2, 'o') then + raise syntax 93.903 array (2) -- raise an error + + value = value~request('STRING') + + if .nil == value then do + raise syntax 93.938 array (1) -- raise an error + end + + forward class (super) array (value, name) + + +::METHOD put + use arg value, name + + if (arg() > 2) then -- too many arguments given? + raise syntax 93.902 array (2) -- raise an error + + if arg(1, 'o') then + raise syntax 93.903 array (1) -- raise an error + + if arg(2, 'o') then + raise syntax 93.903 array (2) -- raise an error + + value = value~request('STRING') + + if .nil == value then do + raise syntax 93.938 array (1) -- raise an error + end + + forward class (super) array (value, name) + Modified: interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h =================================================================== --- interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h 2007-03-18 14:09:53 UTC (rev 163) +++ interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h 2007-03-18 18:09:14 UTC (rev 164) @@ -215,6 +215,7 @@ #define Error_Invalid_whole_number_trace 26007 #define Error_Invalid_whole_number_intdiv 26011 #define Error_Invalid_whole_number_rem 26012 +#define Error_Invalid_whole_number_method 26901 #define Error_Invalid_whole_number_user_defined 26900 #define Error_Invalid_do 27000 #define Error_Invalid_do_whileuntil 27001 @@ -256,6 +257,7 @@ #define Error_Logical_value_method 34901 #define Error_Logical_value_guard 34902 #define Error_Logical_value_authorization 34903 +#define Error_Logical_value_property 34904 #define Error_Invalid_expression 35000 #define Error_Invalid_expression_general 35001 #define Error_Invalid_expression_user_defined 35900 Modified: interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h =================================================================== --- interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h 2007-03-18 14:09:53 UTC (rev 163) +++ interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h 2007-03-18 18:09:14 UTC (rev 164) @@ -576,6 +576,8 @@ #define Error_Execution_user_defined_msg 647 #define Error_Translation_user_defined_msg 648 #define Error_Unmatched_quote_user_defined_msg 649 +#define Error_Invalid_whole_number_method_msg 650 +#define Error_Logical_value_property_msg 651 #endif Modified: interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h =================================================================== --- interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h 2007-03-18 14:09:53 UTC (rev 163) +++ interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h 2007-03-18 18:09:14 UTC (rev 164) @@ -217,6 +217,7 @@ MINOR(Error_Invalid_whole_number_trace) MINOR(Error_Invalid_whole_number_intdiv) MINOR(Error_Invalid_whole_number_rem) + MINOR(Error_Invalid_whole_number_method) MINOR(Error_Invalid_whole_number_user_defined) MAJOR(Error_Invalid_do) MINOR(Error_Invalid_do_whileuntil) @@ -258,6 +259,7 @@ MINOR(Error_Logical_value_method) MINOR(Error_Logical_value_guard) MINOR(Error_Logical_value_authorization) + MINOR(Error_Logical_value_property) MAJOR(Error_Invalid_expression) MINOR(Error_Invalid_expression_general) MINOR(Error_Invalid_expression_user_defined) Modified: interpreter-3.x/trunk/kernel/messages/rexxmsg.xml =================================================================== --- interpreter-3.x/trunk/kernel/messages/rexxmsg.xml 2007-03-18 14:09:53 UTC (rev 163) +++ interpreter-3.x/trunk/kernel/messages/rexxmsg.xml 2007-03-18 18:09:14 UTC (rev 164) @@ -1591,6 +1591,15 @@ </SubMessage> <SubMessage> <Code>26</Code> + <Subcode>901</Subcode> + <MessageNumber>650</MessageNumber> + <Component>Rexx</Component> + <Severity>Warning</Severity> + <SymbolicName>Error_Invalid_whole_number_method</SymbolicName> + <Text>Result of a method call did not result in a whole number; found <q><Sub position="1" name="value"/></q></Text> + </SubMessage> + <SubMessage> + <Code>26</Code> <Subcode>900</Subcode> <MessageNumber>625</MessageNumber> <Component>Rexx</Component> @@ -1980,6 +1989,15 @@ <SymbolicName>Error_Logical_value_authorization</SymbolicName> <Text>Authorization return value must be exactly <q>0</q> or <q>1</q>; found <q><Sub position="1" name="value"/></q></Text> </SubMessage> + <SubMessage> + <Code>34</Code> + <Subcode>904</Subcode> + <MessageNumber>651</MessageNumber> + <Component>Rexx</Component> + <Severity>Warning</Severity> + <SymbolicName>Error_Logical_value_property</SymbolicName> + <Text>Property logical value must be exactly <q>0</q>, <q>1</q>, <q>true</q>, or <q>false</q>; found <q><Sub position="1" name="value"/></q></Text> + </SubMessage> </Subcodes> </Message> <Message> Modified: interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc =================================================================== --- interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc 2007-03-18 14:09:53 UTC (rev 163) +++ interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc 2007-03-18 18:09:14 UTC (rev 164) @@ -576,6 +576,8 @@ Error_Execution_user_defined "&1" Error_Translation_user_defined "&1" Error_Unmatched_quote_user_defined "&1" + Error_Invalid_whole_number_method "Result of a method call did not result in a whole number; found ""&1""" + Error_Logical_value_property "Property logical value must be exactly ""0"", ""1"", ""true"", or ""false""; found ""&1""" END Modified: interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp 2007-03-18 14:09:53 UTC (rev 163) +++ interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp 2007-03-18 18:09:14 UTC (rev 164) @@ -67,7 +67,7 @@ #define SaveStackSize 20 /* newly created objects to save */ #define SaveStackAllocSize 500 /* pre-allocation for save stack */ -#define MaxImageSize 500000 /* maximum startup image size */ +#define MaxImageSize 600000 /* maximum startup image size */ /* Local and global memory Pools */ /* last one accessed. */ @@ -1243,6 +1243,12 @@ /* address the copy in the image */ bufferReference = (RexxObject *)(image_buffer + image_offset); + // we allocated a hard coded buffer, so we need to make sure we don't blow + // the buffer size. + if (image_offset + size> MaxImageSize) + { + logic_error("Rexx saved image exceeds expected maximum"); + } /* Copy object to image buffer. */ memcpy(bufferReference, markObject, size); /* clear the mark in the copy */ @@ -1441,7 +1447,7 @@ saveArray->put(primitive_behaviours, saveArray_PBEHAV); image_buffer = (char *)malloc(MaxImageSize); - image_offset = sizeof(long); + image_offset = sizeof(size_t); saveimage = TRUE; disableOrefChecks(); /* Don't try to check OrefSets now. */ bumpMarkWord(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-03-18 23:13:38
|
Revision: 167 http://svn.sourceforge.net/oorexx/?rev=167&view=rev Author: bigrixx Date: 2007-03-18 15:58:44 -0700 (Sun, 18 Mar 2007) Log Message: ----------- [ 1683291 ] Add an "instanceof" capability to the .object class. Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/ClassClass.cpp interpreter-3.x/trunk/kernel/classes/ClassClass.hpp interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp interpreter-3.x/trunk/kernel/classes/NumberStringClass.cpp interpreter-3.x/trunk/kernel/classes/NumberStringClass.hpp interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/ClassClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ClassClass.cpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/classes/ClassClass.cpp 2007-03-18 22:58:44 UTC (rev 167) @@ -1734,6 +1734,42 @@ this->metaClassScopes->add(this->metaClassScopes->allAt(TheNilObject), metaClass); } + +/** + * Test if the target class is a "compatible" with the argument + * class. To be compatible, the target class must either A) + * be the same class, B) be a direct subclass of the argument + * class, or C) inherit the argument class as a mixin. This + * rule gets applied recursively down the hierarchy. + * + * @param other The comparison class. + * + * @return True if the two classes are compatible, false otherwise. + */ +bool RexxClass::isCompatibleWith(RexxClass *other) +{ + // if asking for a match here, this is true + if (other == this) + { + return true; + } + + // if this is .object, there are no superclasses. Otherwise, ask each of the superclasses + // the same question. + if (instanceSuperClasses != OREF_NULL) + { + for (size_t i = 1; i <= instanceSuperClasses->size(); i++) + { + if (((RexxClass *)instanceSuperClasses->get(i))->isCompatibleWith(other)) + { + return true; + } + } + } + return false; +} + + void *RexxClass::operator new(size_t size, long size1, /* additional size */ RexxBehaviour *class_behaviour, /* new class behaviour */ Modified: interpreter-3.x/trunk/kernel/classes/ClassClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ClassClass.hpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/classes/ClassClass.hpp 2007-03-18 22:58:44 UTC (rev 167) @@ -112,6 +112,7 @@ RexxClass *newRexx(RexxObject **args, size_t argCount); void setMetaClass(RexxClass *); RexxClass *external(RexxString *, RexxClass *, RexxTable *); + bool isCompatibleWith(RexxClass *other); inline BOOL rexxDefined() { return this->class_info & REXX_DEFINED; }; inline BOOL imported() { return this->class_info & IMPORTED; } Modified: interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp 2007-03-18 22:58:44 UTC (rev 167) @@ -285,6 +285,20 @@ return this->stringValue()->sendMessage(msgname, arguments); } + +/** + * Override for the normal isinstanceof method. This version + * allows the IntegerClass to "lie" about being a string. + * + * @param other The comparison class + * + * @return True if the string value is an instance of the target class. + */ +bool RexxInteger::isInstanceOf(RexxClass *other) +{ + return stringValue()->isInstanceOf(other); +} + RexxString *RexxInteger::concatBlank( RexxString *other ) /* other object for concatenation */ /******************************************************************************/ Modified: interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp 2007-03-18 22:58:44 UTC (rev 167) @@ -69,6 +69,7 @@ RexxString *primitiveMakeString(); RexxString *stringValue(); BOOL truthValue(LONG); + bool isInstanceOf(RexxClass *); BOOL isEqual(RexxObject *); long strictComp(RexxObject *); Modified: interpreter-3.x/trunk/kernel/classes/NumberStringClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/NumberStringClass.cpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/classes/NumberStringClass.cpp 2007-03-18 22:58:44 UTC (rev 167) @@ -1510,6 +1510,21 @@ return send_message((RexxObject *)this->stringValue(), msgname, arguments); } + +/** + * Override for the normal isinstanceof method. This version + * allows the NumberStringClass to "lie" about being a string. + * + * @param other The comparison class + * + * @return True if the string value is an instance of the target class. + */ +bool RexxNumberString::isInstanceOf(RexxClass *other) +{ + return stringValue()->isInstanceOf(other); +} + + RexxString *RexxNumberString::concatBlank(RexxObject *other) /******************************************************************************/ /* Function: Blank concatenation operator */ Modified: interpreter-3.x/trunk/kernel/classes/NumberStringClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/NumberStringClass.hpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/classes/NumberStringClass.hpp 2007-03-18 22:58:44 UTC (rev 167) @@ -148,6 +148,7 @@ RexxObject *trunc(RexxObject *); RexxObject *truncInternal(size_t); RexxObject *unknown(RexxString *, RexxArray *); + bool isInstanceOf(RexxClass *); inline RexxNumberString *checkNumber(size_t digits, BOOL rounding) { if (this->length > digits) /* is the length larger than digits()*/ Modified: interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp 2007-03-18 22:58:44 UTC (rev 167) @@ -145,6 +145,49 @@ return this->sendMessage(OREF_STRICT_EQUAL, other)->truthValue(Error_Logical_value_method); } + +/** + * Test if an internal object is an instance of another class. + * + * @param other The test class. + * + * @return Always returns false. + */ +bool RexxInternalObject::isInstanceOf(RexxClass *other) +{ + // internal classes always fail this + return false; +} + + +/** + * Test if a Rexx object is an instance of a given class. + * + * @param other The other test class. + * + * @return True if this object is an instance of the target class, false otherwise. + */ +bool RexxObject::isInstanceOf(RexxClass *other) +{ + return classObject()->isCompatibleWith(other); +} + + +/** + * The Rexx external version of the instance of. + * + * @param other The other test class. + * + * @return .true if this class is an instance of the target class. .false + * otherwise. + */ +RexxObject *RexxObject::isInstanceOfRexx(RexxClass *other) +{ + required_arg(other, ONE); + return isInstanceOf(other) ? TheTrueObject : TheFalseObject; +} + + RexxObject * RexxObject::strictEqual( RexxObject * other) /* other object for comparison */ /******************************************************************************/ Modified: interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp 2007-03-18 22:58:44 UTC (rev 167) @@ -112,6 +112,7 @@ virtual double doubleValueNoNOSTRING() { return this->doubleValue();}; virtual BOOL isEqual(RexxObject *); + virtual bool isInstanceOf(RexxClass *); RexxObject *hasUninit(); void removedUninit(); @@ -215,6 +216,8 @@ LONG requiredNonNegative(LONG, size_t precision=DEFAULT_DIGITS); BOOL isEqual(RexxObject *); + bool isInstanceOf(RexxClass *); + RexxObject *isInstanceOfRexx(RexxClass *); RexxString *objectName(); RexxObject *objectNameEquals(RexxObject *); RexxClass *classObject(); Modified: interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-03-18 22:58:44 UTC (rev 167) @@ -163,6 +163,7 @@ CHARCONSTANT(INTEGER, "INTEGER"); CHARCONSTANT(INTERFACE, "INTERFACE"); CHARCONSTANT(INTNAME, "INTNAME"); +CHARCONSTANT(ISINSTANCEOF, "ISINSTANCEOF"); CHARCONSTANT(ITEM, "ITEM"); CHARCONSTANT(ITEMS, "ITEMS"); CHARCONSTANT(KERNEL, "KERNEL"); Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-03-18 21:59:38 UTC (rev 166) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-03-18 22:58:44 UTC (rev 167) @@ -102,6 +102,7 @@ CPPM(RexxObject::copyRexx), CPPM(RexxObject::defaultNameRexx), CPPM(RexxObject::unknownRexx), +CPPM(RexxObject::isInstanceOfRexx), CPPM(RexxObject::initProxyRexx), CPPM(RexxObject::freeSOMObjRexx), CPPM(RexxObject::SOMObjRexx), @@ -775,6 +776,7 @@ defineKernelMethod(CHAR_START ,TheObjectBehaviour, CPPM(RexxObject::start), A_COUNT); defineKernelMethod(CHAR_STARTAT ,TheObjectBehaviour, CPPM(RexxObject::startAt), A_COUNT); defineKernelMethod(CHAR_STRING ,TheObjectBehaviour, CPPM(RexxObject::stringRexx), 0); + defineKernelMethod(CHAR_ISINSTANCEOF ,TheObjectBehaviour, CPPM(RexxObject::isInstanceOfRexx), 1); definePrivateKernelMethod(CHAR_RUN ,TheObjectBehaviour, CPPM(RexxObject::run), A_COUNT); definePrivateKernelMethod(CHAR_SETMETHOD ,TheObjectBehaviour, CPPM(RexxObject::setMethod), 3); definePrivateKernelMethod(CHAR_UNSETMETHOD ,TheObjectBehaviour, CPPM(RexxObject::unsetMethod), 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-02 16:18:40
|
Revision: 209 http://svn.sourceforge.net/oorexx/?rev=209&view=rev Author: bigrixx Date: 2007-04-02 09:18:40 -0700 (Mon, 02 Apr 2007) Log Message: ----------- [ 1668426 ] Add putAll() methods to non-ordered collections. [ 1668423 ] Add append methods to array, list, and queue Modified Paths: -------------- interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp interpreter-3.x/trunk/kernel/classes/ListClass.cpp interpreter-3.x/trunk/kernel/classes/ListClass.hpp interpreter-3.x/trunk/kernel/classes/QueueClass.cpp interpreter-3.x/trunk/kernel/classes/QueueClass.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx =================================================================== --- interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx 2007-04-02 16:18:40 UTC (rev 209) @@ -50,6 +50,23 @@ .kernel~objectname = "The kernel directory" .nil~objectname = "The NIL object" +say 'Adding appendAll method to ARRAY, LIST and QUEUE' +appendMethods = .table~new +appendMethods~put(.methods~ordered_appendall, 'APPENDALL') + +.array~!define_methods(appendMethods) +.list~!define_methods(appendMethods) +.queue~!define_methods(appendMethods) + +say 'Adding putAll methods to TABLE, DIRECTORY, and RELATION' +putMethods = .table~new +putMethods~put(.methods~collection_putall, 'PUTALL') + +.table~!define_methods(putMethods) +.directory~!define_methods(putMethods) +.relation~!define_methods(putMethods) + + say ('Adding setlike methods to table, relation, and directory') set_methods = .table~new /* get a table directory */ /* add the single item methods */ @@ -73,6 +90,9 @@ .table~!rexxdefined /* get changed by users */ .directory~!rexxdefined .relation~!rexxdefined +.array~!rexxdefined +.list~!rexxdefined +.queue~!rexxdefined /* Call the system dependant routine to define addition methods */ systemMethods = 'SystemMethods.orx'() /* case sensitive */ @@ -540,6 +560,41 @@ raise propagate /* just send on to the caller */ + +/*****************************************/ +/* APPENDALL method */ +/*****************************************/ +::method ordered_appendall + use arg other + if (arg() < 1) /* no index given? */ + then raise syntax 93.901 array (1) /* raise an error */ + if (arg() > 1) /* too many arguments? */ + then raise syntax 93.902 array (1) /* raise an error */ + supplier = other~supplier /* get an other supplier */ + do while supplier~available /* loop over the other collection */ + self~append(supplier~item) -- appending the item + supplier~next + end + + + +/*****************************************/ +/* PUTALL method */ +/*****************************************/ +::method collection_putall + use arg other + if (arg() < 1) /* no index given? */ + then raise syntax 93.901 array (1) /* raise an error */ + if (arg() > 1) /* too many arguments? */ + then raise syntax 93.902 array (1) /* raise an error */ + supplier = other~supplier /* get an other supplier */ + do while supplier~available /* loop over the other collection */ + self~put(supplier~item, supplier~index) -- putting the item using the same index + supplier~next + end + + + /* ******************************** */ /* S E R V E R M E T H O D S */ /* ******************************** */ Modified: interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx =================================================================== --- interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx 2007-04-02 16:18:40 UTC (rev 209) @@ -334,6 +334,23 @@ syntax: /* unknown method sent */ raise propagate /* just send on to the caller */ + +/*****************************************/ +/* PUTALL method */ +/*****************************************/ +::method putall + use arg other + if (arg() < 1) /* no index given? */ + then raise syntax 93.901 array (1) /* raise an error */ + if (arg() > 1) /* too many arguments? */ + then raise syntax 93.902 array (1) /* raise an error */ + supplier = other~supplier /* get an other supplier */ + do while supplier~available /* loop over the other collection */ + self~put(supplier~item) -- set and bag only use the item, ignoring the index. + supplier~next + end + + /* *************************************** */ /* B A G C L A S S */ /* *************************************** */ @@ -482,6 +499,22 @@ syntax: /* unknown method sent */ raise propagate /* just send on to the caller */ + +/*****************************************/ +/* PUTALL method */ +/*****************************************/ +::method putall + use arg other + if (arg() < 1) /* no index given? */ + then raise syntax 93.901 array (1) /* raise an error */ + if (arg() > 1) /* too many arguments? */ + then raise syntax 93.902 array (1) /* raise an error */ + supplier = other~supplier /* get an other supplier */ + do while supplier~available /* loop over the other collection */ + self~put(supplier~item) -- set and bag only use the item, ignoring the index. + supplier~next + end + /* ******************************** */ /* A L A R M C L A S S */ /* ******************************** */ Modified: interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp 2007-04-02 16:18:40 UTC (rev 209) @@ -194,6 +194,39 @@ return OREF_NULL; /* Make sure RESULT gets dropped */ } + +/** + * Append an item after the last item in the array. + * + * @param value The value to append. + * + * @return The index of the appended item. + */ +RexxObject *RexxArray::append(RexxObject *value) +{ + required_arg(value, ONE); + + RexxObject *lastIndex = lastRexx(); + + size_t newIndex; + + // empty array, so just insert at the first element + if (lastIndex == TheNilObject) + { + newIndex = 1; + } + else + { + // the index requires validation + newIndex = ((RexxInteger *)lastIndex)->value + 1; + } + + ensureSpace(newIndex); + put(value, newIndex); + return new_integer(newIndex); +} + + RexxObject *RexxArray::getRexx(RexxObject **arguments, size_t argCount) /******************************************************************************/ /* Function: Performs REXX-level gets from arrays. */ @@ -631,6 +664,30 @@ return position; /* return the position */ } + +/** + * Make sure that the array has been expanded to sufficient + * size for a primitive put operation. + * + * @param newSize The new required size. + */ +void RexxArray::ensureSpace(size_t newSize) +{ + /* out of bounds? */ + if (newSize > this->size()) + { + if (newSize >= MAX_FIXEDARRAY_SIZE) + { + report_exception(Error_Incorrect_method_array_too_big); + } + /* yes, compute amount to expand */ + this->extend(newSize - this->size()); + + } +} + + + RexxInteger *RexxArray::sizeRexx() /******************************************************************************/ /* Function: Return the array size as an integer object */ Modified: interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp 2007-04-02 16:18:40 UTC (rev 209) @@ -98,6 +98,7 @@ RexxObject *putRexx(RexxObject **, size_t); RexxObject *remove(size_t); RexxObject *removeRexx(RexxObject **, size_t); + RexxObject *append(RexxObject *); void setExpansion(RexxObject * expansion); RexxInteger *available(size_t position); size_t validateIndex(RexxObject **, size_t, size_t, size_t); @@ -126,6 +127,7 @@ void insertItem(RexxObject *, size_t); RexxArray *extendMulti(RexxObject **, size_t, size_t); void resize(); + void ensureSpace(size_t newSize); RexxObject *newRexx(RexxObject **, size_t); RexxObject *of(RexxObject **, size_t); Modified: interpreter-3.x/trunk/kernel/classes/ListClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ListClass.cpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/ListClass.cpp 2007-04-02 16:18:40 UTC (rev 209) @@ -453,6 +453,22 @@ return this->insert(value, index); } + +/** + * Append an item after the last item in the list. + * + * @param value The value to append. + * + * @return The index of the appended item. + */ +RexxObject *RexxList::append(RexxObject *value) +{ + required_arg(value, ONE); + // this is just an insertion operation with an ommitted index. + return insert(value, OREF_NULL); +} + + RexxObject *RexxList::insert( RexxObject *value, /* new value to add */ RexxObject *index) /* addition insertion index */ Modified: interpreter-3.x/trunk/kernel/classes/ListClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-04-02 16:18:40 UTC (rev 209) @@ -104,6 +104,7 @@ void addLast(RexxObject *value); void addFirst(RexxObject *value); inline long getSize() {return this->count;} + RexxObject *append(RexxObject *); RexxListTable *table; /* list table item */ long first; /* first real element index */ Modified: interpreter-3.x/trunk/kernel/classes/QueueClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/QueueClass.cpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/QueueClass.cpp 2007-04-02 16:18:40 UTC (rev 209) @@ -59,6 +59,7 @@ item = TheNilObject; /* use .nil instead */ return item; /* return the pulled item */ } + RexxObject *RexxQueue::pushRexx(RexxObject *item) /* item to push onto the queue */ /******************************************************************************/ @@ -71,6 +72,25 @@ return OREF_NULL; /* return nothing */ } + + +/** + * Append an item after the last item in the list. + * + * @param value The value to append. + * + * @return The index of the appended item. + */ +RexxObject *RexxQueue::append(RexxObject *item) +{ + + required_arg(item, ONE); /* make sure we have an argument */ + this->push(item); /* push onto the queue */ + // the insertion index is the position. + return new_integer(this->count); +} + + RexxObject *RexxQueue::queueRexx(RexxObject *item) /******************************************************************************/ /* Function: Push an item onto the queue */ Modified: interpreter-3.x/trunk/kernel/classes/QueueClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/QueueClass.hpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/QueueClass.hpp 2007-04-02 16:18:40 UTC (rev 209) @@ -36,7 +36,7 @@ /* */ /*----------------------------------------------------------------------------*/ /******************************************************************************/ -/* REXX Kernel QueueClass.hpp */ +/* REXX Kernel QueueClass.hpp */ /* */ /* Primitive Queue Class Definitions */ /* */ @@ -64,6 +64,7 @@ RexxObject *peek(); RexxObject *supplier(); RexxObject *newRexx(RexxObject **, size_t); + RexxObject *append(RexxObject *); inline RexxObject *pop() { return this->removeFirst();}; inline void push(RexxObject *obj) { this->addFirst(obj);}; Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-02 16:18:40 UTC (rev 209) @@ -153,6 +153,7 @@ CPPMA(RexxArray::lastRexx), CPPMA(RexxArray::nextRexx), CPPMA(RexxArray::previousRexx), +CPPMA(RexxArray::append), CPPMC1(RexxArray::newRexx), CPPMA(RexxArray::makeString), @@ -220,6 +221,7 @@ CPPML(RexxList::firstItem), CPPML(RexxList::lastItem), CPPML(RexxList::insertRexx), +CPPML(RexxList::append), CPPMLC(RexxListClass::newRexx), CPPMLC(RexxListClass::classOf), @@ -292,6 +294,7 @@ CPPMQ(RexxQueue::at), CPPMQ(RexxQueue::hasindex), CPPMQ(RexxQueue::remove), +CPPML(RexxQueue::append), CPPMQ(RexxQueue::newRexx), @@ -817,6 +820,7 @@ defineKernelMethod(CHAR_LAST ,TheArrayBehaviour, CPPMA(RexxArray::lastRexx), 0); defineKernelMethod(CHAR_NEXT ,TheArrayBehaviour, CPPMA(RexxArray::nextRexx), 1); defineKernelMethod(CHAR_PREVIOUS ,TheArrayBehaviour, CPPMA(RexxArray::previousRexx), 1); + defineKernelMethod(CHAR_APPEND ,TheArrayBehaviour, CPPMA(RexxArray::append), 1); defineKernelMethod(CHAR_MAKESTRING ,TheArrayBehaviour, CPPMA(RexxArray::makeString), 1); /*THU006*/ /* set the scope of the methods to */ /* this classes oref */ @@ -909,6 +913,7 @@ defineKernelMethod(CHAR_REMOVE ,TheListBehaviour, CPPML(RexxList::remove), 1); defineKernelMethod(CHAR_SECTION ,TheListBehaviour, CPPML(RexxList::section), 2); defineKernelMethod(CHAR_SUPPLIER ,TheListBehaviour, CPPML(RexxList::supplier), 0); + defineKernelMethod(CHAR_APPEND ,TheListBehaviour, CPPMA(RexxList::append), 1); /* set the scope of the methods to */ /* this classes oref */ TheListBehaviour->setMethodDictionaryScope(TheListClass); @@ -1009,6 +1014,7 @@ defineKernelMethod(CHAR_HASINDEX ,TheQueueBehaviour, CPPMQ(RexxQueue::hasindex), 1); defineKernelMethod(CHAR_PUT ,TheQueueBehaviour, CPPMQ(RexxQueue::put), 2); defineKernelMethod(CHAR_REMOVE ,TheQueueBehaviour, CPPMQ(RexxQueue::remove), 1); + defineKernelMethod(CHAR_APPEND ,TheQueueBehaviour, CPPMA(RexxQueue::append), 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...> - 2007-04-02 22:15:19
|
Revision: 211 http://svn.sourceforge.net/oorexx/?rev=211&view=rev Author: bigrixx Date: 2007-04-02 15:15:20 -0700 (Mon, 02 Apr 2007) Log Message: ----------- [ 1665257 ] Allow expressions inside variable parse templates. [ 1667085 ] Add a true length operation to parse Modified Paths: -------------- interpreter-3.x/trunk/kernel/instructions/ParseTarget.cpp interpreter-3.x/trunk/kernel/instructions/ParseTarget.hpp interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp interpreter-3.x/trunk/kernel/instructions/ParseTrigger.hpp interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.hpp Modified: interpreter-3.x/trunk/kernel/instructions/ParseTarget.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/ParseTarget.cpp 2007-04-02 16:21:48 UTC (rev 210) +++ interpreter-3.x/trunk/kernel/instructions/ParseTarget.cpp 2007-04-02 22:15:20 UTC (rev 211) @@ -162,6 +162,23 @@ this->subcurrent = this->start; /* set the subpiece pointer */ } +void RexxTarget::forwardLength( + long offset) /* offset to move */ +/******************************************************************************/ +/* Arguments: distance to move the parse pointer */ +/******************************************************************************/ +{ + this->start = this->pattern_start; /* start position is last position */ + this->end = this->start + offset; /* set the end position */ + if (this->end >= this->string_length)/* take us past the end? */ + this->end = this->string_length; /* just use the end position */ + this->pattern_start = this->end; /* this is new start position */ + /* and have a zero length pattern */ + this->pattern_end = this->pattern_start; + this->subcurrent = this->start; /* set the subpiece pointer */ +} + + void RexxTarget::absolute( long offset) /* offset to move */ /******************************************************************************/ @@ -216,6 +233,31 @@ this->subcurrent = this->start; /* set the subpiece pointer */ } + +void RexxTarget::backwardLength( + long offset) /* offset to move */ +/******************************************************************************/ +/* Arguments: distance to move the parse pointer */ +/******************************************************************************/ +{ + this->start = this->pattern_start; /* start position is last position */ + this->end = this->string_length; /* negatives always use to the end */ + /* go past start of string? */ + if ((size_t)offset > this->pattern_start) + { + this->start = 0; + } + else + { + this->start = this->pattern_start - (size_t)offset; + } + this->end = this->pattern_start; // the end is the starting location + /* and have a zero length pattern */ + this->pattern_end = this->pattern_start; + this->subcurrent = this->start; /* set the subpiece pointer */ +} + + void RexxTarget::search( RexxString *string) /* target search string */ /******************************************************************************/ Modified: interpreter-3.x/trunk/kernel/instructions/ParseTarget.hpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/ParseTarget.hpp 2007-04-02 16:21:48 UTC (rev 210) +++ interpreter-3.x/trunk/kernel/instructions/ParseTarget.hpp 2007-04-02 22:15:20 UTC (rev 211) @@ -57,8 +57,10 @@ void next(RexxActivation *); void moveToEnd(); void forward(long); + void forwardLength(long); void absolute(long); void backward(long); + void backwardLength(long); void search(RexxString *); void caselessSearch(RexxString *); RexxString *getWord(); Modified: interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp 2007-04-02 16:21:48 UTC (rev 210) +++ interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp 2007-04-02 22:15:20 UTC (rev 211) @@ -67,15 +67,17 @@ OrefSet(this, this->variables[--variableCount], (RexxVariableBase *)variables->pop()); } -long RexxTrigger::integer( - RexxObject *value) /* value to be converted */ + +long RexxTrigger::integerTrigger( + RexxObject *value, /* value to be converted */ + RexxActivation *context, /* current execution context */ + RexxExpressionStack *stack) /* current expression stack */ /******************************************************************************/ /* Function: Convert a trigger value to an integer, with appopriate error */ /* reporting. */ /******************************************************************************/ { LONG result; /* converted result */ - /* convert the value */ result = REQUEST_LONG(value, NO_LONG); if (result == NO_LONG || result < 0) /* bad value or negative? */ @@ -84,6 +86,21 @@ return result; /* finished */ } + +RexxString *RexxTrigger::stringTrigger( + RexxObject *value, /* value to be converted */ + RexxActivation *context, /* current execution context */ + RexxExpressionStack *stack) /* current expression stack */ +/******************************************************************************/ +/* Function: Convert a trigger expression to a String, with appopriate error */ +/* reporting. */ +/******************************************************************************/ +{ + /* force to string form */ + return REQUEST_STRING(value); +} + + void RexxTrigger::parse( RexxActivation *context, /* current execution context */ RexxExpressionStack *stack, /* current expression stack */ @@ -112,29 +129,39 @@ break; case TRIGGER_PLUS: /* positive relative target */ - integer = this->integer(value); /* get binary version of trigger */ + integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ target->forward(integer); /* move the position */ break; case TRIGGER_MINUS: /* negative relative target */ - integer = this->integer(value); /* get binary version of trigger */ + integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ target->backward(integer); /* move the position */ break; + case TRIGGER_PLUS_LENGTH: /* positive length */ + integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ + target->forwardLength(integer); /* move the position */ + break; + + case TRIGGER_MINUS_LENGTH: /* negative relative target */ + integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ + target->backwardLength(integer); /* move the position */ + break; + case TRIGGER_ABSOLUTE: /* absolute column position */ - integer = this->integer(value); /* get binary version of trigger */ + integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ target->absolute(integer); /* move the position */ break; case TRIGGER_STRING: /* string search */ /* force to string form */ - stringvalue = REQUEST_STRING(value); + stringvalue = this->stringTrigger(value, context, stack); target->search(stringvalue); /* perform the search */ break; case TRIGGER_MIXED: /* string search */ /* force to string form */ - stringvalue = REQUEST_STRING(value); + stringvalue = this->stringTrigger(value, context, stack); /* and go search */ target->caselessSearch(stringvalue); break; Modified: interpreter-3.x/trunk/kernel/instructions/ParseTrigger.hpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/ParseTrigger.hpp 2007-04-02 16:21:48 UTC (rev 210) +++ interpreter-3.x/trunk/kernel/instructions/ParseTrigger.hpp 2007-04-02 22:15:20 UTC (rev 211) @@ -50,6 +50,8 @@ #define TRIGGER_ABSOLUTE 4 #define TRIGGER_STRING 5 #define TRIGGER_MIXED 6 +#define TRIGGER_PLUS_LENGTH 7 +#define TRIGGER_MINUS_LENGTH 8 class RexxTrigger : public RexxInternalObject { public: @@ -57,7 +59,8 @@ inline void *operator new(size_t size, void *ptr) {return ptr;}; RexxTrigger(INT, RexxObject *, LONG, RexxQueue *); inline RexxTrigger(RESTORETYPE restoreType) { ; }; - long integer(RexxObject *); + long integerTrigger(RexxObject *, RexxActivation *, RexxExpressionStack *); + RexxString *stringTrigger(RexxObject *, RexxActivation *, RexxExpressionStack *); void parse(RexxActivation *, RexxExpressionStack *, RexxTarget *); void live(); void liveGeneral(); Modified: interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-02 16:21:48 UTC (rev 210) +++ interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-02 22:15:20 UTC (rev 211) @@ -1396,6 +1396,14 @@ trigger_type = TRIGGER_ABSOLUTE; break; + case OPERATOR_LESSTHAN: // <num or <(var) + trigger_type = TRIGGER_MINUS_LENGTH; + break; + + case OPERATOR_GREATERTHAN: // >num or >(var) + trigger_type = TRIGGER_PLUS_LENGTH; + break; + default: /* something unrecognized */ /* this is invalid */ report_error_token(Error_Invalid_template_trigger, token); @@ -1404,28 +1412,14 @@ token = nextReal(); /* get the next token */ /* have a variable trigger? */ if (token->classId == TOKEN_LEFT) { - token = nextReal(); /* get the next token */ - /* not a symbol? */ - if (token->classId != TOKEN_SYMBOL) - /* must be a symbol here */ - report_error(Error_Symbol_expected_varref); - /* allow also dot symbols here */ - this->needVariableOrDotSymbol(token); /* must have variable form */ + // parse off an expression in the parens. + RexxObject *subExpr = this->parenExpression(); /* create the appropriate trigger */ - trigger = new (variableCount) RexxTrigger(trigger_type, this->addText(token), variableCount, variables); + trigger = new (variableCount) RexxTrigger(trigger_type, subExpr, variableCount, variables); variableCount = 0; /* have a new set of variables */ /* add this to the trigger list */ parse_template->push((RexxObject *)trigger); templateCount++; /* add this one in */ - token = nextReal(); /* get the next token */ - /* nothing following? */ - if (token->classId == TOKEN_EOC) - /* report the missing paren */ - report_error(Error_Variable_reference_missing); - /* must be a right paren here */ - else if (token->classId != TOKEN_RIGHT) - /* this is an error */ - report_error_token(Error_Variable_reference_extra, token); } /* have a symbol? */ else if (token->classId == TOKEN_SYMBOL) { @@ -1451,27 +1445,14 @@ } /* variable string trigger? */ else if (token->classId == TOKEN_LEFT) { - token = nextReal(); /* get the next token */ - /* not a symbol? */ - if (token->classId != TOKEN_SYMBOL) - /* must be a symbol here */ - report_error(Error_Symbol_expected_varref); - /* allow also dot symbols here */ - this->needVariableOrDotSymbol(token); /* check this is a variable form*/ + // parse off an expression in the parens. + RexxObject *subExpr = this->parenExpression(); /* create the appropriate trigger */ - trigger = new (variableCount) RexxTrigger(flags&parse_caseless ? TRIGGER_MIXED : TRIGGER_STRING, this->addText(token), variableCount, variables); + trigger = new (variableCount) RexxTrigger(flags&parse_caseless ? TRIGGER_MIXED : TRIGGER_STRING, subExpr, variableCount, variables); variableCount = 0; /* have a new set of variables */ /* add this to the trigger list */ parse_template->push((RexxObject *)trigger); templateCount++; /* step the counter */ - token = nextReal(); /* get the next token */ - if (token->classId == TOKEN_EOC) /* at the end? */ - /* report the missing paren */ - report_error(Error_Variable_reference_missing); - /* must be a right paren here */ - else if (token->classId != TOKEN_RIGHT) - /* this is an error */ - report_error_token(Error_Variable_reference_extra, token); } else if (token->isLiteral()) { /* non-variable string trigger? */ /* create the appropriate trigger */ Modified: interpreter-3.x/trunk/kernel/parser/SourceFile.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/SourceFile.cpp 2007-04-02 16:21:48 UTC (rev 210) +++ interpreter-3.x/trunk/kernel/parser/SourceFile.cpp 2007-04-02 22:15:20 UTC (rev 211) @@ -3060,6 +3060,29 @@ return expression; /* and return it */ } +RexxObject *RexxSource::parenExpression() +/******************************************************************************/ +/* Function: Evaluate a "parenthetical" expression for REXX instruction */ +/* values. A parenthetical expression is an expression enclosed */ +/* in parentheses. */ +/******************************************************************************/ +{ + RexxToken *token; /* current token */ + RexxToken *second; /* second token */ + RexxObject *expression; /* parse expression */ + + // NB, the opening paren has already been parsed off + + expression = this->subExpression(TERM_EOC | TERM_RIGHT); + second = nextToken(); /* get the terminator token */ + /* not terminated by a right paren? */ + if (second->classId != TOKEN_RIGHT) + /* this is an error */ + report_error_position(Error_Unmatched_parenthesis_paren, token); + this->holdObject(expression); /* protect the expression */ + return expression; /* and return it */ +} + RexxObject *RexxSource::expression( int terminators ) /* expression termination context */ /******************************************************************************/ Modified: interpreter-3.x/trunk/kernel/parser/SourceFile.hpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/SourceFile.hpp 2007-04-02 16:21:48 UTC (rev 210) +++ interpreter-3.x/trunk/kernel/parser/SourceFile.hpp 2007-04-02 22:15:20 UTC (rev 211) @@ -150,6 +150,7 @@ void addBlock(void); RexxVariableBase *getRetriever(RexxString *); RexxObject *constantExpression(); + RexxObject *parenExpression(); RexxObject *expression(int); RexxObject *subExpression(int); size_t argList(RexxToken *, int); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-03 13:43:12
|
Revision: 212 http://svn.sourceforge.net/oorexx/?rev=212&view=rev Author: bigrixx Date: 2007-04-03 06:43:12 -0700 (Tue, 03 Apr 2007) Log Message: ----------- Some cleanup from the previous changes to the parse instruction. Modified Paths: -------------- interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp interpreter-3.x/trunk/kernel/instructions/ParseTrigger.hpp interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.hpp Modified: interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp 2007-04-02 22:15:20 UTC (rev 211) +++ interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp 2007-04-03 13:43:12 UTC (rev 212) @@ -69,9 +69,7 @@ long RexxTrigger::integerTrigger( - RexxObject *value, /* value to be converted */ - RexxActivation *context, /* current execution context */ - RexxExpressionStack *stack) /* current expression stack */ + RexxObject *value) /* value to be converted */ /******************************************************************************/ /* Function: Convert a trigger value to an integer, with appopriate error */ /* reporting. */ @@ -88,9 +86,7 @@ RexxString *RexxTrigger::stringTrigger( - RexxObject *value, /* value to be converted */ - RexxActivation *context, /* current execution context */ - RexxExpressionStack *stack) /* current expression stack */ + RexxObject *value) /* value to be converted */ /******************************************************************************/ /* Function: Convert a trigger expression to a String, with appopriate error */ /* reporting. */ @@ -129,39 +125,39 @@ break; case TRIGGER_PLUS: /* positive relative target */ - integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ + integer = this->integerTrigger(value); /* get binary version of trigger */ target->forward(integer); /* move the position */ break; case TRIGGER_MINUS: /* negative relative target */ - integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ + integer = this->integerTrigger(value); /* get binary version of trigger */ target->backward(integer); /* move the position */ break; case TRIGGER_PLUS_LENGTH: /* positive length */ - integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ + integer = this->integerTrigger(value); /* get binary version of trigger */ target->forwardLength(integer); /* move the position */ break; case TRIGGER_MINUS_LENGTH: /* negative relative target */ - integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ + integer = this->integerTrigger(value); /* get binary version of trigger */ target->backwardLength(integer); /* move the position */ break; case TRIGGER_ABSOLUTE: /* absolute column position */ - integer = this->integerTrigger(value, context, stack); /* get binary version of trigger */ + integer = this->integerTrigger(value); /* get binary version of trigger */ target->absolute(integer); /* move the position */ break; case TRIGGER_STRING: /* string search */ /* force to string form */ - stringvalue = this->stringTrigger(value, context, stack); + stringvalue = this->stringTrigger(value); target->search(stringvalue); /* perform the search */ break; case TRIGGER_MIXED: /* string search */ /* force to string form */ - stringvalue = this->stringTrigger(value, context, stack); + stringvalue = this->stringTrigger(value); /* and go search */ target->caselessSearch(stringvalue); break; Modified: interpreter-3.x/trunk/kernel/instructions/ParseTrigger.hpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/ParseTrigger.hpp 2007-04-02 22:15:20 UTC (rev 211) +++ interpreter-3.x/trunk/kernel/instructions/ParseTrigger.hpp 2007-04-03 13:43:12 UTC (rev 212) @@ -59,8 +59,8 @@ inline void *operator new(size_t size, void *ptr) {return ptr;}; RexxTrigger(INT, RexxObject *, LONG, RexxQueue *); inline RexxTrigger(RESTORETYPE restoreType) { ; }; - long integerTrigger(RexxObject *, RexxActivation *, RexxExpressionStack *); - RexxString *stringTrigger(RexxObject *, RexxActivation *, RexxExpressionStack *); + long integerTrigger(RexxObject *); + RexxString *stringTrigger(RexxObject *); void parse(RexxActivation *, RexxExpressionStack *, RexxTarget *); void live(); void liveGeneral(); Modified: interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-02 22:15:20 UTC (rev 211) +++ interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-03 13:43:12 UTC (rev 212) @@ -1333,7 +1333,6 @@ break; case SUBKEY_VALUE: /* need to process an expression */ -//RI0001 TERM_EOC removed expression = (RexxObject *)this->expression(TERM_EOC | TERM_WITH | TERM_KEYWORD); expression = (RexxObject *)this->expression(TERM_WITH | TERM_KEYWORD); if ( expression == OREF_NULL ) /* If script not complete, report error RI0001 */ //report_error(Error_Invalid_template_with); @@ -1413,7 +1412,7 @@ /* have a variable trigger? */ if (token->classId == TOKEN_LEFT) { // parse off an expression in the parens. - RexxObject *subExpr = this->parenExpression(); + RexxObject *subExpr = this->parenExpression(token); /* create the appropriate trigger */ trigger = new (variableCount) RexxTrigger(trigger_type, subExpr, variableCount, variables); variableCount = 0; /* have a new set of variables */ @@ -1446,7 +1445,7 @@ /* variable string trigger? */ else if (token->classId == TOKEN_LEFT) { // parse off an expression in the parens. - RexxObject *subExpr = this->parenExpression(); + RexxObject *subExpr = this->parenExpression(token); /* create the appropriate trigger */ trigger = new (variableCount) RexxTrigger(flags&parse_caseless ? TRIGGER_MIXED : TRIGGER_STRING, subExpr, variableCount, variables); variableCount = 0; /* have a new set of variables */ Modified: interpreter-3.x/trunk/kernel/parser/SourceFile.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/SourceFile.cpp 2007-04-02 22:15:20 UTC (rev 211) +++ interpreter-3.x/trunk/kernel/parser/SourceFile.cpp 2007-04-03 13:43:12 UTC (rev 212) @@ -3060,25 +3060,23 @@ return expression; /* and return it */ } -RexxObject *RexxSource::parenExpression() +RexxObject *RexxSource::parenExpression(RexxToken *start) /******************************************************************************/ /* Function: Evaluate a "parenthetical" expression for REXX instruction */ /* values. A parenthetical expression is an expression enclosed */ /* in parentheses. */ /******************************************************************************/ { - RexxToken *token; /* current token */ - RexxToken *second; /* second token */ - RexxObject *expression; /* parse expression */ - // NB, the opening paren has already been parsed off - expression = this->subExpression(TERM_EOC | TERM_RIGHT); - second = nextToken(); /* get the terminator token */ + RexxObject *expression = this->subExpression(TERM_EOC | TERM_RIGHT); + RexxToken *second = nextToken(); /* get the terminator token */ /* not terminated by a right paren? */ if (second->classId != TOKEN_RIGHT) + { + report_error_position(Error_Unmatched_parenthesis_paren, start); + } /* this is an error */ - report_error_position(Error_Unmatched_parenthesis_paren, token); this->holdObject(expression); /* protect the expression */ return expression; /* and return it */ } Modified: interpreter-3.x/trunk/kernel/parser/SourceFile.hpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/SourceFile.hpp 2007-04-02 22:15:20 UTC (rev 211) +++ interpreter-3.x/trunk/kernel/parser/SourceFile.hpp 2007-04-03 13:43:12 UTC (rev 212) @@ -150,7 +150,7 @@ void addBlock(void); RexxVariableBase *getRetriever(RexxString *); RexxObject *constantExpression(); - RexxObject *parenExpression(); + RexxObject *parenExpression(RexxToken *); RexxObject *expression(int); RexxObject *subExpression(int); size_t argList(RexxToken *, int); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-04 18:01:32
|
Revision: 221 http://svn.sourceforge.net/oorexx/?rev=221&view=rev Author: bigrixx Date: 2007-04-04 11:01:33 -0700 (Wed, 04 Apr 2007) Log Message: ----------- [ 1665251 ] Remove restriction on indirect call targets. Modified Paths: -------------- interpreter-3.x/trunk/kernel/instructions/CallInstruction.cpp interpreter-3.x/trunk/kernel/instructions/CallInstruction.hpp interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp Modified: interpreter-3.x/trunk/kernel/instructions/CallInstruction.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/CallInstruction.cpp 2007-04-04 06:17:43 UTC (rev 220) +++ interpreter-3.x/trunk/kernel/instructions/CallInstruction.cpp 2007-04-04 18:01:33 UTC (rev 221) @@ -144,10 +144,13 @@ { if (this->name == OREF_NULL) /* not a name target form? */ return; /* just return */ + if (i_flags&call_dynamic) { // can't resolve now + return; // + } if (!(i_flags&call_nointernal)) { /* internal routines allowed? */ if (labels != OREF_NULL) /* have a labels table? */ /* check the label table */ - OrefSet(this, this->target, (RexxInstruction *)labels->at(this->name)); + OrefSet(this, this->target, (RexxInstruction *)labels->at((RexxString *)this->name)); i_flags |= call_internal; /* this is an internal call */ } if (this->target == OREF_NULL) { /* not found yet? */ @@ -213,7 +216,7 @@ } else { /* set up for a normal call */ target = this->target; /* copy the target */ - name = this->name; /* the name value */ + name = (RexxString *)this->name; /* the name value */ /* and the builtin index */ builtin_index = call_builtin_index; type = i_flags&call_type_mask; /* just copy the type info */ @@ -289,7 +292,7 @@ case call_external: /* need to call externally */ /* go process the externnl call */ - result = context->externalCall(this->name, 0, &context->stack, OREF_ROUTINENAME); + result = context->externalCall((RexxString *)this->name, 0, &context->stack, OREF_ROUTINENAME); if (result != OREF_NULL) discard(result); break; } Modified: interpreter-3.x/trunk/kernel/instructions/CallInstruction.hpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/CallInstruction.hpp 2007-04-04 06:17:43 UTC (rev 220) +++ interpreter-3.x/trunk/kernel/instructions/CallInstruction.hpp 2007-04-04 18:01:33 UTC (rev 221) @@ -68,7 +68,7 @@ virtual void resolve(RexxDirectory *) { ; }; virtual void trap(RexxActivation *, RexxDirectory *) { ; }; - RexxString * name; /* name to call */ + RexxObject * name; /* name to call */ RexxInstruction * target; /* routine to call */ RexxString * condition; /* condition trap name */ }; Modified: interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-04 06:17:43 UTC (rev 220) +++ interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-04 18:01:33 UTC (rev 221) @@ -184,7 +184,7 @@ RexxObject *newObject; /* newly created object */ LONG argCount; /* call arguments */ RexxToken *token; /* current working token */ - RexxString *name; /* call name */ + RexxObject *name; /* call name */ INT keyword; /* call subkeyword */ RexxString *condition; /* created USER condition */ CHAR flags; /* final CALL flags */ @@ -242,10 +242,10 @@ } else { /* language defined condition */ name = token->value; /* set the default target */ + condition = token->value; /* condition is the same as target */ /* set the builtin index for later */ /* resolution step */ builtin_index = this->builtin(token); - condition = name; /* condition is the same as target */ } token = nextReal(); /* get the next token */ /* anything real here? */ @@ -336,18 +336,7 @@ /* indirect call case? */ else if (token->classId == TOKEN_LEFT) { flags |= call_dynamic; /* going to be indirect */ - token = nextReal(); /* step to the next token */ - if (token->classId != TOKEN_SYMBOL)/* not a symbol? */ - /* error */ - report_error(Error_Symbol_expected_varref); - this->needVariable(token); /* need a variable token here */ - /* get a variable retriever */ - name = (RexxString *)this->addText(token); - token = nextReal(); /* step to next real token */ - /* must be a right paren here */ - if (token->classId != TOKEN_RIGHT) - /* this is an error */ - report_error_token(Error_Variable_reference_extra, token); + name = this->parenExpression(token); // this is a full expression /* process the argument list */ argCount = this->argList(OREF_NULL, TERM_EOC); /* NOTE: this call is not added to */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-05 00:44:56
|
Revision: 223 http://svn.sourceforge.net/oorexx/?rev=223&view=rev Author: bigrixx Date: 2007-04-04 17:44:56 -0700 (Wed, 04 Apr 2007) Log Message: ----------- Implement basis for some upcoming enhancements. These changes will allow USE ARG dir~name, a[2], and similar usage in parse. Modified Paths: -------------- interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp interpreter-3.x/trunk/kernel/expression/ExpressionBaseVariable.hpp interpreter-3.x/trunk/kernel/expression/ExpressionCompoundVariable.cpp interpreter-3.x/trunk/kernel/expression/ExpressionCompoundVariable.hpp interpreter-3.x/trunk/kernel/expression/ExpressionMessage.cpp interpreter-3.x/trunk/kernel/expression/ExpressionMessage.hpp interpreter-3.x/trunk/kernel/expression/ExpressionStem.cpp interpreter-3.x/trunk/kernel/expression/ExpressionStem.hpp interpreter-3.x/trunk/kernel/expression/ExpressionVariable.cpp interpreter-3.x/trunk/kernel/expression/ExpressionVariable.hpp interpreter-3.x/trunk/kernel/instructions/AssignmentInstruction.cpp interpreter-3.x/trunk/kernel/instructions/DoInstruction.cpp interpreter-3.x/trunk/kernel/instructions/MessageInstruction.cpp interpreter-3.x/trunk/kernel/instructions/MessageInstruction.hpp interpreter-3.x/trunk/kernel/instructions/UseInstruction.cpp interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp Modified: interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -2193,7 +2193,7 @@ result = retriever->getValue(context); if (newvalue != OREF_NULL) /* have a new value to assign? */ /* do the assignment */ - retriever->assign(context, newvalue); + retriever->assign(context, stack, newvalue); } } else if (selector->length == 0) { /* null string selector? */ Modified: interpreter-3.x/trunk/kernel/expression/ExpressionBaseVariable.hpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionBaseVariable.hpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/ExpressionBaseVariable.hpp 2007-04-05 00:44:56 UTC (rev 223) @@ -36,7 +36,7 @@ /* */ /*----------------------------------------------------------------------------*/ /******************************************************************************/ -/* REXX Kernel ExpressionBaseVariable.h */ +/* REXX Kernel ExpressionBaseVariable.h */ /* */ /* Polymorphic declarations for all translator variable parse classes */ /* */ @@ -50,7 +50,7 @@ virtual BOOL exists(RexxActivation *) { return FALSE; } virtual void set(RexxActivation *, RexxObject *) {;} virtual void set(RexxVariableDictionary *, RexxObject *) {;} - virtual void assign(RexxActivation *, RexxObject *) {;} + virtual void assign(RexxActivation *, RexxExpressionStack *, RexxObject *) {;} virtual void drop(RexxActivation *) {;} virtual void setGuard(RexxActivation *) {;} virtual void clearGuard(RexxActivation *) {;} Modified: interpreter-3.x/trunk/kernel/expression/ExpressionCompoundVariable.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionCompoundVariable.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/ExpressionCompoundVariable.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -266,6 +266,7 @@ void RexxCompoundVariable::assign( RexxActivation *context, /* current activation context */ + RexxExpressionStack *stack, /* current evaluation stack */ RexxObject *value ) /* new value to assign */ /******************************************************************************/ /* Function: Assign a value to a compound variable */ Modified: interpreter-3.x/trunk/kernel/expression/ExpressionCompoundVariable.hpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionCompoundVariable.hpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/ExpressionCompoundVariable.hpp 2007-04-05 00:44:56 UTC (rev 223) @@ -63,7 +63,7 @@ BOOL exists(RexxActivation *); void set(RexxActivation *, RexxObject *) ; void set(RexxVariableDictionary *, RexxObject *); - void assign(RexxActivation *, RexxObject *); + void assign(RexxActivation *, RexxExpressionStack *, RexxObject *); void drop(RexxActivation *); void setGuard(RexxActivation *); void clearGuard(RexxActivation *); Modified: interpreter-3.x/trunk/kernel/expression/ExpressionMessage.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionMessage.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/ExpressionMessage.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -48,6 +48,7 @@ #include "RexxActivation.hpp" #include "ExpressionMessage.hpp" #include "Token.hpp" +#include "SourceFile.hpp" RexxExpressionMessage::RexxExpressionMessage( RexxObject *target, /* message send target */ @@ -212,3 +213,80 @@ return newObject; } +void RexxExpressionMessage::assign( + RexxActivation *context, /* current activation context */ + RexxExpressionStack *stack, /* current evaluation stack */ + RexxObject *value ) /* new value to assign */ +/******************************************************************************/ +/* Function: Emulate a variable assignment using a method */ +/******************************************************************************/ +{ + // evaluate the target + RexxObject *target = this->target->evaluate(context, stack); + RexxObject *super = OREF_NULL; + // message override? + if (this->super != OREF_NULL) + { + // in this context, the value needs to be SELF + if (target != context->receiver) + { + report_exception(Error_Execution_super); + } + // evaluate the superclass override + super = this->super->evaluate(context, stack); + stack->toss(); + } + // push the assignment value on to the stack as the argument + stack->push(value); + // now push the rest of the arguments. This might be something like a[1,2,3,4] as + // an assignment term. The assignment value is the first argument, followed by + // any other arguments that are part of the encoded message term. + size_t argcount = (size_t)this->argumentCount; + + RexxObject *result; + for (size_t i = 0; i < argcount; i++) + { + // non-omitted argument? + if (this->arguments[i] != OREF_NULL) + { + // evaluate and potentiall trace + result = this->arguments[i]->evaluate(context, stack); + context->traceResult(result); + } + else + { + // non existant arg....we may still need to trace that + stack->push(OREF_NULL); + context->traceResult(OREF_NULLSTRING); + } + } + + // now send the message the appropriate way + if (super == OREF_NULL) + { + // normal message send + result = stack->send(this->u_name, argcount); + } + else + { + // send with an override + result = stack->send(this->u_name, super, argcount); + } + // remove all arguments + stack->popn(argcount + 1); +} + + + +/** + * Convert a message into an assignment message by adding "=" + * to the end of the message name. + * + * @param source The current source context. + */ +void RexxExpressionMessage::makeAssignment(RexxSource *source) +{ + // add an equal sign to the name + u_name = source->commonString(u_name->concat(OREF_EQUAL)); +} + Modified: interpreter-3.x/trunk/kernel/expression/ExpressionMessage.hpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionMessage.hpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/ExpressionMessage.hpp 2007-04-05 00:44:56 UTC (rev 223) @@ -44,7 +44,7 @@ #ifndef Included_RexxExpressionMessage #define Included_RexxExpressionMessage -class RexxExpressionMessage : public RexxInternalObject { +class RexxExpressionMessage : public RexxVariableBase { public: RexxExpressionMessage(RexxObject *, RexxString *, RexxObject *, size_t, RexxQueue *, int); inline RexxExpressionMessage(RESTORETYPE restoreType) { ; }; @@ -54,6 +54,8 @@ void *operator new(size_t, LONG); inline void *operator new(size_t size, void *ptr) {return ptr;}; RexxObject *evaluate(RexxActivation *, RexxExpressionStack *); + void assign(RexxActivation *, RexxExpressionStack *, RexxObject *); + void makeAssignment(RexxSource *source); RexxObject * target; /* target subexpression */ RexxObject * super; /* super class target */ Modified: interpreter-3.x/trunk/kernel/expression/ExpressionStem.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionStem.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/ExpressionStem.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -201,6 +201,7 @@ void RexxStemVariable::assign( RexxActivation *context, /* current activation context */ + RexxExpressionStack *stack, /* current evaluation stack */ RexxObject *value ) /* new value to assign */ /******************************************************************************/ /* Function: Assign a value to a stem variable */ Modified: interpreter-3.x/trunk/kernel/expression/ExpressionStem.hpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionStem.hpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/ExpressionStem.hpp 2007-04-05 00:44:56 UTC (rev 223) @@ -61,7 +61,7 @@ BOOL exists(RexxActivation *); void set(RexxActivation *, RexxObject *) ; void set(RexxVariableDictionary *, RexxObject *) ; - void assign(RexxActivation *, RexxObject *); + void assign(RexxActivation *, RexxExpressionStack *, RexxObject *); void drop(RexxActivation *); void setGuard(RexxActivation *); void clearGuard(RexxActivation *); Modified: interpreter-3.x/trunk/kernel/expression/ExpressionVariable.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionVariable.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/ExpressionVariable.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -225,6 +225,7 @@ void RexxParseVariable::assign( RexxActivation *context, /* current activation context */ + RexxExpressionStack *stack, /* current evaluation stack */ RexxObject *value ) /* new value to assign */ /******************************************************************************/ /* Function: Assign a value to a simple variable */ Modified: interpreter-3.x/trunk/kernel/expression/ExpressionVariable.hpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionVariable.hpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/expression/ExpressionVariable.hpp 2007-04-05 00:44:56 UTC (rev 223) @@ -61,7 +61,7 @@ BOOL exists(RexxActivation *); void set(RexxActivation *, RexxObject *) ; void set(RexxVariableDictionary *, RexxObject *) ; - void assign(RexxActivation *, RexxObject *); + void assign(RexxActivation *, RexxExpressionStack *, RexxObject *); void drop(RexxActivation *); void setGuard(RexxActivation *); void clearGuard(RexxActivation *); Modified: interpreter-3.x/trunk/kernel/instructions/AssignmentInstruction.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/AssignmentInstruction.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/instructions/AssignmentInstruction.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -118,11 +118,11 @@ result = this->expression->evaluate(context, stack); context->traceResult(result); /* trace if necessary */ /* do the assignment */ - this->variable->assign(context, result); + this->variable->assign(context, stack, result); context->pauseInstruction(); /* do debug pause if necessary */ } else /* non-traced execution */ /* do the assignment */ - this->variable->assign(context, this->expression->evaluate(context, stack)); + this->variable->assign(context, stack, this->expression->evaluate(context, stack)); } Modified: interpreter-3.x/trunk/kernel/instructions/DoInstruction.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/DoInstruction.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/instructions/DoInstruction.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -443,7 +443,7 @@ doblock->setCompare(OPERATOR_GREATERTHAN); } /* do the initial assignment */ - this->control->assign(context, initial); + this->control->assign(context, stack, initial); } BOOL RexxInstructionDo::checkOver( @@ -472,7 +472,7 @@ if (result == OREF_NULL) /* empty for some reason? */ result = TheNilObject; /* use .nil instead */ /* do the initial assignment */ - this->control->assign(context, result); + this->control->assign(context, stack, result); context->traceResult(result); /* trace if necessary */ doblock->setFor(over_position + 1);/* set position for next time */ } Modified: interpreter-3.x/trunk/kernel/instructions/MessageInstruction.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/MessageInstruction.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/instructions/MessageInstruction.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -77,7 +77,6 @@ RexxInstructionMessage::RexxInstructionMessage( RexxExpressionMessage *message, /* templace message to process */ - RexxString *name, /* name to send */ RexxObject *expression) /* associated expression */ /******************************************************************************/ /* Function: Initialize an assignment message instruction */ @@ -89,7 +88,7 @@ /* copy the message info */ OrefSet(this, this->target, message->target); OrefSet(this, this->super, message->super); - OrefSet(this, this->name, name); /* get the name */ + OrefSet(this, this->name, message->u_name); /* get the name */ /* get the argument count */ message_argument_count = message->argumentCount + 1; /* and the argument pointer */ Modified: interpreter-3.x/trunk/kernel/instructions/MessageInstruction.hpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/MessageInstruction.hpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/instructions/MessageInstruction.hpp 2007-04-05 00:44:56 UTC (rev 223) @@ -53,7 +53,7 @@ public: inline void *operator new(size_t size, void *ptr) {return ptr;}; RexxInstructionMessage(RexxExpressionMessage *); - RexxInstructionMessage(RexxExpressionMessage *, RexxString *, RexxObject *); + RexxInstructionMessage(RexxExpressionMessage *, RexxObject *); inline RexxInstructionMessage(RESTORETYPE restoreType) { ; }; void live(); void liveGeneral(); Modified: interpreter-3.x/trunk/kernel/instructions/UseInstruction.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/UseInstruction.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/instructions/UseInstruction.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -144,7 +144,7 @@ else { context->traceResult(argument);/* trace if necessary */ /* assign the value */ - variable->assign(context, argument); + variable->assign(context, stack, argument); } } } Modified: interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-04 18:02:16 UTC (rev 222) +++ interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-05 00:44:56 UTC (rev 223) @@ -1035,13 +1035,10 @@ /****************************************************************************/ { RexxObject *newObject; /* newly create object */ - INT argument_count; /* number of arguments */ hold(message); /* lock this temporarily */ - /* get the argument count */ - argument_count = message->argumentCount; /* allocate a new object */ - newObject = new_variable_instruction(MESSAGE, Message, sizeof(RexxInstructionMessage) + (argument_count - 1) * sizeof(OREF)); + newObject = new_variable_instruction(MESSAGE, Message, sizeof(RexxInstructionMessage) + (message->argumentCount - 1) * sizeof(OREF)); /* Initialize this new method */ new ((void *)newObject) RexxInstructionMessage(message); return (RexxInstruction *)newObject; /* done, return this */ @@ -1055,19 +1052,14 @@ /****************************************************************************/ { RexxObject *newObject; /* newly create object */ - INT argument_count; /* number of arguments */ RexxString *name; /* message name used */ hold(message); /* lock this temporarily */ - name = (RexxString *)message->u_name; /* get the name */ - /* need to add an equal sign to name */ - name = this->commonString(name->concat(OREF_EQUAL)); - /* get the argument count */ - argument_count = message->argumentCount + 1; - /* allocate a new object */ - newObject = new_variable_instruction(MESSAGE, Message, sizeof(RexxInstructionMessage) + (argument_count - 1) * sizeof(OREF)); + message->makeAssignment(this); // convert into an assignment message + // allocate a new object. NB: a message instruction gets an extra argument, so we don't subtract one. + newObject = new_variable_instruction(MESSAGE, Message, sizeof(RexxInstructionMessage) + (message->argumentCount) * sizeof(OREF)); /* Initialize this new method */ - new ((void *)newObject) RexxInstructionMessage(message, name, expression); + new ((void *)newObject) RexxInstructionMessage(message, expression); return (RexxInstruction *)newObject; /* done, return this */ } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-05 13:10:38
|
Revision: 228 http://svn.sourceforge.net/oorexx/?rev=228&view=rev Author: bigrixx Date: 2007-04-05 06:10:39 -0700 (Thu, 05 Apr 2007) Log Message: ----------- [ 1665272 ] Allow message term assignments on USE ARG [ 1665262 ] Allow message term assignments in parse templates. Modified Paths: -------------- interpreter-3.x/trunk/kernel/expression/ExpressionMessage.cpp interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h interpreter-3.x/trunk/kernel/messages/rexxmsg.xml interpreter-3.x/trunk/kernel/parser/Clause.hpp interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.hpp interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc Modified: interpreter-3.x/trunk/kernel/expression/ExpressionMessage.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionMessage.cpp 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/expression/ExpressionMessage.cpp 2007-04-05 13:10:39 UTC (rev 228) @@ -265,12 +265,12 @@ if (super == OREF_NULL) { // normal message send - result = stack->send(this->u_name, argcount); + result = stack->send(this->u_name, argcount + 1); } else { // send with an override - result = stack->send(this->u_name, super, argcount); + result = stack->send(this->u_name, super, argcount + 1); } // remove all arguments stack->popn(argcount + 1); Modified: interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/instructions/ParseTrigger.cpp 2007-04-05 13:10:39 UTC (rev 228) @@ -172,7 +172,7 @@ variable = this->variables[i]; /* get the next variable retriever */ if (variable != OREF_NULL) { /* not a place holder dummy? */ /* set the value */ - variable->set(context, value); + variable->assign(context, stack, value); context->traceResult(value); /* trace if necessary */ } else /* dummy variable, just trace it */ @@ -190,7 +190,7 @@ else value = target->getWord(); /* just get the next word */ /* set the value */ - variable->set(context, value); + variable->assign(context, stack, value); } else { /* dummy variable, just skip it */ if (i == size) /* last variable? */ Modified: interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h =================================================================== --- interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h 2007-04-05 13:10:39 UTC (rev 228) @@ -378,6 +378,9 @@ #define Error_Interpretation 49000 #define Error_Interpretation_initialization 49001 #define Error_Interpretation_user_defined 49900 +#define Error_Variable_expected 89000 +#define Error_Variable_expected_USE 89001 +#define Error_Variable_expected_PARSE 89002 #define Error_External_name_not_found 90000 #define Error_External_name_not_found_user_defined 90900 #define Error_External_name_not_found_class 90997 Modified: interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h =================================================================== --- interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h 2007-04-05 13:10:39 UTC (rev 228) @@ -578,6 +578,9 @@ #define Error_Unmatched_quote_user_defined_msg 649 #define Error_Invalid_whole_number_method_msg 650 #define Error_Logical_value_property_msg 651 +#define Error_Variable_expected_msg 652 +#define Error_Variable_expected_USE_msg 653 +#define Error_Variable_expected_PARSE_msg 654 #endif Modified: interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h =================================================================== --- interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h 2007-04-05 13:10:39 UTC (rev 228) @@ -380,6 +380,9 @@ MAJOR(Error_Interpretation) MINOR(Error_Interpretation_initialization) MINOR(Error_Interpretation_user_defined) + MAJOR(Error_Variable_expected) + MINOR(Error_Variable_expected_USE) + MINOR(Error_Variable_expected_PARSE) MAJOR(Error_External_name_not_found) MINOR(Error_External_name_not_found_user_defined) MINOR(Error_External_name_not_found_class) Modified: interpreter-3.x/trunk/kernel/messages/rexxmsg.xml =================================================================== --- interpreter-3.x/trunk/kernel/messages/rexxmsg.xml 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/messages/rexxmsg.xml 2007-04-05 13:10:39 UTC (rev 228) @@ -3158,6 +3158,36 @@ </Subcodes> </Message> <Message> + <Code>89</Code> + <Subcode>000</Subcode> + <MessageNumber>652</MessageNumber> + <Component>Rexx</Component> + <Severity>Warning</Severity> + <SymbolicName>Error_Variable_expected</SymbolicName> + <Text>Variable or message term expected</Text> + <Explanation><para>An instruction was expecting either a single Rexx variable symbol or a message term to be used for an assignment.</para></Explanation> + <Subcodes> + <SubMessage> + <Code>89</Code> + <Subcode>001</Subcode> + <MessageNumber>653</MessageNumber> + <Component>Rexx</Component> + <Severity>Warning</Severity> + <SymbolicName>Error_Variable_expected_USE</SymbolicName> + <Text>The USE instruction requires a comma-separated list of variables or assignment message terms</Text> + </SubMessage> + <SubMessage> + <Code>89</Code> + <Subcode>002</Subcode> + <MessageNumber>654</MessageNumber> + <Component>Rexx</Component> + <Severity>Warning</Severity> + <SymbolicName>Error_Variable_expected_PARSE</SymbolicName> + <Text>The PARSE was expecting a variable or a message term.</Text> + </SubMessage> + </Subcodes> + </Message> + <Message> <Code>90</Code> <Subcode>000</Subcode> <MessageNumber>90</MessageNumber> Modified: interpreter-3.x/trunk/kernel/parser/Clause.hpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/Clause.hpp 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/parser/Clause.hpp 2007-04-05 13:10:39 UTC (rev 228) @@ -67,6 +67,8 @@ inline void setLocation(PLOCATIONINFO location) { this->location = *location; } inline void previous() { this->current--; } inline RexxToken *next() { return (RexxToken *)this->tokens->get(this->current++); } + inline size_t mark() { return current; } + inline void reset(size_t position) { current = position; } LOCATIONINFO location; /* position of the clause */ size_t current; /* index of current token of clause */ Modified: interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-05 13:10:39 UTC (rev 228) @@ -1051,13 +1051,10 @@ /* Function: Create a new MESSAGE assignment translator object */ /****************************************************************************/ { - RexxObject *newObject; /* newly create object */ - RexxString *name; /* message name used */ - hold(message); /* lock this temporarily */ message->makeAssignment(this); // convert into an assignment message // allocate a new object. NB: a message instruction gets an extra argument, so we don't subtract one. - newObject = new_variable_instruction(MESSAGE, Message, sizeof(RexxInstructionMessage) + (message->argumentCount) * sizeof(OREF)); + RexxObject *newObject = new_variable_instruction(MESSAGE, Message, sizeof(RexxInstructionMessage) + (message->argumentCount) * sizeof(OREF)); /* Initialize this new method */ new ((void *)newObject) RexxInstructionMessage(message, expression); return (RexxInstruction *)newObject; /* done, return this */ @@ -1456,10 +1453,22 @@ /* place holder period? */ else { if (token->subclass == SYMBOL_DUMMY) - variables->push(OREF_NULL); /* just add an empty item */ + { + variables->push(OREF_NULL); /* just add an empty item */ + variableCount++; /* step the variable counter */ + } else /* have a variable, add to list */ - variables->push(this->addText(token)); - variableCount++; /* step the variable counter */ + { + // this is potentially a message term + previousToken(); + RexxObject *term = variableOrMessageTerm(); + if (term == OREF_NULL) + { + report_error_token(Error_Variable_expected_PARSE, token); + } + variables->push(term); + variableCount++; /* step the variable counter */ + } } } else @@ -2038,48 +2047,56 @@ /* Function: Create a USE instruction object */ /****************************************************************************/ { - RexxObject *newObject; /* newly created object */ - RexxToken *token; /* current working token */ - RexxObject *retriever; /* retriever for a variable */ - LONG variableCount; /* count of variables */ - RexxQueue *variable_list; /* list of variables */ - - token = nextReal(); /* get the next token */ - /* next token ARG? */ - if (this->subKeyword(token) != SUBKEY_ARG) - /* invalid keyword */ - report_error_token(Error_Invalid_subkeyword_use, token); - variableCount = 0; /* no variables yet */ - variable_list = this->subTerms; /* use the sub terms queue */ - token = nextReal(); /* get the next token */ - while (token->classId != TOKEN_EOC) {/* while more tokens */ - /* not a symbol token? */ - if (token->classId == TOKEN_COMMA) { - variable_list->push(OREF_NULL); /* add a NIL entry to the list */ - variableCount++; /* and step the count */ + RexxToken *token = nextReal(); + // the only subkeyword supported is ARG + if (this->subKeyword(token) != SUBKEY_ARG) + { + report_error_token(Error_Invalid_subkeyword_use, token); } - else { - /* not a symbol character? */ - if (token->classId != TOKEN_SYMBOL) - /* we have an error */ - report_exception(Error_Symbol_expected_use); - this->needVariable(token); /* non-variable symbol? */ - retriever = this->addText(token);/* get a retriever for this */ - variable_list->push(retriever); /* add to the variable list */ - variableCount++; /* and step the count */ - token = nextReal(); /* get the next token */ - if (token->classId == TOKEN_EOC) /* end of clause? */ - break; /* finished */ - /* not a comma? */ - else if (token->classId != TOKEN_COMMA) - /* this is an error */ - report_error_token(Error_Translation_use_comma, token); + size_t variableCount = 0; /* no variables yet */ + RexxQueue *variable_list = new_queue(); // we might be parsing message terms, so we can't use the subterms list. + saveObject(variable_list); + token = nextReal(); /* get the next token */ + // keep processing tokens to the end + while (token->classId != TOKEN_EOC) + { + // this could be a token to skip a variable + if (token->classId == TOKEN_COMMA) + { + // this goes on as a variable, but an empty entry to process + variable_list->push(OREF_NULL); + variableCount++; + } + else // something real. This could be a single symbol or a message term + { + previousToken(); // push the current token back for term processing + // see if we can get a variable or a message term from this + RexxObject *retriever = variableOrMessageTerm(); + if (retriever != OREF_NULL) + { + variable_list->push(retriever); + variableCount++; + token = nextReal(); + if (token->classId == TOKEN_EOC) + { + break; + } + else if (token->classId != TOKEN_COMMA) + { + report_error_token(Error_Translation_use_comma, token); + } + } + else // invalid assignment type + { + report_error_token(Error_Variable_expected_USE, token); + } + } + token = nextReal(); /* get the next token */ } - token = nextReal(); /* get the next token */ - } - /* create a new translator object */ - newObject = new_variable_instruction(USE, Use, sizeof(RexxInstructionUse) + (variableCount - 1) * sizeof(OREF)); - /* now complete this */ - new ((void *)newObject) RexxInstructionUse(variableCount, variable_list); - return (RexxInstruction *)newObject; /* done, return this */ + /* create a new translator object */ + RexxObject *newObject = new_variable_instruction(USE, Use, sizeof(RexxInstructionUse) + (variableCount - 1) * sizeof(RexxObject *)); + /* now complete this */ + new ((void *)newObject) RexxInstructionUse(variableCount, variable_list); + removeObj(variable_list); + return(RexxInstruction *)newObject; /* done, return this */ } Modified: interpreter-3.x/trunk/kernel/parser/SourceFile.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/SourceFile.cpp 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/parser/SourceFile.cpp 2007-04-05 13:10:39 UTC (rev 228) @@ -3430,6 +3430,48 @@ return (RexxObject *)message; /* return the message item */ } + +/** + * Parse off a single variable symbol or a message term that + * can be used for an assignment. + * + * NOTE: If this is a message term, then the message term + * will be configured as an assignment term. + * + * @return The object for an assignment target, or OREF_NULL if something + * other than a variable or a message term was found. On return, + * the clause position pointer will either be unchanged or + * positioned at the next token of the clause. + */ +RexxObject *RexxSource::variableOrMessageTerm() +{ + // try for a message term first. If not successful, see if the + // next token is a variable symbol. + RexxObject *result = messageTerm(); + if (result == OREF_NULL) + { + RexxToken *first = nextReal(); + if (first->classId == TOKEN_SYMBOL) + { + // ok, add the variable to the processing list + this->needVariable(first); + result = this->addText(first); + } + else + { + previousToken(); // just push back on for the caller to sort out + } + } + else + { + // we need to convert this into an assignment message. + ((RexxExpressionMessage *)result)->makeAssignment(this); + } + return result; +} + + + RexxObject *RexxSource::messageTerm() /******************************************************************************/ /* Function: Parse off an instruction leading message term element */ @@ -3440,6 +3482,8 @@ RexxObject *start; /* starting term */ INT classId; /* token class */ + size_t mark = markPosition(); // save the current position so we can reset cleanly + start = this->subTerm(TERM_EOC); /* get the first term of instruction */ this->holdObject(start); /* save the starting term */ term = OREF_NULL; /* default to no term */ @@ -3452,13 +3496,16 @@ else /* process a message term */ term = this->message(start, classId, TERM_EOC); -// this->holdObject(term); /* lock the term */ - /* HOL: The above hold is obsolete (even bad) because both collectionMessage and message "hold" the new term */ start = term; /* set for the next pass */ token = nextToken(); /* get the next token */ classId = token->classId; /* get the token class */ } previousToken(); /* push this term back */ + // if this was not a valid message term, reset the position to the beginning + if (term == OREF_NULL) + { + resetPosition(mark); // reset back to the entry conditions + } /* return the message term (returns */ return term; /* OREF_NULL if not a message term) */ } Modified: interpreter-3.x/trunk/kernel/parser/SourceFile.hpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/SourceFile.hpp 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/parser/SourceFile.hpp 2007-04-05 13:10:39 UTC (rev 228) @@ -51,11 +51,6 @@ #include "Clause.hpp" /* handy defines to easy coding */ -#define nextToken() (this->clause->next()) -#define nextReal() (this->clause->nextRealToken()) -#define previousToken() (this->clause->previous()) -#define firstToken() (this->clause->firstToken()) -#define trimClause() (this->clause->trim()) #define new_instruction(name, type) this->sourceNewObject(sizeof(RexxInstruction##type), The##type##InstructionBehaviour, KEYWORD_##name) #define new_variable_instruction(name, type, size) this->sourceNewObject(size, The##type##InstructionBehaviour, KEYWORD_##name) #define report_error_line(errorcode, instruction) this->errorLine(errorcode, instruction) @@ -160,6 +155,7 @@ RexxToken *getToken(int, int); RexxObject *message(RexxObject *, int, int); RexxObject *messageTerm(); + RexxObject *variableOrMessageTerm(); RexxObject *messageSubterm(int); RexxObject *subTerm(int); void pushTerm(RexxObject *); @@ -199,6 +195,14 @@ inline void reclaimClause() { this->flags |= reclaimed; }; inline BOOL atEnd(void) { return (!(this->flags&reclaimed) && (this->line_number > (this->line_count))); }; + inline RexxToken *nextToken() { return clause->next(); } + inline RexxToken *nextReal() { return clause->nextRealToken(); } + inline void previousToken() { clause->previous(); } + inline void firstToken() { clause->firstToken(); } + inline void trimClause() { clause->trim(); } + inline size_t markPosition() { return clause->mark(); } + inline void resetPosition(size_t p) { clause->reset(p); } + RexxInstruction *addressNew(); RexxInstruction *assignmentNew(RexxToken *); RexxInstruction *callNew(); Modified: interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc =================================================================== --- interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc 2007-04-05 05:18:18 UTC (rev 227) +++ interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc 2007-04-05 13:10:39 UTC (rev 228) @@ -578,6 +578,9 @@ Error_Unmatched_quote_user_defined "&1" Error_Invalid_whole_number_method "Result of a method call did not result in a whole number; found ""&1""" Error_Logical_value_property "Property logical value must be exactly ""0"", ""1"", ""true"", or ""false""; found ""&1""" + Error_Variable_expected "Variable or message term expected" + Error_Variable_expected_USE "The USE instruction requires a comma-separated list of variables or assignment message terms" + Error_Variable_expected_PARSE "The PARSE was expecting a variable or a message term." END This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-05 21:00:56
|
Revision: 230 http://svn.sourceforge.net/oorexx/?rev=230&view=rev Author: bigrixx Date: 2007-04-05 14:00:57 -0700 (Thu, 05 Apr 2007) Log Message: ----------- [ 1066313 ] Add methods "methods" and "method" to root class "Object" Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp interpreter-3.x/trunk/kernel/classes/NumberStringClass.cpp interpreter-3.x/trunk/kernel/classes/NumberStringClass.hpp interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp interpreter-3.x/trunk/kernel/runtime/RexxBehaviour.hpp interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp 2007-04-05 13:11:18 UTC (rev 229) +++ interpreter-3.x/trunk/kernel/classes/IntegerClass.cpp 2007-04-05 21:00:57 UTC (rev 230) @@ -299,6 +299,38 @@ return stringValue()->isInstanceOf(other); } + +/** + * Retrieve the method instance for an object's defined method. + * + * @param method_name + * The method name. + * + * @return The method object that implements the object method. + */ +RexxMethod *RexxInteger::instanceMethod(RexxString *method_name) +{ + return stringValue()->instanceMethod(method_name); +} + + +/** + * Return a supplier containing the methods implemented by an + * object. Depending on the argument, this is either A) all of + * the methods, B) just the explicitly set instance methods, or + * C) the methods provided by a given class. + * + * @param class_object + * The target class object (optional). + * + * @return A supplier with the appropriate method set. + */ +RexxSupplier *RexxInteger::instanceMethods(RexxClass *class_object) +{ + return stringValue()->instanceMethods(class_object); +} + + RexxString *RexxInteger::concatBlank( RexxString *other ) /* other object for concatenation */ /******************************************************************************/ Modified: interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp 2007-04-05 13:11:18 UTC (rev 229) +++ interpreter-3.x/trunk/kernel/classes/IntegerClass.hpp 2007-04-05 21:00:57 UTC (rev 230) @@ -70,6 +70,8 @@ RexxString *stringValue(); BOOL truthValue(LONG); bool isInstanceOf(RexxClass *); + RexxMethod *instanceMethod(RexxString *); + RexxSupplier *instanceMethods(RexxClass *); BOOL isEqual(RexxObject *); long strictComp(RexxObject *); Modified: interpreter-3.x/trunk/kernel/classes/NumberStringClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/NumberStringClass.cpp 2007-04-05 13:11:18 UTC (rev 229) +++ interpreter-3.x/trunk/kernel/classes/NumberStringClass.cpp 2007-04-05 21:00:57 UTC (rev 230) @@ -1525,6 +1525,37 @@ } +/** + * Retrieve the method instance for an object's defined method. + * + * @param method_name + * The method name. + * + * @return The method object that implements the object method. + */ +RexxMethod *RexxNumberString::instanceMethod(RexxString *method_name) +{ + return stringValue()->instanceMethod(method_name); +} + + +/** + * Return a supplier containing the methods implemented by an + * object. Depending on the argument, this is either A) all of + * the methods, B) just the explicitly set instance methods, or + * C) the methods provided by a given class. + * + * @param class_object + * The target class object (optional). + * + * @return A supplier with the appropriate method set. + */ +RexxSupplier *RexxNumberString::instanceMethods(RexxClass *class_object) +{ + return stringValue()->instanceMethods(class_object); +} + + RexxString *RexxNumberString::concatBlank(RexxObject *other) /******************************************************************************/ /* Function: Blank concatenation operator */ Modified: interpreter-3.x/trunk/kernel/classes/NumberStringClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/NumberStringClass.hpp 2007-04-05 13:11:18 UTC (rev 229) +++ interpreter-3.x/trunk/kernel/classes/NumberStringClass.hpp 2007-04-05 21:00:57 UTC (rev 230) @@ -149,6 +149,8 @@ RexxObject *truncInternal(size_t); RexxObject *unknown(RexxString *, RexxArray *); bool isInstanceOf(RexxClass *); + RexxMethod *instanceMethod(RexxString *); + RexxSupplier *instanceMethods(RexxClass *); inline RexxNumberString *checkNumber(size_t digits, BOOL rounding) { if (this->length > digits) /* is the length larger than digits()*/ Modified: interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp 2007-04-05 13:11:18 UTC (rev 229) +++ interpreter-3.x/trunk/kernel/classes/ObjectClass.cpp 2007-04-05 21:00:57 UTC (rev 230) @@ -188,6 +188,138 @@ } +/** + * Retrieve the method instance for an object's defined method. + * + * @param method_name + * The method name. + * + * @return The method object that implements the object method. + */ +RexxMethod *RexxInternalObject::instanceMethod(RexxString *method_name) +{ + return OREF_NULL; +} + + +/** + * Retrieve the method instance for an object's defined method. + * + * @param method_name + * The method name. + * + * @return The method object that implements the object method. + */ +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(); + // 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 + if (method_object == OREF_NULL) + { + report_exception2(Error_No_method_name, this, method_name); + } + return method_object; // got a live one +} + + +/** + * Return a supplier containing the methods implemented by an + * object. Depending on the argument, this is either A) all of + * the methods, B) just the explicitly set instance methods, or + * C) the methods provided by a given class. + * + * @param class_object + * The target class object (optional). + * + * @return A supplier with the appropriate method set. + */ +RexxSupplier *RexxInternalObject::instanceMethods(RexxClass *class_object) +{ + return OREF_NULL; +} + + +/** + * Return a supplier containing the methods implemented by an + * object. Depending on the argument, this is either A) all of + * the methods, B) just the explicitly set instance methods, or + * C) the methods provided by a given class. + * + * @param class_object + * The target class object (optional). + * + * @return A supplier with the appropriate method set. + */ +RexxSupplier *RexxObject::instanceMethods(RexxClass *class_object) +{ + /* if no parameter specified */ + /* return my behaviour mdict as a */ + /* supplier object */ + if (class_object == OREF_NULL) + { + return this->behaviour->getMethodDictionary()->supplier(); + } + /* if TheNilObject specified */ + /* return my instance mdict as a */ + /* supplier object */ + if (class_object == TheNilObject) + { + // we might not have instance methods defined. + RexxTable *instanceMethods = this->behaviour->getInstanceMethodDictionary(); + if (instanceMethods != OREF_NULL) + { + return instanceMethods->supplier(); + } + // no instance methods, return a null supplier + return (RexxSupplier *)TheNullArray->supplier(); + } + + // if we're an instance of that class + if (isInstanceOf(class_object)) + { + /* let the class specified return */ + /* it's own methods */ + return (RexxSupplier *)send_message1(class_object, OREF_METHODS, TheNilObject); + } + /* or just return a null supplier */ + return (RexxSupplier *)TheNullArray->supplier(); +} + + +/** + * Retrieve the method instance for an object's defined method. + * + * @param method_name + * The method name. + * + * @return The method object that implements the object method. + */ +RexxMethod *RexxObject::instanceMethodRexx(RexxString *method_name) +{ + return instanceMethod(method_name); +} + + +/** + * Return a supplier containing the methods implemented by an + * object. Depending on the argument, this is either A) all of + * the methods, B) just the explicitly set instance methods, or + * C) the methods provided by a given class. + * + * @param class_object + * The target class object (optional). + * + * @return A supplier with the appropriate method set. + */ +RexxSupplier *RexxObject::instanceMethodsRexx(RexxClass *class_object) +{ + return instanceMethods(class_object); +} + + RexxObject * RexxObject::strictEqual( RexxObject * other) /* other object for comparison */ /******************************************************************************/ Modified: interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp 2007-04-05 13:11:18 UTC (rev 229) +++ interpreter-3.x/trunk/kernel/classes/ObjectClass.hpp 2007-04-05 21:00:57 UTC (rev 230) @@ -55,6 +55,8 @@ class RexxCompoundTail; class RexxCompoundElement; class RexxInternalStack; + class RexxSupplier; + class RexxVirtualBase { /* create first base level class */ /* dummy virtual function to force */ /* the virtual function table to a */ @@ -113,6 +115,8 @@ virtual BOOL isEqual(RexxObject *); virtual bool isInstanceOf(RexxClass *); + virtual RexxMethod *instanceMethod(RexxString *); + virtual RexxSupplier *instanceMethods(RexxClass *); RexxObject *hasUninit(); void removedUninit(); @@ -218,6 +222,10 @@ BOOL isEqual(RexxObject *); bool isInstanceOf(RexxClass *); RexxObject *isInstanceOfRexx(RexxClass *); + RexxMethod *instanceMethod(RexxString *); + RexxSupplier *instanceMethods(RexxClass *); + RexxMethod *instanceMethodRexx(RexxString *); + RexxSupplier *instanceMethodsRexx(RexxClass *); RexxString *objectName(); RexxObject *objectNameEquals(RexxObject *); RexxClass *classObject(); Modified: interpreter-3.x/trunk/kernel/runtime/RexxBehaviour.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxBehaviour.hpp 2007-04-05 13:11:18 UTC (rev 229) +++ interpreter-3.x/trunk/kernel/runtime/RexxBehaviour.hpp 2007-04-05 21:00:57 UTC (rev 230) @@ -99,6 +99,7 @@ inline RexxTable *getMethodDictionary() { return this->methodDictionary; }; inline void setMethodDictionary(RexxTable * m) { OrefSet(this, this->methodDictionary, m); }; inline void setInstanceMethodDictionary(RexxTable * m) { OrefSet(this, this->instanceMethodDictionary, m); }; + inline RexxTable *getInstanceMethodDictionary() { return this->instanceMethodDictionary; }; inline RexxClass *getCreateClass() { return this->createClass;}; inline void setClass(RexxClass *c) { OrefSet(this, this->createClass, c); }; inline SHORT typenum() { return this->behaviourInfo.typeNum; }; Modified: interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-04-05 13:11:18 UTC (rev 229) +++ interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-04-05 21:00:57 UTC (rev 230) @@ -159,6 +159,8 @@ CHARCONSTANT(INITPROXY, "INITPROXY"); CHARCONSTANT(INITIALADDRESS, SYSINITIALADDRESS); CHARCONSTANT(INPUT, "INPUT"); +CHARCONSTANT(INSTANCEMETHOD, "INSTANCEMETHOD"); +CHARCONSTANT(INSTANCEMETHODS, "INSTANCEMETHODS"); CHARCONSTANT(INSTRUCTION, "INSTRUCTION"); CHARCONSTANT(INTEGER, "INTEGER"); CHARCONSTANT(INTERFACE, "INTERFACE"); Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-05 13:11:18 UTC (rev 229) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-05 21:00:57 UTC (rev 230) @@ -103,6 +103,8 @@ CPPM(RexxObject::defaultNameRexx), CPPM(RexxObject::unknownRexx), CPPM(RexxObject::isInstanceOfRexx), +CPPM(RexxObject::instanceMethodRexx), +CPPM(RexxObject::instanceMethodsRexx), CPPM(RexxObject::initProxyRexx), CPPM(RexxObject::freeSOMObjRexx), CPPM(RexxObject::SOMObjRexx), @@ -780,6 +782,8 @@ defineKernelMethod(CHAR_STARTAT ,TheObjectBehaviour, CPPM(RexxObject::startAt), A_COUNT); defineKernelMethod(CHAR_STRING ,TheObjectBehaviour, CPPM(RexxObject::stringRexx), 0); defineKernelMethod(CHAR_ISINSTANCEOF ,TheObjectBehaviour, CPPM(RexxObject::isInstanceOfRexx), 1); + defineKernelMethod(CHAR_INSTANCEMETHOD ,TheObjectBehaviour, CPPM(RexxObject::instanceMethodRexx), 1); + defineKernelMethod(CHAR_INSTANCEMETHODS ,TheObjectBehaviour, CPPM(RexxObject::instanceMethodsRexx), 1); definePrivateKernelMethod(CHAR_RUN ,TheObjectBehaviour, CPPM(RexxObject::run), A_COUNT); definePrivateKernelMethod(CHAR_SETMETHOD ,TheObjectBehaviour, CPPM(RexxObject::setMethod), 3); definePrivateKernelMethod(CHAR_UNSETMETHOD ,TheObjectBehaviour, CPPM(RexxObject::unsetMethod), 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-05 23:09:30
|
Revision: 232 http://svn.sourceforge.net/oorexx/?rev=232&view=rev Author: bigrixx Date: 2007-04-05 16:09:29 -0700 (Thu, 05 Apr 2007) Log Message: ----------- [ 1641213 ] Add the Netrexx Upper()/Lower() functions Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/StringClass.cpp interpreter-3.x/trunk/kernel/classes/StringClass.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/StringClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StringClass.cpp 2007-04-05 21:01:32 UTC (rev 231) +++ interpreter-3.x/trunk/kernel/classes/StringClass.cpp 2007-04-05 23:09:29 UTC (rev 232) @@ -56,6 +56,7 @@ extern ACTIVATION_SETTINGS *current_settings; #include "ASCIIDBCSStrings.hpp" +#include "RexxBuiltinFunctions.h" /* Gneral purpose BIF Header file */ ULONG RexxString::hash() /******************************************************************************/ @@ -1130,61 +1131,183 @@ return newCopy; /* return the converted string */ } + RexxString *RexxString::lower() /******************************************************************************/ /* Function: Translate a string to lower case */ /******************************************************************************/ { RexxString *newstring; /* newly created string */ - PUCHAR data; /* current data pointer */ - PUCHAR outdata; /* output data */ + PUCHAR data; /* current data pointer */ + PUCHAR outdata; /* output data */ size_t i; /* loop counter */ - BOOL translate; /* translation required */ + bool translate; /* translation required */ if (DBCS_SELF) { /* need to use DBCS? */ ValidDBCS(this); /* validate the string */ if (!NoDBCS(this)) { /* actually have DBCS characters? */ /* create a new string */ - newstring = (RexxString *)raw_string(this->length); + newstring = (RexxString *)raw_string(this->getLength()); /* copy the data */ memcpy(STRPTR(newstring), STRPTR(this), STRLEN(this)); /* do DBCS lowercasing */ DBCS_MemLower(STRPTR(newstring), STRLEN(newstring)); /* rebuild the hash value */ - newstring->generateHash(); return newstring; /* return the new string */ } /* (single byte only falls through) */ } - data = (PUCHAR)this->stringData; /* point to the string */ - translate = FALSE; /* no translation required */ + data = (PUCHAR)this->getStringData(); /* point to the string */ + translate = false; /* no translation required */ - for (i = 0; i < this->length; i++) { /* loop through entire string */ + for (i = 0; i < this->getLength(); i++) { /* loop through entire string */ if (*data != tolower(*data)) { /* have something to lowercase? */ - translate = TRUE; /* flag it */ + translate = true; /* flag it */ break; /* stop at the first one */ } data++; /* step the position */ } if (translate) { /* something to uppercase? */ /* create a new string */ - newstring = (RexxString *)raw_string(this->length); - data = (PUCHAR)this->stringData; /* point to the data start */ + newstring = (RexxString *)raw_string(this->getLength()); + data = (PUCHAR)this->getStringData(); /* point to the data start */ /* point to output data */ - outdata = (PUCHAR)newstring->stringData; + outdata = (PUCHAR)newstring->getStringData(); /* loop through entire string */ - for (i = 0; i < this->length; i++) { + for (i = 0; i < this->getLength(); i++) { *outdata = tolower(*data); /* copy the lowercase character */ data++; /* step the position */ outdata++; /* and the output position */ } - newstring->generateHash(); /* rebuild the hash value */ } else newstring = this; /* return untranslated string */ return newstring; /* return the new copy */ } + +/** + * 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. + */ +RexxString *RexxString::lowerRexx(RexxInteger *start, RexxInteger *length) +{ + size_t startPos = optional_position(start, 1, ARG_ONE) - 1; + size_t rangeLength = optional_length(length, getLength(), ARG_TWO); + + // if we're starting beyond the end bounds, return unchanged + if (startPos >= getLength()) + { + return this; + } + + rangeLength = min(rangeLength, getLength() - startPos); + + // a zero length value is also a non-change. + if (rangeLength == 0) + { + return this; + } + + return lower(startPos, rangeLength); +} + + +/** + * 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. + */ +RexxString *RexxString::upperRexx(RexxInteger *start, RexxInteger *length) +{ + size_t startPos = optional_position(start, 1, ARG_ONE) - 1; + size_t rangeLength = optional_length(length, getLength(), ARG_TWO); + + // if we're starting beyond the end bounds, return unchanged + if (startPos >= getLength()) + { + return this; + } + + rangeLength = min(rangeLength, getLength() - startPos); + + // a zero length value is also a non-change. + if (rangeLength == 0) + { + return this; + } + + return upper(startPos, rangeLength); +} + + + +/** + * Lowercase a portion of a Rexx string, returning a new string object. This + * method assumes the offset and length are already valid + * for this string object. + * + * @param start The starting offset of the segment to lowercase (origin 0). + * + * @param length The length to lowercase. + * + * @return A new string object with the case conversion applied. + */ +RexxString *RexxString::lower(size_t offset, size_t length) +{ + // get a copy of the string + RexxString *newstring = extract(0, getLength()); + + PUCHAR data = (PUCHAR)newstring->getStringData() + offset; + // now uppercase in place + for (size_t i = 0; i < length; i++) { + *data = tolower(*data); + data++; + } + newstring->generateHash(); /* done building the string */ + return newstring; +} + + + +/** + * Uppercase a portion of a Rexx string, returning a new string + * object. This method assumes the offset and length are + * already valid for this string object. + * + * @param start The starting offset of the segment to uppercase + * (origin 0). + * + * @param length The length to lowercase. + * + * @return A new string object with the case conversion applied. + */ +RexxString *RexxString::upper(size_t offset, size_t length) +{ + // get a copy of the string + RexxString *newstring = extract(0, getLength()); + + PUCHAR data = (PUCHAR)newstring->getStringData() + offset; + // now uppercase in place + for (size_t i = 0; i < length; i++) { + *data = toupper(*data); + data++; + } + newstring->generateHash(); /* done building the string */ + return newstring; +} + RexxInteger *RexxString::integerValue( size_t digits) /* precision to use */ /******************************************************************************/ Modified: interpreter-3.x/trunk/kernel/classes/StringClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StringClass.hpp 2007-04-05 21:01:32 UTC (rev 231) +++ interpreter-3.x/trunk/kernel/classes/StringClass.hpp 2007-04-05 23:09:29 UTC (rev 232) @@ -126,8 +126,12 @@ RexxString *concatBlank(RexxObject *); BOOL checkLower(); RexxString *upper(); + RexxString *upper(size_t, size_t); + RexxString *upperRexx(RexxInteger *, RexxInteger *); + RexxString *lower(); + RexxString *lower(size_t, size_t); + RexxString *lowerRexx(RexxInteger *, RexxInteger *); RexxString *stringTrace(); - RexxString *lower(); void setNumberString(RexxObject *); RexxString *concatWith(RexxString *, char); Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-05 21:01:32 UTC (rev 231) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-05 23:09:29 UTC (rev 232) @@ -338,6 +338,8 @@ CPPMSTR(RexxString::Max), CPPMSTR(RexxString::Min), CPPMSTR(RexxString::isInteger), +CPPMSTR(RexxString::upperRexx), +CPPMSTR(RexxString::lowerRexx), /* All BIF methods start here. They */ /* will be arranged according to the*/ @@ -1198,6 +1200,8 @@ defineKernelMethod(CHAR_OR ,TheStringBehaviour, CPPMSTR(RexxString::orOp), 1); defineKernelMethod(CHAR_XOR ,TheStringBehaviour, CPPMSTR(RexxString::xorOp), 1); defineKernelMethod(CHAR_MAKEARRAY ,TheStringBehaviour, CPPMSTR(RexxString::makeArray), 1); + defineKernelMethod(CHAR_LOWER ,TheStringBehaviour, CPPMSTR(RexxString::lowerRexx), 2); + defineKernelMethod(CHAR_UPPER ,TheStringBehaviour, CPPMSTR(RexxString::upperRexx), 2); /* set the scope of the methods to */ /* this classes oref */ TheStringBehaviour->setMethodDictionaryScope(TheStringClass); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-06 10:48:30
|
Revision: 234 http://svn.sourceforge.net/oorexx/?rev=234&view=rev Author: bigrixx Date: 2007-04-06 03:48:29 -0700 (Fri, 06 Apr 2007) Log Message: ----------- Add lower() and upper() builtin functions for regina compatibility. Modified Paths: -------------- interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp interpreter-3.x/trunk/kernel/parser/Token.hpp interpreter-3.x/trunk/kernel/runtime/RexxConstants.cpp Modified: interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp 2007-04-05 23:10:04 UTC (rev 233) +++ interpreter-3.x/trunk/kernel/expression/BuiltinFunctions.cpp 2007-04-06 10:48:29 UTC (rev 234) @@ -371,6 +371,53 @@ return string->substr(n, length, pad); } + +#define LOWER_MIN 2 +#define LOWER_MAX 3 +#define LOWER_string 1 +#define LOWER_n 2 +#define LOWER_length 3 + + +BUILTIN(LOWER) { + RexxString *string; /* target string */ + RexxInteger *n; /* start position */ + RexxInteger *length; /* target string length */ + + fix_args(LOWER); /* check on required number of args */ + /* must have the first argument */ + string = required_string(LOWER, string); + n = optional_integer(LOWER, n); /* position is optional */ + /* length is optional */ + length = optional_integer(LOWER, length); + /* do the LOWER function */ + return string->lowerRexx(n, length); +} + + +#define UPPER_MIN 2 +#define UPPER_MAX 3 +#define UPPER_string 1 +#define UPPER_n 2 +#define UPPER_length 3 + + +BUILTIN(UPPER) { + RexxString *string; /* target string */ + RexxInteger *n; /* start position */ + RexxInteger *length; /* target string length */ + + fix_args(UPPER); /* check on required number of args */ + /* must have the first argument */ + string = required_string(UPPER, string); + n = optional_integer(UPPER, n); /* position is optional */ + /* length is optional */ + length = optional_integer(UPPER, length); + /* do the UPPER function */ + return string->upperRexx(n, length); +} + + #define SUBWORD_MIN 2 #define SUBWORD_MAX 3 #define SUBWORD_string 1 @@ -3353,5 +3400,7 @@ &builtin_function_X2D , &builtin_function_XRANGE , &builtin_function_USERID , + &builtin_function_LOWER , + &builtin_function_UPPER , }; Modified: interpreter-3.x/trunk/kernel/parser/Token.hpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/Token.hpp 2007-04-05 23:10:04 UTC (rev 233) +++ interpreter-3.x/trunk/kernel/parser/Token.hpp 2007-04-06 10:48:29 UTC (rev 234) @@ -366,6 +366,8 @@ // the magic number in the tokenized format is increased // for that reason #define BUILTIN_USERID BUILTIN_XRANGE + 1 +#define BUILTIN_LOWER BUILTIN_USERID + 1 +#define BUILTIN_UPPER BUILTIN_LOWER + 1 typedef struct _KWDTABLE { /* keyword table entries */ PCHAR name; /* keyword name */ Modified: interpreter-3.x/trunk/kernel/runtime/RexxConstants.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxConstants.cpp 2007-04-05 23:10:04 UTC (rev 233) +++ interpreter-3.x/trunk/kernel/runtime/RexxConstants.cpp 2007-04-06 10:48:29 UTC (rev 234) @@ -211,6 +211,7 @@ KWD(CHAR_LINEIN, BUILTIN_LINEIN) KWD(CHAR_LINEOUT, BUILTIN_LINEOUT) KWD(CHAR_LINES, BUILTIN_LINES) + KWD(CHAR_LOWER, BUILTIN_LOWER) KWD(CHAR_MAX, BUILTIN_MAX) KWD(CHAR_MIN, BUILTIN_MIN) KWD(CHAR_OVERLAY, BUILTIN_OVERLAY) @@ -231,6 +232,7 @@ KWD(CHAR_TRACE, BUILTIN_TRACE) KWD(CHAR_TRANSLATE, BUILTIN_TRANSLATE) KWD(CHAR_TRUNC, BUILTIN_TRUNC) + KWD(CHAR_UPPER, BUILTIN_UPPER) KWD(CHAR_USERID, BUILTIN_USERID) KWD(CHAR_VALUE, BUILTIN_VALUE) KWD(CHAR_VAR, BUILTIN_VAR) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-08 20:01:30
|
Revision: 241 http://svn.sourceforge.net/oorexx/?rev=241&view=rev Author: bigrixx Date: 2007-04-08 13:01:28 -0700 (Sun, 08 Apr 2007) Log Message: ----------- [ 1667757 ] Add NetRexx multiple IF/WHEN expression support. Also allows do while expr1, expr2, .... and do until expr1, expr2, .... Modified Paths: -------------- interpreter-3.x/trunk/kernel/instructions/DoBlock.hpp interpreter-3.x/trunk/kernel/kernel.mak interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h interpreter-3.x/trunk/kernel/messages/rexxmsg.xml interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.cpp interpreter-3.x/trunk/kernel/parser/SourceFile.hpp interpreter-3.x/trunk/kernel/parser/Token.hpp interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc interpreter-3.x/trunk/kernel/runtime/Initialization.cpp interpreter-3.x/trunk/kernel/runtime/PrimitiveClasses.h interpreter-3.x/trunk/kernel/runtime/RexxCore.h Added Paths: ----------- interpreter-3.x/trunk/kernel/expression/ExpressionLogical.cpp interpreter-3.x/trunk/kernel/expression/ExpressionLogical.hpp Added: interpreter-3.x/trunk/kernel/expression/ExpressionLogical.cpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionLogical.cpp (rev 0) +++ interpreter-3.x/trunk/kernel/expression/ExpressionLogical.cpp 2007-04-08 20:01:28 UTC (rev 241) @@ -0,0 +1,190 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* 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.ibm.com/developerworks/oss/CPLv1.0.htm */ +/* */ +/* 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 Translator ExpressionLogical.c */ +/* */ +/* Primitive logical list evaluator */ +/* */ +/******************************************************************************/ +#include <stdlib.h> +#include "RexxCore.h" +#include "StringClass.hpp" +#include "QueueClass.hpp" +#include "RexxActivation.hpp" +#include "RexxInstruction.hpp" +#include "ExpressionLogical.hpp" +#include "StackClass.hpp" +#include "RexxActivity.hpp" +#include "BuiltinFunctions.hpp" +#include "SourceFile.hpp" + +/** + * Constructor for a RexxExpressionLogical object. + * + * @param source The source parsing context (used for raising errors) + * @param count The number of expressions in the list. + * @param list The accumulated list of expressions. + */ +RexxExpressionLogical::RexxExpressionLogical(RexxSource *source, size_t count, RexxQueue *list) +{ + ClearObject(this); /* initialize the object */ + expressionCount = count; + + // the parsed expressions are stored in a queue, so we process them in + // reverse order. + while (count > 0) + { + RexxObject *condition = list->pop(); + if (condition == OREF_NULL) + { + source->report_error(Error_Invalid_expression_logical_list); + } + OrefSet(this, this->expressions[--count], condition); + } +} + +/** + * The runtime, non-debug live marking routine. + */ +void RexxExpressionLogical::live() +{ + size_t i; /* loop counter */ + size_t count; /* argument count */ + + setUpMemoryMark + for (i = 0, count = this->expressionCount; i < count; i++) + { + memory_mark(this->expressions[i]); + } + cleanUpMemoryMark +} + +/** + * The generalized live marking routine used for non-performance + * critical marking operations. + */ +void RexxExpressionLogical::liveGeneral() +{ + size_t i; /* loop counter */ + size_t count; /* argument count */ + + setUpMemoryMarkGeneral + for (i = 0, count = this->expressionCount; i < count; i++) + { + memory_mark_general(this->expressions[i]); + } + cleanUpMemoryMarkGeneral +} + +/** + * The flattening routine, used for serializing object trees. + * + * @param envelope The envelope were's flattening into. + */ +void RexxExpressionLogical::flatten(RexxEnvelope *envelope) +{ + size_t i; /* loop counter */ + size_t count; /* argument count */ + + setUpFlatten(RexxExpressionLogical) + + for (i = 0, count = this->expressionCount; i < count; i++) + { + flatten_reference(newThis->expressions[i], envelope); + } + + cleanUpFlatten +} + +/** + * Evaluate a logical expresion list. + * + * @param context The execution context. + * @param stack The evaluation stack. + * + * @return The result of the operation, either .true or .false. + */ +RexxObject *RexxExpressionLogical::evaluate(RexxActivation *context, RexxExpressionStack *stack) +{ + // loop through the expression list evaulating and then testing for the + // logical value + size_t count = expressionCount; + // there are no optional values in the list, so evaluate unconditionally. + for (size_t i = 0; i < count; i++) + { + // evaluate and trace + RexxObject *value = expressions[i]->evaluate(context, stack); + context->traceResult(value); + + // the comparison methods return either .true or .false, so we + // can to a quick test against those. + if (value != TheTrueObject) // most of the time, these will be TRUE so test that first. + { + if (value == TheFalseObject) + { + return TheFalseObject; + } + // ok, the either returned a '0' or a '1' that was not the result of returning + // .true or .false, or we have a bad value. + if (!value->truthValue(Error_Logical_value_logical_list)) + { + return TheFalseObject; // we terminate on the first false condition + } + } + } + return TheTrueObject; // all is truth +} + +/** + * Create a new logical list object. + * + * @param size The size of the class object. + * @param count The count of logical expressions. Used to adjust the + * allocated size to the requirements. + * + * @return A new RexxExpressionLogical object. + */ +void *RexxExpressionLogical::operator new(size_t size, size_t count) +{ + /* Get new object */ + RexxObject *newObject = new_object(size + (count - 1) * sizeof(RexxObject *)); + /* Give new object its behaviour */ + BehaviourSet(newObject, TheLogicalBehaviour); + return newObject; /* and return the function */ +} + Property changes on: interpreter-3.x/trunk/kernel/expression/ExpressionLogical.cpp ___________________________________________________________________ Name: svn:eol-style + native Added: interpreter-3.x/trunk/kernel/expression/ExpressionLogical.hpp =================================================================== --- interpreter-3.x/trunk/kernel/expression/ExpressionLogical.hpp (rev 0) +++ interpreter-3.x/trunk/kernel/expression/ExpressionLogical.hpp 2007-04-08 20:01:28 UTC (rev 241) @@ -0,0 +1,68 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* 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.ibm.com/developerworks/oss/CPLv1.0.htm */ +/* */ +/* 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 ExpressionLogical.hpp */ +/* */ +/* Primitive Expression Function Class Definitions */ +/* */ +/******************************************************************************/ +#ifndef Included_RexxExpressionLogical +#define Included_RexxExpressionLogical + +class RexxSource; +class RexxQueue; + +class RexxExpressionLogical : public RexxInternalObject { + public: + inline void *operator new(size_t, void *ptr) {return ptr;} + inline void operator delete(void *, void *) {;} + void *operator new(size_t, size_t); + inline void operator delete(void *, size_t) {;} + + RexxExpressionLogical(RexxSource *, size_t, RexxQueue *); + inline RexxExpressionLogical(RESTORETYPE restoreType) { ; }; + void live(); + void liveGeneral(); + void flatten(RexxEnvelope *); + RexxObject *evaluate(RexxActivation*, RexxExpressionStack *); + + size_t expressionCount; // the number of expressions in our list + RexxObject *expressions[1]; // the list of epxressions to validate +}; +#endif + Property changes on: interpreter-3.x/trunk/kernel/expression/ExpressionLogical.hpp ___________________________________________________________________ Name: svn:eol-style + native Modified: interpreter-3.x/trunk/kernel/instructions/DoBlock.hpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/DoBlock.hpp 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/instructions/DoBlock.hpp 2007-04-08 20:01:28 UTC (rev 241) @@ -77,6 +77,5 @@ LONG forcount; /* number of iterations */ LONG indent; /* base indentation */ LONG compare; /* type of comparison */ - bool loop; // whether this is a loop or block instruction }; #endif Modified: interpreter-3.x/trunk/kernel/kernel.mak =================================================================== --- interpreter-3.x/trunk/kernel/kernel.mak 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/kernel.mak 2007-04-08 20:01:28 UTC (rev 241) @@ -101,7 +101,7 @@ OTIOBJ10=$(OR_OUTDIR)\SignalInstruction.$(OBJ) $(OR_OUTDIR)\ThenInstruction.$(OBJ) $(OR_OUTDIR)\TraceInstruction.$(OBJ) \ $(OR_OUTDIR)\UseInstruction.$(OBJ) OTEOBJ1=$(OR_OUTDIR)\ExpressionCompoundVariable.$(OBJ) $(OR_OUTDIR)\ExpressionDotVariable.$(OBJ) $(OR_OUTDIR)\ExpressionFunction.$(OBJ) \ - $(OR_OUTDIR)\ExpressionMessage.$(OBJ) + $(OR_OUTDIR)\ExpressionMessage.$(OBJ) $(OR_OUTDIR)\ExpressionLogical.$(OBJ) OTEOBJ2=$(OR_OUTDIR)\ExpressionStem.$(OBJ) $(OR_OUTDIR)\ExpressionVariable.$(OBJ) $(OR_OUTDIR)\IndirectVariableReference.$(OBJ) \ $(OR_OUTDIR)\ExpressionOperator.$(OBJ) OTEOBJ3=$(OR_OUTDIR)\ParseTarget.$(OBJ) $(OR_OUTDIR)\ParseTrigger.$(OBJ) $(OR_OUTDIR)\RexxInternalStack.$(OBJ) \ Modified: interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h =================================================================== --- interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/messages/RexxErrorCodes.h 2007-04-08 20:01:28 UTC (rev 241) @@ -257,6 +257,7 @@ #define Error_Logical_value_while 34003 #define Error_Logical_value_until 34004 #define Error_Logical_value_logical 34005 +#define Error_Logical_value_logical_list 34006 #define Error_Logical_value_user_defined 34900 #define Error_Logical_value_method 34901 #define Error_Logical_value_guard 34902 @@ -291,6 +292,7 @@ #define Error_Invalid_expression_forward_arguments 35926 #define Error_Invalid_expression_forward_message 35927 #define Error_Invalid_expression_forward_class 35928 +#define Error_Invalid_expression_logical_list 35929 #define Error_Unmatched_parenthesis 36000 #define Error_Unmatched_parenthesis_user_defined 36900 #define Error_Unmatched_parenthesis_paren 36901 Modified: interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h =================================================================== --- interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/messages/RexxMessageNumbers.h 2007-04-08 20:01:28 UTC (rev 241) @@ -585,6 +585,8 @@ #define Error_Invalid_subkeyword_select_msg 656 #define Error_Invalid_leave_iterate_name_msg 657 #define Error_Unexpected_end_select_nolabel_msg 658 +#define Error_Logical_value_logical_list_msg 659 +#define Error_Invalid_expression_logical_list_msg 660 #endif Modified: interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h =================================================================== --- interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/messages/RexxMessageTable.h 2007-04-08 20:01:28 UTC (rev 241) @@ -259,6 +259,7 @@ MINOR(Error_Logical_value_while) MINOR(Error_Logical_value_until) MINOR(Error_Logical_value_logical) + MINOR(Error_Logical_value_logical_list) MINOR(Error_Logical_value_user_defined) MINOR(Error_Logical_value_method) MINOR(Error_Logical_value_guard) @@ -293,6 +294,7 @@ MINOR(Error_Invalid_expression_forward_arguments) MINOR(Error_Invalid_expression_forward_message) MINOR(Error_Invalid_expression_forward_class) + MINOR(Error_Invalid_expression_logical_list) MAJOR(Error_Unmatched_parenthesis) MINOR(Error_Unmatched_parenthesis_user_defined) MINOR(Error_Unmatched_parenthesis_paren) Modified: interpreter-3.x/trunk/kernel/messages/rexxmsg.xml =================================================================== --- interpreter-3.x/trunk/kernel/messages/rexxmsg.xml 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/messages/rexxmsg.xml 2007-04-08 20:01:28 UTC (rev 241) @@ -1991,6 +1991,15 @@ </SubMessage> <SubMessage> <Code>34</Code> + <Subcode>006</Subcode> + <MessageNumber>659</MessageNumber> + <Component>Rexx</Component> + <Severity>Warning</Severity> + <SymbolicName>Error_Logical_value_logical_list</SymbolicName> + <Text>Value of logical list expression element must be exactly <q>0</q> or <q>1</q>; found <q><Sub position="2" name="value"/></q></Text> + </SubMessage> + <SubMessage> + <Code>34</Code> <Subcode>900</Subcode> <MessageNumber>629</MessageNumber> <Component>Rexx</Component> @@ -2307,6 +2316,15 @@ <SymbolicName>Error_Invalid_expression_forward_class</SymbolicName> <Text>Missing expression following CLASS keyword of a FORWARD instruction</Text> </SubMessage> + <SubMessage> + <Code>35</Code> + <Subcode>929</Subcode> + <MessageNumber>660</MessageNumber> + <Component>Rexx</Component> + <Severity>Warning</Severity> + <SymbolicName>Error_Invalid_expression_logical_list</SymbolicName> + <Text>Missing expression in logical_expression_list</Text> + </SubMessage> </Subcodes> </Message> <Message> Modified: interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/parser/InstructionParser.cpp 2007-04-08 20:01:28 UTC (rev 241) @@ -1008,7 +1008,7 @@ RexxToken *token; /* working token */ /* process the expression */ - condition = this->expression(TERM_EOC | TERM_THEN | TERM_KEYWORD); + condition = this->parseLogical(TERM_IF); if (condition == OREF_NULL) { /* no expression here? */ if (type == KEYWORD_IF) /* IF form? */ /* issue the IF message */ Modified: interpreter-3.x/trunk/kernel/parser/SourceFile.cpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/SourceFile.cpp 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/parser/SourceFile.cpp 2007-04-08 20:01:28 UTC (rev 241) @@ -61,6 +61,7 @@ #include "ExpressionFunction.hpp" /* expression terms */ #include "ExpressionMessage.hpp" #include "ExpressionOperator.hpp" +#include "ExpressionLogical.hpp" #include "ExpressionBaseVariable.hpp" /* base variable management class */ #include "ExpressionCompoundVariable.hpp" @@ -4246,7 +4247,7 @@ case SUBKEY_WHILE: /* DO WHILE exprw */ /* get next subexpression */ - condition = this->expression(TERM_COND); + condition = this->parseLogical(TERM_COND); if (condition == OREF_NULL) /* nothing really there? */ /* another invalid DO */ report_error(Error_Invalid_expression_while); @@ -4260,7 +4261,7 @@ case SUBKEY_UNTIL: /* DO UNTIL expru */ /* get next subexpression */ /* get next subexpression */ - condition = this->expression(TERM_COND); + condition = this->parseLogical(TERM_COND); if (condition == OREF_NULL) /* nothing really there? */ /* another invalid DO */ @@ -4284,3 +4285,35 @@ return condition; /* return the condition expression */ } + +/** + * Parse off a "logical list expression", consisting of a + * list of conditionals separated by commas. + * + * @param terminators + * The set of terminators for this logical context. + * + * @return OREF_NULL if no expressions is found, a single expression + * element if a single expression is located, and a complex + * logical expression operator for a list of expressions. + */ +RexxObject *RexxSource::parseLogical(int terminators) +{ + size_t count = argList(OREF_NULL, terminators); + // arglist has swallowed the terminator token, so we need to back up one. + previousToken(); + // let the caller deal with completely missing expressions + if (count == 0) + { + return OREF_NULL; + } + + // just a single item (common)? Just pop the top item and return it. + if (count == 1) + { + return subTerms->pop(); + } + + /* create a new function item */ + return (RexxObject *)new (count) RexxExpressionLogical(this, count, this->subTerms); +} Modified: interpreter-3.x/trunk/kernel/parser/SourceFile.hpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/SourceFile.hpp 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/parser/SourceFile.hpp 2007-04-08 20:01:28 UTC (rev 241) @@ -53,14 +53,6 @@ /* handy defines to easy coding */ #define new_instruction(name, type) this->sourceNewObject(sizeof(RexxInstruction##type), The##type##InstructionBehaviour, KEYWORD_##name) #define new_variable_instruction(name, type, size) this->sourceNewObject(size, The##type##InstructionBehaviour, KEYWORD_##name) -#define report_error_line(errorcode, instruction) this->errorLine(errorcode, instruction) -#define report_error_block(instruction) this->blockError(instruction) -#define report_error_position(errorcode, token) this->errorPosition(errorcode, token) -#define report_error1(errorcode, a1) this->error(errorcode, a1) -#define report_error2(errorcode, a1, a2) this->error(errorcode, a1, a2) -#define report_error3(errorcode, a1, a2, a3) this->error(errorcode, a1, a2, a3) -#define report_error_token(errorcode, token) this->errorToken(errorcode, token) -#define report_error(errorcode) this->error(errorcode) #define requires_allowed 0x00000001 /* ::REQUIRES directives still valid */ #define _interpret 0x00000002 /* this is interpret translation */ @@ -179,6 +171,7 @@ void parseTraceSetting(RexxString *, PINT, PINT); size_t processVariableList(INT); RexxObject *parseConditional(PINT, INT); + RexxObject *RexxSource::parseLogical(int terminators); BOOL terminator(INT, RexxToken *); BOOL traceable(void); @@ -203,6 +196,14 @@ inline void trimClause() { clause->trim(); } inline size_t markPosition() { return clause->mark(); } inline void resetPosition(size_t p) { clause->reset(p); } + inline void report_error_line(int errorcode, RexxInstruction *instruction) { this->errorLine(errorcode, instruction); } + inline void report_error_block(RexxInstruction *instruction) { this->blockError(instruction); } + inline void report_error_position(int errorcode, RexxToken *token) { this->errorPosition(errorcode, token); } + inline void report_error1(int errorcode, RexxObject *a1) { this->error(errorcode, a1); } + inline void report_error2(int errorcode, RexxObject *a1, RexxObject *a2) { this->error(errorcode, a1, a2); } + inline void report_error3(int errorcode, RexxObject *a1, RexxObject *a2, RexxObject *a3) { this->error(errorcode, a1, a2, a3); } + inline void report_error_token(int errorcode, RexxToken *token) { this->errorToken(errorcode, token); } + inline void report_error(int errorcode) { this->error(errorcode); } RexxInstruction *addressNew(); RexxInstruction *assignmentNew(RexxToken *); Modified: interpreter-3.x/trunk/kernel/parser/Token.hpp =================================================================== --- interpreter-3.x/trunk/kernel/parser/Token.hpp 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/parser/Token.hpp 2007-04-08 20:01:28 UTC (rev 241) @@ -67,6 +67,8 @@ /* terminate on DO conditionals */ #define TERM_COND (TERM_KEYWORD | TERM_WHILE | TERM_EOC) +#define TERM_IF (TERM_KEYWORD | TERM_THEN | TERM_EOC) + /* token types */ #define TOKEN_NULL 1201 #define TOKEN_BLANK TOKEN_NULL + 1 Modified: interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc =================================================================== --- interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/platform/windows/winmsgtb.rc 2007-04-08 20:01:28 UTC (rev 241) @@ -585,6 +585,8 @@ Error_Invalid_subkeyword_select "SELECT must be followed by the keyword LABEL; found ""&1""" Error_Invalid_leave_iterate_name "Symbol following ITERATE (""&1"") does not match a repetitive block instruction" Error_Unexpected_end_select_nolabel "END corresponding to SELECT on line &2 must not have a symbol following it because there is no LABEL; found ""&1""" + Error_Logical_value_logical_list "Value of logical list expression element must be exactly ""0"" or ""1""; found ""&2""" + Error_Invalid_expression_logical_list "Missing expression in logical_expression_list" END Modified: interpreter-3.x/trunk/kernel/runtime/Initialization.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Initialization.cpp 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/runtime/Initialization.cpp 2007-04-08 20:01:28 UTC (rev 241) @@ -96,6 +96,7 @@ #include "ExpressionFunction.hpp" /* expression terms */ #include "ExpressionMessage.hpp" #include "ExpressionOperator.hpp" + #include "ExpressionLogical.hpp" /* multi-logical expressions */ #include "ExpressionBaseVariable.hpp" /* base variable management class */ #include "ExpressionCompoundVariable.hpp" Modified: interpreter-3.x/trunk/kernel/runtime/PrimitiveClasses.h =================================================================== --- interpreter-3.x/trunk/kernel/runtime/PrimitiveClasses.h 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/runtime/PrimitiveClasses.h 2007-04-08 20:01:28 UTC (rev 241) @@ -244,3 +244,5 @@ CLASS_INTERNAL(parse_binary_operator, RexxBinaryOperator) CLASS_INTERNAL(parse_labeled_select, RexxInstructionLabeledSelect) + +CLASS_INTERNAL(parse_logical, RexxExpressionLogical) Modified: interpreter-3.x/trunk/kernel/runtime/RexxCore.h =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxCore.h 2007-04-08 12:37:12 UTC (rev 240) +++ interpreter-3.x/trunk/kernel/runtime/RexxCore.h 2007-04-08 20:01:28 UTC (rev 241) @@ -567,7 +567,8 @@ #define T_parse_unary_operator T_activation_frame_buffer + 1 #define T_parse_binary_operator T_parse_unary_operator + 1 #define T_parse_labeled_select T_parse_binary_operator + 1 -#define highest_T T_parse_labeled_select +#define T_parse_logical T_parse_labeled_select + 1 +#define highest_T T_parse_logical /******************************************************************************/ @@ -679,6 +680,7 @@ #define TheExposeInstructionBehaviour ((RexxBehaviour *)(&pbehav[T_parse_expose])) #define TheForwardInstructionBehaviour ((RexxBehaviour *)(&pbehav[T_parse_forward])) #define TheFunctionBehaviour ((RexxBehaviour *)(&pbehav[T_parse_function])) +#define TheLogicalBehaviour ((RexxBehaviour *)(&pbehav[T_parse_logical])) #define TheGuardInstructionBehaviour ((RexxBehaviour *)(&pbehav[T_parse_guard])) #define TheIfInstructionBehaviour ((RexxBehaviour *)(&pbehav[T_parse_if])) #define TheInstructionBehaviour ((RexxBehaviour *)(&pbehav[T_parse_instruction])) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-09 09:41:06
|
Revision: 246 http://svn.sourceforge.net/oorexx/?rev=246&view=rev Author: bigrixx Date: 2007-04-09 02:41:01 -0700 (Mon, 09 Apr 2007) Log Message: ----------- Fix error messages for min/max/noarg to differentiate between methods and routines. Modified Paths: -------------- interpreter-3.x/trunk/kernel/instructions/UseStrictInstruction.cpp interpreter-3.x/trunk/kernel/runtime/RexxActivation.hpp Modified: interpreter-3.x/trunk/kernel/instructions/UseStrictInstruction.cpp =================================================================== --- interpreter-3.x/trunk/kernel/instructions/UseStrictInstruction.cpp 2007-04-09 00:59:19 UTC (rev 245) +++ interpreter-3.x/trunk/kernel/instructions/UseStrictInstruction.cpp 2007-04-09 09:41:01 UTC (rev 246) @@ -155,12 +155,27 @@ // not enough of the required arguments? That's an error if (argcount < minimumRequired) { - report_exception1(Error_Incorrect_method_minarg, new_integer(minimumRequired)); + // this is a pain, but there are different errors for method errors vs. call errors. + if (context->inMethod()) + { + report_exception1(Error_Incorrect_method_minarg, new_integer(minimumRequired)); + } + else + { + report_exception2(Error_Incorrect_call_minarg, context->getCallname(), new_integer(minimumRequired)); + } } // potentially too many? if (!variableSize && argcount > variableCount) { - report_exception1(Error_Incorrect_method_maxarg, new_integer(variableCount)); + if (context->inMethod()) + { + report_exception1(Error_Incorrect_method_maxarg, new_integer(variableCount)); + } + else + { + report_exception2(Error_Incorrect_call_maxarg, context->getCallname(), new_integer(variableCount)); + } } // now we process each of the variable definitions left-to-right @@ -194,7 +209,14 @@ } else { - report_exception1(Error_Incorrect_method_noarg, new_integer(i + 1)); + if (context->inMethod()) + { + report_exception1(Error_Incorrect_method_noarg, new_integer(i + 1)); + } + else + { + report_exception2(Error_Incorrect_call_noarg, context->getCallname(), new_integer(i + 1)); + } } } // now go check any assertions about the argument Modified: interpreter-3.x/trunk/kernel/runtime/RexxActivation.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxActivation.hpp 2007-04-09 00:59:19 UTC (rev 245) +++ interpreter-3.x/trunk/kernel/runtime/RexxActivation.hpp 2007-04-09 09:41:01 UTC (rev 246) @@ -325,6 +325,7 @@ inline RexxActivity * getActivity() {return this->activity;}; inline RexxMethod * getMethod() {return this->method;}; inline RexxString * getMsgname() {return this->settings.msgname;}; + inline RexxString * getCallname() {return this->settings.msgname;}; inline RexxInstruction * getCurrent() {return this->current;}; inline void getSettings(ACTSETTINGS * s) {this->settings = *s;}; inline void putSettings(ACTSETTINGS * s) {*s = this->settings;}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-10 17:10:40
|
Revision: 254 http://svn.sourceforge.net/oorexx/?rev=254&view=rev Author: bigrixx Date: 2007-04-10 10:10:41 -0700 (Tue, 10 Apr 2007) Log Message: ----------- [ 1641215 ] Add region compare functions [ 1663095 ] Add a single character verification routine. Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/StringClass.hpp interpreter-3.x/trunk/kernel/classes/StringClassMisc.cpp interpreter-3.x/trunk/kernel/runtime/RexxActivity.hpp interpreter-3.x/trunk/kernel/runtime/RexxBuiltinFunctions.h interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp interpreter-3.x/trunk/kernel/runtime/RexxCore.h interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/StringClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StringClass.hpp 2007-04-09 18:46:19 UTC (rev 253) +++ interpreter-3.x/trunk/kernel/classes/StringClass.hpp 2007-04-10 17:10:41 UTC (rev 254) @@ -222,6 +222,13 @@ RexxString *x2d(RexxInteger *); RexxString *x2dC2d(RexxInteger *, BOOL); + 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); + RexxInteger *matchChar(RexxInteger *position_, RexxString *matchSet); + RexxInteger *caselessMatchChar(RexxInteger *position_, RexxString *matchSet); + RexxArray *makeArray(RexxString *); /****************************************************************************/ Modified: interpreter-3.x/trunk/kernel/classes/StringClassMisc.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StringClassMisc.cpp 2007-04-09 18:46:19 UTC (rev 253) +++ interpreter-3.x/trunk/kernel/classes/StringClassMisc.cpp 2007-04-10 17:10:41 UTC (rev 254) @@ -1114,3 +1114,215 @@ return Retval; /* return formatted number */ } + +/** + * 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 *RexxString::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 *RexxString::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 RexxString::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 RexxString::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 CaselessCompare((PUCHAR)(getStringData() + start), (PUCHAR)(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 *RexxString::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(); + stringchar_t matchChar = getChar(position - 1); + + // iterate through the match set looking for a match + for (stringsize_t i = 0; i < setLength; i++) + { + if (matchChar == (stringchar_t)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 *RexxString::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(); + stringchar_t matchChar = getChar(position - 1); + + // iterate through the match set looking for a match, using a + // caseless compare + for (stringsize_t i = 0; i < setLength; i++) + { + if (toupper(matchChar) == toupper(matchSet->getChar(i))) + { + return TheTrueObject; + } + } + return TheFalseObject; +} + Modified: interpreter-3.x/trunk/kernel/runtime/RexxActivity.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxActivity.hpp 2007-04-09 18:46:19 UTC (rev 253) +++ interpreter-3.x/trunk/kernel/runtime/RexxActivity.hpp 2007-04-10 17:10:41 UTC (rev 254) @@ -342,6 +342,37 @@ #endif }; + +inline void reportException(wholenumber_t error) +{ + CurrentActivity->reportAnException(error); +} + +inline void reportException(wholenumber_t error, RexxObject *a1) +{ + CurrentActivity->reportAnException(error, a1); +} + +inline void reportException(wholenumber_t error, RexxObject *a1, RexxObject *a2) +{ + CurrentActivity->reportAnException(error, a1, a2); +} + +inline void reportException(wholenumber_t error, RexxObject *a1, RexxObject *a2, RexxObject *a3) +{ + CurrentActivity->reportAnException(error, a1, a2, a3); +} + +inline void reportException(wholenumber_t error, RexxObject *a1, RexxObject *a2, RexxObject *a3, RexxObject *a4) +{ + CurrentActivity->reportAnException(error, a1, a2, a3, a4); +} + +inline void reportException(wholenumber_t error, wholenumber_t a1) +{ + CurrentActivity->reportAnException(error, new_integer(a1)); +} + void activity_create (void); void activity_restore (void); BOOL activity_halt (LONG, RexxString *); Modified: interpreter-3.x/trunk/kernel/runtime/RexxBuiltinFunctions.h =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxBuiltinFunctions.h 2007-04-09 18:46:19 UTC (rev 253) +++ interpreter-3.x/trunk/kernel/runtime/RexxBuiltinFunctions.h 2007-04-10 17:10:41 UTC (rev 254) @@ -58,6 +58,15 @@ #define optionalNonNegative(o, d, p) (o == OREF_NULL ? d : o->requiredNonNegative(p)) #define optionalPositive(o, d, p) (o == OREF_NULL ? d : o->requiredPositive(p)) +// the following are to make it easer to port new features over the 4.0 code base. +#define stringArgument(s, p) REQUIRED_STRING(s,p) +#define optionalStringArgument(o, d, p) optional_string(o, d, p) +#define lengthArgument(o, d) get_length(o, d) +#define optionalLengthArgument(o, d, p) optional_length(o, d, p) +#define positionArgument(o, d) get_position(o, d) +#define optionalPositionArgument(o, d, p) optional_position(o, d, p) + + RexxString *PackHex(PCHAR String, size_t StringLength); #define ch_SPACE ' ' Modified: interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-04-09 18:46:19 UTC (rev 253) +++ interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-04-10 17:10:41 UTC (rev 254) @@ -82,6 +82,8 @@ CHARCONSTANT(CALL_PROGRAM, "CALL_PROGRAM"); CHARCONSTANT(CALL_STRING, "CALL_STRING"); CHARCONSTANT(CASELESSLASTPOS, "CASELESSLASTPOS"); +CHARCONSTANT(CASELESSMATCH, "CASELESSMATCH"); +CHARCONSTANT(CASELESSMATCHCHAR, "CASELESSMATCHCHAR"); CHARCONSTANT(CASELESSPOS, "CASELESSPOS"); CHARCONSTANT(CHAR, "CHAR"); CHARCONSTANT(CLASS, "CLASS"); @@ -186,6 +188,8 @@ CHARCONSTANT(MAKEINTEGER, "MAKEINTEGER"); CHARCONSTANT(MAKESTRING, "MAKESTRING"); CHARCONSTANT(MAKE_PROXY, "MAKE_PROXY"); +CHARCONSTANT(MATCH, "MATCH"); +CHARCONSTANT(MATCHCHAR, "MATCHCHAR"); CHARCONSTANT(MEMORY, "MEMORY"); CHARCONSTANT(MERGE, "MERGE"); CHARCONSTANT(MESSAGE, "MESSAGE"); Modified: interpreter-3.x/trunk/kernel/runtime/RexxCore.h =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxCore.h 2007-04-09 18:46:19 UTC (rev 253) +++ interpreter-3.x/trunk/kernel/runtime/RexxCore.h 2007-04-10 17:10:41 UTC (rev 254) @@ -266,6 +266,13 @@ PFN entryPoint; /* method entry point */ } internalMethodEntry; +// a couple of convience typedefs to make it easier to write code that can be +// moved to the 4.0 codebase. +typedef size_t stringsize_t; +typedef int wholenumber_t; +typedef unsigned char stringchar_t; + + class ACTIVATION_SETTINGS { /* activation "global" settings */ public: inline ACTIVATION_SETTINGS() Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-09 18:46:19 UTC (rev 253) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 17:10:41 UTC (rev 254) @@ -402,6 +402,11 @@ CPPMSTR(RexxString::x2dC2d), CPPMSTR(RexxString::encodeBase64), CPPMSTR(RexxString::decodeBase64), + +CPPMSTR(RexxString::match), +CPPMSTR(RexxString::caselessMatch), +CPPMSTR(RexxString::matchChar), +CPPMSTR(RexxString::caselessMatchChar), /* End of BIF methods */ CPPMSTR(RexxString::makeArray), @@ -1207,6 +1212,10 @@ defineKernelMethod(CHAR_MAKEARRAY ,TheStringBehaviour, CPPMSTR(RexxString::makeArray), 1); defineKernelMethod(CHAR_LOWER ,TheStringBehaviour, CPPMSTR(RexxString::lowerRexx), 2); defineKernelMethod(CHAR_UPPER ,TheStringBehaviour, CPPMSTR(RexxString::upperRexx), 2); + defineKernelMethod(CHAR_MATCH ,TheStringBehaviour, CPPMSTR(RexxString::match), 4); + defineKernelMethod(CHAR_CASELESSMATCH ,TheStringBehaviour, CPPMSTR(RexxString::caselessMatch), 4); + defineKernelMethod(CHAR_MATCHCHAR ,TheStringBehaviour, CPPMSTR(RexxString::matchChar), 2); + defineKernelMethod(CHAR_CASELESSMATCHCHAR ,TheStringBehaviour, CPPMSTR(RexxString::caselessMatchChar), 2); /* set the scope of the methods to */ /* this classes oref */ TheStringBehaviour->setMethodDictionaryScope(TheStringClass); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-10 19:05:27
|
Revision: 255 http://svn.sourceforge.net/oorexx/?rev=255&view=rev Author: bigrixx Date: 2007-04-10 12:05:28 -0700 (Tue, 10 Apr 2007) Log Message: ----------- [ 1697842 ] Add allItems() and allIndexes() methods to collections. (stem class only) [ 1697836 ] Add a supplier method to the stem class. Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/StemClass.cpp interpreter-3.x/trunk/kernel/classes/StemClass.hpp interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp interpreter-3.x/trunk/kernel/runtime/RexxCore.h interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/StemClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StemClass.cpp 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/classes/StemClass.cpp 2007-04-10 19:05:28 UTC (rev 255) @@ -638,6 +638,101 @@ } +/** + * Return all items in the stem. + * + * @return An array of all items in the stem. + */ +RexxArray *RexxStem::allItems() +{ + // first, run the tree and get a count of the real items contained here + arraysize_t count = 0; + RexxCompoundElement *variable = tails.first(); + while (variable != OREF_NULL) + { + // we only want to include the non-dropped compounds, so we only count + // elements with real values. + if (variable->getVariableValue() != OREF_NULL) + { + count++; + } + // and keep iterating + variable = tails.next(variable); + } + // now we know how big the return result will be, get an array and + // populate it, using the same traversal logic as before + RexxArray *array = new_array(count); + // we index the array with a origin-one index, so we start with one this time + count = 1; + + variable = tails.first(); + while (variable != OREF_NULL) + { + // only add the real values + if (variable->getVariableValue() != OREF_NULL) + { + array->put(variable->getVariableValue(), count++); + } + variable = tails.next(variable); + } + return array; // tada, finished +} + + +/** + * Create an array of all indexes of the stem. + * + * @return An array of all tail names used in the stem. + */ +RexxArray *RexxStem::allIndexes() +{ + return this->tailArray(); /* extract the array item */ +} + + +/** + * Create a supplier for the stem, returning the tail names as + * the indexes and the values as the items. + * + * @return A supplier instance. + */ +RexxSupplier *RexxStem::supplier() +{ + // essentially the same logic as allItems(), but both the item and the + // tail value are accumulated. + arraysize_t count = 0; + RexxCompoundElement *variable = tails.first(); + while (variable != OREF_NULL) + { + // again, get the variable count + if (variable->getVariableValue() != OREF_NULL) + { + count++; /* count this variable */ + } + variable = tails.next(variable); + } + + // to create the supplier, we need 2 arrays + RexxArray *tailValues = new_array(count); + RexxArray *values = new_array(count); + count = 1; // we fill in using 1-based indexes + + variable = tails.first(); + while (variable != OREF_NULL) + { + // now grab both the tail and value and put them in the respective arrays + if (variable->getVariableValue() != OREF_NULL) + { + tailValues->put(variable->getName(), count); + values->put(variable->getVariableValue(), count++); + } + variable = tails.next(variable); + } + // two arrays become one supplier + return new_supplier(values, tailValues); +} + + /******************************************************************************/ /* Function: Below are a series of comparison routines used by the qsort() */ /* library function when sorting stems. */ Modified: interpreter-3.x/trunk/kernel/classes/StemClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StemClass.hpp 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/classes/StemClass.hpp 2007-04-10 19:05:28 UTC (rev 255) @@ -74,6 +74,9 @@ RexxInteger *integerValue(size_t); RexxString *stringValue(); RexxArray *makeArray(); + RexxArray *allItems(); + RexxArray *allIndexes(); + RexxSupplier *supplier(); RexxObject *request(RexxString *); void dropValue(); Modified: interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-04-10 19:05:28 UTC (rev 255) @@ -65,6 +65,8 @@ CHARCONSTANT(ADDITIONAL, "ADDITIONAL"); CHARCONSTANT(ALLAT, "ALLAT"); CHARCONSTANT(ALLINDEX, "ALLINDEX"); +CHARCONSTANT(ALLINDEXES, "ALLINDEXES"); +CHARCONSTANT(ALLITEMS, "ALLITEMS"); CHARCONSTANT(ANY, "ANY"); CHARCONSTANT(APPEND, "APPEND"); CHARCONSTANT(ARRAY, "ARRAY"); Modified: interpreter-3.x/trunk/kernel/runtime/RexxCore.h =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxCore.h 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/runtime/RexxCore.h 2007-04-10 19:05:28 UTC (rev 255) @@ -271,6 +271,7 @@ typedef size_t stringsize_t; typedef int wholenumber_t; typedef unsigned char stringchar_t; +typedef size_t arraysize_t; class ACTIVATION_SETTINGS { /* activation "global" settings */ Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 19:05:28 UTC (rev 255) @@ -303,6 +303,9 @@ CPPMSTEM(RexxStem::bracket), /* Stem methods */ CPPMSTEM(RexxStem::bracketEqual), CPPMSTEM(RexxStem::request), +CPPMSTEM(RexxStem::supplier), +CPPMSTEM(RexxStem::allIndexes), +CPPMSTEM(RexxStem::allItems), CPPMSTEM(RexxStem::newRexx), @@ -1092,6 +1095,9 @@ defineKernelMethod(CHAR_BRACKETSEQUAL ,TheStemBehaviour, CPPMSTEM(RexxStem::bracketEqual), A_COUNT); defineKernelMethod(CHAR_MAKEARRAY ,TheStemBehaviour, CPPM(RexxObject::makeArrayRexx), 0); defineKernelMethod(CHAR_REQUEST ,TheStemBehaviour, CPPMSTEM(RexxStem::request), 1); + defineKernelMethod(CHAR_SUPPLIER ,TheStemBehaviour, CPPMSTEM(RexxStem::supplier), 0); + defineKernelMethod(CHAR_ALLINDEXES ,TheStemBehaviour, CPPMSTEM(RexxStem::allIndexes), 0); + defineKernelMethod(CHAR_ALLITEMS ,TheStemBehaviour, CPPMSTEM(RexxStem::allItems), 0); defineKernelMethod(CHAR_UNKNOWN ,TheStemBehaviour, CPPM(RexxObject::unknownRexx), 2); /* set the scope of the methods to */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-10 19:32:51
|
Revision: 256 http://svn.sourceforge.net/oorexx/?rev=256&view=rev Author: bigrixx Date: 2007-04-10 12:32:49 -0700 (Tue, 10 Apr 2007) Log Message: ----------- [ 1697842 ] Add allItems() and allIndexes() methods to collections. array implementation only. Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp 2007-04-10 19:05:28 UTC (rev 255) +++ interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp 2007-04-10 19:32:49 UTC (rev 256) @@ -1012,25 +1012,64 @@ /* has values, so it will be of size items. */ /******************************************************************************/ { - RexxArray *newArray; /* New array */ - size_t count; /* actual count of items in array */ - size_t iterator; - RexxObject **item; /* array item pointer */ + // for an array, this is the all items value. + return this->allItems(); +} - newArray = (RexxArray *)save(new_array(this->numItems())); - count = 0; /* no items yet */ - /* loop through all array items */ - for (iterator = 0, item = this->data(); iterator < this->size(); iterator++ ) { - if (item[iterator] != OREF_NULL) { /* have a real item here? */ - /* put the next element in newArray */ - /* and bump the item counter */ - newArray->put(item[iterator], ++count); +/** + * Return an array of all real items contained in the collection. + * + * @return An array with all of the array items (non-sparse). + */ +RexxArray *RexxArray::allItems(void) +{ + // get a result array of the appropriate size + RexxArray *newArray = (RexxArray *)new_array(this->numItems()); + + // we need to fill in based on actual items, not the index. + arraysize_t count = 0; + RexxObject **item = this->data(); + // loop through the array, copying all of the items. + for (arraysize_t iterator = 0; iterator < this->size(); iterator++ ) + { + // if this is a real array item, copy over to the result + if (item[iterator] != OREF_NULL) + { + newArray->put(item[iterator], ++count); + } } - } + return newArray; +} - discard(hold(newArray)); - return newArray; + +/** + * Return an array of all indices of real array items contained + * in the collection. + * + * @return An array with all of the array indices (non-sparse). + */ +RexxArray *RexxArray::allIndexes(void) +{ + // get a result array of the appropriate size + RexxArray *newArray = (RexxArray *)new_array(this->numItems()); + save(newArray); + + // we need to fill in based on actual items, not the index. + arraysize_t count = 0; + RexxObject **item = this->data(); + // loop through the array, copying all of the items. + for (arraysize_t iterator = 0; iterator < this->size(); iterator++ ) + { + // if this is a real array item, add an integer index item to the + // result collection. + if (item[iterator] != OREF_NULL) + { + newArray->put(new_integer(iterator+1), ++count); + } + } + discard_hold(newArray); + return newArray; } Modified: interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp 2007-04-10 19:05:28 UTC (rev 255) +++ interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp 2007-04-10 19:32:49 UTC (rev 256) @@ -91,6 +91,8 @@ void flatten(RexxEnvelope *); RexxObject *copy(); RexxArray *makeArray(); + RexxArray *allItems(); + RexxArray *allIndexes(); RexxString *makeString(RexxString *); RexxString *primitiveMakeString(); RexxObject *getRexx(RexxObject **, size_t); Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 19:05:28 UTC (rev 255) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 19:32:49 UTC (rev 256) @@ -156,6 +156,8 @@ CPPMA(RexxArray::nextRexx), CPPMA(RexxArray::previousRexx), CPPMA(RexxArray::append), +CPPMA(RexxArray::allIndexes), +CPPMA(RexxArray::allItems), CPPMC1(RexxArray::newRexx), CPPMA(RexxArray::makeString), @@ -838,7 +840,9 @@ defineKernelMethod(CHAR_NEXT ,TheArrayBehaviour, CPPMA(RexxArray::nextRexx), 1); defineKernelMethod(CHAR_PREVIOUS ,TheArrayBehaviour, CPPMA(RexxArray::previousRexx), 1); defineKernelMethod(CHAR_APPEND ,TheArrayBehaviour, CPPMA(RexxArray::append), 1); - defineKernelMethod(CHAR_MAKESTRING ,TheArrayBehaviour, CPPMA(RexxArray::makeString), 1); /*THU006*/ + defineKernelMethod(CHAR_MAKESTRING ,TheArrayBehaviour, CPPMA(RexxArray::makeString), 1); + defineKernelMethod(CHAR_ALLINDEXES ,TheArrayBehaviour, CPPMA(RexxArray::allIndexes), 0); + defineKernelMethod(CHAR_ALLITEMS ,TheArrayBehaviour, CPPMA(RexxArray::allItems), 0); /* set the scope of the methods to */ /* this classes oref */ TheArrayBehaviour->setMethodDictionaryScope(TheArrayClass); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-10 19:51:27
|
Revision: 257 http://svn.sourceforge.net/oorexx/?rev=257&view=rev Author: bigrixx Date: 2007-04-10 12:51:28 -0700 (Tue, 10 Apr 2007) Log Message: ----------- [ 1697842 ] Add allItems() and allIndexes() methods to collections. directory implementation. Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/DirectoryClass.cpp interpreter-3.x/trunk/kernel/classes/DirectoryClass.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/DirectoryClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/DirectoryClass.cpp 2007-04-10 19:32:49 UTC (rev 256) +++ interpreter-3.x/trunk/kernel/classes/DirectoryClass.cpp 2007-04-10 19:51:28 UTC (rev 257) @@ -198,8 +198,65 @@ return result->supplier(); /* convert this to a supplier */ } -RexxArray *RexxDirectory::values(void) +RexxArray *RexxDirectory::requestArray() /******************************************************************************/ +/* Function: Primitive level request('ARRAY') fast path */ +/******************************************************************************/ +{ + if (OTYPE(Directory, this)) /* primitive level object? */ + return this->makeArray(); /* just do the makearray */ + else /* need to so full request mechanism */ + return (RexxArray *)this->sendMessage(OREF_REQUEST, OREF_ARRAYSYM); +} + +RexxArray *RexxDirectory::makeArray(void) +/******************************************************************************/ +/* Function: Create an array of all of the directory indices, including those*/ +/* of all the SETMETHOD methods. */ +/******************************************************************************/ +{ + return this->allIndexes(); +} + + +/** + * Create an array of all of the directory indices, including those + * of all the SETMETHOD methods. + * + * @return An array containing all of the directory indices. + */ +RexxArray *RexxDirectory::allIndexes(void) +{ + // get a result array of the appropriate size + wholenumber_t count = this->items(); + RexxArray *result = (RexxArray *)new_array(count); + save(result); + arraysize_t i = 1; + // we're working directly off of the contents. + RexxHashTable *hashTab = this->contents; + + // traverse the entire table coping over the items. + for (HashLink index = hashTab->first(); hashTab->index(index) != OREF_NULL; index = hashTab->next(index)) + { + RexxString *name = (RexxString *)hashTab->index(index); + result->put(name, i++); + } + // if e hae amethod table, we need to copy those indices also + if (this->method_table != OREF_NULL) + { + RexxTable *methodTable = this->method_table; + for (HashLink index = methodTable->first(); methodTable->available(index); index = methodTable->next(index)) + { + RexxString *name = (RexxString *)methodTable->index(index); + result->put(name, i++); + } + } + discard_hold(result); + return result; /* send back the array */ +} + +RexxArray *RexxDirectory::allItems() +/******************************************************************************/ /* Function: Create an array of all of the directory values, including the */ /* values of all the SETMETHOD methods */ /******************************************************************************/ @@ -246,58 +303,6 @@ return result; /* send back the array */ } -RexxArray *RexxDirectory::requestArray() -/******************************************************************************/ -/* Function: Primitive level request('ARRAY') fast path */ -/******************************************************************************/ -{ - if (OTYPE(Directory, this)) /* primitive level object? */ - return this->makeArray(); /* just do the makearray */ - else /* need to so full request mechanism */ - return (RexxArray *)this->sendMessage(OREF_REQUEST, OREF_ARRAYSYM); -} - -RexxArray *RexxDirectory::makeArray(void) -/******************************************************************************/ -/* Function: Create an array of all of the directory indices, including those*/ -/* of all the SETMETHOD methods. */ -/******************************************************************************/ -{ - LONG count; /* count of items in the directory */ - LONG i; /* loop counter */ - LONG index; /* table index */ - RexxArray *result; /* returned result */ - RexxHashTable *hashTab; /* working hash table pointer */ - RexxTable *methodTable; /* working method table pointer */ - RexxString *name; /* table index */ - - /* return the count as an object */ - count = this->items(); /* get the array size */ - /* get result array of correct size */ - result = (RexxArray *)new_array(count); - save(result); /* protect this */ - i = 1; /* position in array */ - hashTab = this->contents; /* get the contents */ - /* now traverse the entire table */ - for (index = hashTab->first(); hashTab->index(index) != OREF_NULL; index = hashTab->next(index)) { - /* get the directory index */ - name = (RexxString *)hashTab->index(index); - result->put(name, i++); /* add to the array */ - } - /* have a method table? */ - if (this->method_table != OREF_NULL) { - methodTable = this->method_table; /* get the method table */ - /* need to extract method values */ - for (index = methodTable->first(); methodTable->available(index); index = methodTable->next(index)) { - /* get the directory index */ - name = (RexxString *)methodTable->index(index); - result->put(name, i++); /* add to the array */ - } - } - discard_hold(result); /* unlock the result */ - return result; /* send back the array */ -} - RexxObject *RexxDirectory::entryRexx( RexxString *entryName) /* name to retrieve */ /******************************************************************************/ Modified: interpreter-3.x/trunk/kernel/classes/DirectoryClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/DirectoryClass.hpp 2007-04-10 19:32:49 UTC (rev 256) +++ interpreter-3.x/trunk/kernel/classes/DirectoryClass.hpp 2007-04-10 19:51:28 UTC (rev 257) @@ -75,7 +75,8 @@ RexxObject *setMethod(RexxString *, RexxMethod *); RexxObject *unknown(RexxString *, RexxArray *); RexxSupplier *supplier(); - RexxArray *values(); + RexxArray *allItems(); + RexxArray *allIndexes(); void reset(); RexxObject *newRexx(RexxObject **init_args, size_t); Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 19:32:49 UTC (rev 256) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 19:51:28 UTC (rev 257) @@ -174,6 +174,8 @@ CPPMD(RexxDirectory::setEntry), CPPMD(RexxDirectory::setMethod), CPPMD(RexxDirectory::supplier), +CPPMA(RexxDirectory::allIndexes), +CPPMA(RexxDirectory::allItems), CPPMD(RexxDirectory::newRexx), @@ -870,6 +872,8 @@ defineKernelMethod(CHAR_HASINDEX , TheDirectoryBehaviour, CPPMD(RexxDirectory::hasIndex), 1); defineKernelMethod(CHAR_ITEMS , TheDirectoryBehaviour, CPPMD(RexxDirectory::itemsRexx), 0); defineKernelMethod(CHAR_MAKEARRAY , TheDirectoryBehaviour, CPPM(RexxObject::makeArrayRexx), 0); + defineKernelMethod(CHAR_ALLITEMS , TheDirectoryBehaviour, CPPMD(RexxDirectory::allItems), 0); + defineKernelMethod(CHAR_ALLINDEXES , TheDirectoryBehaviour, CPPMD(RexxDirectory::allIndexes), 0); defineKernelMethod(CHAR_PUT , TheDirectoryBehaviour, CPPMD(RexxDirectory::put), 2); defineKernelMethod(CHAR_REMOVE , TheDirectoryBehaviour, CPPMD(RexxDirectory::remove), 1); defineKernelMethod(CHAR_SETENTRY , TheDirectoryBehaviour, CPPMD(RexxDirectory::setEntry), 2); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-10 20:09:20
|
Revision: 258 http://svn.sourceforge.net/oorexx/?rev=258&view=rev Author: bigrixx Date: 2007-04-10 13:09:21 -0700 (Tue, 10 Apr 2007) Log Message: ----------- [ 1697842 ] Add allItems() and allIndexes() methods to collections. list implementation. Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/ListClass.cpp interpreter-3.x/trunk/kernel/classes/ListClass.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/ListClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ListClass.cpp 2007-04-10 19:51:28 UTC (rev 257) +++ interpreter-3.x/trunk/kernel/classes/ListClass.cpp 2007-04-10 20:09:21 UTC (rev 258) @@ -699,28 +699,62 @@ return (RexxArray *)send_message1(this, OREF_REQUEST, OREF_ARRAYSYM); } + RexxArray *RexxList::makeArray(void) /******************************************************************************/ /* Function: Return all of the list values in an array */ /******************************************************************************/ { - RexxArray *array; /* returned array value */ - LISTENTRY *element; /* current working entry */ - long i; /* loop counter */ - long next; /* next item to process */ + return this->allItems(); // this is just all of the array items. +} - /* allocate proper sized array */ - array = (RexxArray *)new_array(this->count); - next = this->first; /* point to the first element */ - for (i = 1; i <= this->count; i++) { /* step through the array elements */ - element = ENTRY_POINTER(next); /* get the next item */ - /* copy over to the array */ - array->put(element->value, i); - next = element->next; /* get the next pointer */ - } - return array; /* return the array element */ + +/** + * Return an array containing all elements contained in the list, + * in sorted order. + * + * @return An array with the list elements. + */ +RexxArray *RexxList::allItems(void) +{ + // just iterate through the list, copying the elements. + RexxArray *array = (RexxArray *)new_array(this->count); + long next = this->first; + for (long i = 1; i <= this->count; i++) + { + LISTENTRY *element = ENTRY_POINTER(next); + array->put(element->value, i); + next = element->next; + } + return array; } + +/** + * Return an array containing all elements contained in the list, + * in sorted order. + * + * @return An array with the list elements. + */ +RexxArray *RexxList::allIndexes(void) +{ + // just iterate through the list, copying the elements. + RexxArray *array = (RexxArray *)new_array(this->count); + // this requires protecting, since we're going to be creating new + // integer objects. + save(array); + long next = this->first; + for (long i = 1; i <= this->count; i++) + { + LISTENTRY *element = ENTRY_POINTER(next); + array->put((RexxObject *)new_integer(next), i); + next = element->next; + } + discard_hold(array); + return array; +} + + RexxObject *RexxList::indexOfValue( RexxObject *value) /*****************************************************************************/ Modified: interpreter-3.x/trunk/kernel/classes/ListClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-04-10 19:51:28 UTC (rev 257) +++ interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-04-10 20:09:21 UTC (rev 258) @@ -73,6 +73,8 @@ void flatten(RexxEnvelope *); RexxObject *copy(); RexxArray *makeArray(); + RexxArray *allItems(); + RexxArray *allIndexes(); RexxArray *requestArray(); RexxObject *value(RexxObject *); Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 19:51:28 UTC (rev 257) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 20:09:21 UTC (rev 258) @@ -228,6 +228,8 @@ CPPML(RexxList::lastItem), CPPML(RexxList::insertRexx), CPPML(RexxList::append), +CPPML(RexxList::allIndexes), +CPPML(RexxList::allItems), CPPMLC(RexxListClass::newRexx), CPPMLC(RexxListClass::classOf), @@ -939,6 +941,8 @@ defineKernelMethod(CHAR_SECTION ,TheListBehaviour, CPPML(RexxList::section), 2); defineKernelMethod(CHAR_SUPPLIER ,TheListBehaviour, CPPML(RexxList::supplier), 0); defineKernelMethod(CHAR_APPEND ,TheListBehaviour, CPPMA(RexxList::append), 1); + defineKernelMethod(CHAR_ALLITEMS ,TheListBehaviour, CPPML(RexxList::allItems), 0); + defineKernelMethod(CHAR_ALLINDEXES ,TheListBehaviour, CPPML(RexxList::allIndexes), 0); /* set the scope of the methods to */ /* this classes oref */ TheListBehaviour->setMethodDictionaryScope(TheListClass); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2007-04-10 21:11:23
|
Revision: 260 http://svn.sourceforge.net/oorexx/?rev=260&view=rev Author: bigrixx Date: 2007-04-10 14:11:24 -0700 (Tue, 10 Apr 2007) Log Message: ----------- [ 1697842 ] Add allItems() and allIndexes() methods to collections. queue implementation. Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/ListClass.hpp interpreter-3.x/trunk/kernel/classes/QueueClass.cpp interpreter-3.x/trunk/kernel/classes/QueueClass.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/ListClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-04-10 20:19:52 UTC (rev 259) +++ interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-04-10 21:11:24 UTC (rev 260) @@ -87,6 +87,7 @@ RexxObject *hasIndex(RexxObject *); RexxSupplier *supplier(); RexxObject *itemsRexx(); + inline size_t items() { return (size_t)count; }; RexxObject *insert(RexxObject *, RexxObject *); RexxObject *put(RexxObject *, RexxObject *); RexxObject *section(RexxObject *, RexxObject *); Modified: interpreter-3.x/trunk/kernel/classes/QueueClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/QueueClass.cpp 2007-04-10 20:19:52 UTC (rev 259) +++ interpreter-3.x/trunk/kernel/classes/QueueClass.cpp 2007-04-10 21:11:24 UTC (rev 260) @@ -234,6 +234,32 @@ return (RexxObject *)new_supplier(values, OREF_NULL); } + +/** + * Retrieve an array containing all index values for the queue. + * For queue classes, the indices are the integers 1 - items(), so + * this is generally a pretty silly way to access this. + * + * @return An array containing all of the queue indices. + */ +RexxArray *RexxQueue::allIndexes() +{ + // create an array and protect it. + arraysize_t size = this->items(); + + RexxArray *result = new_array(size); + save(result); + + // now just make an array containing each index value. + for (arraysize_t i = 1; i <= size; i++) + { + result->put(new_integer(i), i); + } + + discard_hold(result); + return result; +} + RexxObject *RexxQueue::newRexx(RexxObject **init_args, size_t argCount) /******************************************************************************/ /* Function: Create an instance of a queue */ Modified: interpreter-3.x/trunk/kernel/classes/QueueClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/QueueClass.hpp 2007-04-10 20:19:52 UTC (rev 259) +++ interpreter-3.x/trunk/kernel/classes/QueueClass.hpp 2007-04-10 21:11:24 UTC (rev 260) @@ -64,7 +64,8 @@ RexxObject *peek(); RexxObject *supplier(); RexxObject *newRexx(RexxObject **, size_t); - RexxObject *append(RexxObject *); + RexxObject *append(RexxObject *); + RexxArray *allIndexes(); inline RexxObject *pop() { return this->removeFirst();}; inline void push(RexxObject *obj) { this->addFirst(obj);}; Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 20:19:52 UTC (rev 259) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 21:11:24 UTC (rev 260) @@ -303,6 +303,7 @@ CPPMQ(RexxQueue::hasindex), CPPMQ(RexxQueue::remove), CPPML(RexxQueue::append), +CPPML(RexxQueue::allIndexes), CPPMQ(RexxQueue::newRexx), @@ -1043,7 +1044,9 @@ defineKernelMethod(CHAR_HASINDEX ,TheQueueBehaviour, CPPMQ(RexxQueue::hasindex), 1); defineKernelMethod(CHAR_PUT ,TheQueueBehaviour, CPPMQ(RexxQueue::put), 2); defineKernelMethod(CHAR_REMOVE ,TheQueueBehaviour, CPPMQ(RexxQueue::remove), 1); - defineKernelMethod(CHAR_APPEND ,TheQueueBehaviour, CPPMA(RexxQueue::append), 1); + defineKernelMethod(CHAR_APPEND ,TheQueueBehaviour, CPPMQ(RexxQueue::append), 1); + defineKernelMethod(CHAR_ALLITEMS ,TheQueueBehaviour, CPPML(RexxList::allItems), 0); + defineKernelMethod(CHAR_ALLINDEXES ,TheQueueBehaviour, CPPMQ(RexxQueue::allIndexes), 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...> - 2007-04-10 22:17:06
|
Revision: 261 http://svn.sourceforge.net/oorexx/?rev=261&view=rev Author: bigrixx Date: 2007-04-10 15:17:07 -0700 (Tue, 10 Apr 2007) Log Message: ----------- [ 1697842 ] Add allItems() and allIndexes() methods to collections. table, relation, set, and bag Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/TableClass.hpp interpreter-3.x/trunk/kernel/runtime/RexxCollection.cpp interpreter-3.x/trunk/kernel/runtime/RexxCollection.hpp interpreter-3.x/trunk/kernel/runtime/RexxHashTable.cpp interpreter-3.x/trunk/kernel/runtime/RexxHashTable.hpp interpreter-3.x/trunk/kernel/runtime/RexxVariableDictionary.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/TableClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/TableClass.hpp 2007-04-10 21:11:24 UTC (rev 260) +++ interpreter-3.x/trunk/kernel/classes/TableClass.hpp 2007-04-10 22:17:07 UTC (rev 261) @@ -62,7 +62,6 @@ RexxObject * replace(RexxObject *newValue, long pos) {return this->contents->replace(newValue, pos); }; RexxArray * allAt(RexxObject *key) { return this->contents->getAll(key); } void reHash(); - RexxArray * values() { return this->contents->values(); }; RexxArray * requestArray(); inline RexxArray * stringGetAll(RexxString *key) {return this->contents->stringGetAll(key); }; inline RexxObject * stringGet(RexxString *key) {return this->contents->stringGet(key); }; Modified: interpreter-3.x/trunk/kernel/runtime/RexxCollection.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxCollection.cpp 2007-04-10 21:11:24 UTC (rev 260) +++ interpreter-3.x/trunk/kernel/runtime/RexxCollection.cpp 2007-04-10 22:17:07 UTC (rev 261) @@ -307,3 +307,19 @@ /* get the hashtab supplier */ return this->contents->supplier(); } + +RexxArray *RexxHashTableCollection::allItems() +/******************************************************************************/ +/* Function: retrieve all items of the collection. */ +/******************************************************************************/ +{ + return this->contents->allItems(); +} + +RexxArray *RexxHashTableCollection::allIndexes() +/******************************************************************************/ +/* Function: retrieve all indexes of the collection. */ +/******************************************************************************/ +{ + return this->contents->allIndexes(); +} Modified: interpreter-3.x/trunk/kernel/runtime/RexxCollection.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxCollection.hpp 2007-04-10 21:11:24 UTC (rev 260) +++ interpreter-3.x/trunk/kernel/runtime/RexxCollection.hpp 2007-04-10 22:17:07 UTC (rev 261) @@ -67,6 +67,8 @@ RexxObject *hasIndex(RexxObject *); RexxSupplier *supplier(); RexxObject *merge(RexxHashTableCollection *); + RexxArray *allItems(); + RexxArray *allIndexes(); inline long items() { return this->contents->totalEntries(); }; inline long first() { return this->contents->first(); }; Modified: interpreter-3.x/trunk/kernel/runtime/RexxHashTable.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxHashTable.cpp 2007-04-10 21:11:24 UTC (rev 260) +++ interpreter-3.x/trunk/kernel/runtime/RexxHashTable.cpp 2007-04-10 22:17:07 UTC (rev 261) @@ -1246,7 +1246,7 @@ return OREF_NULL; /* always return nothing */ } -RexxArray *RexxHashTable::values(void) +RexxArray *RexxHashTable::allItems() /******************************************************************************/ /* Function: Create an array containing the hash table values */ /******************************************************************************/ @@ -1281,6 +1281,16 @@ /* Function: Create an array containing the hash table indexes. */ /******************************************************************************/ { + // this just returns the index values + return this->allIndexes(); +} + + +RexxArray *RexxHashTable::allIndexes() +/******************************************************************************/ +/* Function: Create an array containing the hash table indexes. */ +/******************************************************************************/ +{ size_t count; /* count of values */ size_t i; /* loop counter */ size_t j; /* loop counter */ @@ -1306,6 +1316,7 @@ return result; /* return the result array */ } + RexxSupplier *RexxHashTable::supplier(void) /******************************************************************************/ /* Function: create a supplier from a hash table */ Modified: interpreter-3.x/trunk/kernel/runtime/RexxHashTable.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxHashTable.hpp 2007-04-10 21:11:24 UTC (rev 260) +++ interpreter-3.x/trunk/kernel/runtime/RexxHashTable.hpp 2007-04-10 22:17:07 UTC (rev 261) @@ -94,8 +94,9 @@ RexxObject *getIndex(RexxObject *value); RexxHashTable *reHash(); RexxHashTable *putNodupe(RexxObject *value, RexxObject *key); - RexxArray *values(); RexxSupplier *supplier(); + RexxArray *allItems(); + RexxArray *allIndexes(); RexxObject *removeItem(RexxObject *value, RexxObject *key); RexxObject *stringGet(RexxString *key); RexxHashTable *stringPut(RexxObject *value, RexxString *key); Modified: interpreter-3.x/trunk/kernel/runtime/RexxVariableDictionary.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxVariableDictionary.hpp 2007-04-10 21:11:24 UTC (rev 260) +++ interpreter-3.x/trunk/kernel/runtime/RexxVariableDictionary.hpp 2007-04-10 22:17:07 UTC (rev 261) @@ -110,7 +110,7 @@ stem_table->setCompoundVariable(&resolved_tail, value); } - inline RexxArray *getAllVariables() { return contents->values(); } + inline RexxArray *getAllVariables() { return contents->allItems(); } RexxVariable *nextVariable(RexxNativeActivation *); void set(RexxString *, RexxObject *); Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 21:11:24 UTC (rev 260) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 22:17:07 UTC (rev 261) @@ -493,6 +493,8 @@ CPPMTBL(RexxTable::itemsRexx), CPPMHC(RexxHashTableCollection::merge), CPPMHC(RexxHashTableCollection::supplier), +CPPMHC(RexxHashTableCollection::allItems), +CPPMHC(RexxHashTableCollection::allIndexes), CPPMTBL(RexxTable::newRexx), @@ -1084,6 +1086,8 @@ defineKernelMethod(CHAR_REMOVE , TheRelationBehaviour, CPPMHC(RexxHashTableCollection::removeRexx), 1); defineKernelMethod(CHAR_REMOVEITEM , TheRelationBehaviour, CPPMREL(RexxRelation::removeItemRexx), 2); defineKernelMethod(CHAR_SUPPLIER , TheRelationBehaviour, CPPMREL(RexxRelation::supplier), 1); + defineKernelMethod(CHAR_ALLITEMS , TheRelationBehaviour, CPPMHC(RexxHashTableCollection::allItems), 0); + defineKernelMethod(CHAR_ALLINDEXES , TheRelationBehaviour, CPPMHC(RexxHashTableCollection::allIndexes), 0); /* set the scope of the methods to */ /* this classes oref */ @@ -1565,6 +1569,8 @@ defineKernelMethod(CHAR_PUT , TheTableBehaviour, CPPMHC(RexxHashTableCollection::put), 2); defineKernelMethod(CHAR_REMOVE , TheTableBehaviour, CPPMHC(RexxHashTableCollection::removeRexx), 1); defineKernelMethod(CHAR_SUPPLIER , TheTableBehaviour, CPPMHC(RexxHashTableCollection::supplier), 0); + defineKernelMethod(CHAR_ALLITEMS , TheTableBehaviour, CPPMHC(RexxHashTableCollection::allItems), 0); + defineKernelMethod(CHAR_ALLINDEXES , TheTableBehaviour, CPPMHC(RexxHashTableCollection::allIndexes), 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. |