From: <bi...@us...> - 2008-07-27 20:36:14
|
Revision: 2795 http://oorexx.svn.sourceforge.net/oorexx/?rev=2795&view=rev Author: bigrixx Date: 2008-07-27 20:36:23 +0000 (Sun, 27 Jul 2008) Log Message: ----------- Add a FindContextClass() api to the Call Context Modified Paths: -------------- main/trunk/api/oorexxapi.h main/trunk/kernel/api/CallContextStubs.cpp main/trunk/kernel/runtime/RexxActivation.hpp main/trunk/kernel/runtime/RexxNativeActivation.cpp main/trunk/kernel/runtime/RexxNativeActivation.hpp Modified: main/trunk/api/oorexxapi.h =================================================================== --- main/trunk/api/oorexxapi.h 2008-07-27 19:28:24 UTC (rev 2794) +++ main/trunk/api/oorexxapi.h 2008-07-27 20:36:23 UTC (rev 2795) @@ -676,6 +676,7 @@ wholenumber_t (RexxEntry *GetContextDigits)(RexxCallContext *); wholenumber_t (RexxEntry *GetContextFuzz)(RexxCallContext *); logical_t (RexxEntry *GetContextForm)(RexxCallContext *); + RexxClassObject (RexxEntry *FindContextClass)(RexxCallContext *, CSTRING); } CallContextInterface; #define EXIT_INTERFACE_VERSION 100 @@ -2378,6 +2379,10 @@ { return functions->GetContextForm(this); } + RexxClassObject FindContextClass(CSTRING n) + { + return functions->FindContextClass(this, n); + } #endif }; Modified: main/trunk/kernel/api/CallContextStubs.cpp =================================================================== --- main/trunk/kernel/api/CallContextStubs.cpp 2008-07-27 19:28:24 UTC (rev 2794) +++ main/trunk/kernel/api/CallContextStubs.cpp 2008-07-27 20:36:23 UTC (rev 2795) @@ -286,7 +286,22 @@ return false; } +RexxClassObject RexxEntry FindCallContextClass(RexxCallContext *c, CSTRING n) +{ + ApiContext context(c); + try + { + // convert the name to a string instance, and check the environments. + RexxString *name = new_upper_string(n); + return (RexxClassObject)context.ret(context.context->findCallerClass(name)); + } + catch (RexxNativeActivation *) + { + } + return NULLOBJECT; +} + END_EXTERN_C() CallContextInterface RexxActivity::callContextFunctions = @@ -303,7 +318,8 @@ InvalidRoutine, GetContextDigits, GetContextFuzz, - GetContextForm + GetContextForm, + FindCallContextClass }; ExitContextInterface RexxActivity::exitContextFunctions = Modified: main/trunk/kernel/runtime/RexxActivation.hpp =================================================================== --- main/trunk/kernel/runtime/RexxActivation.hpp 2008-07-27 19:28:24 UTC (rev 2794) +++ main/trunk/kernel/runtime/RexxActivation.hpp 2008-07-27 20:36:23 UTC (rev 2795) @@ -266,6 +266,7 @@ static RoutineClass* getMacroCode(RexxString *macroName); RexxString *resolveProgramName(RexxString *name); RexxClass *findClass(RexxString *name); + RexxClass *findCallerClass(RexxString *name); RexxObject * command(RexxString *, RexxString *); int64_t getElapsed(); RexxDateTime getTime(); Modified: main/trunk/kernel/runtime/RexxNativeActivation.cpp =================================================================== --- main/trunk/kernel/runtime/RexxNativeActivation.cpp 2008-07-27 19:28:24 UTC (rev 2794) +++ main/trunk/kernel/runtime/RexxNativeActivation.cpp 2008-07-27 20:36:23 UTC (rev 2795) @@ -2486,6 +2486,29 @@ /** + * Resolve a class in the context of the caller's execution + * context. + * + * @param className The target class name. + * + * @return The resolved class (if any). + */ +RexxClass *RexxNativeActivation::findCallerClass(RexxString *className) +{ + // have a caller context? if not, just do the default environment searches + if (activation == OREF_NULL) + { + return Interpreter::findClass(className); + } + else + { + // use the caller activation to resolve this + return activation->findClass(className); + } +} + + +/** * Retrieve the source object for the current context, if there is one. * * @return The source object associated with any Method or Routine currently Modified: main/trunk/kernel/runtime/RexxNativeActivation.hpp =================================================================== --- main/trunk/kernel/runtime/RexxNativeActivation.hpp 2008-07-27 19:28:24 UTC (rev 2794) +++ main/trunk/kernel/runtime/RexxNativeActivation.hpp 2008-07-27 20:36:23 UTC (rev 2795) @@ -108,6 +108,7 @@ RexxObject *getSuper(); RexxStem *resolveStemVariable(RexxObject *s); RexxClass *findClass(RexxString *className); + RexxClass *findCallerClass(RexxString *className); inline void termination() { this->guardOff();} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-07-27 21:42:28
|
Revision: 2796 http://oorexx.svn.sourceforge.net/oorexx/?rev=2796&view=rev Author: bigrixx Date: 2008-07-27 21:42:37 +0000 (Sun, 27 Jul 2008) Log Message: ----------- Add an ObjectToCSelf api Modified Paths: -------------- main/trunk/api/oorexxapi.h main/trunk/kernel/api/ThreadContextStubs.cpp main/trunk/kernel/classes/ObjectClass.cpp main/trunk/kernel/classes/ObjectClass.hpp main/trunk/kernel/runtime/RexxNativeActivation.cpp Modified: main/trunk/api/oorexxapi.h =================================================================== --- main/trunk/api/oorexxapi.h 2008-07-27 20:36:23 UTC (rev 2795) +++ main/trunk/api/oorexxapi.h 2008-07-27 21:42:37 UTC (rev 2796) @@ -55,9 +55,8 @@ #define REXX_VALUE_ARGLIST 2 #define REXX_VALUE_NAME 3 #define REXX_VALUE_SCOPE 4 -#define REXX_VALUE_BUFFER 5 -#define REXX_VALUE_CSELF 6 -#define REXX_VALUE_OSELF 7 +#define REXX_VALUE_CSELF 5 +#define REXX_VALUE_OSELF 6 // each of the following types have an optional equivalent @@ -327,7 +326,6 @@ RexxArrayObject value_ARGLIST; CSTRING value_NAME; RexxClassObject value_SCOPE; - POINTER value_BUFFER; POINTER value_CSELF; RexxObjectPtr value_OSELF; RexxObjectPtr value_RexxObjectPtr; @@ -527,6 +525,7 @@ RexxBufferObject (RexxEntry *SaveRoutine)(RexxThreadContext *, RexxRoutineObject); RexxObjectPtr (RexxEntry *NewObject)(RexxThreadContext *); + POINTER (RexxEntry *ObjectToCSelf)(RexxThreadContext *, RexxObjectPtr); RexxObjectPtr (RexxEntry *NumberToObject)(RexxThreadContext *, wholenumber_t); RexxObjectPtr (RexxEntry *UintptrToObject)(RexxThreadContext *, uintptr_t); RexxObjectPtr (RexxEntry *ValueToObject)(RexxThreadContext *, ValueDescriptor *); @@ -584,7 +583,7 @@ RexxArrayObject (RexxEntry *ArrayOfTwo)(RexxThreadContext *, RexxObjectPtr, RexxObjectPtr); logical_t (RexxEntry *IsArray)(RexxThreadContext *, RexxObjectPtr); - CSTRING (RexxEntry *BufferData)(RexxThreadContext *, RexxBufferObject); + POINTER (RexxEntry *BufferData)(RexxThreadContext *, RexxBufferObject); size_t (RexxEntry *BufferLength)(RexxThreadContext *, RexxBufferObject); RexxBufferObject (RexxEntry *NewBuffer)(RexxThreadContext *, size_t); logical_t (RexxEntry *IsBuffer)(RexxThreadContext *, RexxObjectPtr); @@ -881,6 +880,10 @@ { return functions->NewObject(this); } + POINTER ObjectToCSelf(RexxObjectPtr o) + { + return functions->ObjectToCSelf(this, o); + } RexxObjectPtr NumberToObject(wholenumber_t n) { return functions->NumberToObject(this, n); @@ -1094,7 +1097,7 @@ return functions->IsArray(this, o); } - CSTRING BufferData(RexxBufferObject bo) + POINTER BufferData(RexxBufferObject bo) { return functions->BufferData(this, bo); } @@ -1395,6 +1398,10 @@ { return threadContext->NewObject(); } + POINTER ObjectToCSelf(RexxObjectPtr o) + { + return threadContext->ObjectToCSelf(o); + } RexxObjectPtr NumberToObject(wholenumber_t n) { return threadContext->NumberToObject(n); @@ -1604,7 +1611,7 @@ return threadContext->IsArray(o); } - CSTRING BufferData(RexxBufferObject bo) + POINTER BufferData(RexxBufferObject bo) { return threadContext->BufferData(bo); } @@ -1962,6 +1969,10 @@ { return threadContext->NewObject(); } + POINTER ObjectToCSelf(RexxObjectPtr o) + { + return threadContext->ObjectToCSelf(o); + } RexxObjectPtr NumberToObject(wholenumber_t n) { return threadContext->NumberToObject(n); @@ -2171,7 +2182,7 @@ return threadContext->IsArray(o); } - CSTRING BufferData(RexxBufferObject bo) + POINTER BufferData(RexxBufferObject bo) { return threadContext->BufferData(bo); } @@ -2527,6 +2538,10 @@ { return threadContext->NewObject(); } + POINTER ObjectToCSelf(RexxObjectPtr o) + { + return threadContext->ObjectToCSelf(o); + } RexxObjectPtr NumberToObject(wholenumber_t n) { return threadContext->NumberToObject(n); @@ -2736,7 +2751,7 @@ return threadContext->IsArray(o); } - CSTRING BufferData(RexxBufferObject bo) + POINTER BufferData(RexxBufferObject bo) { return threadContext->BufferData(bo); } @@ -2931,7 +2946,6 @@ #define ARGUMENT_TYPE_ARGLIST RexxArrayObject #define ARGUMENT_TYPE_NAME CSTRING #define ARGUMENT_TYPE_SCOPE RexxClassObject -#define ARGUMENT_TYPE_BUFFER POINTER #define ARGUMENT_TYPE_CSELF POINTER #define ARGUMENT_TYPE_OSELF RexxObjectPtr Modified: main/trunk/kernel/api/ThreadContextStubs.cpp =================================================================== --- main/trunk/kernel/api/ThreadContextStubs.cpp 2008-07-27 20:36:23 UTC (rev 2795) +++ main/trunk/kernel/api/ThreadContextStubs.cpp 2008-07-27 21:42:37 UTC (rev 2796) @@ -560,6 +560,21 @@ return NULLOBJECT; } +POINTER RexxEntry ObjectToCSelf(RexxThreadContext *c, RexxObjectPtr o) +{ + ApiContext context(c); + try + { + // ask the object to figure this out + return ((RexxObject *)o)->getCSelf(); + } + catch (RexxNativeActivation *) + { + } + return NULL; +} + + RexxObjectPtr RexxEntry NumberToObject(RexxThreadContext *c, wholenumber_t n) { ApiContext context(c); @@ -1263,12 +1278,12 @@ return false; } -CSTRING RexxEntry BufferData(RexxThreadContext *c, RexxBufferObject b) +POINTER RexxEntry BufferData(RexxThreadContext *c, RexxBufferObject b) { ApiContext context(c); try { - return (CSTRING)((RexxBuffer *)b)->getData(); + return (POINTER)((RexxBuffer *)b)->getData(); } catch (RexxNativeActivation *) { @@ -1747,6 +1762,7 @@ SaveRoutine, NewObject, + ObjectToCSelf, NumberToObject, UintptrToObject, ValueToObject, Modified: main/trunk/kernel/classes/ObjectClass.cpp =================================================================== --- main/trunk/kernel/classes/ObjectClass.cpp 2008-07-27 20:36:23 UTC (rev 2795) +++ main/trunk/kernel/classes/ObjectClass.cpp 2008-07-27 21:42:37 UTC (rev 2796) @@ -58,9 +58,9 @@ #include "ExpressionBaseVariable.hpp" #include "SourceFile.hpp" #include "ProtectedObject.hpp" +#include "PointerClass.hpp" - // singleton class instance RexxClass *RexxObject::classInstance = OREF_NULL; RexxObject *RexxNilObject::nilObject = OREF_NULL; @@ -1897,6 +1897,34 @@ memoryObject.removeUninitObject((RexxObject *)this); } +/** + * Search through all of the scopes looking for a variable + * of the given name. This will return the first match. + * + * @param name The target name. + * + * @return The value associated with the variable or OREF_NULL if + * no matching variable is found. + */ +RexxObject *RexxObject::getObjectVariable(RexxString *name) +{ + RexxVariableDictionary *dictionary = objectVariables; + while (dictionary != OREF_NULL) + { + // see if this dictionary has the variable + RexxObject *val = dictionary->realValue(name); + // return this if it exists + if (val != OREF_NULL) + { + return val; + } + // step to the next dictionary in the chain + dictionary = dictionary->getNextDictionary(); + } + return OREF_NULL; // no variable found +} + + RexxObject * RexxObject::getObjectVariable( RexxString * name, /* variable name (name object) */ RexxObject * scope) /* target variable scope */ @@ -2313,6 +2341,35 @@ /** + * Attempt to get a CSELF value from an object instance + * for a native context. + * + * @return An unwrapperd CSELF value, if one can be found. + */ +void *RexxObject::getCSelf() +{ + // try for the variable value + RexxObject *C_self = getObjectVariable(OREF_CSELF); + // if we found one, validate for unwrappering + if (C_self != OREF_NULL) + { + // if this is a pointer, then unwrapper the value + if (C_self->isInstanceOf(ThePointerClass)) + { + return ((RexxPointer *)C_self)->pointer(); + } + // this could be a containing buffer instance as well + else if (C_self->isInstanceOf(TheBufferClass)) + { + // return a pointer to the buffer beginning + return(void *)((RexxBuffer *)C_self)->getData(); + } + } + return NULL; /* no object available */ +} + + +/** * new operator for creating a RexxNilObject */ void *RexxNilObject::operator new(size_t size) Modified: main/trunk/kernel/classes/ObjectClass.hpp =================================================================== --- main/trunk/kernel/classes/ObjectClass.hpp 2008-07-27 20:36:23 UTC (rev 2795) +++ main/trunk/kernel/classes/ObjectClass.hpp 2008-07-27 21:42:37 UTC (rev 2796) @@ -445,6 +445,7 @@ // Following are internal OREXX methods RexxObject *defMethods(RexxDirectory *); void setObjectVariable(RexxString *, RexxObject *, RexxObject *); + RexxObject *getObjectVariable(RexxString *); RexxObject *getObjectVariable(RexxString *, RexxObject *); void addObjectVariables(RexxVariableDictionary *); void copyObjectVariables(RexxObject *newObject); @@ -476,6 +477,7 @@ RexxObject *copyRexx(); RexxObject *unknownRexx(RexxString *, RexxArray *); RexxObject *hasMethodRexx(RexxString *); + void *getCSelf(); // compare 2 values for equality, potentially falling back on the // "==" method for the test. bool inline equalValue(RexxObject *other) Modified: main/trunk/kernel/runtime/RexxNativeActivation.cpp =================================================================== --- main/trunk/kernel/runtime/RexxNativeActivation.cpp 2008-07-27 20:36:23 UTC (rev 2795) +++ main/trunk/kernel/runtime/RexxNativeActivation.cpp 2008-07-27 21:42:37 UTC (rev 2796) @@ -262,18 +262,6 @@ break; } - case REXX_VALUE_BUFFER: /* reference to Buffered storage */ - { - // this doesn't make any sense for a function call - if (activationType != METHOD_ACTIVATION) - { - reportSignatureError(); - } - descriptors[outputIndex].flags = ARGUMENT_EXISTS | SPECIAL_ARGUMENT; - descriptors[outputIndex].value.value_POINTER = this->buffer(); - break; - } - case REXX_VALUE_ARGLIST: /* need the argument list */ { descriptors[outputIndex].flags = ARGUMENT_EXISTS | SPECIAL_ARGUMENT; @@ -1781,38 +1769,16 @@ /* NULL is returned. */ /******************************************************************************/ { - /* retrieve from object dictionary */ - RexxPointer *C_self = (RexxPointer *)methodVariables()->realValue(OREF_CSELF); - if (C_self != OREF_NULL) /* got an item? */ + // if this is a method invocation, ask the receiver object to figure this out. + if (receiver != OREF_NULL) { - return C_self->pointer(); /* return the pointer value */ + return receiver->getCSelf(); } - else - { - return NULL; /* no object available */ - } + // nope, call context doesn't allow this + return OREF_NULL; } -void *RexxNativeActivation::buffer() -/******************************************************************************/ -/* Function: Returns "unwrapped" C or C++ object stored in a buffer object. */ -/* If the variable CSELF does not exist, then NULL is returned. */ -/******************************************************************************/ -{ - /* retrieve from object dictionary */ - RexxBuffer *C_self = (RexxBuffer *)this->methodVariables()->realValue(OREF_CSELF); - if (C_self != OREF_NULL) /* got an item? */ - { - return(void *)C_self->getData(); /* return a pointer to the address */ - } - else - { - return NULL; /* no object available */ - } -} - - void *RexxNativeActivation::pointer( RexxObject *object) /* object to convert */ /******************************************************************************/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-07-31 21:02:17
|
Revision: 2808 http://oorexx.svn.sourceforge.net/oorexx/?rev=2808&view=rev Author: bigrixx Date: 2008-07-31 21:02:26 +0000 (Thu, 31 Jul 2008) Log Message: ----------- Tweak the native method creation code slightly Modified Paths: -------------- main/trunk/kernel/classes/MessageClass.hpp main/trunk/kernel/parser/SourceFile.cpp main/trunk/rxregexp/rxregexp.cpp Modified: main/trunk/kernel/classes/MessageClass.hpp =================================================================== --- main/trunk/kernel/classes/MessageClass.hpp 2008-07-31 18:56:34 UTC (rev 2807) +++ main/trunk/kernel/classes/MessageClass.hpp 2008-07-31 21:02:26 UTC (rev 2808) @@ -36,7 +36,7 @@ /* */ /*----------------------------------------------------------------------------*/ /******************************************************************************/ -/* REXX Kernel MessageClass.hpp */ +/* REXX Kernel MessageClass.hpp */ /* */ /* Primitive Message Class Definitions */ /* */ Modified: main/trunk/kernel/parser/SourceFile.cpp =================================================================== --- main/trunk/kernel/parser/SourceFile.cpp 2008-07-31 18:56:34 UTC (rev 2807) +++ main/trunk/kernel/parser/SourceFile.cpp 2008-07-31 21:02:26 UTC (rev 2808) @@ -2310,7 +2310,8 @@ { syntaxError(Error_External_name_not_found_method, entry); } - nmethod->setSourceObject(this); + // this might return a different object if this has been used already + nmethod = (RexxNativeCode *)nmethod->setSourceObject(this); /* turn into a real method object */ _method = new RexxMethod(name, nmethod); } Modified: main/trunk/rxregexp/rxregexp.cpp =================================================================== --- main/trunk/rxregexp/rxregexp.cpp 2008-07-31 18:56:34 UTC (rev 2807) +++ main/trunk/rxregexp/rxregexp.cpp 2008-07-31 21:02:26 UTC (rev 2808) @@ -78,6 +78,7 @@ // this will be passed back into us on calls context->SetObjectVariable("CSELF", context->NewPointer(pAutomaton)); + return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-09 00:21:14
|
Revision: 2893 http://oorexx.svn.sourceforge.net/oorexx/?rev=2893&view=rev Author: bigrixx Date: 2008-08-09 00:21:23 +0000 (Sat, 09 Aug 2008) Log Message: ----------- Fix inadvertent trapping of conditions on methods invoked from native code Modified Paths: -------------- main/trunk/kernel/api/ThreadContextStubs.cpp main/trunk/kernel/runtime/RexxNativeActivation.cpp main/trunk/kernel/runtime/RexxNativeActivation.hpp main/trunk/rxregexp/rxregexp.cls main/trunk/rxregexp/rxregexp.cpp Modified: main/trunk/kernel/api/ThreadContextStubs.cpp =================================================================== --- main/trunk/kernel/api/ThreadContextStubs.cpp 2008-08-08 22:52:20 UTC (rev 2892) +++ main/trunk/kernel/api/ThreadContextStubs.cpp 2008-08-09 00:21:23 UTC (rev 2893) @@ -1659,6 +1659,7 @@ ApiContext context(c); try { + context.context->enableConditionTrap(); context.activity->raiseCondition(new_upper_string(name), OREF_NULL, new_string(desc), (RexxArray *)add, (RexxObject *)result, OREF_NULL); } Modified: main/trunk/kernel/runtime/RexxNativeActivation.cpp =================================================================== --- main/trunk/kernel/runtime/RexxNativeActivation.cpp 2008-08-08 22:52:20 UTC (rev 2892) +++ main/trunk/kernel/runtime/RexxNativeActivation.cpp 2008-08-09 00:21:23 UTC (rev 2893) @@ -2186,8 +2186,23 @@ // we end up seeing this a second time if we're raising the exception on // return from an external call or method. - if (trapErrors) + if (condition->isEqual(OREF_SYNTAX)) { + if (trapErrors) + { + // record this in case any callers want to know about it. + setConditionInfo(exception_object); + // this will unwind back to the calling level, with the + // exception information recorded. + throw this; + } + + } + else if (trapConditions) + { + // pretty much the same deal, but we're only handling conditions, and + // only one condtion, so reset the trap flag + trapConditions = false; // record this in case any callers want to know about it. setConditionInfo(exception_object); // this will unwind back to the calling level, with the Modified: main/trunk/kernel/runtime/RexxNativeActivation.hpp =================================================================== --- main/trunk/kernel/runtime/RexxNativeActivation.hpp 2008-08-08 22:52:20 UTC (rev 2892) +++ main/trunk/kernel/runtime/RexxNativeActivation.hpp 2008-08-09 00:21:23 UTC (rev 2893) @@ -170,6 +170,7 @@ RexxReturnCode copyValue(RexxObject * value, RXSTRING *rxstring, size_t *length); RexxReturnCode copyValue(RexxObject * value, CONSTRXSTRING *rxstring, size_t *length); int stemSort(const char *stemname, int order, int type, size_t start, size_t end, size_t firstcol, size_t lastcol); + inline void enableConditionTrap() { trapConditions = true; } protected: @@ -205,5 +206,6 @@ int object_scope; /* reserve/release state of variables*/ bool stackBase; // this is a stack base marker bool trapErrors; // we're trapping errors from external callers + bool trapConditions; // trap any raised conditions }; #endif Modified: main/trunk/rxregexp/rxregexp.cls =================================================================== --- main/trunk/rxregexp/rxregexp.cls 2008-08-08 22:52:20 UTC (rev 2892) +++ main/trunk/rxregexp/rxregexp.cls 2008-08-09 00:21:23 UTC (rev 2893) @@ -50,6 +50,7 @@ ::METHOD PARSE EXTERNAL "LIBRARY rxregexp RegExp_Parse" ::METHOD MATCH EXTERNAL "LIBRARY rxregexp RegExp_Match" ::METHOD POS EXTERNAL "LIBRARY rxregexp RegExp_Pos" +::METHOD FOO EXTERNAL "LIBRARY rxregexp RegExp_Foo" ::METHOD POSITION expose !POS Modified: main/trunk/rxregexp/rxregexp.cpp =================================================================== --- main/trunk/rxregexp/rxregexp.cpp 2008-08-08 22:52:20 UTC (rev 2892) +++ main/trunk/rxregexp/rxregexp.cpp 2008-08-09 00:21:23 UTC (rev 2893) @@ -96,6 +96,14 @@ return 0; } +RexxMethod1(int, // Return type + RegExp_Foo, // Object_method name + OSELF, self) // Pointer to self +{ + context->SendMessage0(self, "FOOBAR"); + return 0; +} + RexxMethod3(int, // Return type RegExp_Parse, // Object_method name CSELF, self, // Pointer to automaton control block @@ -206,6 +214,7 @@ REXX_METHOD(RegExp_Parse, RegExp_Parse), REXX_METHOD(RegExp_Pos, RegExp_Pos), REXX_METHOD(RegExp_Match, RegExp_Match), + REXX_METHOD(RegExp_Foo, RegExp_Foo), REXX_LAST_METHOD() }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-09 00:58:59
|
Revision: 2895 http://oorexx.svn.sourceforge.net/oorexx/?rev=2895&view=rev Author: bigrixx Date: 2008-08-09 00:59:08 +0000 (Sat, 09 Aug 2008) Log Message: ----------- [ 2040660 ] Seg Fauld Instead of Method Not Found Error Modified Paths: -------------- main/trunk/kernel/runtime/InterpreterInstance.cpp main/trunk/rxregexp/rxregexp.cls main/trunk/rxregexp/rxregexp.cpp Modified: main/trunk/kernel/runtime/InterpreterInstance.cpp =================================================================== --- main/trunk/kernel/runtime/InterpreterInstance.cpp 2008-08-09 00:22:33 UTC (rev 2894) +++ main/trunk/kernel/runtime/InterpreterInstance.cpp 2008-08-09 00:59:08 UTC (rev 2895) @@ -184,10 +184,12 @@ return activity; } - ResourceSection lock; - // we need to get a new activity set up for this particular thread activity = ActivityManager::attachThread(); + // resource lock must come AFTER we attach the thread, otherwise + // we can create a deadlock situation when we attempt to get the kernel + // lock + ResourceSection lock; // add this to the activity lists allActivities->append((RexxObject *)activity); // associate the thread with this instance Modified: main/trunk/rxregexp/rxregexp.cls =================================================================== --- main/trunk/rxregexp/rxregexp.cls 2008-08-09 00:22:33 UTC (rev 2894) +++ main/trunk/rxregexp/rxregexp.cls 2008-08-09 00:59:08 UTC (rev 2895) @@ -50,6 +50,7 @@ ::METHOD PARSE EXTERNAL "LIBRARY rxregexp RegExp_Parse" ::METHOD MATCH EXTERNAL "LIBRARY rxregexp RegExp_Match" ::METHOD POS EXTERNAL "LIBRARY rxregexp RegExp_Pos" +::METHOD FOO EXTERNAL "LIBRARY rxregexp RegExp_Foo" ::METHOD POSITION expose !POS Modified: main/trunk/rxregexp/rxregexp.cpp =================================================================== --- main/trunk/rxregexp/rxregexp.cpp 2008-08-09 00:22:33 UTC (rev 2894) +++ main/trunk/rxregexp/rxregexp.cpp 2008-08-09 00:59:08 UTC (rev 2895) @@ -96,6 +96,29 @@ return 0; } + enum + { + THREAD_STACK_SIZE = 1024*512 + }; + +DWORD WINAPI call_thread_function(void * arguments) +{ + RexxInstance *instance = (RexxInstance *)arguments; + RexxThreadContext *context; + instance->AttachThread(&context); + context->SendMessage0(context->Nil(), "FOO"); + return 0; +} + +RexxMethod1(int, // Return type + RegExp_Foo, // Object_method name + OSELF, self) // Pointer to self +{ + DWORD _threadID; // thread identifier + CreateThread(NULL, THREAD_STACK_SIZE, call_thread_function, (void *)context->threadContext->instance, 0, &_threadID); + return 0; +} + RexxMethod3(int, // Return type RegExp_Parse, // Object_method name CSELF, self, // Pointer to automaton control block @@ -206,6 +229,7 @@ REXX_METHOD(RegExp_Parse, RegExp_Parse), REXX_METHOD(RegExp_Pos, RegExp_Pos), REXX_METHOD(RegExp_Match, RegExp_Match), + REXX_METHOD(RegExp_Foo, RegExp_Foo), REXX_LAST_METHOD() }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-09 21:43:38
|
Revision: 2915 http://oorexx.svn.sourceforge.net/oorexx/?rev=2915&view=rev Author: bigrixx Date: 2008-08-09 21:42:51 +0000 (Sat, 09 Aug 2008) Log Message: ----------- merge rxapi work back into trunk Modified Paths: -------------- main/trunk/Makefile.am main/trunk/api/platform/unix/rexxplatformapis.h main/trunk/api/platform/windows/rexxplatformapis.h main/trunk/api/rexx.h main/trunk/kernel/api/InterpreterAPI.cpp main/trunk/kernel/classes/ArrayClass.cpp main/trunk/kernel/classes/ClassClass.cpp main/trunk/kernel/classes/ClassClass.hpp main/trunk/kernel/classes/IntegerClass.cpp main/trunk/kernel/classes/IntegerClass.hpp main/trunk/kernel/classes/MethodClass.cpp main/trunk/kernel/classes/ObjectClass.cpp main/trunk/kernel/classes/PackageClass.cpp main/trunk/kernel/classes/RexxQueueMethods.cpp main/trunk/kernel/classes/RoutineClass.cpp main/trunk/kernel/classes/StemClass.cpp main/trunk/kernel/classes/StringClass.cpp main/trunk/kernel/classes/StringClassUtil.cpp main/trunk/kernel/classes/WeakReferenceClass.cpp main/trunk/kernel/instructions/RaiseInstruction.cpp main/trunk/kernel/kernel.mak main/trunk/kernel/parser/SourceFile.cpp main/trunk/kernel/platform/unix/APIDefinitions.h main/trunk/kernel/platform/unix/ExternalFunctions.cpp main/trunk/kernel/platform/unix/FileSystem.cpp main/trunk/kernel/platform/unix/MiscSystem.cpp main/trunk/kernel/platform/unix/PlatformDefinitions.h main/trunk/kernel/platform/unix/RexxMain.cpp main/trunk/kernel/platform/unix/SharedMemorySupport.cpp main/trunk/kernel/platform/unix/SysFileSystem.cpp main/trunk/kernel/platform/unix/SysFileSystem.hpp main/trunk/kernel/platform/unix/SystemCommands.cpp main/trunk/kernel/platform/unix/SystemInterpreter.cpp main/trunk/kernel/platform/windows/ExternalFunctions.cpp main/trunk/kernel/platform/windows/FileSystem.cpp main/trunk/kernel/platform/windows/MiscSystem.cpp main/trunk/kernel/platform/windows/RexxMain.cpp main/trunk/kernel/platform/windows/SystemCommands.cpp main/trunk/kernel/platform/windows/SystemInterpreter.cpp main/trunk/kernel/platform/windows/wrexx.def main/trunk/kernel/runtime/ActivityManager.cpp main/trunk/kernel/runtime/ActivityManager.hpp main/trunk/kernel/runtime/CPPCode.cpp main/trunk/kernel/runtime/DeadObject.cpp main/trunk/kernel/runtime/Interpreter.cpp main/trunk/kernel/runtime/Interpreter.hpp main/trunk/kernel/runtime/InterpreterInstance.cpp main/trunk/kernel/runtime/LibraryPackage.cpp main/trunk/kernel/runtime/MemorySegment.hpp main/trunk/kernel/runtime/RexxActivation.cpp main/trunk/kernel/runtime/RexxActivity.cpp main/trunk/kernel/runtime/RexxActivity.hpp main/trunk/kernel/runtime/RexxCollection.cpp main/trunk/kernel/runtime/RexxCore.h main/trunk/kernel/runtime/RexxMemory.cpp main/trunk/kernel/runtime/Setup.cpp main/trunk/kernel/runtime/TranslateDispatcher.cpp main/trunk/kernel/runtime/TranslateDispatcher.hpp main/trunk/lib/RexxInternalApis.h main/trunk/lib/orxwin32.mak main/trunk/orxdb.bat main/trunk/platform/windows/buildorx.bat main/trunk/platform/windows/ole/orexxole.c main/trunk/platform/windows/ole/orexxole.mak main/trunk/platform/windows/oodialog/oodialog.mak main/trunk/platform/windows/orxscrpt/orxscrpt.mak main/trunk/platform/windows/oryxwin.mak main/trunk/platform/windows/rexx.c main/trunk/platform/windows/rexxc.c main/trunk/platform/windows/rexxhide.c main/trunk/platform/windows/rexxpaws.c main/trunk/rexutils/rexxutil.mak main/trunk/rexutils/rxmath.mak main/trunk/rexutils/rxsock.mak main/trunk/rexutils/rxwinsys.mak main/trunk/rexutils/unix/rexxutil.cpp main/trunk/rexutils/windows/rexxutil.cpp main/trunk/rexutils/windows/rxwinsys.cpp main/trunk/rexxapi/rexxapi.mak main/trunk/rxregexp/rxregexp.mak Added Paths: ----------- main/trunk/common/ main/trunk/common/SynchronizedBlock.hpp main/trunk/common/Utilities.cpp main/trunk/common/Utilities.hpp main/trunk/common/platform/ main/trunk/common/platform/unix/ main/trunk/common/platform/unix/SysFile.cpp main/trunk/common/platform/unix/SysFile.hpp main/trunk/common/platform/unix/SysLibrary.cpp main/trunk/common/platform/unix/SysLibrary.hpp main/trunk/common/platform/unix/SysSemaphore.cpp main/trunk/common/platform/unix/SysSemaphore.hpp main/trunk/common/platform/unix/SysThread.cpp main/trunk/common/platform/unix/SysThread.hpp main/trunk/common/platform/windows/ main/trunk/common/platform/windows/SysFile.cpp main/trunk/common/platform/windows/SysFile.hpp main/trunk/common/platform/windows/SysLibrary.cpp main/trunk/common/platform/windows/SysLibrary.hpp main/trunk/common/platform/windows/SysSemaphore.cpp main/trunk/common/platform/windows/SysSemaphore.hpp main/trunk/common/platform/windows/SysThread.cpp main/trunk/common/platform/windows/SysThread.hpp main/trunk/kernel/platform/unix/SysActivity.cpp main/trunk/kernel/platform/unix/SysActivity.hpp main/trunk/kernel/platform/windows/SysActivity.cpp main/trunk/kernel/platform/windows/SysActivity.hpp main/trunk/rexxapi/client/ main/trunk/rexxapi/client/ClientMessage.cpp main/trunk/rexxapi/client/ClientMessage.hpp main/trunk/rexxapi/client/LocalAPIContext.cpp main/trunk/rexxapi/client/LocalAPIContext.hpp main/trunk/rexxapi/client/LocalAPIManager.cpp main/trunk/rexxapi/client/LocalAPIManager.hpp main/trunk/rexxapi/client/LocalAPISubsystem.hpp main/trunk/rexxapi/client/LocalMacroSpaceManager.cpp main/trunk/rexxapi/client/LocalMacroSpaceManager.hpp main/trunk/rexxapi/client/LocalQueueManager.cpp main/trunk/rexxapi/client/LocalQueueManager.hpp main/trunk/rexxapi/client/LocalRegistrationManager.cpp main/trunk/rexxapi/client/LocalRegistrationManager.hpp main/trunk/rexxapi/client/MacroSpaceApi.cpp main/trunk/rexxapi/client/QueuesAPI.cpp main/trunk/rexxapi/client/RegistrationAPI.cpp main/trunk/rexxapi/client/RexxAPI.h main/trunk/rexxapi/client/platform/ main/trunk/rexxapi/client/platform/unix/ main/trunk/rexxapi/client/platform/unix/SysLegacyAPI.cpp main/trunk/rexxapi/client/platform/unix/SysLocalAPIManager.cpp main/trunk/rexxapi/client/platform/unix/SysLocalAPIManager.hpp main/trunk/rexxapi/client/platform/windows/ main/trunk/rexxapi/client/platform/windows/SysLegacyAPI.cpp main/trunk/rexxapi/client/platform/windows/SysLocalAPIManager.cpp main/trunk/rexxapi/client/platform/windows/SysLocalAPIManager.hpp main/trunk/rexxapi/client/platform/windows/rexxapi.def main/trunk/rexxapi/common/ main/trunk/rexxapi/common/Encodings.hpp main/trunk/rexxapi/common/Rxstring.hpp main/trunk/rexxapi/common/ServiceException.hpp main/trunk/rexxapi/common/ServiceMessage.cpp main/trunk/rexxapi/common/ServiceMessage.hpp main/trunk/rexxapi/common/platform/ main/trunk/rexxapi/common/platform/unix/ main/trunk/rexxapi/common/platform/unix/SysAPIManager.cpp main/trunk/rexxapi/common/platform/unix/SysAPIManager.hpp main/trunk/rexxapi/common/platform/unix/SysCSStream.cpp main/trunk/rexxapi/common/platform/unix/SysCSStream.hpp main/trunk/rexxapi/common/platform/unix/SysProcess.cpp main/trunk/rexxapi/common/platform/unix/SysProcess.hpp main/trunk/rexxapi/common/platform/windows/ main/trunk/rexxapi/common/platform/windows/SysAPIManager.cpp main/trunk/rexxapi/common/platform/windows/SysAPIManager.hpp main/trunk/rexxapi/common/platform/windows/SysCSStream.cpp main/trunk/rexxapi/common/platform/windows/SysCSStream.hpp main/trunk/rexxapi/common/platform/windows/SysProcess.cpp main/trunk/rexxapi/common/platform/windows/SysProcess.hpp main/trunk/rexxapi/server/ main/trunk/rexxapi/server/APIServer.cpp main/trunk/rexxapi/server/APIServer.hpp main/trunk/rexxapi/server/APIServerInstance.cpp main/trunk/rexxapi/server/APIServerInstance.hpp main/trunk/rexxapi/server/APIServerThread.cpp main/trunk/rexxapi/server/APIServerThread.hpp main/trunk/rexxapi/server/MacroSpaceManager.cpp main/trunk/rexxapi/server/MacroSpaceManager.hpp main/trunk/rexxapi/server/QueueManager.cpp main/trunk/rexxapi/server/QueueManager.hpp main/trunk/rexxapi/server/RegistrationManager.cpp main/trunk/rexxapi/server/RegistrationManager.hpp main/trunk/rexxapi/server/platform/ main/trunk/rexxapi/server/platform/Makefile.am main/trunk/rexxapi/server/platform/unix/ main/trunk/rexxapi/server/platform/unix/APIService.cpp main/trunk/rexxapi/server/platform/unix/rxapid.sh.in main/trunk/rexxapi/server/platform/windows/ main/trunk/rexxapi/server/platform/windows/APIService.cpp main/trunk/rexxapi/server/platform/windows/rxapi.ico main/trunk/rexxapi/server/platform/windows/rxapi.rc main/trunk/utilities/ main/trunk/utilities/rxqueue/ main/trunk/utilities/rxqueue/platform/ main/trunk/utilities/rxqueue/platform/unix/ main/trunk/utilities/rxqueue/platform/unix/rxqueue.cpp main/trunk/utilities/rxqueue/platform/windows/ main/trunk/utilities/rxqueue/platform/windows/rxqueue.cpp main/trunk/utilities/rxqueue/platform/windows/rxqueue.mak main/trunk/utilities/rxsubcom/ main/trunk/utilities/rxsubcom/platform/ main/trunk/utilities/rxsubcom/platform/unix/ main/trunk/utilities/rxsubcom/platform/unix/rxsubcom.cpp main/trunk/utilities/rxsubcom/platform/windows/ main/trunk/utilities/rxsubcom/platform/windows/rxsubcom.cpp main/trunk/utilities/rxsubcom/platform/windows/rxsubcom.mak Removed Paths: ------------- main/trunk/common/SynchronizedBlock.hpp main/trunk/common/Utilities.cpp main/trunk/common/Utilities.hpp main/trunk/common/platform/ main/trunk/common/platform/unix/ main/trunk/common/platform/unix/SysFile.cpp main/trunk/common/platform/unix/SysFile.hpp main/trunk/common/platform/unix/SysLibrary.cpp main/trunk/common/platform/unix/SysLibrary.hpp main/trunk/common/platform/unix/SysSemaphore.cpp main/trunk/common/platform/unix/SysSemaphore.hpp main/trunk/common/platform/unix/SysThread.cpp main/trunk/common/platform/unix/SysThread.hpp main/trunk/common/platform/windows/ main/trunk/common/platform/windows/SysFile.cpp main/trunk/common/platform/windows/SysFile.hpp main/trunk/common/platform/windows/SysLibrary.cpp main/trunk/common/platform/windows/SysLibrary.hpp main/trunk/common/platform/windows/SysSemaphore.cpp main/trunk/common/platform/windows/SysSemaphore.hpp main/trunk/common/platform/windows/SysThread.cpp main/trunk/common/platform/windows/SysThread.hpp main/trunk/kernel/platform/unix/SysFile.cpp main/trunk/kernel/platform/unix/SysFile.hpp main/trunk/kernel/platform/unix/SysLibrary.cpp main/trunk/kernel/platform/unix/SysLibrary.hpp main/trunk/kernel/platform/unix/SysSemaphore.cpp main/trunk/kernel/platform/unix/SysSemaphore.hpp main/trunk/kernel/platform/unix/SysThread.cpp main/trunk/kernel/platform/unix/SysThread.hpp main/trunk/kernel/platform/unix/SystemSemaphores.cpp main/trunk/kernel/platform/unix/SystemSemaphores.h main/trunk/kernel/platform/windows/DebugOutput.cpp main/trunk/kernel/platform/windows/DebugOutput.h main/trunk/kernel/platform/windows/SysFile.cpp main/trunk/kernel/platform/windows/SysFile.hpp main/trunk/kernel/platform/windows/SysLibrary.cpp main/trunk/kernel/platform/windows/SysLibrary.hpp main/trunk/kernel/platform/windows/SysSemaphore.cpp main/trunk/kernel/platform/windows/SysSemaphore.hpp main/trunk/kernel/platform/windows/SysThread.cpp main/trunk/kernel/platform/windows/SysThread.hpp main/trunk/kernel/runtime/Utilities.cpp main/trunk/kernel/runtime/Utilities.hpp main/trunk/rexxapi/APIUtil.h main/trunk/rexxapi/ASCIISymbols.h main/trunk/rexxapi/Characters.h main/trunk/rexxapi/CodePageTables.h main/trunk/rexxapi/client/ClientMessage.cpp main/trunk/rexxapi/client/ClientMessage.hpp main/trunk/rexxapi/client/LocalAPIContext.cpp main/trunk/rexxapi/client/LocalAPIContext.hpp main/trunk/rexxapi/client/LocalAPIManager.cpp main/trunk/rexxapi/client/LocalAPIManager.hpp main/trunk/rexxapi/client/LocalAPISubsystem.hpp main/trunk/rexxapi/client/LocalMacroSpaceManager.cpp main/trunk/rexxapi/client/LocalMacroSpaceManager.hpp main/trunk/rexxapi/client/LocalQueueManager.cpp main/trunk/rexxapi/client/LocalQueueManager.hpp main/trunk/rexxapi/client/LocalRegistrationManager.cpp main/trunk/rexxapi/client/LocalRegistrationManager.hpp main/trunk/rexxapi/client/MacroSpaceApi.cpp main/trunk/rexxapi/client/QueuesAPI.cpp main/trunk/rexxapi/client/RegistrationAPI.cpp main/trunk/rexxapi/client/RexxAPI.h main/trunk/rexxapi/client/platform/ main/trunk/rexxapi/client/platform/unix/ main/trunk/rexxapi/client/platform/unix/SysLegacyAPI.cpp main/trunk/rexxapi/client/platform/unix/SysLocalAPIManager.cpp main/trunk/rexxapi/client/platform/unix/SysLocalAPIManager.hpp main/trunk/rexxapi/client/platform/windows/ main/trunk/rexxapi/client/platform/windows/SysLegacyAPI.cpp main/trunk/rexxapi/client/platform/windows/SysLocalAPIManager.cpp main/trunk/rexxapi/client/platform/windows/SysLocalAPIManager.hpp main/trunk/rexxapi/client/platform/windows/rexxapi.def main/trunk/rexxapi/common/Encodings.hpp main/trunk/rexxapi/common/Rxstring.hpp main/trunk/rexxapi/common/ServiceException.hpp main/trunk/rexxapi/common/ServiceMessage.cpp main/trunk/rexxapi/common/ServiceMessage.hpp main/trunk/rexxapi/common/platform/ main/trunk/rexxapi/common/platform/unix/ main/trunk/rexxapi/common/platform/unix/SysAPIManager.cpp main/trunk/rexxapi/common/platform/unix/SysAPIManager.hpp main/trunk/rexxapi/common/platform/unix/SysCSStream.cpp main/trunk/rexxapi/common/platform/unix/SysCSStream.hpp main/trunk/rexxapi/common/platform/unix/SysProcess.cpp main/trunk/rexxapi/common/platform/unix/SysProcess.hpp main/trunk/rexxapi/common/platform/windows/ main/trunk/rexxapi/common/platform/windows/SysAPIManager.cpp main/trunk/rexxapi/common/platform/windows/SysAPIManager.hpp main/trunk/rexxapi/common/platform/windows/SysCSStream.cpp main/trunk/rexxapi/common/platform/windows/SysCSStream.hpp main/trunk/rexxapi/common/platform/windows/SysProcess.cpp main/trunk/rexxapi/common/platform/windows/SysProcess.hpp main/trunk/rexxapi/rexxapi.exp main/trunk/rexxapi/rxqueue.mak main/trunk/rexxapi/rxsubcom.mak main/trunk/rexxapi/server/APIServer.cpp main/trunk/rexxapi/server/APIServer.hpp main/trunk/rexxapi/server/APIServerInstance.cpp main/trunk/rexxapi/server/APIServerInstance.hpp main/trunk/rexxapi/server/APIServerThread.cpp main/trunk/rexxapi/server/APIServerThread.hpp main/trunk/rexxapi/server/MacroSpaceManager.cpp main/trunk/rexxapi/server/MacroSpaceManager.hpp main/trunk/rexxapi/server/QueueManager.cpp main/trunk/rexxapi/server/QueueManager.hpp main/trunk/rexxapi/server/RegistrationManager.cpp main/trunk/rexxapi/server/RegistrationManager.hpp main/trunk/rexxapi/server/platform/ main/trunk/rexxapi/server/platform/Makefile.am main/trunk/rexxapi/server/platform/unix/ main/trunk/rexxapi/server/platform/unix/APIService.cpp main/trunk/rexxapi/server/platform/unix/rxapid.sh.in main/trunk/rexxapi/server/platform/windows/ main/trunk/rexxapi/server/platform/windows/APIService.cpp main/trunk/rexxapi/server/platform/windows/rxapi.ico main/trunk/rexxapi/server/platform/windows/rxapi.rc main/trunk/rexxapi/unix/ main/trunk/rexxapi/windows/ main/trunk/utilities/rxqueue/ main/trunk/utilities/rxqueue/platform/ main/trunk/utilities/rxqueue/platform/unix/ main/trunk/utilities/rxqueue/platform/unix/rxqueue.cpp main/trunk/utilities/rxqueue/platform/windows/ main/trunk/utilities/rxqueue/platform/windows/rxqueue.cpp main/trunk/utilities/rxqueue/platform/windows/rxqueue.mak main/trunk/utilities/rxsubcom/ main/trunk/utilities/rxsubcom/platform/ main/trunk/utilities/rxsubcom/platform/unix/ main/trunk/utilities/rxsubcom/platform/unix/rxsubcom.cpp main/trunk/utilities/rxsubcom/platform/windows/ main/trunk/utilities/rxsubcom/platform/windows/rxsubcom.cpp main/trunk/utilities/rxsubcom/platform/windows/rxsubcom.mak Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-09 20:41:32 UTC (rev 2914) +++ main/trunk/Makefile.am 2008-08-09 21:42:51 UTC (rev 2915) @@ -59,6 +59,14 @@ # These are the platform independent directories build_utils_dir = $(top_srcdir)/platform build_rexxapi_dir = $(top_srcdir)/rexxapi +build_rexxapi_client_dir = $(build_rexxapi_dir)/client +build_rexxapi_client_platform_dir = $(build_rexxapi_dir)/client/platform/unix +build_rexxapi_server_dir = $(build_rexxapi_dir)/server +build_rexxapi_server_platform_dir = $(build_rexxapi_dir)/server/platform/unix +build_rexxapi_common_dir = $(build_rexxapi_dir)/common +build_rexxapi_common_platform_dir = $(build_rexxapi_dir)/common/platform/unix +build_common_dir = $(top_srcdir)/common +build_common_platform_dir = $(top_srcdir)/common/platform/unix build_kernel_dir = $(top_srcdir)/kernel build_kernel_common_dir = $(build_kernel_dir)/platform/common build_kernel_api_dir = $(build_kernel_dir)/api @@ -75,10 +83,10 @@ build_rxregexp_dir = $(top_srcdir)/rxregexp build_samples_dir = $(top_srcdir)/samples build_rexxclasses_dir = $(build_kernel_dir)/RexxClasses +build_utilities_dir = $(build_kernel_dir)/utilities # These are the *nix directories utils_unix_dir = $(build_utils_dir)/unix -rexxapi_unix_dir = $(build_rexxapi_dir)/unix kernel_unix_dir = $(build_kernel_dir)/platform/unix api_unix_dir = $(build_api_dir)/platform/unix rexutils_unix_dir = $(build_rexutils_dir)/unix @@ -204,18 +212,20 @@ platformHeaders = $(build_kernel_platform_dir)/APIDefinitions.h \ $(build_kernel_platform_dir)/PlatformDefinitions.h \ $(build_kernel_platform_dir)/SharedMemorySupport.h \ - $(build_kernel_platform_dir)/SysFile.hpp \ + $(build_kernel_platform_dir)/SysActivity.hpp \ $(build_kernel_platform_dir)/SysFileSystem.hpp \ $(build_kernel_platform_dir)/SysInterpreterInstance.hpp \ - $(build_kernel_platform_dir)/SysLibrary.hpp \ $(build_kernel_platform_dir)/SysNativeFunctions.h \ $(build_kernel_platform_dir)/SysNativeMethods.h \ $(build_kernel_platform_dir)/SystemCommands.h \ - $(build_kernel_platform_dir)/SystemInterpreter.hpp \ - $(build_kernel_platform_dir)/SystemSemaphores.h \ - $(build_kernel_platform_dir)/SysSemaphore.hpp \ - $(build_kernel_platform_dir)/SysThread.hpp -platformcommonHeaders = + $(build_kernel_platform_dir)/SystemInterpreter.hpp +commonHeaders = $(build_common_dir)/SynchronizedBlock.hpp \ + $(build_common_dir)/Utilities.hpp \ + $(build_common_platform_dir)/SysFile.hpp \ + $(build_common_platform_dir)/SysLibrary.hpp \ + $(build_common_platform_dir)/SysSemaphore.hpp \ + $(build_common_platform_dir)/SysThread.hpp + runtimeHeaders = $(build_runtime_dir)/ActivationApiContexts.hpp \ $(build_runtime_dir)/ActivityDispatcher.hpp \ $(build_runtime_dir)/ActivityManager.hpp \ @@ -265,19 +275,33 @@ $(build_runtime_dir)/RexxVariable.hpp \ $(build_runtime_dir)/RexxVariableDictionary.hpp \ $(build_runtime_dir)/SecurityManager.hpp \ - $(build_runtime_dir)/TranslateDispatcher.hpp \ - $(build_runtime_dir)/Utilities.hpp + $(build_runtime_dir)/TranslateDispatcher.hpp streamlibraryHeaders = $(build_streamlibrary_dir)/StreamCommandParser.h \ $(build_streamlibrary_dir)/StreamNative.hpp libHeaders = $(build_lib_dir)/RexxPlatformDefinitions.h \ $(build_lib_dir)/RexxInternalApis.h -rexxapiHeaders = $(build_rexxapi_dir)/APIUtil.h \ - $(build_rexxapi_dir)/ASCIISymbols.h \ - $(build_rexxapi_dir)/Characters.h \ - $(build_rexxapi_dir)/CodePageTables.h -rexxapiunixHeaders = $(build_rexxapi_platform_dir)/APIUtilities.h \ - $(build_rexxapi_platform_dir)/RexxAPIManager.h \ - $(build_rexxapi_platform_dir)/SubcommandAPI.h +rexxapiServerHeaders = $(build_rexxapi_server_dir)/APIServer.hpp \ + $(build_rexxapi_server_dir)/APIServerInstance.hpp \ + $(build_rexxapi_server_dir)/APIServerThread.hpp \ + $(build_rexxapi_server_dir)/MacroSpaceManager.hpp \ + $(build_rexxapi_server_dir)/QueueManager.hpp \ + $(build_rexxapi_server_dir)/RegistrationManager.hpp +rexxapiClientHeaders = $(build_rexxapi_client_dir)/ClientMessage.hpp \ + $(build_rexxapi_client_dir)/LocalAPIContext.hpp \ + $(build_rexxapi_client_dir)/LocalAPIManager.hpp \ + $(build_rexxapi_client_dir)/LocalAPISubsystem.hpp \ + $(build_rexxapi_client_dir)/LocalMacroSpaceManager.hpp \ + $(build_rexxapi_client_dir)/LocalQueueManager.hpp \ + $(build_rexxapi_client_dir)/LocalRegistrationManager.hpp \ + $(build_rexxapi_client_dir)/RexxAPI.h \ + $(build_rexxapi_client_dir)/SysLocalAPIManager.hpp +rexxapiCommonHeaders = $(build_rexxapi_common_dir)/Encodings.hpp \ + $(build_rexxapi_common_dir)/Rxstring.hpp \ + $(build_rexxapi_common_dir)/ServiceException.hpp \ + $(build_rexxapi_common_dir)/ServiceMessage.hpp \ + $(build_rexxapi_common_dir)platform/unix/SysAPIManager.hpp \ + $(build_rexxapi_common_dir)platform/unix/SysCSStream.hpp \ + $(build_rexxapi_common_dir)platform/unix/SysProcess.hpp \ rxregexpHeaders = $(build_rxregexp_dir)/automaton.hpp \ $(build_rxregexp_dir)/dblqueue.cpp \ $(build_rxregexp_dir)/dblqueue.hpp \ @@ -327,7 +351,7 @@ # # Binary targets # -bin_PROGRAMS = rexximage rexx rexxc rxqueue rxsubcom rxdelipc +bin_PROGRAMS = rxapi rexximage rexx rexxc rxqueue rxsubcom rxdelipc # # Shared library targets @@ -362,12 +386,26 @@ #################### librexx.so ########################## # Sources for librexxapi.so # -librexxapi_la_SOURCES = $(build_rexxapi_platform_dir)/SubcommandAPI.cpp \ - $(build_rexxapi_platform_dir)/RexxAPIManager.cpp \ - $(build_kernel_platform_dir)/SystemSemaphores.cpp \ - $(build_kernel_platform_dir)/SharedMemorySupport.cpp \ - $(build_rexxapi_platform_dir)/MacroSpace.cpp \ - $(build_rexxapi_platform_dir)/QueuesAPI.cpp +librexxapi_la_SOURCES = $(build_rexxapi_client_dir)/ClientMessage.cpp \ + $(build_rexxapi_client_dir)/LocalAPIContext.cpp \ + $(build_rexxapi_client_dir)/LocalAPIManager.cpp \ + $(build_rexxapi_client_dir)/LocalMacroSpaceManager.cpp \ + $(build_rexxapi_client_dir)/LocalQueueManager.cpp \ + $(build_rexxapi_client_dir)/LocalRegistrationManager.cpp \ + $(build_rexxapi_client_dir)/MacroSpaceApi.cpp \ + $(build_rexxapi_client_dir)/QueuesAPI.cpp \ + $(build_rexxapi_client_dir)/RegistrationAPI.cpp \ + $(build_rexxapi_client_dir)/platform/unix/SysLegacyAPI.cpp \ + $(build_rexxapi_client_dir)/platform/unix/SysLocalAPIManager.cpp \ + $(build_rexxapi_common_dir)/ServiceMessage.cpp \ + $(build_rexxapi_common_dir)/platform/unix/SysAPIManager.cpp \ + $(build_rexxapi_common_dir)/platform/unix/SysCSStream.cpp \ + $(build_rexxapi_common_dir)/platform/unix/SysProcess.cpp \ + $(build_common_dir)/Utilities.cpp \ + $(build_common_dir)/platform/unix/SysSemaphore.cpp \ + $(build_common_dir)/platform/unix/SysLibrary.cpp \ + $(build_common_dir)/platform/unix/SysFile.cpp \ + $(build_common_dir)/platform/unix/SysThread.cpp # # Preprocessor flags for librexxapi.so @@ -376,17 +414,12 @@ -I$(build_lib_dir) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ - -I$(build_kernel_dir) \ - -I$(build_expression_dir) \ - -I$(build_instructions_dir) \ - -I$(build_classes_dir) \ - -I$(build_runtime_dir) \ - -I$(build_parser_dir) \ - -I$(build_messages_dir) \ - -I$(build_kernel_common_dir) \ - -I$(build_kernel_platform_dir) \ - -I$(build_rexxapi_dir) \ - -I$(build_rexxapi_platform_dir) + -I$(build_rexxapi_client_dir) \ + -I$(build_rexxapi_client_platform_dir) \ + -I$(build_rexxapi_common_dir) \ + -I$(build_rexxapi_common_platform_dir) \ + -I$(build_common_dir) \ + -I$(build_common_platform_dir) librexxapi_la_LDFLAGS = $(VERSION_INFO) @@ -490,28 +523,26 @@ $(build_parser_dir)/Scanner.cpp \ $(build_parser_dir)/SourceFile.cpp \ $(build_parser_dir)/Token.cpp -kernel_platform_common_sources = -# SharedMemorySupport.cpp -# SystemSemaphores.cpp platform_sources = $(build_kernel_platform_dir)/ErrorMessages.cpp \ $(build_kernel_platform_dir)/ExternalFunctions.cpp \ $(build_kernel_platform_dir)/FileSystem.cpp \ $(build_kernel_platform_dir)/MemorySupport.cpp \ $(build_kernel_platform_dir)/MiscSystem.cpp \ $(build_kernel_platform_dir)/RexxMain.cpp \ - $(build_kernel_platform_dir)/SysFile.cpp \ + $(build_kernel_platform_dir)/SysActivity.cpp \ $(build_kernel_platform_dir)/SysFileSystem.cpp \ $(build_kernel_platform_dir)/SysInterpreterInstance.cpp \ - $(build_kernel_platform_dir)/SysLibrary.cpp \ $(build_kernel_platform_dir)/SystemCommands.cpp \ $(build_kernel_platform_dir)/SystemInitialization.cpp \ $(build_kernel_platform_dir)/SystemInterpreter.cpp \ - $(build_kernel_platform_dir)/SystemSemaphores.cpp \ - $(build_kernel_platform_dir)/SysSemaphore.cpp \ - $(build_kernel_platform_dir)/SysThread.cpp \ $(build_kernel_platform_dir)/TimeSupport.cpp \ $(build_kernel_platform_dir)/UseridFunction.cpp \ $(build_kernel_platform_dir)/ValueFunction.cpp +common_sources = $(build_common_dir)/Utilities.cpp \ + $(build_common_platform_dir)/SysFile.cpp \ + $(build_common_platform_dir)/SysLibrary.cpp \ + $(build_common_platform_dir)/SysSemaphore.cpp \ + $(build_common_platform_dir)/SysThread.cpp runtime_sources = $(build_runtime_dir)/ActivityDispatcher.cpp \ $(build_runtime_dir)/ActivityManager.cpp \ $(build_runtime_dir)/CallbackDispatcher.cpp \ @@ -558,7 +589,6 @@ $(build_runtime_dir)/SecurityManager.cpp \ $(build_runtime_dir)/Setup.cpp \ $(build_runtime_dir)/TranslateDispatcher.cpp \ - $(build_runtime_dir)/Utilities.cpp \ $(build_runtime_dir)/Version.cpp \ $(build_runtime_dir)/VirtualFunctionTable.cpp streamlibrary_sources = $(build_streamlibrary_dir)/StreamCommandParser.cpp \ @@ -568,8 +598,8 @@ $(expression_sources) \ $(instructions_sources) \ $(parser_sources) \ - $(kernel_platform_common_sources) \ $(platform_sources) \ + $(common_sources) \ $(runtime_sources) \ $(streamlibrary_sources) core_classes = $(build_rexxclasses_dir)/CoreClasses.orx \ @@ -584,6 +614,8 @@ -I$(build_lib_dir) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ + -I$(build_common_dir) \ + -I$(build_common_platform_dir) \ -I$(build_kernel_dir) \ -I$(build_expression_dir) \ -I$(build_instructions_dir) \ @@ -597,6 +629,43 @@ -I$(build_rexxapi_platform_dir) librexx_la_LDFLAGS = $(VERSION_INFO) -nostartfiles +#################### rxapi ########################## +# Sources for rxapi +# +rxapi_SOURCES = $(build_rexxapi_server_dir)/APIServer.cpp \ + $(build_rexxapi_server_dir)/APIServerInstance.cpp \ + $(build_rexxapi_server_dir)/APIServerThread.cpp \ + $(build_rexxapi_server_dir)/MacroSpaceManager.cpp \ + $(build_rexxapi_server_dir)/QueueManager.cpp \ + $(build_rexxapi_server_dir)/RegistrationManager.cpp \ + $(build_rexxapi_server_dir)/platform/unix/APIService.cpp \ + $(build_rexxapi_common_dir)/ServiceMessage.cpp \ + $(build_rexxapi_common_dir)/platform/unix/SysAPIManager.cpp \ + $(build_rexxapi_common_dir)/platform/unix/SysCSStream.cpp \ + $(build_rexxapi_common_dir)/platform/unix/SysProcess.cpp \ + $(build_common_dir)/Utilities.cpp \ + $(build_common_dir)/platform/unix/SysSemaphore.cpp \ + $(build_common_dir)/platform/unix/SysThread.cpp +# +# Preprocessor flags for rxapi +# +rxapi_CXXFLAGS = $(COMMON_CPPFLAGS) \ + -I$(build_lib_dir) \ + -I$(build_api_dir) \ + -I$(build_api_platform_dir) \ + -I$(build_messages_dir) \ + -I$(build_rexxapi_server_dir) \ + -I$(build_rexxapi_server_platform_dir) \ + -I$(build_rexxapi_common_dir) \ + -I$(build_rexxapi_common_platform_dir) \ + -I$(build_common_dir) \ + -I$(build_common_platform_dir) +# +# Extra libraries for rxapi +# +rxapi_LDADD = @ORX_LDADD_EXECUTABLE@ +rxapi_LDFLAGS = @ORX_LDFLAGS_EXECUTABLE@ + #################### rexx ########################## # Sources for rexx # @@ -663,7 +732,7 @@ #################### rxqueue ######################### # Sources for rxqueue # -rxqueue_SOURCES = $(build_rexxapi_platform_dir)/QueueCommand.cpp +rxqueue_SOURCES = $(build_utilities_dir)/rxqueue/platform/unix/rxqueue.cpp # # Preprocessor flags for rxqueue # @@ -683,7 +752,7 @@ #################### rxsubcom ######################### # Sources for rxsubcom # -rxsubcom_SOURCES = $(build_rexxapi_platform_dir)/SUBCOMCommand.cpp +rxsubcom_SOURCES = $(build_utilities_dir)/rxsubcom/platform/unix/rxsubcom.cpp # # Preprocessor flags for rxsubcom # @@ -883,7 +952,7 @@ $(instructionsHeaders) \ $(parserHeaders) \ $(platformHeaders) \ - $(platformcommonHeaders) \ + $(commonHeaders) \ $(runtimeHeaders) \ $(streamlibraryHeaders) \ $(libHeaders) \ Modified: main/trunk/api/platform/unix/rexxplatformapis.h =================================================================== --- main/trunk/api/platform/unix/rexxplatformapis.h 2008-08-09 20:41:32 UTC (rev 2914) +++ main/trunk/api/platform/unix/rexxplatformapis.h 2008-08-09 21:42:51 UTC (rev 2915) @@ -38,28 +38,14 @@ #ifndef REXXPLATFORMAPIS_INCLUDED #define REXXPLATFORMAPIS_INCLUDED -/*** RexxPullQueue - Retrieve data from an External Data Queue */ -typedef struct _REXXDATETIME { /* REXX time stamp format */ - uint16_t hours; /* hour of the day (24-hour) */ - uint16_t minutes; /* minute of the hour */ - uint16_t seconds; /* second of the minute */ - uint16_t hundredths; /* hundredths of a second */ - uint16_t day; /* day of the month */ - uint16_t month; /* month of the year */ - uint16_t year; /* current year */ - uint16_t weekday; /* day of the week */ - uint32_t microseconds; /* microseconds */ - uint32_t yearday; /* day number within the year */ -} REXXDATETIME; /*** RexxPullQueue - Retrieve data from an External Data Queue */ - RexxReturnCode REXXENTRY RexxPullQueue ( const char *, /* Name of queue to read from */ PRXSTRING, /* RXSTRING to receive data */ REXXDATETIME *, /* Stor for data date/time */ size_t); /* wait status (WAIT|NOWAIT) */ -typedef RexxReturnCode (REXXENTRY *PFNREXXPULLQUEUE)(const char *, PCONSTRXSTRING, REXXDATETIME *, +typedef RexxReturnCode (REXXENTRY *PFNREXXPULLQUEUE)(const char *, PRXSTRING, REXXDATETIME *, size_t); #endif /* REXXPLATFORMAPIS_INCLUDED */ Modified: main/trunk/api/platform/windows/rexxplatformapis.h =================================================================== --- main/trunk/api/platform/windows/rexxplatformapis.h 2008-08-09 20:41:32 UTC (rev 2914) +++ main/trunk/api/platform/windows/rexxplatformapis.h 2008-08-09 21:42:51 UTC (rev 2915) @@ -44,9 +44,9 @@ const char *, /* Name of queue to read from */ PRXSTRING, /* RXSTRING to receive data */ SYSTEMTIME *, /* Stor for data date/time */ - unsigned int); /* wait status (WAIT|NOWAIT) */ -typedef RexxReturnCode (REXXENTRY *PFNREXXPULLQUEUE)(const char *, PCONSTRXSTRING, SYSTEMTIME *, - unsigned int); + size_t); /* wait status (WAIT|NOWAIT) */ +typedef RexxReturnCode (REXXENTRY *PFNREXXPULLQUEUE)(const char *, PRXSTRING, SYSTEMTIME *, + size_t); #endif /* REXXPLATFORMAPIS_INCLUDED */ Modified: main/trunk/api/rexx.h =================================================================== --- main/trunk/api/rexx.h 2008-08-09 20:41:32 UTC (rev 2914) +++ main/trunk/api/rexx.h 2008-08-09 21:42:51 UTC (rev 2915) @@ -165,6 +165,21 @@ #define RexxEntry REXXENTRY +/*** RexxPullFromQueue - Retrieve data from an External Data Queue */ +typedef struct _REXXDATETIME { /* REXX time stamp format */ + uint16_t hours; /* hour of the day (24-hour) */ + uint16_t minutes; /* minute of the hour */ + uint16_t seconds; /* second of the minute */ + uint16_t hundredths; /* hundredths of a second */ + uint16_t day; /* day of the month */ + uint16_t month; /* month of the year */ + uint16_t year; /* current year */ + uint16_t weekday; /* day of the week */ + uint32_t microseconds; /* microseconds */ + uint32_t yearday; /* day number within the year */ +} REXXDATETIME; + + typedef struct _RexxConditionData { wholenumber_t code; // The condition CODE information @@ -214,6 +229,17 @@ #define REXXTRANSLATEPROGRAM RexxTranslateProgram +RexxReturnCode REXXENTRY RexxTranslateInstoreProgram( + const char *, // input program name + CONSTRXSTRING *, // program source + RXSTRING *); // returned image + + +typedef RexxReturnCode (REXXENTRY *PFNREXXTRANSLATEINSTOREPROGRAM)(const char *, CONSTRXSTRING *, RXSTRING *); + +#define REXXTRANSLATEINSTOREPROGRAM RexxTranslateInstoreProgram + + char *REXXENTRY RexxGetVersionInformation(void); typedef char *(REXXENTRY *PFNGETVERSIONINFORMATION)(void); @@ -693,16 +719,24 @@ size_t); /* Queue type (FIFO|LIFO) */ typedef RexxReturnCode (REXXENTRY *PFNREXXADDQUEUE)(const char *, PCONSTRXSTRING, size_t); +/*** RexxPullFromQueue - Retrieve data from an External Data Queue */ +RexxReturnCode REXXENTRY RexxPullFromQueue ( + const char *, /* Name of queue to read from */ + PRXSTRING, /* RXSTRING to receive data */ + REXXDATETIME *, /* Stor for data date/time */ + size_t); /* wait status (WAIT|NOWAIT) */ +typedef RexxReturnCode (REXXENTRY *PFNREXXPULLFROMQUEUE)(const char *, PRXSTRING, REXXDATETIME *, + size_t); -#include "rexxplatformapis.h" +/*** RexxClearQueue - Clear all lines in a queue */ +RexxReturnCode REXXENTRY RexxClearQueue ( + const char * ); /* Name of queue to be deleted */ +typedef RexxReturnCode (REXXENTRY *PFNREXXCLEARQUEUE)(const char *); -RexxReturnCode REXXENTRY RexxShutDownAPI(void); -typedef RexxReturnCode (REXXENTRY *PFNREXXSHUTDOWNAPI)(void); -#define REXXSHUTDOWNAPI RexxShutDownAPI +#include "rexxplatformapis.h" - /*----------------------------------------------------------------------------*/ /*** Memory Allocation Services */ /*----------------------------------------------------------------------------*/ Deleted: main/trunk/common/SynchronizedBlock.hpp =================================================================== --- sandbox/rick/rxapi/common/SynchronizedBlock.hpp 2008-08-09 20:41:32 UTC (rev 2914) +++ main/trunk/common/SynchronizedBlock.hpp 2008-08-09 21:42:51 UTC (rev 2915) @@ -1,68 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.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 runtime support */ -/* */ -/* Critical section definitions */ -/* */ -/*****************************************************************************/ - -#ifndef SynchronizedBlock_DEFINED -#define SynchronizedBlock_DEFINED - -#include "SysSemaphore.hpp" - -class Lock -{ -public: - inline Lock(SysMutex &l) : lock(l) - { - lock.request(); - } - - - inline ~Lock() - { - lock.release(); - } - -protected: - SysMutex &lock; -}; -#endif - Copied: main/trunk/common/SynchronizedBlock.hpp (from rev 2914, sandbox/rick/rxapi/common/SynchronizedBlock.hpp) =================================================================== --- main/trunk/common/SynchronizedBlock.hpp (rev 0) +++ main/trunk/common/SynchronizedBlock.hpp 2008-08-09 21:42:51 UTC (rev 2915) @@ -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 runtime support */ +/* */ +/* Critical section definitions */ +/* */ +/*****************************************************************************/ + +#ifndef SynchronizedBlock_DEFINED +#define SynchronizedBlock_DEFINED + +#include "SysSemaphore.hpp" + +class Lock +{ +public: + inline Lock(SysMutex &l) : lock(l) + { + lock.request(); + } + + + inline ~Lock() + { + lock.release(); + } + +protected: + SysMutex &lock; +}; +#endif + Deleted: main/trunk/common/Utilities.cpp =================================================================== --- sandbox/rick/rxapi/common/Utilities.cpp 2008-08-09 20:41:32 UTC (rev 2914) +++ main/trunk/common/Utilities.cpp 2008-08-09 21:42:51 UTC (rev 2915) @@ -1,184 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ -/****************************************************************************/ -/* REXX Kernel */ -/* */ -/* Utility Functions */ -/* */ -/****************************************************************************/ - -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <sys/types.h> -#include "Utilities.hpp" - -const char *Utilities::locateCharacter( - const char *string, /* search string */ - const char *set, /* reference set */ - size_t length ) /* size of string */ -/*********************************************************************/ -/* Function: Find first occurence of set member in memory */ -/*********************************************************************/ -{ - while (length-- > 0) - { /* search through string */ - - if (strchr(set, *string)) - { /* find a match in ref set? */ - return string; - } - string++; /* step the pointer */ - } - return NULL; /* return matched position */ -} - - -/** - * Portable implementation of an ascii-z caseless string compare. - * - * @param opt1 First string argument - * @param opt2 Second string argument. - * - * @return The compare result. Returns 0, negative, or positive depending - * one the ordering compare result. - */ -int Utilities::strCaselessCompare(const char *op1, const char *op2) -{ - while (tolower(*op1) == tolower(*op2)) - { - if (*op1 == 0) - { - return 0; - } - op1++; - op2++; - } - - return(tolower(*op1) - tolower(*op2)); -} - -/** - * Portable implementation of a caseless memory compare. - * - * @param opt1 First memory location to compare. - * @param opt2 Second memory location. - * @param len Length to compare. - * - * @return The compare result. Returns 0, negative, or positive depending - * one the ordering compare result. - */ -int Utilities::memicmp(const void *mem1, const void *mem2, size_t len) -{ - const char *op1 = (const char *)mem1; - const char *op2 = (const char *)mem2; - while(len != 0) - { - if (tolower(*op1) != tolower(*op2)) - { - return tolower(*op1) - tolower(*op2); - - } - op1++; - op2++; - len--; - } - return 0; -} - -/** - * Portable implementation of an ascii-z string to uppercase (in place). - * - * @param str String argument - * - * @return The address of the str unput argument. - */ -void Utilities::strupper(char *str) -{ - while (*str) - { - *str = toupper(*str); - str++; - } - - return; -} - - -/** - * Portable implementation of an ascii-z string to uppercase (in place). - * - * @param str String argument - * - * @return The address of the str unput argument. - */ -void Utilities::strlower(char *str) -{ - while (*str) - { - *str = tolower(*str); - str++; - } - - return; -} - - -/** - * Bounded strchr() function. - * - * @param data The data pointer. - * @param n The maximum length to scan. - * @param ch The character of interest. - * - * @return The pointer to the located character, or NULL if it isn't found. - */ -const char *Utilities::strnchr(const char *data, size_t n, char ch) -{ - const char *endPtr = data + n; - while (data < endPtr && *data != '\0') - { - if (*data == ch) - { - return data; - } - data++; - } - return NULL; -} Copied: main/trunk/common/Utilities.cpp (from rev 2914, sandbox/rick/rxapi/common/Utilities.cpp) =================================================================== --- main/trunk/common/Utilities.cpp (rev 0) +++ main/trunk/common/Utilities.cpp 2008-08-09 21:42:51 UTC (rev 2915) @@ -0,0 +1,184 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* REXX Kernel */ +/* */ +/* Utility Functions */ +/* */ +/****************************************************************************/ + +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <sys/types.h> +#include "Utilities.hpp" + +const char *Utilities::locateCharacter( + const char *string, /* search string */ + const char *set, /* reference set */ + size_t length ) /* size of string */ +/*********************************************************************/ +/* Function: Find first occurence of set member in memory */ +/*********************************************************************/ +{ + while (length-- > 0) + { /* search through string */ + + if (strchr(set, *string)) + { /* find a match in ref set? */ + return string; + } + string++; /* step the pointer */ + } + return NULL; /* return matched position */ +} + + +/** + * Portable implementation of an ascii-z caseless string compare. + * + * @param opt1 First string argument + * @param opt2 Second string argument. + * + * @return The compare result. Returns 0, negative, or positive depending + * one the ordering compare result. + */ +int Utilities::strCaselessCompare(const char *op1, const char *op2) +{ + while (tolower(*op1) == tolower(*op2)) + { + if (*op1 == 0) + { + return 0; + } + op1++; + op2++; + } + + return(tolower(*op1) - tolower(*op2)); +} + +/** + * Portable implementation of a caseless memory compare. + * + * @param opt1 First memory location to compare. + * @param opt2 Second memory location. + * @param len Length to compare. + * + * @return The compare result. Returns 0, negative, or positive depending + * one the ordering compare result. + */ +int Utilities::memicmp(const void *mem1, const void *mem2, size_t len) +{ + const... [truncated message content] |
From: <bi...@us...> - 2008-08-09 22:02:25
|
Revision: 2916 http://oorexx.svn.sourceforge.net/oorexx/?rev=2916&view=rev Author: bigrixx Date: 2008-08-09 22:02:29 +0000 (Sat, 09 Aug 2008) Log Message: ----------- pick up some missed changes Modified Paths: -------------- main/trunk/Makefile.am main/trunk/utilities/rxqueue/platform/unix/rxqueue.cpp main/trunk/utilities/rxsubcom/platform/unix/rxsubcom.cpp Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-09 21:42:51 UTC (rev 2915) +++ main/trunk/Makefile.am 2008-08-09 22:02:29 UTC (rev 2916) @@ -83,7 +83,7 @@ build_rxregexp_dir = $(top_srcdir)/rxregexp build_samples_dir = $(top_srcdir)/samples build_rexxclasses_dir = $(build_kernel_dir)/RexxClasses -build_utilities_dir = $(build_kernel_dir)/utilities +build_utilities_dir = $(top_srcdir)/utilities # These are the *nix directories utils_unix_dir = $(build_utils_dir)/unix @@ -351,7 +351,7 @@ # # Binary targets # -bin_PROGRAMS = rxapi rexximage rexx rexxc rxqueue rxsubcom rxdelipc +bin_PROGRAMS = rxapi rexximage rexx rexxc rxqueue rxsubcom # # Shared library targets @@ -380,8 +380,7 @@ man_MANS = $(build_utils_platform_dir)/rexx.1 \ $(build_utils_platform_dir)/rexxc.1 \ $(build_utils_platform_dir)/rxsubcom.1 \ - $(build_utils_platform_dir)/rxqueue.1 \ - $(build_utils_platform_dir)/rxdelipc.1 + $(build_utils_platform_dir)/rxqueue.1 #################### librexx.so ########################## # Sources for librexxapi.so @@ -769,22 +768,6 @@ rxsubcom_LDADD = librexx.la librexxapi.la @ORX_LDADD_EXECUTABLE@ rxsubcom_LDFLAGS = @ORX_LDFLAGS_EXECUTABLE@ -#################### rxdelipc ######################### -# Sources for rxdelipc -# -rxdelipc_SOURCES = $(build_rexxapi_platform_dir)/APIManagerShutdown.cpp -# -# Preprocessor flags for rxdelipc -# -rxdelipc_CXXFLAGS = $(COMMON_CPPFLAGS) \ - -I$(build_api_dir) \ - -I$(build_api_platform_dir) -# -# Extra libraries for rxdelipc -# -rxdelipc_LDADD = librexx.la librexxapi.la @ORX_LDADD_EXECUTABLE@ -rxdelipc_LDFLAGS = @ORX_LDFLAGS_EXECUTABLE@ - #################### librexxutil.so ################ # # Sources for librexxutil.so Modified: main/trunk/utilities/rxqueue/platform/unix/rxqueue.cpp =================================================================== --- main/trunk/utilities/rxqueue/platform/unix/rxqueue.cpp 2008-08-09 21:42:51 UTC (rev 2915) +++ main/trunk/utilities/rxqueue/platform/unix/rxqueue.cpp 2008-08-09 22:02:29 UTC (rev 2916) @@ -65,12 +65,14 @@ #include <stdlib.h> /* needed for miscellaneous functions */ #include <string.h> /* needed for string functions */ #include "rexx.h" /* needed for queue functions & codes */ +#include "RexxMessageNumbers.h" #define RXQUEUE_CLEAR -2 /* used for queue mode CLEAR flag */ #define BAD_MESSAGE -6 /* Exit RC for message not found. */ #define MSG_BUF_SIZE 256 /* Error message buffer size */ +#define REXXMESSAGEFILE "rexx.cat" #define CATD_ERR -1 char line[4096]; /* buffer for data to add to queue */ @@ -90,7 +92,6 @@ int i; /* loop counter for arguments */ int rc; /* return code from API calls */ size_t entries; /* number of entries in queue */ - REXXDATETIME dt; /* date/time structure for reading */ const char *quename=NULL; /* initialize queuename to NULL */ size_t linelen ; /* input line length */ CONSTRXSTRING queuedata; /* data added to the queue */ Modified: main/trunk/utilities/rxsubcom/platform/unix/rxsubcom.cpp =================================================================== --- main/trunk/utilities/rxsubcom/platform/unix/rxsubcom.cpp 2008-08-09 21:42:51 UTC (rev 2915) +++ main/trunk/utilities/rxsubcom/platform/unix/rxsubcom.cpp 2008-08-09 22:02:29 UTC (rev 2916) @@ -61,6 +61,8 @@ #include "RexxErrorCodes.h" #include "RexxMessageNumbers.h" +#define REXXMESSAGEFILE "rexx.cat" + #define BUFFERLEN 256 /* Length of message bufs used*/ /* Macro for argv[1] compares */ #define CASE(x) if(!strcasecmp(x,argv[1])) @@ -80,7 +82,6 @@ const char * scbname; /* registration name */ const char * scbdll_name; /* DLL file name */ const char * scbdll_proc; /* DLL procedure name */ - int rc; /* Must be at lease 1 argument*/ if (argc<2) @@ -111,10 +112,14 @@ /* if only 3 passed, dummy 4 */ if (argc<4) { - argv[3]=""; + scbdll_name = ""; } + else + { + scbdll_name = argv[3]; + } unsigned short flags; - return RexxQuerySubcom(argv[2], argv[3], &flags, NULL); + return RexxQuerySubcom(argv[2], scbdll_name, &flags, NULL); } /* */ CASE("DROP") { /* Drop Check */ @@ -126,9 +131,13 @@ /* if only 3 passed, dummy 4 */ if (argc<4) { - argv[3]=""; + scbdll_name = ""; } - return RexxDeregisterSubcom(argv[2], argv[3]); + else + { + scbdll_name = argv[3]; + } + return RexxDeregisterSubcom(argv[2], scbdll_name); } CASE("LOAD") { @@ -138,8 +147,12 @@ } if (argc<4) { - argv[3]=""; /* if only 3 passed, dummy 4 */ + scbdll_name = ""; } + else + { + scbdll_name = argv[3]; + } return RexxLoadSubcom(argv[2], argv[3]); } parmerr(Error_RXSUBC_general); /* Otherwise, must be a error */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-09 22:15:17
|
Revision: 2917 http://oorexx.svn.sourceforge.net/oorexx/?rev=2917&view=rev Author: bigrixx Date: 2008-08-09 22:15:24 +0000 (Sat, 09 Aug 2008) Log Message: ----------- create directories for the code reorganization Added Paths: ----------- main/trunk/extensions/ main/trunk/kernel/behaviour/ main/trunk/kernel/classes/support/ main/trunk/kernel/concurrency/ main/trunk/kernel/execution/ main/trunk/kernel/memory/ main/trunk/kernel/package/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-10 01:22:54
|
Revision: 2918 http://oorexx.svn.sourceforge.net/oorexx/?rev=2918&view=rev Author: bigrixx Date: 2008-08-10 01:22:56 +0000 (Sun, 10 Aug 2008) Log Message: ----------- move concurrency files Modified Paths: -------------- main/trunk/Makefile.am main/trunk/kernel/kernel.mak main/trunk/orxdb.bat Added Paths: ----------- main/trunk/kernel/concurrency/ActivationApiContexts.hpp main/trunk/kernel/concurrency/ActivityDispatcher.cpp main/trunk/kernel/concurrency/ActivityDispatcher.hpp main/trunk/kernel/concurrency/ActivityManager.cpp main/trunk/kernel/concurrency/ActivityManager.hpp main/trunk/kernel/concurrency/CallbackDispatcher.cpp main/trunk/kernel/concurrency/CallbackDispatcher.hpp main/trunk/kernel/concurrency/ExitHandler.cpp main/trunk/kernel/concurrency/ExitHandler.hpp main/trunk/kernel/concurrency/MessageDispatcher.cpp main/trunk/kernel/concurrency/MessageDispatcher.hpp main/trunk/kernel/concurrency/RexxActivity.cpp main/trunk/kernel/concurrency/RexxActivity.hpp main/trunk/kernel/concurrency/RexxStartDispatcher.cpp main/trunk/kernel/concurrency/RexxStartDispatcher.hpp Removed Paths: ------------- main/trunk/kernel/runtime/ActivationApiContexts.hpp main/trunk/kernel/runtime/ActivityDispatcher.cpp main/trunk/kernel/runtime/ActivityDispatcher.hpp main/trunk/kernel/runtime/ActivityManager.cpp main/trunk/kernel/runtime/ActivityManager.hpp main/trunk/kernel/runtime/CallbackDispatcher.cpp main/trunk/kernel/runtime/CallbackDispatcher.hpp main/trunk/kernel/runtime/ExitHandler.cpp main/trunk/kernel/runtime/ExitHandler.hpp main/trunk/kernel/runtime/MessageDispatcher.cpp main/trunk/kernel/runtime/MessageDispatcher.hpp main/trunk/kernel/runtime/RexxActivity.cpp main/trunk/kernel/runtime/RexxActivity.hpp main/trunk/kernel/runtime/RexxStartDispatcher.cpp main/trunk/kernel/runtime/RexxStartDispatcher.hpp Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-09 22:15:24 UTC (rev 2917) +++ main/trunk/Makefile.am 2008-08-10 01:22:56 UTC (rev 2918) @@ -72,6 +72,7 @@ build_kernel_api_dir = $(build_kernel_dir)/api build_classes_dir = $(build_kernel_dir)/classes build_expression_dir = $(build_kernel_dir)/expression +build_concurrency_dir = $(build_kernel_dir)/concurrency build_instructions_dir = $(build_kernel_dir)/instructions build_parser_dir = $(build_kernel_dir)/parser build_runtime_dir = $(build_kernel_dir)/runtime @@ -163,6 +164,14 @@ $(build_expression_dir)/ExpressionVariable.hpp \ $(build_expression_dir)/IndirectVariableReference.hpp \ $(build_expression_dir)/ExpressionLogical.hpp +concurrencyHeaders = $(build_concurrency_dir)/ActivationApiContexts.hpp \ + $(build_concurrency_dir)/ActivityDispatcher.hpp \ + $(build_concurrency_dir)/ActivityManager.hpp \ + $(build_concurrency_dir)/CallbackDispatcher.hpp \ + $(build_concurrency_dir)/ExitHandler.hpp \ + $(build_concurrency_dir)/MessageDispatcher.hpp \ + $(build_concurrency_dir)/RexxActivity.hpp \ + $(build_concurrency_dir)/RexxStartDispatcher.hpp \ instructionsHeaders = $(build_instructions_dir)/AddressInstruction.hpp \ $(build_instructions_dir)/AssignmentInstruction.hpp \ $(build_instructions_dir)/CallInstruction.hpp \ @@ -218,7 +227,7 @@ $(build_kernel_platform_dir)/SysNativeFunctions.h \ $(build_kernel_platform_dir)/SysNativeMethods.h \ $(build_kernel_platform_dir)/SystemCommands.h \ - $(build_kernel_platform_dir)/SystemInterpreter.hpp + $(build_kernel_platform_dir)/SystemInterpreter.hpp commonHeaders = $(build_common_dir)/SynchronizedBlock.hpp \ $(build_common_dir)/Utilities.hpp \ $(build_common_platform_dir)/SysFile.hpp \ @@ -226,21 +235,15 @@ $(build_common_platform_dir)/SysSemaphore.hpp \ $(build_common_platform_dir)/SysThread.hpp -runtimeHeaders = $(build_runtime_dir)/ActivationApiContexts.hpp \ - $(build_runtime_dir)/ActivityDispatcher.hpp \ - $(build_runtime_dir)/ActivityManager.hpp \ - $(build_runtime_dir)/CallbackDispatcher.hpp \ - $(build_runtime_dir)/ClassTypeCodes.h \ +runtimeHeaders = $(build_runtime_dir)/ClassTypeCodes.h \ $(build_runtime_dir)/CPPCode.hpp \ $(build_runtime_dir)/DeadObject.hpp \ - $(build_runtime_dir)/ExitHandler.hpp \ $(build_runtime_dir)/GlobalNames.h \ $(build_runtime_dir)/Interpreter.hpp \ $(build_runtime_dir)/InterpreterInstance.hpp \ $(build_runtime_dir)/LibraryPackage.hpp \ $(build_runtime_dir)/MemorySegment.hpp \ $(build_runtime_dir)/MemoryStats.hpp \ - $(build_runtime_dir)/MessageDispatcher.hpp \ $(build_runtime_dir)/NativeFunctions.h \ $(build_runtime_dir)/NativeMethods.h \ $(build_runtime_dir)/Numerics.hpp \ @@ -250,7 +253,6 @@ $(build_runtime_dir)/ProtectedObject.hpp \ $(build_runtime_dir)/RexxActivation.hpp \ $(build_runtime_dir)/RexxActivationStack.hpp \ - $(build_runtime_dir)/RexxActivity.hpp \ $(build_runtime_dir)/RexxBehaviour.hpp \ $(build_runtime_dir)/RexxBuiltinFunctions.h \ $(build_runtime_dir)/RexxCode.hpp \ @@ -271,7 +273,6 @@ $(build_runtime_dir)/RexxNativeActivation.hpp \ $(build_runtime_dir)/RexxNativeCode.hpp \ $(build_runtime_dir)/RexxSmartBuffer.hpp \ - $(build_runtime_dir)/RexxStartDispatcher.hpp \ $(build_runtime_dir)/RexxVariable.hpp \ $(build_runtime_dir)/RexxVariableDictionary.hpp \ $(build_runtime_dir)/SecurityManager.hpp \ @@ -463,6 +464,13 @@ $(build_classes_dir)/SupplierClass.cpp \ $(build_classes_dir)/TableClass.cpp \ $(build_classes_dir)/WeakReferenceClass.cpp +concurrency_sources = $(build_concurrency_dir)/ActivityDispatcher.cpp \ + $(build_concurrency_dir)/ActivityManager.cpp \ + $(build_concurrency_dir)/CallbackDispatcher.cpp \ + $(build_concurrency_dir)/ExitHandler.cpp \ + $(build_concurrency_dir)/MessageDispatcher.cpp \ + $(build_concurrency_dir)/RexxActivity.cpp \ + $(build_concurrency_dir)/RexxStartDispatcher.cpp expression_sources = $(build_expression_dir)/BuiltinFunctions.cpp \ $(build_expression_dir)/CommonExternalFunctions.cpp \ $(build_expression_dir)/ExpressionCompoundVariable.cpp \ @@ -542,12 +550,8 @@ $(build_common_platform_dir)/SysLibrary.cpp \ $(build_common_platform_dir)/SysSemaphore.cpp \ $(build_common_platform_dir)/SysThread.cpp -runtime_sources = $(build_runtime_dir)/ActivityDispatcher.cpp \ - $(build_runtime_dir)/ActivityManager.cpp \ - $(build_runtime_dir)/CallbackDispatcher.cpp \ - $(build_runtime_dir)/CPPCode.cpp \ +runtime_sources = $(build_runtime_dir)/CPPCode.cpp \ $(build_runtime_dir)/DeadObject.cpp \ - $(build_runtime_dir)/ExitHandler.cpp \ $(build_runtime_dir)/GlobalData.cpp \ $(build_runtime_dir)/GlobalNames.cpp \ $(build_runtime_dir)/InternalPackage.cpp \ @@ -556,7 +560,6 @@ $(build_runtime_dir)/LibraryPackage.cpp \ $(build_runtime_dir)/MemorySegment.cpp \ $(build_runtime_dir)/MemoryStats.cpp \ - $(build_runtime_dir)/MessageDispatcher.cpp \ $(build_runtime_dir)/Numerics.cpp \ $(build_runtime_dir)/PackageManager.cpp \ $(build_runtime_dir)/PrimitiveBehaviours.cpp \ @@ -564,7 +567,6 @@ $(build_runtime_dir)/ProtectedObject.cpp \ $(build_runtime_dir)/RexxActivation.cpp \ $(build_runtime_dir)/RexxActivationStack.cpp \ - $(build_runtime_dir)/RexxActivity.cpp \ $(build_runtime_dir)/RexxBehaviour.cpp \ $(build_runtime_dir)/RexxCode.cpp \ $(build_runtime_dir)/RexxCollection.cpp \ @@ -582,7 +584,6 @@ $(build_runtime_dir)/RexxNativeActivation.cpp \ $(build_runtime_dir)/RexxNativeCode.cpp \ $(build_runtime_dir)/RexxSmartBuffer.cpp \ - $(build_runtime_dir)/RexxStartDispatcher.cpp \ $(build_runtime_dir)/RexxVariable.cpp \ $(build_runtime_dir)/RexxVariableDictionary.cpp \ $(build_runtime_dir)/SecurityManager.cpp \ @@ -594,6 +595,7 @@ $(build_streamlibrary_dir)/StreamNative.cpp librexx_la_SOURCES = $(classes_sources) \ $(kernel_api_sources) \ + $(concurrency_sources) \ $(expression_sources) \ $(instructions_sources) \ $(parser_sources) \ @@ -616,6 +618,7 @@ -I$(build_common_dir) \ -I$(build_common_platform_dir) \ -I$(build_kernel_dir) \ + -I$(build_concurrency_dir) \ -I$(build_expression_dir) \ -I$(build_instructions_dir) \ -I$(build_classes_dir) \ Copied: main/trunk/kernel/concurrency/ActivationApiContexts.hpp (from rev 2914, main/trunk/kernel/runtime/ActivationApiContexts.hpp) =================================================================== --- main/trunk/kernel/concurrency/ActivationApiContexts.hpp (rev 0) +++ main/trunk/kernel/concurrency/ActivationApiContexts.hpp 2008-08-10 01:22:56 UTC (rev 2918) @@ -0,0 +1,143 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* 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 */ +/* */ +/* Definition of contexts used for API call vector states. */ +/* */ +/******************************************************************************/ +#ifndef ActivationApiContexts_Included +#define ActivationApiContexts_Included + +#include "RexxCore.h" + +class RexxActivity; +class RexxNativeActivation; +class InterpreterInstance; + +// structure used to hand out a thread context structure for this +// activity. This stucture contains a RexxThreadContext structure +// followed by a self-referential pointer back to the containing +// activity. This gives us a quick mapping back to the activity +// associated with the thread context. + +typedef struct +{ + RexxInstance instanceContext; // externalized instance context + InterpreterInstance *instance; // the instance this represents +} InstanceContext; + +typedef struct +{ + RexxThreadContext threadContext; // the thread context structure used for the API + RexxActivity *owningActivity; // a pointer back to the owning activity +} ActivityContext; + +// and similar structures for other API context structures +typedef struct +{ + RexxMethodContext threadContext; // the thread context structure used for the API + RexxNativeActivation *context; // a pointer back to the owning activation +} MethodContext; + +typedef struct +{ + RexxCallContext threadContext; // the thread context structure used for the API + RexxNativeActivation *context; // a pointer back to the owning activation +} CallContext; + +typedef struct +{ + RexxExitContext threadContext; // the thread context structure used for the API + RexxNativeActivation *context; // a pointer back to the owning activation +} ExitContext; + + +/** + * Convert a context into the activity the context is associated with. + * + * @param c The calling thread context. + * + * @return The activity object the context is associated with. + */ +inline RexxActivity *contextToActivity(RexxThreadContext *c) +{ + return ((ActivityContext *)c)->owningActivity; +} + + +/** + * Convert a context into the activity the context is associated with. + * + * @param c The calling thread context. + * + * @return The activity object the context is associated with. + */ +inline RexxActivity *contextToActivity(RexxCallContext *c) +{ + return ((ActivityContext *)(c->threadContext))->owningActivity; +} + + +/** + * Convert a context into the activity the context is associated with. + * + * @param c The calling thread context. + * + * @return The activity object the context is associated with. + */ +inline RexxActivity *contextToActivity(RexxMethodContext *c) +{ + return ((ActivityContext *)(c->threadContext))->owningActivity; +} + + +/** + * Convert a context into the activity the context is associated with. + * + * @param c The calling thread context. + * + * @return The activity object the context is associated with. + */ +inline RexxActivity *contextToActivity(RexxExitContext *c) +{ + return ((ActivityContext *)(c->threadContext))->owningActivity; +} + +#endif + Copied: main/trunk/kernel/concurrency/ActivityDispatcher.cpp (from rev 2914, main/trunk/kernel/runtime/ActivityDispatcher.cpp) =================================================================== --- main/trunk/kernel/concurrency/ActivityDispatcher.cpp (rev 0) +++ main/trunk/kernel/concurrency/ActivityDispatcher.cpp 2008-08-10 01:22:56 UTC (rev 2918) @@ -0,0 +1,122 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "RexxCore.h" +#include "ActivityDispatcher.hpp" +#include "Interpreter.hpp" +#include "InterpreterInstance.hpp" +#include "RexxActivity.hpp" + + +/** + * Default virtual method for handling a run() methods on + * an activity dispatcher. + */ +void ActivityDispatcher::run() +{ + // this just returns +} + + +/** + * Default handler for any error conditions. This just sets the + * condition information in the dispatch unit. + * + * @param c The condition information for the error. + */ +void ActivityDispatcher::handleError(wholenumber_t r, RexxDirectory *c) +{ + // save the condition information + rc = r; + conditionData = c; +} + + +/** + * Default handler for any error conditions. This just sets the + * condition information in the dispatch unit. + * + * @param c The condition information for the error. + */ +void ActivityDispatcher::handleError(RexxDirectory *c) +{ + // this only gets added if there is a condition + if (c != OREF_NULL) + { + handleError(activity->errorNumber(c), c); + } +} + + +/** + * Invoke the dispatcher on a newly created interpreter instance. + */ +void ActivityDispatcher::invoke() +{ + // this creates a new instance to run under, with an active activity + InstanceBlock instance; + + // go run the instance on the current activity + instance.activity->run(*this); +} + + +/** + * Invoke the dispatcher on a newly created interpreter instance. + */ +void ActivityDispatcher::invoke(RexxOption *options) +{ + // this creates a new instance to run under, with an active activity + InstanceBlock instance(options); + + // go run the instance on the current activity + instance.activity->run(*this); +} + + +/** + * Invoke the dispatcher on a newly created interpreter instance. + */ +void ActivityDispatcher::invoke(PRXSYSEXIT exits, const char *env) +{ + // this creates a new instance to run under, with an active activity + InstanceBlock instance(exits, env); + + // go run the instance on the current activity + instance.activity->run(*this); +} Copied: main/trunk/kernel/concurrency/ActivityDispatcher.hpp (from rev 2914, main/trunk/kernel/runtime/ActivityDispatcher.hpp) =================================================================== --- main/trunk/kernel/concurrency/ActivityDispatcher.hpp (rev 0) +++ main/trunk/kernel/concurrency/ActivityDispatcher.hpp 2008-08-10 01:22:56 UTC (rev 2918) @@ -0,0 +1,72 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#ifndef ActivityDispatcher_included +#define ActivityDispatcher_included + + +class RexxDirectory; +class RexxNativeActivation; + +class ActivityDispatcher +{ +public: + inline ActivityDispatcher() : rc(0), activity(OREF_NULL), activation(OREF_NULL), conditionData(OREF_NULL) { ; } + virtual ~ActivityDispatcher() { ; } + + virtual void run(); + virtual void handleError(wholenumber_t, RexxDirectory *); + virtual void handleError(RexxDirectory *); + virtual void invoke(); + virtual void invoke(RexxOption *); + virtual void invoke(PRXSYSEXIT exits, const char *env); + + inline void setContext(RexxActivity *act, RexxNativeActivation *a) { activity = act; activation = a; } + + wholenumber_t rc; // error return code + +protected: + + RexxActivity *activity; // the activity we're running on + RexxNativeActivation *activation; // the native activation we're running under + RexxDirectory *conditionData; // any condition data posted due to an activity error +}; + + +#endif Copied: main/trunk/kernel/concurrency/ActivityManager.cpp (from rev 2915, main/trunk/kernel/runtime/ActivityManager.cpp) =================================================================== --- main/trunk/kernel/concurrency/ActivityManager.cpp (rev 0) +++ main/trunk/kernel/concurrency/ActivityManager.cpp 2008-08-10 01:22:56 UTC (rev 2918) @@ -0,0 +1,1069 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "RexxCore.h" +#include "RexxActivity.hpp" +#include "RexxActivation.hpp" +#include "DirectoryClass.hpp" +#include "ActivityManager.hpp" +#include "Interpreter.hpp" +#include "ProtectedObject.hpp" +#include "InterpreterInstance.hpp" +#include "RexxNativeActivation.hpp" +#include "SysActivity.hpp" + +// The currently active activity. +RexxActivity *ActivityManager::currentActivity = OREF_NULL; + +// this is a volatile variable used to ensure instruction ordering +volatile bool ActivityManager::sentinel = false; + +// available activities we can reuse +RexxList *ActivityManager::availableActivities = OREF_NULL; + +// table of all activities +RexxList *ActivityManager::allActivities = OREF_NULL; + +// the activation Cache +RexxStack *ActivityManager::activations = OREF_NULL; + +// size of the activation cache +size_t ActivityManager::activationCacheSize = 0; + +// the native activation Cache +RexxStack *ActivityManager::nativeActivations = OREF_NULL; + +// size of the activation cache +size_t ActivityManager::nativeActivationCacheSize = 0; + +// this is the head of the waiting activity chain +RexxActivity *ActivityManager::firstWaitingActivity = OREF_NULL; + +// tail of the waiting activity chain +RexxActivity *ActivityManager::lastWaitingActivity = OREF_NULL; + +// process shutting down flag +bool ActivityManager::processTerminating = false; + +// number of active interpreter instances in this process +size_t ActivityManager::interpreterInstances = 0; + +// the local environment +RexxDirectory *ActivityManager::localEnvironment = OREF_NULL; + +// global lock for the interpreter +SysMutex ActivityManager::kernelSemaphore; + +// the termination complete semaphore +SysSemaphore ActivityManager::terminationSem; + +const size_t ACTIVATION_CACHE_SIZE = 10; + +// we tend not to go as deep with nested native activations, so +// this number does not need to be the same as as the activation +// cache +const size_t NATIVE_ACTIVATION_CACHE_SIZE = 5; + + +/** + * Initialize the activity manager when the interpreter starts up. + */ +void ActivityManager::init() +{ + availableActivities = new_list(); + allActivities = new_list(); + activations = new (ACTIVATION_CACHE_SIZE, false) RexxStack(ACTIVATION_CACHE_SIZE); + + // now initialize both activation caches with empty references. This generally + // keeps the cached items from fragmenting the object heap because they are + // longer lived. + size_t i; + for (i = 0; i < ACTIVATION_CACHE_SIZE; i++) + { + // push a dummy activation on the stack + activations->push((RexxObject *)new RexxActivation()); + } + activationCacheSize = ACTIVATION_CACHE_SIZE; + + nativeActivations = new (NATIVE_ACTIVATION_CACHE_SIZE, false) RexxStack(NATIVE_ACTIVATION_CACHE_SIZE); + for (i = 0; i < NATIVE_ACTIVATION_CACHE_SIZE; i++) + { + // push a dummy activation on the stack + nativeActivations->push((RexxObject *)new RexxNativeActivation()); + } + nativeActivationCacheSize = NATIVE_ACTIVATION_CACHE_SIZE; + + currentActivity = OREF_NULL; + localEnvironment = new_directory(); +} + +void ActivityManager::live(size_t liveMark) +/******************************************************************************/ +/* NOTE: we do not mark the UninitTables. MEMORY will request the table */ +/* and mark it for us. This is so that it can determine if there are */ +/* any objects that a "dead" and need uninit run. Activity will run the */ +/* UNINIT, but we let Garbage Collection, handle detection/etc. */ +/* NOTE: we also do not mark the subClasses table. This will be managed */ +/* by memory so that we can reclaim classes once all of the instances have */ +/* also been reclaimed. */ +/******************************************************************************/ +{ + memory_mark(availableActivities); + memory_mark(allActivities); + memory_mark(activations); +memory_mark(nativeActivations); + memory_mark(firstWaitingActivity); + memory_mark(lastWaitingActivity); + memory_mark(localEnvironment); +} + +void ActivityManager::liveGeneral(int reason) +/******************************************************************************/ +/* NOTE: we do not mark the UninitTables. MEMORY will request the table */ +/* and mark it for us. This is so that it can determine if there are */ +/* any objects that a "dead" and need uninit run. Activity will run the */ +/* UNINIT, but we let Garbage Collection, handle detection/etc. */ +/* The subClasses table is only marked during a save image, so that the */ +/* classes will still have the proper subclass definitions. */ +/******************************************************************************/ +{ + if (!memoryObject.savingImage()) + { + memory_mark_general(availableActivities); + memory_mark_general(allActivities); + memory_mark_general(activations); + memory_mark_general(nativeActivations); + memory_mark_general(firstWaitingActivity); + memory_mark_general(lastWaitingActivity); + memory_mark_general(localEnvironment); + } +} + + +void ActivityManager::addWaitingActivity( + RexxActivity *waitingAct, /* new activity to add to the queue */ + bool release ) /* need to release the run semaphore */ +/******************************************************************************/ +/* Function: Add an activity to the round robin wait queue */ +/******************************************************************************/ +{ + ResourceSection lock; // need the control block locks + + /* NOTE: The following assignments */ + /* do not use OrefSet intentionally. */ + /* because we do have yet have kernel*/ + /* access, we can't allow memory to */ + /* allocate a new counter object for */ + /* this. This leads to memory */ + /* corruption and unpredictable traps*/ + /* nobody waiting yet? */ + if (firstWaitingActivity == OREF_NULL) + { + /* this is the head of the chain */ + firstWaitingActivity = waitingAct; + /* and the tail */ + lastWaitingActivity = waitingAct; + // this will ensure these are set before the lock is released + sentinel = false; + lock.release(); // release the lock now + } + else + { /* move to the end of the line */ + /* chain off of the existing one */ + lastWaitingActivity->setNextWaitingActivity(waitingAct); + /* this is the new last one */ + lastWaitingActivity = waitingAct; + sentinel = false; // another synchronization point + waitingAct->clearWait(); /* clear the run semaphore */ + lock.release(); // release the lock now + if (release) /* current semaphore owner? */ + { + unlockKernel(); + } + SysActivity::yield(); /* yield the thread */ + SysActivity::relinquish(); /* now allow system stuff to run */ + waitingAct->waitKernel(); /* and wait for permission */ + } + lockKernel(); // get the kernel lock now + lock.reacquire(); // get the resource lock back + /* NOTE: The following assignments */ + /* do not use OrefSet intentionally. */ + /* because we do have yet have kernel*/ + /* access, we can't allow memory to */ + /* allocate a new counter object for */ + /* this. This leads to memory */ + /* corruption and unpredictable traps*/ + /* dechain the activity */ + + sentinel = false; // another memory barrier + + /* firstWaitingActivity will be released, so set first to next of first + The original outcommented code was setting the first to the next of the + activity that got the semaphore. This could corrupt the list if threads + are not released in fifo */ + + if (firstWaitingActivity != OREF_NULL) + { + firstWaitingActivity = firstWaitingActivity->getNextWaitingActivity(); + } + /* clear out the chain */ + /* if we are here, newActivity must have been firstWaitingActivity sometime + before and therefore we can set next pointer to NULL without disturbing + the linked list */ + + waitingAct->setNextWaitingActivity(OREF_NULL); + /* was this the only one? */ + if (firstWaitingActivity == OREF_NULL) + { + /* clear out the last one */ + lastWaitingActivity = OREF_NULL; + } + else /* release the next one to run */ + { + firstWaitingActivity->postRelease(); + } + // the setting of the sentinel variables acts as a memory barrier to + // ensure that the assignment of currentActivitiy occurs precisely at this point. + sentinel = false; + currentActivity = waitingAct; /* set new current activity */ + sentinel = true; + /* and new active settings */ + Numerics::setCurrentSettings(waitingAct->getNumericSettings()); +} + + +/** + * Terminate an interpreter instance. This starts process + * shutdown if the last instance goes away. + */ +void ActivityManager::createInterpreter() +{ + //TODO: more stuff should be moved into here. + interpreterInstances++; +} + +/** + * Terminate an interpreter instance. This starts process + * shutdown if the last instance goes away. + */ +void ActivityManager::terminateInterpreter() +{ + ResourceSection lock; + interpreterInstances--; /* reduce the active count */ + if (interpreterInstances == 0) /* down to nothing? */ + { + /* force termination */ + shutdown(); + } +} + + +/** + * Shutdown the activity manager and initiate interpreter termination. + */ +void ActivityManager::shutdown() +{ + processTerminating = true; + /* Make sure we wake up server */ + /* Make sure all free Activities */ + /* get the terminate message */ + /* done after uninit calls. incas */ + /* uninits needed some. */ + clearActivityPool(); + // if there are no activities yet to shutdown, we can terminate immediately. + // Otherwise, we need to wait for the rest of the threads to finish cleaning + // up. Once the last thread terminates, we can shutdown. + localEnvironment = OREF_NULL; /* no local environment */ +} + + +/** + * Create a new activation for a toplevel activation using a + * routine (vs. a method invocation). + * + * @param activity The activity we're running on. + * @param routine The routine object we're calling. + * @param code The code object associated with the method. + * @param calltype The type of call being made. + * @param environment + * The initial address environment. + * @param context The context of the invocation. + * + * @return The newly created activation. + */ +RexxActivation *ActivityManager::newActivation(RexxActivity *activity, RoutineClass *routine, RexxCode *code, RexxString *calltype, RexxString *environment, int context) +{ + + if (activationCacheSize != 0) /* have a cached entry? */ + { + activationCacheSize--; /* remove an entry from the count */ + /* get the top cached entry */ + RexxActivation *resultActivation = (RexxActivation *)activations->stackTop(); + /* reactivate this */ + resultActivation->setHasReferences(); + resultActivation = new (resultActivation) RexxActivation(activity, routine, code, calltype, environment, context); + activations->pop(); /* Remove reused activation from stac*/ + return resultActivation; + + } + else /* need to create a new one */ + { + /* Create new Activation. */ + return new RexxActivation(activity, routine, code, calltype, environment, context); + } +} + + +/** + * Create a new activation for an internal level call + * (internal call or interpreted execution). + * + * @param activity The activity we're running on. + * @param parent The parent activation. OREF_NULL is used if this is a top-level + * call. + * @param code The code object associated with the method. + * @param context The context of the invocation. + * + * @return The newly created activation. + */ +RexxActivation *ActivityManager::newActivation(RexxActivity *activity, RexxActivation *parent, RexxCode *code, int context) +{ + + if (activationCacheSize != 0) /* have a cached entry? */ + { + activationCacheSize--; /* remove an entry from the count */ + /* get the top cached entry */ + RexxActivation *resultActivation = (RexxActivation *)activations->stackTop(); + /* reactivate this */ + resultActivation->setHasReferences(); + resultActivation = new (resultActivation) RexxActivation(activity, parent, code, context); + activations->pop(); /* Remove reused activation from stac*/ + return resultActivation; + + } + else /* need to create a new one */ + { + /* Create new Activation. */ + return new RexxActivation(activity, parent, code, context); + } +} + + +/** + * Create a new activation for a method invocation (vs. a + * program or routine call) + * + * @param activity The activity we're running on. + * @param method The method object being invoked. + * @param code The code object associated with the method. + * + * @return The newly created activation. + */ +RexxActivation *ActivityManager::newActivation(RexxActivity *activity, RexxMethod *method, RexxCode *code) +{ + + if (activationCacheSize != 0) /* have a cached entry? */ + { + activationCacheSize--; /* remove an entry from the count */ + /* get the top cached entry */ + RexxActivation *resultActivation = (RexxActivation *)activations->stackTop(); + /* reactivate this */ + resultActivation->setHasReferences(); + resultActivation = new (resultActivation) RexxActivation(activity, method, code); + activations->pop(); /* Remove reused activation from stac*/ + return resultActivation; + + } + else /* need to create a new one */ + { + /* Create new Activation. */ + return new RexxActivation(activity, method, code); + } +} + + +/** + * Create a new activation for a a native external call stack + * + * @param activity The activity we're running on. + * @param parent The parent activation. + * + * @return The newly created activation. + */ +RexxNativeActivation *ActivityManager::newNativeActivation(RexxActivity *activity, RexxActivation *parent) +{ + if (nativeActivationCacheSize != 0) /* have a cached entry? */ + { + nativeActivationCacheSize--; /* remove an entry from the count */ + /* get the top cached entry */ + RexxNativeActivation *resultActivation = (RexxNativeActivation *)nativeActivations->stackTop(); + /* reactivate this */ + resultActivation->setHasReferences(); + resultActivation = new (resultActivation) RexxNativeActivation(activity, parent); + nativeActivations->pop(); /* Remove reused activation from stac*/ + return resultActivation; + + } + else /* need to create a new one */ + { + /* Create new Activation. */ + return new RexxNativeActivation(activity, parent); + } +} + + +/** + * Create a new activation for a a native external call stack + * + * @param activity The activity we're running on. + * + * @return The newly created activation. + */ +RexxNativeActivation *ActivityManager::newNativeActivation(RexxActivity *activity) +{ + if (nativeActivationCacheSize != 0) /* have a cached entry? */ + { + nativeActivationCacheSize--; /* remove an entry from the count */ + /* get the top cached entry */ + RexxNativeActivation *resultActivation = (RexxNativeActivation *)nativeActivations->stackTop(); + /* reactivate this */ + resultActivation->setHasReferences(); + resultActivation = new (resultActivation) RexxNativeActivation(activity); + nativeActivations->pop(); /* Remove reused activation from stac*/ + return resultActivation; + + } + else /* need to create a new one */ + { + /* Create new Activation. */ + return new RexxNativeActivation(activity); + } +} + + +/** + * Add a popped activation back to the cache. + * + * @param activation The activation to add. + */ +void ActivityManager::cacheActivation(RexxActivationBase *activation) +{ + + // if this is not a reply operation and the frame we just removed is + // a Rexx activation, we can just cache this. + if (isOfClass(Activation, activation)) + { + /* still room in the cache? */ + if (activationCacheSize < ACTIVATION_CACHE_SIZE) + { + /* free everything for reclamation */ + activation->setHasNoReferences(); + activationCacheSize++; /* add the this to the count */ + /* and add the activation */ + activations->push((RexxObject *)activation); + } + } + else + { + /* still room in the cache? */ + if (nativeActivationCacheSize < NATIVE_ACTIVATION_CACHE_SIZE) + { + /* free everything for reclamation */ + activation->setHasNoReferences(); + nativeActivationCacheSize++; /* add the this to the count */ + /* and add the activation */ + nativeActivations->push((RexxObject *)activation); + } + + } +} + + +/** + * Obtain a new activity for running on a separate thread. + * + * @return The created (or pooled) activity object. + */ +RexxActivity *ActivityManager::createNewActivity() +{ + ResourceSection lock; // lock the control information + /* try to get one from the free table*/ + RexxActivity *activity = (RexxActivity *)availableActivities->removeFirstItem(); + if (activity == OREF_NULL) + { + lock.release(); // release lock while creating new activity + /* Create a new activity object */ + activity = new RexxActivity(true); + lock.reacquire(); // need this back again + /* Add this activity to the table of */ + /* in use activities and the global */ + /* table */ + allActivities->append((RexxObject *)activity); + } + else + { + /* We are able to reuse an activity, */ + /* so just re-initialize it. */ + activity->reset(); + } + return activity; /* return the activity */ +} + + +/** + * Create an activity object for the current thread. + * + * @return + */ +RexxActivity *ActivityManager::createCurrentActivity() +{ + // create an activity object without creating a new thread + RexxActivity *activity = new RexxActivity(false); + ResourceSection lock; // lock the control information + /* Add this activity to the table of */ + /* in use activities and the global */ + /* table */ + allActivities->append((RexxObject *)activity); + return activity; /* return the activity */ +} + + +/** + * Clone off an activity from an existing activity. Used for + * message start() are early reply operations. + * + * @param parent The currently running activity. The activity-specific settings are + * inherited from the parent. + * + * @return A new activity. + */ +RexxActivity *ActivityManager::createNewActivity(RexxActivity *parent) +{ + // create a new activity with the same priority as the parent + RexxActivity *activity = createNewActivity(); + // copy any needed settings from the parent + activity->inheritSettings(parent); + return activity; +} + + +void ActivityManager::clearActivityPool() +/******************************************************************************/ +/* Function: see if there are any Uninit messages need to be send before */ +/* the process goes away. */ +/******************************************************************************/ +{ + RexxActivity *activity = (RexxActivity *)availableActivities->removeFirstItem(); + while (activity != OREF_NULL) + { + // terminate this thread + activity->terminatePoolActivity(); + activity = (RexxActivity *)availableActivities->removeFirstItem(); + } +} + + +/** + * Return an activity to the available pool. If we're in the + * process of shutting down, or have too many pool activities, + * we'll return false to tell the activity to completely + * shut things down. + * + * @param activity The activity we're adding back to the available pool. + * + * @return true if this was pooled, false if the thread should not wait for + * more work. + */ +bool ActivityManager::poolActivity(RexxActivity *activity) +{ + // are we shutting down or have too many threads in the pool? + if (processTerminating || availableActivities->items() > MAX_THREAD_POOL_SIZE) + { + // have the activity clean up its resources. + activity->cleanupActivityResources(); + + // remove this from the activity list + allActivities->removeItem((RexxObject *)activity); + return false; + } + else + { + // just add this to the available list + availableActivities->append((RexxObject *)activity); + return true; // this was successfully pooled + } +} + + +bool ActivityManager::haltActivity( + thread_id_t thread_id, /* target thread id */ + RexxString * description ) /* description to use */ +/******************************************************************************/ +/* Function: Flip on a bit in a target activities top activation */ +/******************************************************************************/ +{ + ResourceSection lock; + // locate the activity associated with this thread_id. If not found, return + // a failure. + RexxActivity *activity = findActivity(thread_id); + if (activity != OREF_NULL) + { + return activity->halt(description); + } + return false; // this was a failure +} + +bool ActivityManager::yieldActivity( + thread_id_t thread_id) /* target thread id */ +/****************************************************************************/ +/* Function: Flip on a bit in a target activities top activation */ +/* called from rexxsetyield */ +/****************************************************************************/ +{ + ResourceSection lock; + // locate the activity associated with this thread_id. If not found, return + // a failure. + RexxActivity *activity = findActivity(thread_id); + if (activity != OREF_NULL) + { + activity->yield(); + return true; /* this actually worked */ + } + return false; // this was a failure +} + + +bool ActivityManager::setActivityTrace( + thread_id_t thread_id, /* target thread id */ + bool on_or_off ) /* trace on/off flag */ +/******************************************************************************/ +/* Function: Flip on a bit in a target activities top activation */ +/******************************************************************************/ +{ + ResourceSection lock; + // locate the activity associated with this thread_id. If not found, return + // a failure. + RexxActivity *activity = findActivity(thread_id); + if (activity != OREF_NULL) + { + return activity->setTrace(on_or_off); + } + return false; // this was a failure +} + + +void ActivityManager::yieldCurrentActivity() +/******************************************************************************/ +/* Function: Signal an activation to yield control */ +/******************************************************************************/ +{ + ResourceSection lock; + + RexxActivity *activity = ActivityManager::currentActivity; + if (activity != OREF_NULL) + { + activity->yield(); + } +} + + +RexxActivity *ActivityManager::findActivity(thread_id_t threadId) +/******************************************************************************/ +/* Function: Locate the activity associated with a thread */ +/******************************************************************************/ +{ + // this is a critical section + ResourceSection lock; + + // NB: New activities are pushed on to the end, so it's prudent to search + // from the list end toward the front of the list. Also, this ensures we + // will find the toplevel activity nested on a given thread first. + for (size_t listIndex = allActivities->lastIndex(); + listIndex != LIST_END; + listIndex = allActivities->previousIndex(listIndex) ) + { + RexxActivity *activity = (RexxActivity *)allActivities->getValue(listIndex); + // this should never happen, but we never return suspended threads + if (activity->isThread(threadId) && !activity->isSuspended()) + { + return activity; + } + } + return OREF_NULL; +} + + +RexxActivity *ActivityManager::findActivity() +/******************************************************************************/ +/* Function: Locate the activity associated with a thread */ +/******************************************************************************/ +{ + return findActivity(SysActivity::queryThreadID()); +} + + +void ActivityManager::exit(int retcode) +/******************************************************************************/ +/* Function: Really shut down--this exits the process */ +/******************************************************************************/ +{ + ::exit(retcode); +} + +void ActivityManager::lockKernel() +/******************************************************************************/ +/* Function: Request access to the kernel */ +/******************************************************************************/ +{ + kernelSemaphore.request(); /* just request the semaphore */ +} + +void ActivityManager::unlockKernel() +/******************************************************************************/ +/* Function: Release the kernel access */ +/******************************************************************************/ +{ + // the use of the sentinel variables will ensure that the assignment of + // current activity occurs BEFORE the kernel semaphore is released. + currentActivity = OREF_NULL; /* no current activation */ + sentinel = true; + kernelSemaphore.release(); /* release the kernel semaphore */ +} + +/** + * Create the global kernel lock for the ActivityManager. + */ +void ActivityManager::createLocks() +{ + kernelSemaphore.create(); + // this needs to be created and set + terminationSem.create(); + terminationSem.reset(); +} + +/** + * Create the global kernel lock for the ActivityManager. + */ +void ActivityManager::closeLocks() +{ + kernelSemaphore.close(); + terminationSem.close(); +} + + +/** + * Try a fast request for the kernel. This requires A) there + * be no waiting activities and B) that it be possible to request + * the ... [truncated message content] |
From: <bi...@us...> - 2008-08-10 02:08:36
|
Revision: 2919 http://oorexx.svn.sourceforge.net/oorexx/?rev=2919&view=rev Author: bigrixx Date: 2008-08-10 02:08:40 +0000 (Sun, 10 Aug 2008) Log Message: ----------- move behaviour files Modified Paths: -------------- main/trunk/Makefile.am main/trunk/kernel/kernel.mak main/trunk/orxdb.bat Added Paths: ----------- main/trunk/kernel/behaviour/ClassTypeCodes.h main/trunk/kernel/behaviour/ClassTypeCodes.xsl main/trunk/kernel/behaviour/PrimitiveBehaviourNames.h main/trunk/kernel/behaviour/PrimitiveBehaviourNames.xsl main/trunk/kernel/behaviour/PrimitiveBehaviours.cpp main/trunk/kernel/behaviour/PrimitiveBehaviours.xsl main/trunk/kernel/behaviour/PrimitiveClasses.xml main/trunk/kernel/behaviour/RexxBehaviour.cpp main/trunk/kernel/behaviour/RexxBehaviour.hpp main/trunk/kernel/behaviour/VirtualFunctionTable.cpp main/trunk/kernel/behaviour/VirtualFunctionTable.xsl Removed Paths: ------------- main/trunk/kernel/runtime/ClassTypeCodes.h main/trunk/kernel/runtime/ClassTypeCodes.xsl main/trunk/kernel/runtime/PrimitiveBehaviourNames.h main/trunk/kernel/runtime/PrimitiveBehaviourNames.xsl main/trunk/kernel/runtime/PrimitiveBehaviours.cpp main/trunk/kernel/runtime/PrimitiveBehaviours.xsl main/trunk/kernel/runtime/PrimitiveClasses.xml main/trunk/kernel/runtime/RexxBehaviour.cpp main/trunk/kernel/runtime/RexxBehaviour.hpp main/trunk/kernel/runtime/VirtualFunctionTable.cpp main/trunk/kernel/runtime/VirtualFunctionTable.xsl Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-10 01:22:56 UTC (rev 2918) +++ main/trunk/Makefile.am 2008-08-10 02:08:40 UTC (rev 2919) @@ -73,6 +73,7 @@ build_classes_dir = $(build_kernel_dir)/classes build_expression_dir = $(build_kernel_dir)/expression build_concurrency_dir = $(build_kernel_dir)/concurrency +build_behaviour_dir = $(build_kernel_dir)/behaviour build_instructions_dir = $(build_kernel_dir)/instructions build_parser_dir = $(build_kernel_dir)/parser build_runtime_dir = $(build_kernel_dir)/runtime @@ -118,7 +119,7 @@ messageXML = $(build_messages_dir)/rexxmsg.xml -classesXML = $(build_runtime_dir)/PrimitiveClasses.xml +classesXML = $(build_behaviour_dir)/PrimitiveClasses.xml # # header files for source distribution @@ -164,6 +165,9 @@ $(build_expression_dir)/ExpressionVariable.hpp \ $(build_expression_dir)/IndirectVariableReference.hpp \ $(build_expression_dir)/ExpressionLogical.hpp +behaviourHeaders = $(build_behaviour_dir)/ClassTypeCodes.h \ + $(build_behaviour_dir)/PrimitiveBehaviourNames.h \ + $(build_behaviour_dir)/RexxBehaviour.hpp concurrencyHeaders = $(build_concurrency_dir)/ActivationApiContexts.hpp \ $(build_concurrency_dir)/ActivityDispatcher.hpp \ $(build_concurrency_dir)/ActivityManager.hpp \ @@ -235,8 +239,7 @@ $(build_common_platform_dir)/SysSemaphore.hpp \ $(build_common_platform_dir)/SysThread.hpp -runtimeHeaders = $(build_runtime_dir)/ClassTypeCodes.h \ - $(build_runtime_dir)/CPPCode.hpp \ +runtimeHeaders = $(build_runtime_dir)/CPPCode.hpp \ $(build_runtime_dir)/DeadObject.hpp \ $(build_runtime_dir)/GlobalNames.h \ $(build_runtime_dir)/Interpreter.hpp \ @@ -248,12 +251,10 @@ $(build_runtime_dir)/NativeMethods.h \ $(build_runtime_dir)/Numerics.hpp \ $(build_runtime_dir)/PackageManager.hpp \ - $(build_runtime_dir)/PrimitiveBehaviourNames.h \ $(build_runtime_dir)/ProgramMetaData.hpp \ $(build_runtime_dir)/ProtectedObject.hpp \ $(build_runtime_dir)/RexxActivation.hpp \ $(build_runtime_dir)/RexxActivationStack.hpp \ - $(build_runtime_dir)/RexxBehaviour.hpp \ $(build_runtime_dir)/RexxBuiltinFunctions.h \ $(build_runtime_dir)/RexxCode.hpp \ $(build_runtime_dir)/RexxCollection.hpp \ @@ -352,7 +353,7 @@ # # Binary targets # -bin_PROGRAMS = rxapi rexximage rexx rexxc rxqueue rxsubcom +bin_PROGRAMS = rxapi rexximage rexx rexxc rxqueue rxsubcom # # Shared library targets @@ -381,7 +382,7 @@ man_MANS = $(build_utils_platform_dir)/rexx.1 \ $(build_utils_platform_dir)/rexxc.1 \ $(build_utils_platform_dir)/rxsubcom.1 \ - $(build_utils_platform_dir)/rxqueue.1 + $(build_utils_platform_dir)/rxqueue.1 #################### librexx.so ########################## # Sources for librexxapi.so @@ -464,6 +465,9 @@ $(build_classes_dir)/SupplierClass.cpp \ $(build_classes_dir)/TableClass.cpp \ $(build_classes_dir)/WeakReferenceClass.cpp +behaviour_sources = $(build_behaviour_dir)/PrimitiveBehaviours.cpp \ + $(build_behaviour_dir)/RexxBehaviour.cpp \ + $(build_behaviour_dir)/VirtualFunctionTable.cpp concurrency_sources = $(build_concurrency_dir)/ActivityDispatcher.cpp \ $(build_concurrency_dir)/ActivityManager.cpp \ $(build_concurrency_dir)/CallbackDispatcher.cpp \ @@ -562,12 +566,10 @@ $(build_runtime_dir)/MemoryStats.cpp \ $(build_runtime_dir)/Numerics.cpp \ $(build_runtime_dir)/PackageManager.cpp \ - $(build_runtime_dir)/PrimitiveBehaviours.cpp \ $(build_runtime_dir)/ProgramMetaData.cpp \ $(build_runtime_dir)/ProtectedObject.cpp \ $(build_runtime_dir)/RexxActivation.cpp \ $(build_runtime_dir)/RexxActivationStack.cpp \ - $(build_runtime_dir)/RexxBehaviour.cpp \ $(build_runtime_dir)/RexxCode.cpp \ $(build_runtime_dir)/RexxCollection.cpp \ $(build_runtime_dir)/RexxCompoundElement.cpp \ @@ -589,12 +591,12 @@ $(build_runtime_dir)/SecurityManager.cpp \ $(build_runtime_dir)/Setup.cpp \ $(build_runtime_dir)/TranslateDispatcher.cpp \ - $(build_runtime_dir)/Version.cpp \ - $(build_runtime_dir)/VirtualFunctionTable.cpp + $(build_runtime_dir)/Version.cpp streamlibrary_sources = $(build_streamlibrary_dir)/StreamCommandParser.cpp \ $(build_streamlibrary_dir)/StreamNative.cpp librexx_la_SOURCES = $(classes_sources) \ $(kernel_api_sources) \ + $(behaviour_sources) \ $(concurrency_sources) \ $(expression_sources) \ $(instructions_sources) \ @@ -618,6 +620,7 @@ -I$(build_common_dir) \ -I$(build_common_platform_dir) \ -I$(build_kernel_dir) \ + -I$(build_behaviour_dir) \ -I$(build_concurrency_dir) \ -I$(build_expression_dir) \ -I$(build_instructions_dir) \ @@ -884,17 +887,17 @@ $(build_messages_dir)/gencat.inp: $(build_kernel_platform_dir)/UnixGencat.xsl $(messageXML) sh ./xsl.sh $(@) $(messageXML) $(build_kernel_platform_dir)/UnixGencat.xsl -$(build_runtime_dir)/ClassTypeCodes.h: $(build_runtime_dir)/ClassTypeCodes.xsl $(classesXML) - sh ./xsl.sh $(@) $(classesXML) $(build_runtime_dir)/ClassTypeCodes.xsl +$(build_behaviour_dir)/ClassTypeCodes.h: $(build_behaviour_dir)/ClassTypeCodes.xsl $(classesXML) + sh ./xsl.sh $(@) $(classesXML) $(build_behaviour_dir)/ClassTypeCodes.xsl -$(build_runtime_dir)/PrimitiveBehaviourNames.h: $(build_runtime_dir)/PrimitiveBehaviourNames.xsl $(classesXML) - sh ./xsl.sh $(@) $(classesXML) $(build_runtime_dir)/PrimitiveBehaviourNames.xsl +$(build_behaviour_dir)/PrimitiveBehaviourNames.h: $(build_behaviour_dir)/PrimitiveBehaviourNames.xsl $(classesXML) + sh ./xsl.sh $(@) $(classesXML) $(build_behaviour_dir)/PrimitiveBehaviourNames.xsl -$(build_runtime_dir)/PrimitiveBehaviours.cpp: $(build_runtime_dir)/PrimitiveBehaviours.xsl $(classesXML) - sh ./xsl.sh $(@) $(classesXML) $(build_runtime_dir)/PrimitiveBehaviours.xsl +$(build_behaviour_dir)/PrimitiveBehaviours.cpp: $(build_behaviour_dir)/PrimitiveBehaviours.xsl $(classesXML) + sh ./xsl.sh $(@) $(classesXML) $(build_behaviour_dir)/PrimitiveBehaviours.xsl -$(build_runtime_dir)/VirtualFunctionTables.cpp: $(build_runtime_dir)/VirtualFunctionTable.xsl $(classesXML) - sh ./xsl.sh $(@) $(classesXML) $(build_runtime_dir)/VirtualFunctionTable.xsl +$(build_behaviour_dir)/VirtualFunctionTables.cpp: $(build_behaviour_dir)/VirtualFunctionTable.xsl $(classesXML) + sh ./xsl.sh $(@) $(classesXML) $(build_behaviour_dir)/VirtualFunctionTable.xsl rexx.img: rexximage librexxutil.la $(core_classes) $(core_platform_classes) cp $(build_rexxclasses_dir)/*.orx . @@ -921,10 +924,10 @@ $(messageXML) \ $(classesXML) \ $(build_kernel_platform_dir)/UnixGencat.xsl \ - $(build_runtime_dir)/ClassTypeCodes.xsl \ - $(build_runtime_dir)/PrimitiveBehaviourNames.xsl \ - $(build_runtime_dir)/PrimitiveBehaviours.xsl \ - $(build_runtime_dir)/VirtualFunctionTable.xsl \ + $(build_behaviour_dir)/ClassTypeCodes.xsl \ + $(build_behaviour_dir)/PrimitiveBehaviourNames.xsl \ + $(build_behaviour_dir)/PrimitiveBehaviours.xsl \ + $(build_behaviour_dir)/VirtualFunctionTable.xsl \ $(errorHeaders) \ $(build_utils_platform_dir)/rexx.sh \ $(build_utils_platform_dir)/rexx.csh \ Copied: main/trunk/kernel/behaviour/ClassTypeCodes.h (from rev 2917, main/trunk/kernel/runtime/ClassTypeCodes.h) =================================================================== --- main/trunk/kernel/behaviour/ClassTypeCodes.h (rev 0) +++ main/trunk/kernel/behaviour/ClassTypeCodes.h 2008-08-10 02:08:40 UTC (rev 2919) @@ -0,0 +1,205 @@ + + +/*----------------------------------------------------------------------------*/ +/* */ +/* 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 Support */ +/* */ +/* Rexx primitive class id codes */ +/* */ +/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ +/* -- FILE WAS GENERATED BY ClassTypeIds.xsl -- */ +/******************************************************************************/ + +#ifndef ClassTypeCodes_Included +#define ClassTypeCodes_Included + +typedef enum +{ + T_First_Primitive_Class = 0, + T_First_Exported_Class = 0, + + T_Object = 0, + T_ObjectClass = 1, + T_Class = 2, + T_ClassClass = 3, + T_Array = 4, + T_ArrayClass = 5, + T_Directory = 6, + T_DirectoryClass = 7, + T_Integer = 8, + T_IntegerClass = 9, + T_List = 10, + T_ListClass = 11, + T_Message = 12, + T_MessageClass = 13, + T_Method = 14, + T_MethodClass = 15, + T_NumberString = 16, + T_NumberStringClass = 17, + T_Queue = 18, + T_QueueClass = 19, + T_Stem = 20, + T_StemClass = 21, + T_String = 22, + T_StringClass = 23, + T_Supplier = 24, + T_SupplierClass = 25, + T_Table = 26, + T_TableClass = 27, + T_Relation = 28, + T_RelationClass = 29, + T_MutableBuffer = 30, + T_MutableBufferClass = 31, + T_Pointer = 32, + T_PointerClass = 33, + T_Buffer = 34, + T_BufferClass = 35, + T_WeakReference = 36, + T_WeakReferenceClass = 37, + T_Routine = 38, + T_RoutineClass = 39, + T_Package = 40, + T_PackageClass = 41, + T_RexxContext = 42, + T_RexxContextClass = 43, + + T_Last_Exported_Class = 43, + + T_First_Internal_Class = 44, + + T_NilObject = 44, + T_Behaviour = 45, + T_RexxSource = 46, + T_LibraryPackage = 47, + T_RexxCode = 48, + T_NativeMethod = 49, + T_NativeRoutine = 50, + T_RegisteredRoutine = 51, + T_CPPCode = 52, + T_AttributeGetterCode = 53, + T_AttributeSetterCode = 54, + T_ConstantGetterCode = 55, + T_AbstractCode = 56, + T_HashTable = 57, + T_ListTable = 58, + T_SmartBuffer = 59, + T_Variable = 60, + T_VariableDictionary = 61, + T_VariableTerm = 62, + T_CompoundVariableTerm = 63, + T_StemVariableTerm = 64, + T_DotVariableTerm = 65, + T_IndirectVariableTerm = 66, + T_FunctionCallTerm = 67, + T_MessageSendTerm = 68, + T_UnaryOperatorTerm = 69, + T_BinaryOperatorTerm = 70, + T_LogicalTerm = 71, + T_Instruction = 72, + T_AddressInstruction = 73, + T_AssignmentInstruction = 74, + T_CallInstruction = 75, + T_CommandInstruction = 76, + T_DoInstruction = 77, + T_DropInstruction = 78, + T_ElseInstruction = 79, + T_EndInstruction = 80, + T_EndIfInstruction = 81, + T_ExitInstruction = 82, + T_ExposeInstruction = 83, + T_ForwardInstruction = 84, + T_GuardInstruction = 85, + T_IfInstruction = 86, + T_InterpretInstruction = 87, + T_LabelInstruction = 88, + T_LeaveInstruction = 89, + T_MessageInstruction = 90, + T_NopInstruction = 91, + T_NumericInstruction = 92, + T_OptionsInstruction = 93, + T_OtherwiseInstruction = 94, + T_ParseInstruction = 95, + T_ProcedureInstruction = 96, + T_QueueInstruction = 97, + T_RaiseInstruction = 98, + T_ReplyInstruction = 99, + T_ReturnInstruction = 100, + T_SayInstruction = 101, + T_SelectInstruction = 102, + T_SignalInstruction = 103, + T_ThenInstruction = 104, + T_TraceInstruction = 105, + T_UseInstruction = 106, + T_ClassDirective = 107, + T_LibraryDirective = 108, + T_RequiresDirective = 109, + T_CompoundElement = 110, + T_ParseTrigger = 111, + + T_Last_Internal_Class = 111, + + T_First_Transient_Class = 112, + + T_Memory = 112, + T_InternalStack = 113, + T_Stack = 114, + T_Activity = 115, + T_Activation = 116, + T_NativeActivation = 117, + T_ActivationFrameBuffer = 118, + T_Envelope = 119, + T_Clause = 120, + T_Token = 121, + T_DoBlock = 122, + T_InterpreterInstance = 123, + T_SecurityManager = 124, + + T_Last_Transient_Class = 124, + T_Last_Primitive_Class = 124, + T_Last_Class_Type = 124, + +} ClassTypeCode; + +/* -------------------------------------------------------------------------- */ +/* -- ================================================== -- */ +/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ +/* -- ================================================== -- */ +/* -------------------------------------------------------------------------- */ +#endif + Copied: main/trunk/kernel/behaviour/ClassTypeCodes.xsl (from rev 2917, main/trunk/kernel/runtime/ClassTypeCodes.xsl) =================================================================== --- main/trunk/kernel/behaviour/ClassTypeCodes.xsl (rev 0) +++ main/trunk/kernel/behaviour/ClassTypeCodes.xsl 2008-08-10 02:08:40 UTC (rev 2919) @@ -0,0 +1,117 @@ +<?xml version="1.0"?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> +<xsl:output method="text"/> +<xsl:template match="Classes"> +<xsl:text>/*----------------------------------------------------------------------------*/ +/* */ +/* 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 Support */ +/* */ +/* Rexx primitive class id codes */ +/* */ +/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ +/* -- FILE WAS GENERATED BY ClassTypeIds.xsl -- */ +/******************************************************************************/ + +#ifndef ClassTypeCodes_Included +#define ClassTypeCodes_Included + +typedef enum +{</xsl:text> +<xsl:variable name="firstexported" select="0"/> +<xsl:variable name="lastexported" select="$firstexported + ((count(Exported/Class) * 2) - 1)"/> +<xsl:text> + T_First_Primitive_Class = </xsl:text><xsl:value-of select="$firstexported"/><xsl:text>, + T_First_Exported_Class = </xsl:text><xsl:value-of select="$firstexported"/><xsl:text>, +</xsl:text> + + <xsl:for-each select="Exported/Class"> +<xsl:text> + T_</xsl:text><xsl:value-of select="@id"/><xsl:text> = </xsl:text><xsl:value-of select="$firstexported + ((position() - 1) * 2)"/><xsl:text>, + T_</xsl:text><xsl:value-of select="@id"/><xsl:text>Class = </xsl:text><xsl:value-of select="$firstexported + (((position() - 1) * 2) + 1)"/><xsl:text>,</xsl:text> + </xsl:for-each> +<xsl:text> + + T_Last_Exported_Class = </xsl:text><xsl:value-of select="$lastexported"/><xsl:text>, + </xsl:text> + +<xsl:variable name="firstinternal" select="$lastexported + 1"/> +<xsl:variable name="lastinternal" select="$firstinternal + (count(Internal/Class) - 1)"/> +<xsl:text> + T_First_Internal_Class = </xsl:text><xsl:value-of select="$firstinternal"/><xsl:text>, +</xsl:text> + + <xsl:for-each select="Internal/Class"> +<xsl:text> + T_</xsl:text><xsl:value-of select="@id"/><xsl:text> = </xsl:text><xsl:value-of select="$firstinternal + (position() - 1)"/><xsl:text>,</xsl:text> + </xsl:for-each> +<xsl:text> + + T_Last_Internal_Class = </xsl:text><xsl:value-of select="$lastinternal"/><xsl:text>, + </xsl:text> + +<xsl:variable name="firsttransient" select="$lastinternal + 1"/> +<xsl:variable name="lasttransient" select="$firsttransient + (count(Transient/Class) - 1)"/> +<xsl:text> + T_First_Transient_Class = </xsl:text><xsl:value-of select="$firsttransient"/><xsl:text>, +</xsl:text> + + <xsl:for-each select="Transient/Class"> +<xsl:text> + T_</xsl:text><xsl:value-of select="@id"/><xsl:text> = </xsl:text><xsl:value-of select="$firsttransient + (position() - 1)"/><xsl:text>,</xsl:text> + </xsl:for-each> +<xsl:text> + + T_Last_Transient_Class = </xsl:text><xsl:value-of select="$lasttransient"/><xsl:text>, + T_Last_Primitive_Class = </xsl:text><xsl:value-of select="$lasttransient"/><xsl:text>, + T_Last_Class_Type = </xsl:text><xsl:value-of select="$lasttransient"/><xsl:text>, + </xsl:text> + <xsl:text> +} ClassTypeCode; + +/* -------------------------------------------------------------------------- */ +/* -- ================================================== -- */ +/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ +/* -- ================================================== -- */ +/* -------------------------------------------------------------------------- */ +#endif +</xsl:text> +</xsl:template> + +<xsl:template match="CopyRight"></xsl:template> +</xsl:stylesheet> Copied: main/trunk/kernel/behaviour/PrimitiveBehaviourNames.h (from rev 2917, main/trunk/kernel/runtime/PrimitiveBehaviourNames.h) =================================================================== --- main/trunk/kernel/behaviour/PrimitiveBehaviourNames.h (rev 0) +++ main/trunk/kernel/behaviour/PrimitiveBehaviourNames.h 2008-08-10 02:08:40 UTC (rev 2919) @@ -0,0 +1,185 @@ + + +/*----------------------------------------------------------------------------*/ +/* */ +/* 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 Support */ +/* */ +/* Defines for mapping class ids to behaviours */ +/* */ +/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ +/******************************************************************************/ + +#ifndef PrimitiveBehaviourNames_Included +#define PrimitiveBehaviourNames_Included + + +#define TheObjectBehaviour (&RexxBehaviour::primitiveBehaviours[T_Object]) +#define TheObjectClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_ObjectClass]) +#define TheClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_Class]) +#define TheClassClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_ClassClass]) +#define TheArrayBehaviour (&RexxBehaviour::primitiveBehaviours[T_Array]) +#define TheArrayClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_ArrayClass]) +#define TheDirectoryBehaviour (&RexxBehaviour::primitiveBehaviours[T_Directory]) +#define TheDirectoryClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_DirectoryClass]) +#define TheIntegerBehaviour (&RexxBehaviour::primitiveBehaviours[T_Integer]) +#define TheIntegerClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_IntegerClass]) +#define TheListBehaviour (&RexxBehaviour::primitiveBehaviours[T_List]) +#define TheListClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_ListClass]) +#define TheMessageBehaviour (&RexxBehaviour::primitiveBehaviours[T_Message]) +#define TheMessageClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_MessageClass]) +#define TheMethodBehaviour (&RexxBehaviour::primitiveBehaviours[T_Method]) +#define TheMethodClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_MethodClass]) +#define TheNumberStringBehaviour (&RexxBehaviour::primitiveBehaviours[T_NumberString]) +#define TheNumberStringClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_NumberStringClass]) +#define TheQueueBehaviour (&RexxBehaviour::primitiveBehaviours[T_Queue]) +#define TheQueueClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_QueueClass]) +#define TheStemBehaviour (&RexxBehaviour::primitiveBehaviours[T_Stem]) +#define TheStemClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_StemClass]) +#define TheStringBehaviour (&RexxBehaviour::primitiveBehaviours[T_String]) +#define TheStringClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_StringClass]) +#define TheSupplierBehaviour (&RexxBehaviour::primitiveBehaviours[T_Supplier]) +#define TheSupplierClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_SupplierClass]) +#define TheTableBehaviour (&RexxBehaviour::primitiveBehaviours[T_Table]) +#define TheTableClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_TableClass]) +#define TheRelationBehaviour (&RexxBehaviour::primitiveBehaviours[T_Relation]) +#define TheRelationClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_RelationClass]) +#define TheMutableBufferBehaviour (&RexxBehaviour::primitiveBehaviours[T_MutableBuffer]) +#define TheMutableBufferClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_MutableBufferClass]) +#define ThePointerBehaviour (&RexxBehaviour::primitiveBehaviours[T_Pointer]) +#define ThePointerClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_PointerClass]) +#define TheBufferBehaviour (&RexxBehaviour::primitiveBehaviours[T_Buffer]) +#define TheBufferClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_BufferClass]) +#define TheWeakReferenceBehaviour (&RexxBehaviour::primitiveBehaviours[T_WeakReference]) +#define TheWeakReferenceClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_WeakReferenceClass]) +#define TheRoutineBehaviour (&RexxBehaviour::primitiveBehaviours[T_Routine]) +#define TheRoutineClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_RoutineClass]) +#define ThePackageBehaviour (&RexxBehaviour::primitiveBehaviours[T_Package]) +#define ThePackageClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_PackageClass]) +#define TheRexxContextBehaviour (&RexxBehaviour::primitiveBehaviours[T_RexxContext]) +#define TheRexxContextClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_RexxContextClass]) +#define TheNilObjectBehaviour (&RexxBehaviour::primitiveBehaviours[T_NilObject]) +#define TheBehaviourBehaviour (&RexxBehaviour::primitiveBehaviours[T_Behaviour]) +#define TheRexxSourceBehaviour (&RexxBehaviour::primitiveBehaviours[T_RexxSource]) +#define TheLibraryPackageBehaviour (&RexxBehaviour::primitiveBehaviours[T_LibraryPackage]) +#define TheRexxCodeBehaviour (&RexxBehaviour::primitiveBehaviours[T_RexxCode]) +#define TheNativeMethodBehaviour (&RexxBehaviour::primitiveBehaviours[T_NativeMethod]) +#define TheNativeRoutineBehaviour (&RexxBehaviour::primitiveBehaviours[T_NativeRoutine]) +#define TheRegisteredRoutineBehaviour (&RexxBehaviour::primitiveBehaviours[T_RegisteredRoutine]) +#define TheCPPCodeBehaviour (&RexxBehaviour::primitiveBehaviours[T_CPPCode]) +#define TheAttributeGetterCodeBehaviour (&RexxBehaviour::primitiveBehaviours[T_AttributeGetterCode]) +#define TheAttributeSetterCodeBehaviour (&RexxBehaviour::primitiveBehaviours[T_AttributeSetterCode]) +#define TheConstantGetterCodeBehaviour (&RexxBehaviour::primitiveBehaviours[T_ConstantGetterCode]) +#define TheAbstractCodeBehaviour (&RexxBehaviour::primitiveBehaviours[T_AbstractCode]) +#define TheHashTableBehaviour (&RexxBehaviour::primitiveBehaviours[T_HashTable]) +#define TheListTableBehaviour (&RexxBehaviour::primitiveBehaviours[T_ListTable]) +#define TheSmartBufferBehaviour (&RexxBehaviour::primitiveBehaviours[T_SmartBuffer]) +#define TheVariableBehaviour (&RexxBehaviour::primitiveBehaviours[T_Variable]) +#define TheVariableDictionaryBehaviour (&RexxBehaviour::primitiveBehaviours[T_VariableDictionary]) +#define TheVariableTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_VariableTerm]) +#define TheCompoundVariableTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_CompoundVariableTerm]) +#define TheStemVariableTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_StemVariableTerm]) +#define TheDotVariableTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_DotVariableTerm]) +#define TheIndirectVariableTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_IndirectVariableTerm]) +#define TheFunctionCallTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_FunctionCallTerm]) +#define TheMessageSendTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_MessageSendTerm]) +#define TheUnaryOperatorTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_UnaryOperatorTerm]) +#define TheBinaryOperatorTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_BinaryOperatorTerm]) +#define TheLogicalTermBehaviour (&RexxBehaviour::primitiveBehaviours[T_LogicalTerm]) +#define TheInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_Instruction]) +#define TheAddressInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_AddressInstruction]) +#define TheAssignmentInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_AssignmentInstruction]) +#define TheCallInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_CallInstruction]) +#define TheCommandInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_CommandInstruction]) +#define TheDoInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_DoInstruction]) +#define TheDropInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_DropInstruction]) +#define TheElseInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_ElseInstruction]) +#define TheEndInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_EndInstruction]) +#define TheEndIfInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_EndIfInstruction]) +#define TheExitInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_ExitInstruction]) +#define TheExposeInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_ExposeInstruction]) +#define TheForwardInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_ForwardInstruction]) +#define TheGuardInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_GuardInstruction]) +#define TheIfInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_IfInstruction]) +#define TheInterpretInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_InterpretInstruction]) +#define TheLabelInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_LabelInstruction]) +#define TheLeaveInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_LeaveInstruction]) +#define TheMessageInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_MessageInstruction]) +#define TheNopInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_NopInstruction]) +#define TheNumericInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_NumericInstruction]) +#define TheOptionsInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_OptionsInstruction]) +#define TheOtherwiseInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_OtherwiseInstruction]) +#define TheParseInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_ParseInstruction]) +#define TheProcedureInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_ProcedureInstruction]) +#define TheQueueInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_QueueInstruction]) +#define TheRaiseInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_RaiseInstruction]) +#define TheReplyInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_ReplyInstruction]) +#define TheReturnInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_ReturnInstruction]) +#define TheSayInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_SayInstruction]) +#define TheSelectInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_SelectInstruction]) +#define TheSignalInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_SignalInstruction]) +#define TheThenInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_ThenInstruction]) +#define TheTraceInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_TraceInstruction]) +#define TheUseInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_UseInstruction]) +#define TheClassDirectiveBehaviour (&RexxBehaviour::primitiveBehaviours[T_ClassDirective]) +#define TheLibraryDirectiveBehaviour (&RexxBehaviour::primitiveBehaviours[T_LibraryDirective]) +#define TheRequiresDirectiveBehaviour (&RexxBehaviour::primitiveBehaviours[T_RequiresDirective]) +#define TheCompoundElementBehaviour (&RexxBehaviour::primitiveBehaviours[T_CompoundElement]) +#define TheParseTriggerBehaviour (&RexxBehaviour::primitiveBehaviours[T_ParseTrigger]) +#define TheMemoryBehaviour (&RexxBehaviour::primitiveBehaviours[T_Memory]) +#define TheInternalStackBehaviour (&RexxBehaviour::primitiveBehaviours[T_InternalStack]) +#define TheStackBehaviour (&RexxBehaviour::primitiveBehaviours[T_Stack]) +#define TheActivityBehaviour (&RexxBehaviour::primitiveBehaviours[T_Activity]) +#define TheActivationBehaviour (&RexxBehaviour::primitiveBehaviours[T_Activation]) +#define TheNativeActivationBehaviour (&RexxBehaviour::primitiveBehaviours[T_NativeActivation]) +#define TheActivationFrameBufferBehaviour (&RexxBehaviour::primitiveBehaviours[T_ActivationFrameBuffer]) +#define TheEnvelopeBehaviour (&RexxBehaviour::primitiveBehaviours[T_Envelope]) +#define TheClauseBehaviour (&RexxBehaviour::primitiveBehaviours[T_Clause]) +#define TheTokenBehaviour (&RexxBehaviour::primitiveBehaviours[T_Token]) +#define TheDoBlockBehaviour (&RexxBehaviour::primitiveBehaviours[T_DoBlock]) +#define TheInterpreterInstanceBehaviour (&RexxBehaviour::primitiveBehaviours[T_InterpreterInstance]) +#define TheSecurityManagerBehaviour (&RexxBehaviour::primitiveBehaviours[T_SecurityManager]) + + +/* -------------------------------------------------------------------------- */ +/* -- ================================================== -- */ +/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ +/* -- ================================================== -- */ +/* -------------------------------------------------------------------------- */ +#endif + Copied: main/trunk/kernel/behaviour/PrimitiveBehaviourNames.xsl (from rev 2917, main/trunk/kernel/runtime/PrimitiveBehaviourNames.xsl) =================================================================== --- main/trunk/kernel/behaviour/PrimitiveBehaviourNames.xsl (rev 0) +++ main/trunk/kernel/behaviour/PrimitiveBehaviourNames.xsl 2008-08-10 02:08:40 UTC (rev 2919) @@ -0,0 +1,83 @@ +<?xml version="1.0"?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> +<xsl:output method="text"/> +<xsl:template match="Classes"> +<xsl:text>/*----------------------------------------------------------------------------*/ +/* */ +/* 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 Support */ +/* */ +/* Defines for mapping class ids to behaviours */ +/* */ +/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ +/******************************************************************************/ + +#ifndef PrimitiveBehaviourNames_Included +#define PrimitiveBehaviourNames_Included + + </xsl:text> + + <xsl:for-each select="Exported/Class"> + <xsl:text> +#define The</xsl:text><xsl:value-of select="@id"/><xsl:text>Behaviour (&RexxBehaviour::primitiveBehaviours[T_</xsl:text><xsl:value-of select="@id"/><xsl:text>]) +#define The</xsl:text><xsl:value-of select="@id"/><xsl:text>ClassBehaviour (&RexxBehaviour::primitiveBehaviours[T_</xsl:text><xsl:value-of select="@id"/><xsl:text>Class])</xsl:text> + </xsl:for-each> + + <xsl:for-each select="Internal/Class"> + <xsl:text> +#define The</xsl:text><xsl:value-of select="@id"/><xsl:text>Behaviour (&RexxBehaviour::primitiveBehaviours[T_</xsl:text><xsl:value-of select="@id"/><xsl:text>])</xsl:text> + </xsl:for-each> + + <xsl:for-each select="Transient/Class"> + <xsl:text> +#define The</xsl:text><xsl:value-of select="@id"/><xsl:text>Behaviour (&RexxBehaviour::primitiveBehaviours[T_</xsl:text><xsl:value-of select="@id"/><xsl:text>])</xsl:text> + </xsl:for-each> + + <xsl:text> + + +/* -------------------------------------------------------------------------- */ +/* -- ================================================== -- */ +/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ +/* -- ================================================== -- */ +/* -------------------------------------------------------------------------- */ +#endif +</xsl:text> +</xsl:template> +<xsl:template match="CopyRight"></xsl:template> +</xsl:stylesheet> Copied: main/trunk/kernel/behaviour/PrimitiveBehaviours.cpp (from rev 2917, main/trunk/kernel/runtime/PrimitiveBehaviours.cpp) =================================================================== --- main/trunk/kernel/behaviour/PrimitiveBehaviours.cpp (rev 0) +++ main/trunk/kernel/behaviour/PrimitiveBehaviours.cpp 2008-08-10 02:08:40 UTC (rev 2919) @@ -0,0 +1,194 @@ + + +/*----------------------------------------------------------------------------*/ +/* */ +/* 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 */ +/* */ +/* Build the table of virtual functions assigned to Rexx class instances */ +/* */ +/******************************************************************************/ + +/* -------------------------------------------------------------------------- */ +/* -- ================================================== -- */ +/* -- DO NOT CHANGE THIS FILE, ALL CHANGES WILL BE LOST! -- */ +/* -- ================================================== -- */ +/* -------------------------------------------------------------------------- */ + +#include "RexxCore.h" +#include "RexxBehaviour.hpp" +#include "StringClass.hpp" +#include "IntegerClass.hpp" +#include "NumberStringClass.hpp" + +// the table of primitive behaviours +RexxBehaviour RexxBehaviour::primitiveBehaviours[T_Last_Primitive_Class + 1] = +{ + RexxBehaviour(T_Object, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ObjectClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Class, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ClassClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Array, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ArrayClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Directory, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_DirectoryClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Integer, (PCPPM *)RexxInteger::operatorMethods), + RexxBehaviour(T_IntegerClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_List, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ListClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Message, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_MessageClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Method, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_MethodClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_NumberString, (PCPPM *)RexxNumberString::operatorMethods), + RexxBehaviour(T_NumberStringClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Queue, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_QueueClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Stem, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_StemClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_String, (PCPPM *)RexxString::operatorMethods), + RexxBehaviour(T_StringClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Supplier, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_SupplierClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Table, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_TableClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Relation, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_RelationClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_MutableBuffer, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_MutableBufferClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Pointer, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_PointerClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Buffer, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_BufferClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_WeakReference, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_WeakReferenceClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Routine, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_RoutineClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Package, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_PackageClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_RexxContext, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_RexxContextClass, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_NilObject, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Behaviour, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_RexxSource, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_LibraryPackage, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_RexxCode, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_NativeMethod, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_NativeRoutine, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_RegisteredRoutine, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_CPPCode, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_AttributeGetterCode, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_AttributeSetterCode, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ConstantGetterCode, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_AbstractCode, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_HashTable, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ListTable, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_SmartBuffer, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Variable, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_VariableDictionary, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_VariableTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_CompoundVariableTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_StemVariableTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_DotVariableTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_IndirectVariableTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_FunctionCallTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_MessageSendTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_UnaryOperatorTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_BinaryOperatorTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_LogicalTerm, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Instruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_AddressInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_AssignmentInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_CallInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_CommandInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_DoInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_DropInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ElseInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_EndInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_EndIfInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ExitInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ExposeInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ForwardInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_GuardInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_IfInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_InterpretInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_LabelInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_LeaveInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_MessageInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_NopInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_NumericInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_OptionsInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_OtherwiseInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ParseInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ProcedureInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_QueueInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_RaiseInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ReplyInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ReturnInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_SayInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_SelectInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_SignalInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ThenInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_TraceInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_UseInstruction, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ClassDirective, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_LibraryDirective, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_RequiresDirective, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_CompoundElement, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ParseTrigger, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_Memory, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_InternalStack, (PCPPM *)RexxObject::ope... [truncated message content] |
From: <bi...@us...> - 2008-08-10 02:35:33
|
Revision: 2920 http://oorexx.svn.sourceforge.net/oorexx/?rev=2920&view=rev Author: bigrixx Date: 2008-08-10 02:35:38 +0000 (Sun, 10 Aug 2008) Log Message: ----------- move execution files Modified Paths: -------------- main/trunk/Makefile.am main/trunk/kernel/kernel.mak main/trunk/orxdb.bat Added Paths: ----------- main/trunk/kernel/execution/CPPCode.cpp main/trunk/kernel/execution/CPPCode.hpp main/trunk/kernel/execution/RexxActivation.cpp main/trunk/kernel/execution/RexxActivation.hpp main/trunk/kernel/execution/RexxActivationStack.cpp main/trunk/kernel/execution/RexxActivationStack.hpp main/trunk/kernel/execution/RexxCode.cpp main/trunk/kernel/execution/RexxCode.hpp main/trunk/kernel/execution/RexxLocalVariables.cpp main/trunk/kernel/execution/RexxLocalVariables.hpp main/trunk/kernel/execution/RexxNativeActivation.cpp main/trunk/kernel/execution/RexxNativeActivation.hpp main/trunk/kernel/execution/RexxNativeCode.cpp main/trunk/kernel/execution/RexxNativeCode.hpp main/trunk/kernel/execution/RexxVariable.cpp main/trunk/kernel/execution/RexxVariable.hpp main/trunk/kernel/execution/RexxVariableDictionary.cpp main/trunk/kernel/execution/RexxVariableDictionary.hpp main/trunk/kernel/execution/SecurityManager.cpp main/trunk/kernel/execution/SecurityManager.hpp Removed Paths: ------------- main/trunk/kernel/runtime/CPPCode.cpp main/trunk/kernel/runtime/CPPCode.hpp main/trunk/kernel/runtime/RexxActivation.cpp main/trunk/kernel/runtime/RexxActivation.hpp main/trunk/kernel/runtime/RexxActivationStack.cpp main/trunk/kernel/runtime/RexxActivationStack.hpp main/trunk/kernel/runtime/RexxCode.cpp main/trunk/kernel/runtime/RexxCode.hpp main/trunk/kernel/runtime/RexxLocalVariables.cpp main/trunk/kernel/runtime/RexxLocalVariables.hpp main/trunk/kernel/runtime/RexxNativeActivation.cpp main/trunk/kernel/runtime/RexxNativeActivation.hpp main/trunk/kernel/runtime/RexxNativeCode.cpp main/trunk/kernel/runtime/RexxNativeCode.hpp main/trunk/kernel/runtime/RexxVariable.cpp main/trunk/kernel/runtime/RexxVariable.hpp main/trunk/kernel/runtime/RexxVariableDictionary.cpp main/trunk/kernel/runtime/RexxVariableDictionary.hpp main/trunk/kernel/runtime/SecurityManager.cpp main/trunk/kernel/runtime/SecurityManager.hpp Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-10 02:08:40 UTC (rev 2919) +++ main/trunk/Makefile.am 2008-08-10 02:35:38 UTC (rev 2920) @@ -74,6 +74,7 @@ build_expression_dir = $(build_kernel_dir)/expression build_concurrency_dir = $(build_kernel_dir)/concurrency build_behaviour_dir = $(build_kernel_dir)/behaviour +build_execution_dir = $(build_kernel_dir)/execution build_instructions_dir = $(build_kernel_dir)/instructions build_parser_dir = $(build_kernel_dir)/parser build_runtime_dir = $(build_kernel_dir)/runtime @@ -165,6 +166,16 @@ $(build_expression_dir)/ExpressionVariable.hpp \ $(build_expression_dir)/IndirectVariableReference.hpp \ $(build_expression_dir)/ExpressionLogical.hpp +executionHeaders = $(build_execution_dir)/CPPCode.hpp \ + $(build_execution_dir)/RexxActivation.hpp \ + $(build_execution_dir)/RexxActivationStack.hpp \ + $(build_execution_dir)/RexxCode.hpp \ + $(build_execution_dir)/RexxLocalVariables.hpp \ + $(build_execution_dir)/RexxNativeActivation.hpp \ + $(build_execution_dir)/RexxNativeCode.hpp \ + $(build_execution_dir)/RexxVariable.hpp \ + $(build_execution_dir)/RexxVariableDictionary.hpp \ + $(build_execution_dir)/SecurityManager.hpp behaviourHeaders = $(build_behaviour_dir)/ClassTypeCodes.h \ $(build_behaviour_dir)/PrimitiveBehaviourNames.h \ $(build_behaviour_dir)/RexxBehaviour.hpp @@ -239,8 +250,7 @@ $(build_common_platform_dir)/SysSemaphore.hpp \ $(build_common_platform_dir)/SysThread.hpp -runtimeHeaders = $(build_runtime_dir)/CPPCode.hpp \ - $(build_runtime_dir)/DeadObject.hpp \ +runtimeHeaders = $(build_runtime_dir)/DeadObject.hpp \ $(build_runtime_dir)/GlobalNames.h \ $(build_runtime_dir)/Interpreter.hpp \ $(build_runtime_dir)/InterpreterInstance.hpp \ @@ -253,10 +263,7 @@ $(build_runtime_dir)/PackageManager.hpp \ $(build_runtime_dir)/ProgramMetaData.hpp \ $(build_runtime_dir)/ProtectedObject.hpp \ - $(build_runtime_dir)/RexxActivation.hpp \ - $(build_runtime_dir)/RexxActivationStack.hpp \ $(build_runtime_dir)/RexxBuiltinFunctions.h \ - $(build_runtime_dir)/RexxCode.hpp \ $(build_runtime_dir)/RexxCollection.hpp \ $(build_runtime_dir)/RexxCompoundElement.hpp \ $(build_runtime_dir)/RexxCompoundTable.hpp \ @@ -268,15 +275,9 @@ $(build_runtime_dir)/RexxHashTable.hpp \ $(build_runtime_dir)/RexxInternalStack.hpp \ $(build_runtime_dir)/RexxListTable.hpp \ - $(build_runtime_dir)/RexxLocalVariables.hpp \ $(build_runtime_dir)/RexxMemory.hpp \ $(build_runtime_dir)/RexxMisc.hpp \ - $(build_runtime_dir)/RexxNativeActivation.hpp \ - $(build_runtime_dir)/RexxNativeCode.hpp \ $(build_runtime_dir)/RexxSmartBuffer.hpp \ - $(build_runtime_dir)/RexxVariable.hpp \ - $(build_runtime_dir)/RexxVariableDictionary.hpp \ - $(build_runtime_dir)/SecurityManager.hpp \ $(build_runtime_dir)/TranslateDispatcher.hpp streamlibraryHeaders = $(build_streamlibrary_dir)/StreamCommandParser.h \ $(build_streamlibrary_dir)/StreamNative.hpp @@ -465,6 +466,16 @@ $(build_classes_dir)/SupplierClass.cpp \ $(build_classes_dir)/TableClass.cpp \ $(build_classes_dir)/WeakReferenceClass.cpp +execution_sources = $(build_execution_dir)/CPPCode.cpp \ + $(build_execution_dir)/RexxActivation.cpp \ + $(build_execution_dir)/RexxActivationStack.cpp \ + $(build_execution_dir)/RexxCode.cpp \ + $(build_execution_dir)/RexxLocalVariables.cpp \ + $(build_execution_dir)/RexxNativeActivation.cpp \ + $(build_execution_dir)/RexxNativeCode.cpp \ + $(build_execution_dir)/RexxVariable.cpp \ + $(build_execution_dir)/RexxVariableDictionary.cpp \ + $(build_execution_dir)/SecurityManager.cpp behaviour_sources = $(build_behaviour_dir)/PrimitiveBehaviours.cpp \ $(build_behaviour_dir)/RexxBehaviour.cpp \ $(build_behaviour_dir)/VirtualFunctionTable.cpp @@ -597,6 +608,7 @@ librexx_la_SOURCES = $(classes_sources) \ $(kernel_api_sources) \ $(behaviour_sources) \ + $(execution_sources) \ $(concurrency_sources) \ $(expression_sources) \ $(instructions_sources) \ @@ -621,6 +633,7 @@ -I$(build_common_platform_dir) \ -I$(build_kernel_dir) \ -I$(build_behaviour_dir) \ + -I$(build_execution_dir) \ -I$(build_concurrency_dir) \ -I$(build_expression_dir) \ -I$(build_instructions_dir) \ Copied: main/trunk/kernel/execution/CPPCode.cpp (from rev 2917, main/trunk/kernel/runtime/CPPCode.cpp) =================================================================== --- main/trunk/kernel/execution/CPPCode.cpp (rev 0) +++ main/trunk/kernel/execution/CPPCode.cpp 2008-08-10 02:35:38 UTC (rev 2920) @@ -0,0 +1,943 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "RexxCore.h" +#include "CPPCode.hpp" +#include "ActivityManager.hpp" +#include "ProtectedObject.hpp" +#include "Interpreter.hpp" + + +/** + * Allocate a new CPP code object. + * + * @param size the allocation size. + * + * @return A pointer to the newly allocated object. + */ +void *CPPCode::operator new(size_t size) +{ + // just allocate ane return + return new_object(size, T_CPPCode); +} + + +/** + * Constructor for a CPPCode object. + * + * @param index The index of the method used to restore unflattened internal method. + * @param entry The entry point address. + * @param argcount The number of arguments this method expects. + */ +CPPCode::CPPCode(size_t index, PCPPM entry, size_t argcount) +{ + methodIndex = (uint16_t)index; + cppEntry = entry; + argumentCount = (uint16_t)argcount; +} + + +void CPPCode::liveGeneral(int reason) +/******************************************************************************/ +/* Function: Generalized object marking */ +/******************************************************************************/ +{ + if (reason == RESTORINGIMAGE) /* restoring the image? */ + { + this->cppEntry = exportedMethods[this->methodIndex]; + } +} + + +RexxObject *CPPCode::unflatten(RexxEnvelope *envelope) +/******************************************************************************/ +/* Function: unflatten an object */ +/******************************************************************************/ +{ + this->cppEntry = exportedMethods[this->methodIndex]; + return (RexxObject *)this; +} + + +/** + * Run (or call) a CPPMethod. + * + * @param activity The activity we're running under. + * @param method The method to run. + * @param receiver The receiver object. + * @param messageName + * The name used to invoke the message. + * @param argPtr The actual arguments. + * @param count The argument count. + * @param result The returned result. + */ +void CPPCode::run(RexxActivity *activity, RexxMethod *method, RexxObject *receiver, RexxString *messageName, + RexxObject **argPtr, size_t count, ProtectedObject &result) +{ + PCPPM methodEntry = this->cppEntry; /* get the entry point */ + /* expecting an array? */ + /* expecting a pointer/count pair? */ + if (this->argumentCount == A_COUNT) + { + /* we can pass this right on */ + result = (receiver->*((PCPPMC1)methodEntry))(argPtr, count); + } + else + { + if (count > argumentCount) + { + reportException(Error_Incorrect_method_maxarg, this->argumentCount); + } + // This is the temporary list of arguments + RexxObject * argument_list[7]; + if (count < argumentCount) /* need to pad these out? */ + { + // null out the argument list + memset(argument_list, 0, sizeof(argument_list)); + // and copy over the provided argument pointers + memcpy(argument_list, argPtr, count * sizeof(RexxObject *)); + // now switch the argument pointer to the temporary + argPtr = &argument_list[0]; + } + // now we make the actual call + switch (argumentCount) + { + case 0: /* zero */ + result = (receiver->*((PCPPM0)methodEntry))(); + break; + + case 1: + result = (receiver->*((PCPPM1)methodEntry))(argPtr[0]); + break; + + case 2: + result = (receiver->*((PCPPM2)methodEntry))(argPtr[0], argPtr[1]); + break; + + case 3: + result = (receiver->*((PCPPM3)methodEntry))(argPtr[0], argPtr[1], argPtr[2]); + break; + + case 4: + result = (receiver->*((PCPPM4)methodEntry))(argPtr[0], argPtr[1], argPtr[2], argPtr[3]); + break; + + case 5: + result = (receiver->*((PCPPM5)methodEntry))(argPtr[0], argPtr[1], argPtr[2], + argPtr[3], argPtr[4]); + break; + + case 6: + result = (receiver->*((PCPPM6)methodEntry))(argPtr[0], argPtr[1], argPtr[2], + argPtr[3], argPtr[4], argPtr[5]); + break; + + case 7: + result = (receiver->*((PCPPM7)methodEntry))(argPtr[0], argPtr[1], argPtr[2], + argPtr[3], argPtr[4], argPtr[5], argPtr[6]); + break; + } + } +} + + +/** + * Allocate a new attribute getter code object. + * + * @param size the allocation size. + * + * @return A pointer to the newly allocated object. + */ +void *AttributeGetterCode::operator new(size_t size) +{ + // just allocate ane return + return new_object(size, T_AttributeGetterCode); +} + +void AttributeGetterCode::live(size_t liveMark) +/******************************************************************************/ +/* Function: Normal garbage collection live marking */ +/******************************************************************************/ +{ + memory_mark(this->attribute); +} + +void AttributeGetterCode::liveGeneral(int reason) +/******************************************************************************/ +/* Function: Generalized object marking */ +/******************************************************************************/ +{ + memory_mark_general(this->attribute); +} + +void AttributeGetterCode::flatten(RexxEnvelope *envelope) +/******************************************************************************/ +/* Function: Flatten an object */ +/******************************************************************************/ +{ + setUpFlatten(AttributeGetterCode) + + flatten_reference(newThis->attribute, envelope); + + cleanUpFlatten +} + + +/** + * Execute an attribute-get operation. + * + * @param activity The current activity. + * @param method The method we're invoking. + * @param receiver The receiver object. + * @param messageName + * The name of the message used to invoke the method. + * @param argPtr The pointer to the arguments. + * @param count The argument count. + * @param result The returned result. + */ +void AttributeGetterCode::run(RexxActivity *activity, RexxMethod *method, RexxObject *receiver, RexxString *messageName, + RexxObject **argPtr, size_t count, ProtectedObject &result) +{ + // validate the number of arguments + if (count > 0) + { + reportException(Error_Incorrect_method_maxarg, (wholenumber_t)0); + } + result = attribute->getValue(receiver->getObjectVariables(method->getScope())); +} + + +/** + * Allocate a new attribute setter code object. + * + * @param size the allocation size. + * + * @return A pointer to the newly allocated object. + */ +void *AttributeSetterCode::operator new(size_t size) +{ + // just allocate ane return + return new_object(size, T_AttributeGetterCode); +} + + +/** + * Execute an attribute-set operation. + * + * @param activity The current activity. + * @param method The method we're invoking. + * @param receiver The receiver object. + * @param messageName + * The name of the message used to invoke the method. + * @param argPtr The pointer to the arguments. + * @param count The argument count. + * @param result The returned result. + */ +void AttributeSetterCode::run(RexxActivity *activity, RexxMethod *method, RexxObject *receiver, RexxString *messageName, + RexxObject **argPtr, size_t count, ProtectedObject &result) +{ + // validate the number of arguments + if (count > 1) + { + reportException(Error_Incorrect_method_maxarg, 1); + } + + if (count == 0 || *argPtr == OREF_NULL) + { + missingArgument(1); + } + // go set the attribue + attribute->set(receiver->getObjectVariables(method->getScope()), argPtr[0]); +} + + +/** + * Allocate a new constant getter code object. + * + * @param size the allocation size. + * + * @return A pointer to the newly allocated object. + */ +void *ConstantGetterCode::operator new(size_t size) +{ + // just allocate ane return + return new_object(size, T_AttributeGetterCode); +} + + +void ConstantGetterCode::live(size_t liveMark) +/******************************************************************************/ +/* Function: Normal garbage collection live marking */ +/******************************************************************************/ +{ + memory_mark(this->constantValue); +} + +void ConstantGetterCode::liveGeneral(int reason) +/******************************************************************************/ +/* Function: Generalized object marking */ +/******************************************************************************/ +{ + memory_mark_general(this->constantValue); +} + +void ConstantGetterCode::flatten(RexxEnvelope *envelope) +/******************************************************************************/ +/* Function: Flatten an object */ +/******************************************************************************/ +{ + setUpFlatten(ConstantGetterCode) + + flatten_reference(newThis->constantValue, envelope); + + cleanUpFlatten +} + + +/** + * Execute a constant get operation + * + * @param activity The current activity. + * @param method The method we're invoking. + * @param receiver The receiver object. + * @param messageName + * The name of the message used to invoke the method. + * @param argPtr The pointer to the arguments. + * @param count The argument count. + * @param result The returned result. + */ +void ConstantGetterCode::run(RexxActivity *activity, RexxMethod *method, RexxObject *receiver, RexxString *messageName, + RexxObject **argPtr, size_t count, ProtectedObject &result) +{ + // validate the number of arguments + if (count > 0) + { + reportException(Error_Incorrect_method_maxarg, (wholenumber_t)0); + } + result = constantValue; +} + + +/** + * Allocate a new abstract code object. + * + * @param size the allocation size. + * + * @return A pointer to the newly allocated object. + */ +void *AbstractCode::operator new(size_t size) +{ + // just allocate ane return + return new_object(size, T_AbstractCode); +} + + +/** + * Execute a constant get operation + * + * @param activity The current activity. + * @param method The method we're invoking. + * @param receiver The receiver object. + * @param messageName + * The name of the message used to invoke the method. + * @param argPtr The pointer to the arguments. + * @param count The argument count. + * @param result The returned result. + */ +void AbstractCode::run(RexxActivity *activity, RexxMethod *method, RexxObject *receiver, RexxString *messageName, + RexxObject **argPtr, size_t count, ProtectedObject &result) +{ + reportException(Error_Incorrect_method_abstract, messageName); +} + + +#include "RexxCore.h" +#include "TableClass.hpp" +#include "RexxMemory.hpp" +#include "RexxBehaviour.hpp" +#include "ClassClass.hpp" +#include "NumberStringClass.hpp" +#include "IntegerClass.hpp" +#include "StringClass.hpp" +#include "MutableBufferClass.hpp" +#include "ArrayClass.hpp" +#include "DirectoryClass.hpp" +#include "RelationClass.hpp" +#include "ListClass.hpp" +#include "QueueClass.hpp" +#include "SupplierClass.hpp" +#include "MethodClass.hpp" +#include "RoutineClass.hpp" +#include "PackageClass.hpp" +#include "RexxEnvelope.hpp" +#include "MessageClass.hpp" +#include "StemClass.hpp" +#include "RexxMisc.hpp" +#include "RexxNativeCode.hpp" +#include "RexxActivity.hpp" +#include "ActivityManager.hpp" +#include "RexxNativeActivation.hpp" +#include "RexxVariableDictionary.hpp" +#include "ExpressionVariable.hpp" +#include "RexxLocalVariables.hpp" +#include "ProtectedObject.hpp" +#include "PointerClass.hpp" +#include "BufferClass.hpp" +#include "WeakReferenceClass.hpp" +#include "ContextClass.hpp" + +PCPPM CPPCode::exportedMethods[] = /* start of exported methods table */ +{ +CPPM(RexxObject::objectName), +CPPM(RexxObject::objectNameEquals), +CPPM(RexxObject::run), +CPPM(RexxObject::stringRexx), +CPPM(RexxObject::notEqual), +CPPM(RexxObject::setMethod), +CPPM(RexxObject::hasMethodRexx), +CPPM(RexxObject::start), +CPPM(RexxObject::unsetMethod), +CPPM(RexxObject::requestRexx), +CPPM(RexxObject::makeStringRexx), +CPPM(RexxObject::makeArrayRexx), +CPPM(RexxInternalObject::hasUninit), +CPPM(RexxObject::classObject), +CPPM(RexxObject::equal), +CPPM(RexxObject::strictEqual), +CPPM(RexxObject::hashCode), +CPPM(RexxObject::init), +CPPM(RexxObject::strictNotEqual), +CPPM(RexxObject::copyRexx), +CPPM(RexxObject::defaultNameRexx), +CPPM(RexxObject::unknownRexx), +CPPM(RexxObject::isInstanceOfRexx), +CPPM(RexxObject::instanceMethodRexx), +CPPM(RexxObject::instanceMethodsRexx), +CPPM(RexxObject::identityHashRexx), +CPPM(RexxObject::concatRexx), +CPPM(RexxObject::concatBlank), + +CPPM(RexxObject::newRexx), + +CPPM(RexxClass::setRexxDefined), /* Class methods */ +CPPM(RexxClass::defaultNameRexx), +CPPM(RexxClass::queryMixinClass), +CPPM(RexxClass::getId), +CPPM(RexxClass::getBaseClass), +CPPM(RexxClass::getMetaClass), +CPPM(RexxClass::getSuperClasses), +CPPM(RexxClass::getSuperClass), +CPPM(RexxClass::getSubClasses), +CPPM(RexxClass::defmeths), +CPPM(RexxClass::defineMethod), +CPPM(RexxClass::defineMethods), +CPPM(RexxClass::deleteMethod), +CPPM(RexxClass::method), +CPPM(RexxClass::methods), +CPPM(RexxClass::inherit), +CPPM(RexxClass::uninherit), +CPPM(RexxClass::enhanced), +CPPM(RexxClass::mixinclass), +CPPM(RexxClass::subclass), +CPPM(RexxClass::equal), +CPPM(RexxClass::strictEqual), +CPPM(RexxClass::notEqual), +CPPM(RexxClass::isSubclassOf), + +CPPM(RexxClass::newRexx), + +CPPM(RexxArray::sizeRexx), /* Array methods */ +CPPM(RexxArray::items), +CPPM(RexxArray::dimension), +CPPM(RexxArray::supplier), +CPPM(RexxArray::getRexx), +CPPM(RexxArray::putRexx), +CPPM(RexxArray::hasIndexRexx), +CPPM(RexxArray::sectionRexx), +CPPM(RexxArray::removeRexx), +CPPM(RexxArray::firstRexx), +CPPM(RexxArray::lastRexx), +CPPM(RexxArray::nextRexx), +CPPM(RexxArray::previousRexx), +CPPM(RexxArray::appendRexx), +CPPM(RexxArray::allIndexes), +CPPM(RexxArray::allItems), +CPPM(RexxArray::empty), +CPPM(RexxArray::isEmpty), +CPPM(RexxArray::index), +CPPM(RexxArray::hasItem), +CPPM(RexxArray::removeItem), +CPPM(RexxArray::toString), +CPPM(RexxArray::sortRexx), +CPPM(RexxArray::stableSortRexx), +CPPM(RexxArray::sortWithRexx), +CPPM(RexxArray::stableSortWithRexx), + +CPPM(RexxArray::newRexx), +CPPM(RexxArray::makeString), +CPPM(RexxArray::of), + +CPPM(RexxDirectory::atRexx), /* Directory methods */ +CPPM(RexxDirectory::put), +CPPM(RexxDirectory::entryRexx), +CPPM(RexxDirectory::hasEntry), +CPPM(RexxDirectory::hasIndex), +CPPM(RexxDirectory::itemsRexx), +CPPM(RexxHashTableCollection::merge), +CPPM(RexxDirectory::remove), +CPPM(RexxDirectory::setEntry), +CPPM(RexxDirectory::setMethod), +CPPM(RexxDirectory::supplier), +CPPM(RexxDirectory::allIndexes), +CPPM(RexxDirectory::allItems), +CPPM(RexxDirectory::empty), +CPPM(RexxDirectory::isEmpty), +CPPM(RexxDirectory::indexRexx), +CPPM(RexxDirectory::hasItem), +CPPM(RexxDirectory::removeItem), + +CPPM(RexxDirectory::newRexx), + +CPPM(RexxInteger::plus), /* Integer methods */ +CPPM(RexxInteger::minus), +CPPM(RexxInteger::multiply), +CPPM(RexxInteger::divide), +CPPM(RexxInteger::integerDivide), +CPPM(RexxInteger::remainder), +CPPM(RexxInteger::power), +CPPM(RexxInteger::notOp), +CPPM(RexxInteger::andOp), +CPPM(RexxInteger::orOp), +CPPM(RexxInteger::xorOp), +CPPM(RexxInteger::equal), +CPPM(RexxInteger::notEqual), +CPPM(RexxInteger::strictEqual), +CPPM(RexxInteger::hashCode), +CPPM(RexxInteger::strictNotEqual), +CPPM(RexxInteger::isGreaterThan), +CPPM(RexxInteger::isLessThan), +CPPM(RexxInteger::isGreaterOrEqual), +CPPM(RexxInteger::isLessOrEqual), +CPPM(RexxInteger::strictGreaterThan), +CPPM(RexxInteger::strictLessThan), +CPPM(RexxInteger::strictGreaterOrEqual), +CPPM(RexxInteger::strictLessOrEqual), +CPPM(RexxInteger::abs), +CPPM(RexxInteger::sign), +CPPM(RexxInteger::Max), +CPPM(RexxInteger::Min), +CPPM(RexxInteger::d2x), +CPPM(RexxInteger::d2c), +CPPM(RexxInteger::format), +CPPM(RexxInteger::trunc), + +CPPM(RexxList::value), /* list methods */ +CPPM(RexxList::remove), +CPPM(RexxList::firstRexx), +CPPM(RexxList::lastRexx), +CPPM(RexxList::next), +CPPM(RexxList::previous), +CPPM(RexxList::hasIndex), +CPPM(RexxList::supplier), +CPPM(RexxList::itemsRexx), +CPPM(RexxList::put), +CPPM(RexxList::section), +CPPM(RexxList::firstItem), +CPPM(RexxList::lastItem), +CPPM(RexxList::insertRexx), +CPPM(RexxList::append), +CPPM(RexxList::allIndexes), +CPPM(RexxList::allItems), +CPPM(RexxList::empty), +CPPM(RexxList::isEmpty), +CPPM(RexxList::index), +CPPM(RexxList::hasItem), +CPPM(RexxList::removeItem), + +CPPM(RexxList::newRexx), +CPPM(RexxList::classOf), + +CPPM(RexxMessage::notify), /* Message methods */ +CPPM(RexxMessage::result), +CPPM(RexxMessage::send), +CPPM(RexxMessage::start), +CPPM(RexxMessage::completed), +CPPM(RexxMessage::hasError), +CPPM(RexxMessage::errorCondition), +CPPM(RexxMessage::messageTarget), +CPPM(RexxMessage::messageName), +CPPM(RexxMessage::arguments), + +CPPM(RexxMessage::newRexx), + +CPPM(RexxMethod::setUnguardedRexx), /* Method methods */ +CPPM(RexxMethod::setGuardedRexx), +CPPM(BaseExecutable::source), +CPPM(BaseExecutable::getPackage), +CPPM(RexxMethod::setPrivateRexx), +CPPM(RexxMethod::setProtectedRexx), +CPPM(RexxMethod::setSecurityManager), +CPPM(RexxMethod::isGuardedRexx), +CPPM(RexxMethod::isPrivateRexx), +CPPM(RexxMethod::isProtectedRexx), + +CPPM(RexxMethod::newFileRexx), +CPPM(RexxMethod::newRexx), + +CPPM(RoutineClass::setSecurityManager), +CPPM(RoutineClass::callRexx), +CPPM(RoutineClass::callWithRexx), + +CPPM(RoutineClass::newFileRexx), +CPPM(RoutineClass::newRexx), + +CPPM(PackageClass::setSecurityManager), +CPPM(PackageClass::getSource), +CPPM(PackageClass::getSourceLineRexx), +CPPM(PackageClass::getSourceSize), +CPPM(PackageClass::getClasses), +CPPM(PackageClass::getPublicClasses), +CPPM(PackageClass::getImportedClasses), +CPPM(PackageClass::getMethods), +CPPM(PackageClass::getRoutines), +CPPM(PackageClass::getPublicRoutines), +CPPM(PackageClass::getImportedPackages), +CPPM(PackageClass::loadPackage), +CPPM(PackageClass::addPackage), +CPPM(PackageClass::findClass), +CPPM(PackageClass::findRoutine), +CPPM(PackageClass::addRoutine), +CPPM(PackageClass::addPublicRoutine), +CPPM(PackageClass::addClass), +CPPM(PackageClass::addPublicClass), +CPPM(PackageClass::getName), + +CPPM(PackageClass::newRexx), + +CPPM(RexxNumberString::formatRexx), /* NumberString methods */ +CPPM(RexxNumberString::trunc), +CPPM(RexxNumberString::equal), +CPPM(RexxNumberString::notEqual), +CPPM(RexxNumberString::isLessThan), +CPPM(RexxNumberString::isGreaterThan), +CPPM(RexxNumberString::isGreaterOrEqual), +CPPM(RexxNumberString::isLessOrEqual), +CPPM(RexxNumberString::strictNotEqual), +CPPM(RexxNumberString::strictLessThan), +CPPM(RexxNumberString::strictGreaterThan), +CPPM(RexxNumberString::strictGreaterOrEqual), +CPPM(RexxNumberString::strictLessOrEqual), +CPPM(RexxNumberString::plus), +CPPM(RexxNumberString::minus), +CPPM(RexxNumberString::multiply), +CPPM(RexxNumberString::divide), +CPPM(RexxNumberString::integerDivide), +CPPM(RexxNumberString::remainder), +CPPM(RexxNumberString::power), +CPPM(RexxNumberString::abs), +CPPM(RexxNumberString::Sign), +CPPM(RexxNumberString::notOp), +CPPM(RexxNumberString::andOp), +CPPM(RexxNumberString::orOp), +CPPM(RexxNumberString::xorOp), +CPPM(RexxNumberString::Max), +CPPM(RexxNumberString::Min), +CPPM(RexxNumberString::isInteger), +CPPM(RexxNumberString::d2c), +CPPM(RexxNumberString::d2x), +CPPM(RexxNumberString::d2xD2c), +CPPM(RexxNumberString::strictEqual), +CPPM(RexxNumberString::hashCode), + +CPPM(RexxQueue::supplier), /* Queue methods */ +CPPM(RexxQueue::pushRexx), +CPPM(RexxQueue::queueRexx), +CPPM(RexxQueue::pullRexx), +CPPM(RexxQueue::peek), +CPPM(RexxQueue::put), +CPPM(RexxQueue::at), +CPPM(RexxQueue::hasindex), +CPPM(RexxQueue::remove), +CPPM(RexxQueue::append), +CPPM(RexxQueue::allIndexes), +CPPM(RexxQueue::index), +CPPM(RexxQueue::firstRexx), +CPPM(RexxQueue::lastRexx), +CPPM(RexxQueue::next), +CPPM(RexxQueue::previous), +CPPM(RexxQueue::insert), + +CPPM(RexxQueue::newRexx), +CPPM(RexxQueue::ofRexx), + +CPPM(RexxStem::bracket), /* Stem methods */ +CPPM(RexxStem::bracketEqual), +CPPM(RexxStem::request), +CPPM(RexxStem::supplier), +CPPM(RexxStem::allIndexes), +CPPM(RexxStem::allItems), +CPPM(RexxStem::empty), +CPPM(RexxStem::isEmpty), +CPPM(RexxStem::itemsRexx), +CPPM(RexxStem::hasIndex), +CPPM(RexxStem::remove), +CPPM(RexxStem::index), +CPPM(RexxStem::hasItem), +CPPM(RexxStem::removeItem), + +CPPM(RexxStem::newRexx), + +CPPM(RexxString::lengthRexx), /* String methods */ +CPPM(RexxString::concatRexx), +CPPM(RexxString::concatBlank), +CPPM(RexxString::concatWith), +CPPM(RexxString::equal), +CPPM(RexxString::notEqual), +CPPM(RexxString::isLessThan), +CPPM(RexxString::isGreaterThan), +CPPM(RexxString::isGreaterOrEqual), +CPPM(RexxString::isLessOrEqual), +CPPM(RexxString::strictEqual), +CPPM(RexxString::strictNotEqual), +CPPM(RexxString::strictLessThan), +CPPM(RexxString::strictGreaterThan), +CPPM(RexxString::strictGreaterOrEqual), +CPPM(RexxString::strictLessOrEqual), +CPPM(RexxString::plus), +CPPM(RexxString::minus), +CPPM(RexxString::multiply), +CPPM(RexxString::divide), +CPPM(RexxString::integerDivide), +CPPM(RexxString::remainder), +CPPM(RexxString::power), +CPPM(RexxString::abs), +CPPM(RexxString::sign), +CPPM(RexxString::notOp), +CPPM(RexxString::andOp), +CPPM(RexxString::orOp), +CPPM(RexxString::xorOp), +CPPM(RexxString::Max), +CPPM(RexxString::Min), +CPPM(RexxString::isInteger), +CPPM(RexxString::upperRexx), +CPPM(RexxString::lowerRexx), + + /* All BIF methods start here. They */ + /* will be arranged according to the*/ + /* they are defined in. */ + + /* following methods are in OKBSUBS */ +CPPM(RexxString::center), +CPPM(RexxString::delstr), +CPPM(RexxString::insert), +CPPM(RexxString::left), +CPPM(RexxString::overlay), +CPPM(RexxString::reverse), +CPPM(RexxString::right), +CPPM(RexxString::strip), +CPPM(RexxString::substr), +CPPM(RexxString::subchar), + + /* following methods are in OKBWORD */ +CPPM(RexxString::delWord), +CPPM(RexxString::space), +CPPM(RexxString::subWord), +CPPM(RexxString::word), +CPPM(RexxString::wordIndex), +CPPM(RexxString::wordLength), +CPPM(RexxString::wordPos), +CPPM(RexxString::caselessWordPos), +CPPM(RexxString::words), + + /* following methods are in OKBMISC */ + +CPPM(RexxString::changeStr), +CPPM(RexxString::caselessChangeStr), +CPPM(RexxString::countStrRexx), +CPPM(RexxString::caselessCountStrRexx), +CPPM(RexxString::abbrev), +CPPM(RexxString::caselessAbbrev), +CPPM(RexxString::compare), +CPPM(RexxString::caselessCompare), +CPPM(RexxString::copies), +CPPM(RexxString::dataType), +CPPM(RexxString::lastPosRexx), +CPPM(RexxString::posRexx), +CPPM(RexxString::caselessLastPosRexx), +CPPM(RexxString::caselessPosRexx), +CPPM(RexxString::translate), +CPPM(RexxString::verify), + + /* following methods are in OKBBITS */ +CPPM(RexxString::bitAnd), +CPPM(RexxString::bitOr), +CPPM(RexxString::bitXor), + + /* following methods are in OKBCONV */ + +CPPM(RexxString::b2x), +CPPM(RexxString::c2d), +CPPM(RexxString::c2x), +CPPM(RexxString::d2c), +CPPM(RexxString::d2x), +CPPM(RexxString::x2b), +CPPM(RexxString::x2c), +CPPM(RexxString::x2d), +CPPM(RexxString::format), +CPPM(RexxString::trunc), +CPPM(RexxString::x2dC2d), +CPPM(RexxString::encodeBase64), +CPPM(RexxString::decodeBase64), + +CPPM(RexxString::match), +CPPM(RexxString::caselessMatch), +CPPM(RexxString::matchChar), +CPPM(RexxString::caselessMatchChar), +CPPM(RexxString::equals), +CPPM(RexxString::caselessEquals), +CPPM(RexxString::compareToRexx), +CPPM(RexxString::caselessCompareToRexx), + /* End of BIF methods */ +CPPM(RexxString::makeArray), + +CPPM(RexxString::newRexx), +CPPM(RexxMutableBufferClass::newRexx), +CPPM(RexxMutableBuffer::lengthRexx), +CPPM(RexxMutableBuffer::makearray), +CPPM(RexxMutableBuffer::append), +CPPM(RexxMutableBuffer::insert), +CPPM(RexxMutableBuffer::overlay), +CPPM(RexxMutableBuffer::mydelete), +CPPM(RexxMutableBuffer::substr), +CPPM(RexxMutableBuffer::subchar), +CPPM(RexxMutableBuffer::posRexx), +CPPM(RexxMutableBuffer::lastPos), +CPPM(RexxMutableBuffer::getBufferSize), +CPPM(RexxMutableBuffer::setBufferSize), + +CPPM(RexxSupplier::available), /* Supplier methods */ +CPPM(RexxSupplier::next), +CPPM(RexxSupplier::value), +CPPM(RexxSupplier::index), +CPPM(RexxSupplier::initRexx), + +CPPM(RexxSupplierClass::newRexx), + + /* Table methods */ +CPPM(RexxHashTableCollection::removeRexx), +CPPM(RexxHashTableCollection::getRexx), +CPPM(RexxHashTableCollection::put), +CPPM(RexxHashTableCollection::add), +CPPM(RexxHashTableCollection::allAt), +CPPM(RexxHashTableCollection::hasIndex), +CPPM(RexxHashTableCollection::merge), +CPPM(RexxHashTableCollection::supplier), +CPPM(RexxHashTableCollection::allItems), +CPPM(RexxHashTableCollection::allIndexes), +CPPM(RexxHashTableCollection::empty), +CPPM(RexxHashTableCollection::isEmpty), +CPPM(RexxHashTableCollection::indexRexx), +CPPM(RexxHashTableCollection::hasItem), +CPPM(RexxHashTableCollection::removeItem), + +CPPM(RexxTable::itemsRexx), +CPPM(RexxTable::newRexx), + +CPPM(RexxRelation::put), /* Relation methods */ +CPPM(RexxRelation::removeItemRexx), +CPPM(RexxRelation::allIndex), +CPPM(RexxRelation::itemsRexx), +CPPM(RexxRelation::supplier), +CPPM(RexxRelation::hasItem), + +CPPM(RexxRelation::newRexx), + +CPPM(RexxLocal::local), /* the .local environment methods */ + +CPPM(RexxPointer::equal), +CPPM(RexxPointer::notEqual), +CPPM(RexxPointer::newRexx), + +CPPM(RexxBuffer::newRexx), + +CPPM(WeakReference::newRexx), +CPPM(WeakReference::value), + +CPPM(RexxContext::newRexx), +CPPM(RexxContext::copyRexx), +CPPM(RexxContext::getPackage), +CPPM(RexxContext::getDigits), +CPPM(RexxContext::getFuzz), +CPPM(RexxContext::getForm), +CPPM(RexxContext::getVariables), +CPPM(RexxContext::getExecutable), +CPPM(RexxContext::getArgs), +CPPM(RexxContext::getCondition), +NULL /* final terminating method */ +}; + + +/** + * Resolve the entry point of a CPP method into a CPPCode wrapper + * for that method. + * + * @param name The name of the method (used for error reporting) + * @param targetMethod + * The method to wrapper + * @param argumentCount + * The argument descriptor. + * + * @return A CPPCode object for the wrappered method. + */ +CPPCode *CPPCode::resolveExportedMethod(const char *name, PCPPM targetMethod, size_t argumentCount) +{ + for (size_t i = 0; exportedMethods[i] != NULL; i++) + { + // found the one we need? Wrap a CPPCode object around it + if (exportedMethods[i] == targetMethod) + { + return new CPPCode(i, targetMethod, argumentCount); + } + } + + char buffer[256]; + sprintf(buffer,"Unresolved exported method: %s", name); + /* this is a bad error */ + Interpreter::logicError(buffer); + return NULL; /* needs a return value */ +} Copied: main/trunk/kernel/execution/CPPCode.hpp (from rev 2917, main/trunk/kernel/runtime/CPPCode.hpp) =================================================================== --- main/trunk/kernel/execution/CPPCode.hpp (rev 0) +++ main/trunk/kernel/execution/CPPCode.hpp 2008-08-10 02:35:38 UTC (rev 2920) @@ -0,0 +1,152 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef Included_CPPCode +#define Included_CPPCode + + +#include "MethodClass.hpp" + + +/** + * Class for a method-wrappered CPP internal method. + */ +class CPPCode : public BaseCode +{ +public: + void *operator new(size_t); + inline void *operator new(size_t size, void *ptr) { return ptr; }; + inline void operator delete(void *) { } + inline void operator delete(void *, void *) { } + CPPCode(size_t, PCPPM, size_t); + inline CPPCode(RESTORETYPE restoreType) { ; }; + void liveGeneral(int reason); + RexxObject *unflatten(RexxEnvelope *envelope); + + void run(RexxActivity *, RexxMethod *, RexxObject *, RexxString *, RexxObject **, size_t, ProtectedObject &); + + static CPPCode *resolveExportedMethod(const char *, PCPPM targetMethod, size_t argcount); + // The table of exported methods. + static PCPPM exportedMethods[]; + +protected: + uint16_t methodIndex; // kernel method number + uint16_t argumentCount; // argument count + PCPPM cppEntry; // C++ Method entry point. +}; + + +/** + * Class for an attribute getter method + */ +class AttributeGetterCode : public BaseCode +{ +public: + void *operator new(size_t); + inline void *operator new(size_t size, void *ptr) { return ptr; }; + inline void operator delete(void *) { } + inline void operator delete(void *, void *) { } + inline AttributeGetterCode(RexxVariableBase *a) { attribute = a; } + inline AttributeGetterCode(RESTORETYPE restoreType) { ; }; + void live(size_t); + void liveGeneral(int reason); + void flatten(RexxEnvelope*); + + void run(RexxActivity *, RexxMethod *, RexxObject *, RexxString *, RexxObject **, size_t, ProtectedObject &); + +protected: + RexxVariableBase *attribute; /* method attribute info */ +}; + + +/** + * Class for an attribute setter method. + */ +class AttributeSetterCode : public AttributeGetterCode +{ +public: + void *operator new(size_t); + inline void *operator new(size_t size, void *ptr) { return ptr; }; + inline void operator delete(void *) { } + inline void operator delete(void *, void *) { } + inline AttributeSetterCode(RexxVariableBase *a) : AttributeGetterCode(a) { } + inline AttributeSetterCode(RESTORETYPE restoreType) : AttributeGetterCode(restoreType) { } + + void run(RexxActivity *, RexxMethod *, RexxObject *, RexxString *, RexxObject **, size_t, ProtectedObject &); +}; + + +/** + * Class for a constant retriever method + */ +class ConstantGetterCode : public BaseCode +{ +public: + void *operator new(size_t); + inline void *operator new(size_t size, void *ptr) { return ptr; }; + inline void operator delete(void *) { } + inline void operator delete(void *, void *) { } + inline ConstantGetterCode(RexxObject * v) { constantValue = v; } + inline ConstantGetterCode(RESTORETYPE restoreType) { } + void live(size_t); + void liveGeneral(int reason); + void flatten(RexxEnvelope*); + + void run(RexxActivity *, RexxMethod *, RexxObject *, RexxString *, RexxObject **, size_t, ProtectedObject &); + +protected: + RexxObject *constantValue; // the returned constant value +}; + + +/** + * Class for a constant retriever method + */ +class AbstractCode : public BaseCode +{ +public: + void *operator new(size_t); + inline void *operator new(size_t size, void *ptr) { return ptr; }; + inline void operator delete(void *) { } + inline void operator delete(void *, void *) { } + inline AbstractCode() { } + inline AbstractCode(RESTORETYPE restoreType) { } + + void run(RexxActivity *, RexxMethod *, RexxObject *, RexxString *, RexxObject **, size_t, ProtectedObject &); +}; + +#endif Copied: main/trunk/kernel/execution/RexxActivation.cpp (from rev 2917, main/trunk/kernel/runtime/RexxActivation.cpp) =================================================================== --- main/trunk/kernel/execution/RexxActivation.cpp (rev 0) +++ main/trunk/kernel/execution/RexxActivation.cpp 2008-08-10 02:35:38 UTC (rev 2920) @@ -0,0 +1,4039 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/******************************************************************************/ +/* REXX Kernel RexxActivation.c */ +/* */ +/* Primitive Activation Class */ +/* */ +/* NOTE: activations are an execution time only object. They are never */ +/* flattened or saved in the image, and hence will never be in old */ +/* space. Because of this, activations "cheat" and do not use */ +/* OrefSet to assign values to get better performance. Care must be */ +/* used to maintain this situation. */ +/* */ +/******************************************************************************/ +/******************************************************************************/ +#include <ctype.h> +#include <string.h> +#include "RexxCore.h" +#include "StringClass.hpp" +#include "BufferClass.hpp" +#include "DirectoryClass.hpp" +#include "RexxVariableDictionary.hpp" +#include "RexxActivation.hpp" +#include "RexxActivity.hpp" +#include "MethodClass.hpp" +#include "MessageClass.hpp" +#include "RexxCode.hpp" +#include "SourceFile.hpp" +#include "RexxInstruction.hpp" +#include "CallInstruction.hpp" +#include "DoBlock.hpp" +#include "DoInstruction.hpp" +#include "ExpressionBaseVariable.hpp" +#include "ExpressionDotVariable.hpp" +#include "ExpressionVariable.hpp" +#include "ExpressionStem.hpp" +#include "ExpressionCompoundVariable.hpp" +#include "ProtectedObject.hpp" +#include "ActivityManager.hpp" +#include "Interpreter.hpp" +#include "SystemInterpreter.hpp" +#include "RexxInternalApis.h" +#include "PackageManager.hpp" +#include "RexxCompoundTail.hpp" + +/* max instructions without a yield */ +#define MAX_INSTRUCTIONS 100 + /* default template for a new */ + /* activation. This must be changed */ + /* whenever the settings definition */ + /* changes */ +static ActivationSettings activationSettingsTemplate; + +// randomization value added to random seeds +size_t RexxActivation::randomizer = 1; + + +void * RexxActivation::operator new(size_t size) +/******************************************************************************/ +/* Function: Create a new activation object */ +/******************************************************************************/ +{ + /* Get new object */ + RexxActivation *newObject = (RexxActivation *)new_object(size); + /* Give new object its behaviour */ + newObject->setBehaviour(TheActivationBehaviour); + return (RexxObject *)newObject; /* return the new object */ +} + + +/** + * Initialize an activation for direct caching in the activation + * cache. At this time, this is not an executable activation + */ +RexxActivation::RexxActivation() +{ + this->setHasNoReferences(); // nothing referenced from this either +} + + +/** + * Initialize an activation for a method invocation. + * + * @param _activity The activity we're running under. + * @param _method The method being invoked. + * @param _code The code to execute. + */ +RexxActivation::RexxActivation(RexxActivity* _activity, RexxMethod * _method, RexxCode *_code) +{ + this->clearObject(); /* start with a fresh object */ + this->activity = _activity; /* save the activity pointer */ + this->scope = _method->getScope(); // save the scope + this->code = _code; /* get the REXX method object */ + this->executable = _method; // save this as the base executable + this->settings.intermediate_trace = false; + this->activation_context = METHODCALL; // the context is a method call + this->parent = OREF_NULL; // we don't have a parent stack frame when invoked as a method + this->execution_state = ACTIVE; /* we are now in active execution */ + this->object_scope = SCOPE_RELEASED; /* scope not reserved yet */ + /* create a new evaluation stack. This must be done before a */ + /* local variable frame is created. */ + this->setHasNoReferences(); /* during allocateStack.. */ + /* a live marking can happen without */ + /* a properly set up stack (::live() */ + /* is called). Setting the NoRefBit */ + /* when creating the stack avoids it.*/ + _activity->allocateStackFrame(&this->stack, this->code->getMaxStackSize()); + this->setHasReferences(); + + // get initial settings template + // NOTE: Anything that alters information in the settings must happen AFTER + // this point. + this->settings = activationSettingsTemplate; + + if (_method->isGuarded()) // make sure we set the appropriate guarded state + { + setGuarded(); + } + /* save the source also */ + this->settings.parent_code = this->code; + + /* allocate a frame for the local variables from activity stack */ + settings.local_variables.init(this, code->getLocalVariableSize()); + this->activity->allocateLocalVariableFrame(&settings.local_variables); + /* set the initial and initial */ + /* alternate address settings */ + this->settings.current_env = SystemInterpreter::getDefaultAddressName(); + this->settings.alternate_env = this->settings.current_env; + /* get initial random seed value */ + this->random_seed = this->activity->getRandomSeed(); + /* copy the source security manager */ + this->settings.securityManager = this->code->getSecurityManager(); + if (this->settings.securityManager == OREF_NULL) + { + this->settings.securityManager = activity->getInstanceSecurityManager(); + } + // and the call type is METHOD + this->settings.calltype = OREF_METHODNAME; +} + + +/** + * Create a new Rexx activation for an internal level call. + * An internal level call is an internal call, a call trap, + * an Interpret statement, or a debug pause execution. + * + * @param _activity The current activity. + * @param _parent The parent activation. + * @param _code The code to be executed. For interpret and debug pauses, this + * is a new code object. For call activations, this is the + * parent code object. + * @param context The type of call being made. + */ +RexxActivation::RexxActivation(RexxActivity *_activity, RexxActivation *_parent, RexxCode *_code, int context) +{ + this->clearObject(); /* start with a fresh object */ + this->activity = _activity; /* save the activity pointer */ + this->code = _code; /* get the REXX method object */ + + if (context == DEBUGPAUSE) /* actually a debug pause? */ + { + this->debug_pause = true; /* set up for debugging intercepts */ + context = INTERPRET; /* this is really an interpret */ + } + this->activation_context = context; /* save the context */ + this->settings.intermediate_trace = false; + // the sender is our parent activity + this->parent = _parent; + this->execution_state = ACTIVE; /* we are now in active execution */ + this->object_scope = SCOPE_RELEASED; /* scope not reserved yet */ + /* create a new evaluation stack. This must be done before a */ + /* local variable frame is created. */ + this->setHasNoReferences(); /* during allocateStack.. */ + /* a live marking can happen without */ + /* a properly set up stack (::live() */ + /* is called). Setting the NoRefBit */ + /* when creating the stack avoids it.*/ + _activity->allocateStackFrame(&stack, code->getMaxStackSize()); + this->setHasReferences(); + // the random seed is copied from the calling activity, this led + // to reproducable random sequences even though no specific seed was given! + // see feat. 900 for example program. + adjustRandomSeed(); + /* inherit parents settings */ + _parent->putSettings(this->settings); + if (context == INTERNALCALL) /* internal call? */ + { + /* force a new copy of the traps */ + /* table to be created whenever it */ + /* is changed */ + this->settings.flags &= ~traps_copied; + this->settings.flags &= ~reply_issued; /* this is a new activation that can use its own return */ + /* invalidate the timestamp */ + this->settings.timestamp.valid = false; + } + /* this is a nested call until we issue a procedure */ + settings.local_variables.setNested(); + // get the executable from the parent. + this->executable = _parent->getExecutable(); +} + + +/** + * Create a top-level activation of Rexx code. This will + * either a toplevel program or an external call. + * + * @param _activity The current thread we're running on. + * @param _routine The routine to invoke. + * @param _code The code object to be executed. + * @param calltype Type type of call being made (function or subroutine) + * @param env The default address environment + * @param context The type of call context. + */ +RexxActivation::RexxActivation(RexxActivity *_activity, RoutineClass *_ro... [truncated message content] |
From: <bi...@us...> - 2008-08-10 11:54:26
|
Revision: 2926 http://oorexx.svn.sourceforge.net/oorexx/?rev=2926&view=rev Author: bigrixx Date: 2008-08-10 11:54:33 +0000 (Sun, 10 Aug 2008) Log Message: ----------- move memory files Modified Paths: -------------- main/trunk/Makefile.am main/trunk/kernel/kernel.mak main/trunk/orxdb.bat Added Paths: ----------- main/trunk/kernel/memory/DeadObject.cpp main/trunk/kernel/memory/DeadObject.hpp main/trunk/kernel/memory/MemorySegment.cpp main/trunk/kernel/memory/MemorySegment.hpp main/trunk/kernel/memory/MemoryStats.cpp main/trunk/kernel/memory/MemoryStats.hpp main/trunk/kernel/memory/ProtectedObject.cpp main/trunk/kernel/memory/ProtectedObject.hpp main/trunk/kernel/memory/RexxEnvelope.cpp main/trunk/kernel/memory/RexxEnvelope.hpp main/trunk/kernel/memory/RexxInternalStack.cpp main/trunk/kernel/memory/RexxInternalStack.hpp main/trunk/kernel/memory/RexxMemory.cpp main/trunk/kernel/memory/RexxMemory.hpp Removed Paths: ------------- main/trunk/kernel/runtime/DeadObject.cpp main/trunk/kernel/runtime/DeadObject.hpp main/trunk/kernel/runtime/MemorySegment.cpp main/trunk/kernel/runtime/MemorySegment.hpp main/trunk/kernel/runtime/MemoryStats.cpp main/trunk/kernel/runtime/MemoryStats.hpp main/trunk/kernel/runtime/ProtectedObject.cpp main/trunk/kernel/runtime/ProtectedObject.hpp main/trunk/kernel/runtime/RexxEnvelope.cpp main/trunk/kernel/runtime/RexxEnvelope.hpp main/trunk/kernel/runtime/RexxInternalStack.cpp main/trunk/kernel/runtime/RexxInternalStack.hpp main/trunk/kernel/runtime/RexxMemory.cpp main/trunk/kernel/runtime/RexxMemory.hpp Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-10 07:19:28 UTC (rev 2925) +++ main/trunk/Makefile.am 2008-08-10 11:54:33 UTC (rev 2926) @@ -75,6 +75,7 @@ build_concurrency_dir = $(build_kernel_dir)/concurrency build_behaviour_dir = $(build_kernel_dir)/behaviour build_execution_dir = $(build_kernel_dir)/execution +build_memory_dir = $(build_kernel_dir)/memory build_instructions_dir = $(build_kernel_dir)/instructions build_parser_dir = $(build_kernel_dir)/parser build_runtime_dir = $(build_kernel_dir)/runtime @@ -166,6 +167,13 @@ $(build_expression_dir)/ExpressionVariable.hpp \ $(build_expression_dir)/IndirectVariableReference.hpp \ $(build_expression_dir)/ExpressionLogical.hpp +memoryHeaders = $(build_memory_dir)/DeadObject.hpp \ + $(build_memory_dir)/MemorySegment.hpp \ + $(build_memory_dir)/MemoryStats.hpp \ + $(build_memory_dir)/ProtectedObject.hpp \ + $(build_memory_dir)/RexxEnvelope.hpp \ + $(build_memory_dir)/RexxInternalStack.hpp \ + $(build_memory_dir)/RexxMemory.hpp executionHeaders = $(build_execution_dir)/CPPCode.hpp \ $(build_execution_dir)/RexxActivation.hpp \ $(build_execution_dir)/RexxActivationStack.hpp \ @@ -250,19 +258,15 @@ $(build_common_platform_dir)/SysSemaphore.hpp \ $(build_common_platform_dir)/SysThread.hpp -runtimeHeaders = $(build_runtime_dir)/DeadObject.hpp \ - $(build_runtime_dir)/GlobalNames.h \ +runtimeHeaders = $(build_runtime_dir)/GlobalNames.h \ $(build_runtime_dir)/Interpreter.hpp \ $(build_runtime_dir)/InterpreterInstance.hpp \ $(build_runtime_dir)/LibraryPackage.hpp \ - $(build_runtime_dir)/MemorySegment.hpp \ - $(build_runtime_dir)/MemoryStats.hpp \ $(build_runtime_dir)/NativeFunctions.h \ $(build_runtime_dir)/NativeMethods.h \ $(build_runtime_dir)/Numerics.hpp \ $(build_runtime_dir)/PackageManager.hpp \ $(build_runtime_dir)/ProgramMetaData.hpp \ - $(build_runtime_dir)/ProtectedObject.hpp \ $(build_runtime_dir)/RexxBuiltinFunctions.h \ $(build_runtime_dir)/RexxCollection.hpp \ $(build_runtime_dir)/RexxCompoundElement.hpp \ @@ -271,11 +275,8 @@ $(build_runtime_dir)/RexxConstants.hpp \ $(build_runtime_dir)/RexxCore.h \ $(build_runtime_dir)/RexxDateTime.hpp \ - $(build_runtime_dir)/RexxEnvelope.hpp \ $(build_runtime_dir)/RexxHashTable.hpp \ - $(build_runtime_dir)/RexxInternalStack.hpp \ $(build_runtime_dir)/RexxListTable.hpp \ - $(build_runtime_dir)/RexxMemory.hpp \ $(build_runtime_dir)/RexxMisc.hpp \ $(build_runtime_dir)/RexxSmartBuffer.hpp \ $(build_runtime_dir)/TranslateDispatcher.hpp @@ -466,6 +467,13 @@ $(build_classes_dir)/SupplierClass.cpp \ $(build_classes_dir)/TableClass.cpp \ $(build_classes_dir)/WeakReferenceClass.cpp +memory_sources = $(build_memory_dir)/DeadObject.cpp \ + $(build_memory_dir)/MemorySegment.cpp \ + $(build_memory_dir)/MemoryStats.cpp \ + $(build_memory_dir)/ProtectedObject.cpp \ + $(build_memory_dir)/RexxEnvelope.cpp \ + $(build_memory_dir)/RexxInternalStack.cpp \ + $(build_memory_dir)/RexxMemory.cpp execution_sources = $(build_execution_dir)/CPPCode.cpp \ $(build_execution_dir)/RexxActivation.cpp \ $(build_execution_dir)/RexxActivationStack.cpp \ @@ -565,29 +573,22 @@ $(build_common_platform_dir)/SysLibrary.cpp \ $(build_common_platform_dir)/SysSemaphore.cpp \ $(build_common_platform_dir)/SysThread.cpp -runtime_sources = $(build_runtime_dir)/DeadObject.cpp \ - $(build_runtime_dir)/GlobalData.cpp \ +runtime_sources = $(build_runtime_dir)/GlobalData.cpp \ $(build_runtime_dir)/GlobalNames.cpp \ $(build_runtime_dir)/InternalPackage.cpp \ $(build_runtime_dir)/Interpreter.cpp \ $(build_runtime_dir)/InterpreterInstance.cpp \ $(build_runtime_dir)/LibraryPackage.cpp \ - $(build_runtime_dir)/MemorySegment.cpp \ - $(build_runtime_dir)/MemoryStats.cpp \ $(build_runtime_dir)/Numerics.cpp \ $(build_runtime_dir)/PackageManager.cpp \ $(build_runtime_dir)/ProgramMetaData.cpp \ - $(build_runtime_dir)/ProtectedObject.cpp \ $(build_runtime_dir)/RexxCollection.cpp \ $(build_runtime_dir)/RexxCompoundElement.cpp \ $(build_runtime_dir)/RexxCompoundTable.cpp \ $(build_runtime_dir)/RexxCompoundTail.cpp \ $(build_runtime_dir)/RexxDateTime.cpp \ - $(build_runtime_dir)/RexxEnvelope.cpp \ $(build_runtime_dir)/RexxHashTable.cpp \ - $(build_runtime_dir)/RexxInternalStack.cpp \ $(build_runtime_dir)/RexxListTable.cpp \ - $(build_runtime_dir)/RexxMemory.cpp \ $(build_runtime_dir)/RexxMisc.cpp \ $(build_runtime_dir)/RexxSmartBuffer.cpp \ $(build_runtime_dir)/Setup.cpp \ @@ -599,6 +600,7 @@ $(kernel_api_sources) \ $(behaviour_sources) \ $(execution_sources) \ + $(memory_sources) \ $(concurrency_sources) \ $(expression_sources) \ $(instructions_sources) \ @@ -624,6 +626,7 @@ -I$(build_kernel_dir) \ -I$(build_behaviour_dir) \ -I$(build_execution_dir) \ + -I$(build_memory_dir) \ -I$(build_concurrency_dir) \ -I$(build_expression_dir) \ -I$(build_instructions_dir) \ Modified: main/trunk/kernel/kernel.mak =================================================================== --- main/trunk/kernel/kernel.mak 2008-08-10 07:19:28 UTC (rev 2925) +++ main/trunk/kernel/kernel.mak 2008-08-10 11:54:33 UTC (rev 2926) @@ -469,6 +469,15 @@ # *** Inference Rule for CPP->OBJ # *** For .CPP files in OR_LIBSRC directory # +{$(MEMORY)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# {$(INSTRUCTIONS)}.cpp{$(OR_OUTDIR)}.obj: @ECHO . @ECHO Compiling $(**) Copied: main/trunk/kernel/memory/DeadObject.cpp (from rev 2921, main/trunk/kernel/runtime/DeadObject.cpp) =================================================================== --- main/trunk/kernel/memory/DeadObject.cpp (rev 0) +++ main/trunk/kernel/memory/DeadObject.cpp 2008-08-10 11:54:33 UTC (rev 2926) @@ -0,0 +1,226 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/******************************************************************************/ +/* REXX Kernel DeadObject.c */ +/* */ +/* Primitive DeadObject management code */ +/* */ +/******************************************************************************/ + +#include <stdlib.h> +#include <string.h> +#include "RexxCore.h" +#include "RexxMemory.hpp" +#include "Interpreter.hpp" + +void DeadObjectPool::dumpMemoryProfile(FILE *outFile) +/******************************************************************************/ +/* Function: Dump statistics for this dead object pool. */ +/******************************************************************************/ +{ +#ifdef MEMPROFILE /* doing memory profiling */ + fprintf(outFile, "Statistics for Dead Object Pool %s\n, id"); + fprintf(outFile, " Total memory allocations: %d\n", allocationCount); + fprintf(outFile, " Unsuccessful requests: %d\n", allocationMisses); + fprintf(outFile, " Successful requests: %d\n", allocationHits); + fprintf(outFile, " Objects added back to the pool\n", allocationReclaim); +#endif +} + + +DeadObject *DeadObjectPool::findBestFit(size_t length) +/******************************************************************************/ +/* Function: Find an object that is the best fit for a requested length. */ +/* To get the best fit, we either want an object that fits well enough that */ +/* we don't need to create a trailing dead object from the remainder, OR */ +/* we return the largest possible object so that we can create the largest */ +/* possible remainder object. */ +/******************************************************************************/ +{ + DeadObject *newObject = anchor.next; + DeadObject *largest = NULL; + size_t largestSize = 0; + size_t deadLength = newObject->getObjectSize(); + + for (; deadLength != 0; deadLength = newObject->getObjectSize()) { + if (deadLength >= length) { + /* if within an allocation unit of the request size (which should */ + /* be common, since we round to a higher boundary for */ + /* large allocations), use this block */ + if ((deadLength - length) < VeryLargeObjectGrain) { + newObject->remove(); + logHit(); + return newObject; + } + /* keep track of the largest block. We want to */ + /* suballocate that if we can't find a good fit. */ + else if (deadLength > largestSize) { + largestSize = deadLength; + largest = newObject; + } + } + newObject = newObject->next; + } + /* we didn't find a close fit, so use the largest that will */ + /* work, if we found one. */ + if (largest != NULL) { + logHit(); + largest->remove(); + } + else { + logMiss(); + } + return largest; +} + + +DeadObject *DeadObjectPool::findSmallestFit(size_t minSize) +/******************************************************************************/ +/* Function: Find the smallest object in the pool that will hold the length. */ +/******************************************************************************/ +{ + DeadObject *newObject = anchor.next; + DeadObject *smallest = NULL; + size_t smallestSize = MaximumObjectSize; + + while (newObject->isReal()) { + size_t deadLength = newObject->getObjectSize(); + /* does this fit the request size? */ + if (deadLength >= minSize && deadLength < smallestSize) { + /* remember this for the end. */ + smallestSize = deadLength; + smallest = newObject; + /* did we get an exact fit? No need to look at any */ + /* others then. */ + if (deadLength == minSize) { + break; + } + } + newObject = newObject->next; + } + /* if we found a fit, remove the block and return it. */ + if (smallest != NULL) { + smallest->remove(); + logHit(); + } + else { + logMiss(); + } + return smallest; +} + + +void DeadObjectPool::addSortedBySize(DeadObject *obj) +/******************************************************************************/ +/* Function: Add an object to the pool sorted by size (ascending order). */ +/******************************************************************************/ +{ +// checkObjectOverlap(obj); +// checkObjectGrain(obj); + /* we start with the first element in the chain as the */ + /* insertion point. If the chain is empty, we'll terminate the */ + /* loop immediately and use the anchor as the insertion point, */ + /* which gives us the result we want. */ + DeadObject *insertPoint = anchor.next; + size_t size = obj->getObjectSize(); + + while (insertPoint->isReal()) { + /* if the current block is larger than the one we're */ + /* inserting, we've found our spot. */ + if (insertPoint->getObjectSize() >= size) { + break; + } + insertPoint = insertPoint->next; + } + /* insert this at the given point */ + insertPoint->insertBefore(obj); +} + + +void DeadObjectPool::addSortedByLocation(DeadObject *obj) +/******************************************************************************/ +/* Function: Add an object to the pool sorted by address (ascending order). */ +/******************************************************************************/ +{ +// checkObjectOverlap(obj); +// checkObjectGrain(obj); + /* we start with the first element in the chain as the */ + /* insertion point. If the chain is empty, we'll terminate the */ + /* loop immediately and use the anchor as the insertion point, */ + /* which gives us the result we want. */ + DeadObject *insertPoint = anchor.next; + + while (insertPoint->isReal()) { + /* if the current block's address is larger than the one we're */ + /* inserting, we've found our spot. */ + if (insertPoint > obj) { + break; + } + insertPoint = insertPoint->next; + } + /* insert this at the given point */ + insertPoint->insertBefore(obj); +} + + +void DeadObjectPool::checkObjectGrain(DeadObject *obj) +/******************************************************************************/ +/* Function: Debug validity check of object added to a dead pool. */ +/******************************************************************************/ +{ + if (!IsObjectGrained(obj)) + { + Interpreter::logicError("Object aligned on improper boundary"); + } +} + +void DeadObjectPool::checkObjectOverlap(DeadObject *obj) +/******************************************************************************/ +/* Function: Debug validity check of object added to a dead pool. */ +/******************************************************************************/ +{ + DeadObject *check = anchor.next; + + while (check != NULL && check->isReal()) { + if (check->overlaps(obj)) { + printf("Object at %p for length %d overlaps object at %p for length %d\n", obj, obj->getObjectSize(), check, check->getObjectSize()); + Interpreter::logicError("Overlapping dead objects added to the cache."); + } + check = check->next; + } +} Copied: main/trunk/kernel/memory/DeadObject.hpp (from rev 2921, main/trunk/kernel/runtime/DeadObject.hpp) =================================================================== --- main/trunk/kernel/memory/DeadObject.hpp (rev 0) +++ main/trunk/kernel/memory/DeadObject.hpp 2008-08-10 11:54:33 UTC (rev 2926) @@ -0,0 +1,317 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/******************************************************************************/ +/* REXX Kernel DeadObject.hpp */ +/* */ +/* Primitive DeadObject class definitions */ +/* */ +/******************************************************************************/ + +#ifndef Included_DeadObject +#define Included_DeadObject + +void FOUND(); void NOTFOUND(); +/* Dead chains are doubly linked lists. The anchors are in the memoryobj dead */ +/* arrays. The first element of each dead list is a dead object 3 words long. */ +/* The first and third words are next and prev pointers, and the second is the */ +/* header, just like any object. However, the header is set to 0 so that this */ +/* element will never be used and we can recognize if the chain has useable */ +/* elements with the expression: element->next->header. */ + + +/* DeadObject must be kept in synch with RexxInternalObject size */ +/* and layout */ +class DeadObject { + friend class DeadObjectPool; + + public: + inline void *operator new(size_t size, void *address) { return address; }; + inline void operator delete(void *, void *) {;} + + inline void addEyeCatcher(const char *string) { memcpy(VFT, string, 4); } + inline DeadObject(size_t objectSize) { + header.setObjectSize(objectSize); +#ifdef CHECKOREFS + addEyeCatcher("DEAD"); +#endif + } + + // Following is a static constructor. + // Called during RexxMemory initialization + inline DeadObject() { + addEyeCatcher("HEAD"); + header.setObjectSize(0); + /* Chain this deadobject to itself. */ + next = this; + previous = this; + } + + inline void setObjectSize(size_t newSize) { header.setObjectSize(newSize); } + inline size_t getObjectSize() { return header.getObjectSize(); }; + + inline void insertAfter(DeadObject *newDead) { + newDead->next = this->next; + newDead->previous = this; + this->next->previous = newDead; + this->next = newDead; + }; + + inline void insertBefore(DeadObject *newDead) { + newDead->next = this; + newDead->previous = this->previous; + this->previous->next = newDead; + this->previous = newDead; + }; + + inline void remove() { + this->next->previous = this->previous; + this->previous->next = this->next; + } + + inline bool isReal() { return header.getObjectSize() != 0; } + inline bool isHeader() { return header.getObjectSize() == 0; } + + inline void reset() { + /* Chain this deadobject to itself, removing all of the */ + /* elements from the chain */ + next = this; + previous = this; + } + + inline DeadObject *end() { return (DeadObject *)(((char *)this) + this->getObjectSize()); } + inline bool overlaps(DeadObject *o) { return (o >= this && o < end()) || (o->end() >= this && o->end() < this->end()); } + + +protected: + char VFT[sizeof(void *)]; /* Place Holder for virtualFuncTable */ + /* in debug mode, holds string DEAD */ + ObjectHeader header; /* header info just like any obj */ + DeadObject *next; /* next dead object on this chain */ + DeadObject *previous; /* prev dead object on this chain */ + +}; + +/* A pool of dead objects. This is the anchor for a set of dead */ +/* objects, as well as control and metric information for what is */ +/* stored in the pool of objects. */ +class DeadObjectPool +{ + public: + inline DeadObjectPool() { init("Generic DeadChain"); } + + inline DeadObjectPool(const char * poolID) : anchor() { + init(poolID); + } + + inline void init(const char * poolID) { + this->id = poolID; +#ifdef MEMPROFILE /* doing memory profiling */ + allocationCount = 0; + allocationReclaim = 0; + allocationHits = 0 ; + allocationMisses = 0; +#endif + } + + // the threshold for deciding the large object chain is getting fragmented. + // this tells us we need to move larger blocks to the front of the chain. + #define ReorderThreshold 100 + + inline void setID(const char *poolID) { this->id = poolID; } + inline void empty() { anchor.reset(); } + inline bool isEmpty() { return anchor.next->isReal(); } + inline void emptySingle() { anchor.next = NULL; } + inline bool isEmptySingle() { return anchor.next == NULL; } + inline + void checkObjectGrain(DeadObject *obj); + inline void add(DeadObject *obj) { +// checkObjectOverlap(obj); +// checkObjectGrain(obj); + anchor.insertAfter(obj); + } + void addSortedBySize(DeadObject *obj); + void addSortedByLocation(DeadObject *obj); + void dumpMemoryProfile(FILE *outfile); + void checkObjectOverlap(DeadObject *obj); + + inline DeadObject *getFirst() + /******************************************************************************/ + /* Function: Get the first object from the deal object pool. If the pool */ + /* is empty, this returns NULL. If a block is returned it is removed from the*/ + /* pool before return. */ + /******************************************************************************/ + { + DeadObject *newObject = anchor.next; + /* The next item could just be a pointer back to the anchor. */ + /* If it is not, we have a real block to return. */ + if (newObject->isReal()) { + /* we need to remove the object from the chain before */ + /* returning it. */ + newObject->remove(); + logHit(); + return newObject; + } + logMiss(); + return NULL; + } + inline DeadObject *lastBlock() { return anchor.previous; } + inline DeadObject *firstBlock() { return anchor.next; } + inline DeadObject *findFit(size_t length) + /******************************************************************************/ + /* Function: Find first object large enough to satisfy this request. If the */ + /* pool is empty, this returns NULL. If a block is returned it is removed */ + /* from the pool before return. */ + /******************************************************************************/ + { + DeadObject *newObject = anchor.next; + size_t newLength; + for (newLength = newObject->getObjectSize(); newLength != 0; newLength = newObject->getObjectSize()) { + if (newLength >= length) { + newObject->remove(); + logHit(); + return newObject; + } + newObject = newObject->next; + } + logMiss(); + return NULL; + } + + inline DeadObject *findFit(size_t length, size_t *realLength) + /******************************************************************************/ + /* Function: Find first object large enough to satisfy this request. If the */ + /* pool is empty, this returns NULL. If a block is returned it is removed */ + /* from the pool before return. */ + /******************************************************************************/ + { + DeadObject *newObject = anchor.next; + size_t newLength; + int probes = 1; + for (newLength = newObject->getObjectSize(); newLength != 0; newLength = newObject->getObjectSize()) { + if (newLength >= length) { + // we had to examine a lot of objects to get a match. + // it's worthwhile percolating the larger objects on the rest of the + // chain toward the front. We only do this when we're starting to have problems + // allocating objects because of fragmentation. + DeadObject *tailObject = newObject->next; + + newObject->remove(); + logHit(); + *realLength = newLength; + if (probes > ReorderThreshold) + { + for (size_t tailLength = tailObject->getObjectSize(); tailLength != 0; tailLength = tailObject->getObjectSize()) + { + // the size we just had problems with is a good marker for + // selecting candidates to move toward the front. The will guarantee + // that a similar request for the same size will succeed faster in the future. + DeadObject *nextObject = tailObject->next; + if (tailLength > length) + { + tailObject->remove(); + add(tailObject); + } + tailObject = nextObject; + } + } + return newObject; + } + probes++; + newObject = newObject->next; + } + logMiss(); + return NULL; + } + DeadObject *findBestFit(size_t length); + DeadObject *findSmallestFit(size_t minSize); + + inline void addSingle(DeadObject *obj) { +// checkObjectOverlap(obj); +// checkObjectGrain(obj); + obj->next = anchor.next; + anchor.next = obj; + } + + + inline DeadObject *getFirstSingle() + /******************************************************************************/ + /* Function: Get the first object from the deal object pool. If the pool */ + /* is empty, this returns NULL. If a block is returned it is removed from the*/ + /* pool before return. */ + /******************************************************************************/ + { + DeadObject *newObject = anchor.next; + + /* if we have a real object remove it */ + if (newObject != NULL) { + logHit(); + anchor.next = newObject->next; + return newObject; + } + logMiss(); + return NULL; + } + + private: +#ifdef MEMPROFILE /* doing memory profiling */ + inline void logAllocation() { allocationCount++; } + inline void logReclaim() { allocationReclaim++; } + inline void logHit() { allocationHits++; } + inline void logMiss() { allocationMisses; } + inline void clearProfile() { allocationCount = 0; allocationReclaim = 0; allocationHits = 0; allocationMisses = 0; } +#else + inline void logAllocation() { ; } + inline void logReclaim() { ; } + inline void logHit() { ; } + inline void logMiss() { ; } + inline void clearProfile(); +#endif + + /* the anchor position for our chain */ + DeadObject anchor; /* the anchor position for our chain */ + const char *id; /* identifier for the pool */ +#ifdef MEMPROFILE /* doing memory profiling */ + size_t allocationCount; /* the number of allocations from this chain */ + size_t allocationReclaim; /* elements we've split into multiples for reuse */ + size_t allocationHits; /* successful allocation requests */ + size_t allocationMisses; /* unsuccessful allocation requests */ +#endif + +}; + +#endif Copied: main/trunk/kernel/memory/MemorySegment.cpp (from rev 2921, main/trunk/kernel/runtime/MemorySegment.cpp) =================================================================== --- main/trunk/kernel/memory/MemorySegment.cpp (rev 0) +++ main/trunk/kernel/memory/MemorySegment.cpp 2008-08-10 11:54:33 UTC (rev 2926) @@ -0,0 +1,1817 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/******************************************************************************/ +/* REXX Kernel RexxMemorysegment.c */ +/* */ +/* Primitive Memory segment management */ +/* */ +/******************************************************************************/ +#include "RexxCore.h" +#include "ActivityManager.hpp" + + +void MemorySegment::dump(const char *owner, size_t counter, FILE *keyfile, FILE *dumpfile) +/******************************************************************************/ +/* Function: Dump information about an individual segment */ +/******************************************************************************/ +{ + /* print header for segment */ + fprintf(stderr,"Dumping %s Segment %d from %p for %u\n", owner, counter, &segmentStart, segmentSize); + /* now dump the segment */ + fprintf(keyfile, "%s addr.%d = %p\n", owner, counter, &segmentStart); + fprintf(keyfile, "%s size.%d = %u\n", owner, counter, segmentSize); + fwrite(&segmentStart, 1, segmentSize, dumpfile); +} + + +DeadObject *MemorySegment::lastDeadObject() +/******************************************************************************/ +/* Function: return a pointer to the last object in a segment if, and only if*/ +/* the object is a dead one. This is used to check the trailing deadspace */ +/* in the segment for purposes of combining the segments. */ +/******************************************************************************/ +{ + char *objectPtr, *endPtr; + char *lastObjectPtr = NULL; + + /* just scan all of the objects until we've reached the end of */ + /* the segment */ + for (objectPtr = start(), endPtr = end(); + objectPtr < endPtr; + objectPtr += ((RexxObject *)objectPtr)->getObjectSize()) + { + lastObjectPtr = objectPtr; + } + + if (!((RexxObject *)lastObjectPtr)->isObjectLive(memoryObject.markWord)) + { + return(DeadObject *)lastObjectPtr; + } + return NULL; +} + + +DeadObject *MemorySegment::firstDeadObject() +/******************************************************************************/ +/* Function: return a pointer to the first object in a segment if, and only */ +/* if the object is a dead one. This is used to check the leading deadspace */ +/* in the segment for purposes of combining the segments. */ +/******************************************************************************/ +{ + if (!((RexxObject *)start())->isObjectLive(memoryObject.markWord)) + { + return(DeadObject *)start(); + } + return NULL; +} + + +void MemorySegment::gatherObjectStats(MemoryStats *memStats, SegmentStats *stats) +/******************************************************************************/ +/* Function: Accumulate memory statistics for a segment */ +/******************************************************************************/ +{ + char *op; + char *ep; + /* for all objects in this segment */ + for (op = start(), ep = end(); op < ep; op += ((RexxObject *)op)->getObjectSize()) + { + /* record the information about this object */ + stats->recordObject(memStats, op); + } +} + + +void MemorySegmentSet::dumpSegments(FILE *keyfile, FILE *dumpfile) +/******************************************************************************/ +/* Function: Dump information about the each of the segments */ +/******************************************************************************/ +{ + MemorySegment *segment; + size_t counter = 0; + + for (segment = first(); segment != NULL; segment = next(segment)) + { + segment->dump(name, ++counter, keyfile, dumpfile); + } +} + +void MemorySegmentSet::dumpMemoryProfile(FILE *outfile) +/******************************************************************************/ +/* Function: Dump profile informaton about a segment set (empty for base */ +/* class) */ +/******************************************************************************/ +{ +} + +void LargeSegmentSet::dumpMemoryProfile(FILE *outfile) +/******************************************************************************/ +/* Function: Dump profile informaton about the large allocation segment set */ +/******************************************************************************/ +{ + fprintf(outfile, "Memory profile for large object allocations\n\n"); + /* all the work is done by the dead caches */ + deadCache.dumpMemoryProfile(outfile); +} + + +void NormalSegmentSet::dumpMemoryProfile(FILE *outfile) +/******************************************************************************/ +/* Function: Dump profile informaton about the normal allocation segment set */ +/******************************************************************************/ +{ + int i; + + fprintf(outfile, "Memory profile for normal object allocations\n\n"); + /* all the work is done by the dead caches */ + largeDead.dumpMemoryProfile(outfile); + + for (i = FirstDeadPool; i < DeadPools; i++) { + subpools[i].dumpMemoryProfile(outfile); + } +} + + +void NormalSegmentSet::checkObjectOverlap(DeadObject *obj) +/******************************************************************************/ +/* Function: do dead object overlap validation checking. */ +/******************************************************************************/ +{ + /* all the work is done by the dead caches */ + largeDead.checkObjectOverlap(obj); + + for (int i = FirstDeadPool - 1; i < DeadPools; i++) + { + subpools[i].checkObjectOverlap(obj); + } +} + + +/******************************************************************************/ +/* Function: Constructor for the large segment pool. */ +/******************************************************************************/ +LargeSegmentSet::LargeSegmentSet(RexxMemory *mem) : + MemorySegmentSet(mem, SET_NORMAL, "Large Allocation Segments"), + deadCache("Large Block Allocation Pool"), requests(0), smallestObject(0), largestObject(0) { } + + +/******************************************************************************/ +/* Function: Constructor for the large segment pool. */ +/******************************************************************************/ +OldSpaceSegmentSet::OldSpaceSegmentSet(RexxMemory *mem) : + MemorySegmentSet(mem, SET_OLDSPACE, "Old Space Segments"), + deadCache("Old Space Allocation Pool") +{ + +} + + +/******************************************************************************/ +/* Function: Constructor for the normal segment pool. */ +/******************************************************************************/ +NormalSegmentSet::NormalSegmentSet(RexxMemory *mem) : + MemorySegmentSet(mem, SET_NORMAL, "Normal Allocation Segments"), + largeDead("Large Normal Allocation Pool") +{ + /* finish setting up the allocation subpools. We set up one */ + /* additional one, to act as a guard pool to redirect things to */ + /* the large pool. */ + int i; + for (i = 0; i < DeadPools; i++) + { /* there are only */ + /* DeadPools subpools! (<, not <=) */ + char buffer[100]; + sprintf(buffer, "Normal allocation subpool %d for blocks of size %d", i, DeadPoolToLength(i)); + subpools[i].setID(buffer); + /* make sure these are properly set up as single size */ + /* keepers */ + subpools[i].emptySingle(); + /* initially, all subpools are empty, so have them skip */ + /* directly to the dead chains. */ + lastUsedSubpool[i] = DeadPools; + } + lastUsedSubpool[i] = DeadPools; /* add the final entry in */ + /* the lastUsedSubpool table (extra) */ + + /* This must be the first seg created*/ + /* Create a segment for recovery */ + /* doesn't need to be a full segment */ + /* worth, 1/2 should do */ + recoverSegment = memory->newSegment(RecoverSegmentSize, RecoverSegmentSize); +} + + +void NormalSegmentSet::getInitialSet() +/******************************************************************************/ +/* Function: Set up the intial normal memory allocation. */ +/******************************************************************************/ +{ + /* get our first set of segments */ + addSegments(InitialNormalSegmentSpace); +} + + +MemorySegment *MemorySegmentSet::allocateSegment(size_t requestLength, size_t minimumLength) +/******************************************************************************/ +/* Function: Allocate a segment...designed for subclass overrides */ +/******************************************************************************/ +{ + return memory->newSegment(requestLength, minimumLength); +} + + +MemorySegment *LargeSegmentSet::allocateSegment(size_t requestLength, size_t minimumLength) +/******************************************************************************/ +/* Function: Allocate a segment...designed for subclass overrides */ +/******************************************************************************/ +{ + return memory->newLargeSegment(requestLength, minimumLength); +} + + +MemorySegment *MemorySegmentSet::getSegment(size_t requestLength, size_t minimumLength) +/******************************************************************************/ +/* Function: Locate a for a request. We try to allocate one first from */ +/* the pool of empty segments, then go to the memory pool manager if we don't */ +/* have one in reserve. */ +/******************************************************************************/ +{ + /* see if we have an empty segment available for the full size */ + MemorySegment *segment = findEmptySegment(requestLength); + /* if we can't find one, check for the minimum size first, */ + /* before we go to the memory pool manager to get more. */ + if (segment == NULL) { + segment = findEmptySegment(minimumLength); + /* No luck, go get a real thing to add to this. */ + if (segment == NULL) { + segment = allocateSegment(requestLength, minimumLength); + } + } + return segment; +} + + +MemorySegment *MemorySegmentSet::findEmptySegment(size_t requestLength) +/******************************************************************************/ +/* Function: Find a segment in our empty segment cache. */ +/******************************************************************************/ +{ + /* scan the empty segments list */ + MemorySegment *segment = emptySegments.next; + while (segment->isReal()) + { + /* if this one is large enough, use it. */ + if (segment->size() > requestLength) + { + segment->remove(); + return segment; + } + segment = segment->next; + } + return NULL; +} + + +void MemorySegmentSet::activateEmptySegments() +/******************************************************************************/ +/* Function: Move all of our active segments back into the active cache. We */ +/* do this because we want to try to merge segments to create larger blocks. */ +/******************************************************************************/ +{ + /* scan the empty segments list */ + MemorySegment *segment = emptySegments.next; + while (segment->isReal()) + { + /* grab the next segment in the chain */ + MemorySegment *nextSeg = segment->next; + + /* remove the current one from the chain */ + segment->remove(); + /* insert back into the active list */ + addSegment(segment); + segment = nextSeg; + } +} + + +bool MemorySegmentSet::newSegment(size_t requestLength, size_t minimumLength) +/******************************************************************************/ +/* Function: Allocate a segment and add it to the segment pool */ +/******************************************************************************/ +{ + /* try to allocate a segment, and add it to the list if */ + /* successful. This also adds the space to our dead object */ + /* pool. */ + MemorySegment *segment = allocateSegment(requestLength, minimumLength); + if (segment != NULL) + { + addSegment(segment); + return true; + } + return false; +} + + +void MemorySegmentSet::addDeadObject(DeadObject *object) +/******************************************************************************/ +/* Function: Add a dead object to the segment set. */ +/******************************************************************************/ +{ + // The base class doesn't maintain a dead object pool, so this is a nop +} + + +void LargeSegmentSet::addDeadObject(DeadObject *object) +/******************************************************************************/ +/* Function: Add a dead object to the segment set. */ +/******************************************************************************/ +{ + /* we want to keep our cache sorted by the size. */ + deadCache.addSortedBySize(object); +} + + +void OldSpaceSegmentSet::addDeadObject(DeadObject *object) +/******************************************************************************/ +/* Function: Add a dead object to the segment set. */ +/******************************************************************************/ +{ + /* we want to keep our cache sorted by the size. */ + deadCache.addSortedBySize(object); +} + + +void NormalSegmentSet::addDeadObject(DeadObject *object) +/******************************************************************************/ +/* Function: Add a dead object to the segment set. */ +/******************************************************************************/ +{ +// checkObjectOverlap(object); + size_t length = object->getObjectSize(); + + /* if the length is larger than the biggest subpool we */ + /* maintain, we add this to the large block list. */ + if (length > LargestSubpool) + { + /* ideally, we'd like to add this sorted by size, but */ + /* this is called so frequently, attempting to sort */ + /* degrades performance by about 10%. */ + largeDead.add(object); + } + else + { + /* calculate the dead chain */ + /* and add that to the appropriate chain */ + size_t deadChain = LengthToDeadPool(length); + subpools[deadChain].addSingle(object); + /* we can mark this subpool as having items again */ + lastUsedSubpool[deadChain] = deadChain; + } +} + + +void MemorySegmentSet::addDeadObject(char *object, size_t length) +/******************************************************************************/ +/* Function: Add a dead object to the segment set. */ +/******************************************************************************/ +{ + // The base class doesn't maintain a dead object pool, so this is a nop +} + + +void LargeSegmentSet::addDeadObject(char *object, size_t length) +/******************************************************************************/ +/* Function: Add a dead object to the segment set. */ +/******************************************************************************/ +{ +#ifdef VERBOSE_GC + if (length > largestObject) + { + largestObject = length; + } + if (length < smallestObject) + { + smallestObject = length; + } +#endif + /* we want to keep our cache sorted by the size. */ + deadCache.addSortedBySize(new (object) DeadObject(length)); +} + + +void OldSpaceSegmentSet::addDeadObject(char *object, size_t length) +/******************************************************************************/ +/* Function: Add a dead object to the segment set. */ +/******************************************************************************/ +{ + /* we want to keep our cache sorted by the size. */ + deadCache.addSortedBySize(new (object) DeadObject(length)); +} + + +void NormalSegmentSet::addDeadObject(char *object, size_t length) +/******************************************************************************/ +/* Function: Add a dead object to the segment set. */ +/******************************************************************************/ +{ + /* if the length is larger than the biggest subpool we */ + /* maintain, we add this to the large block list. */ + if (length > LargestSubpool) + { + /* ideally, we'd like to add this sorted by size, but */ + /* this is called so frequently, attempting to sort */ + /* degrades performance by about 10%. */ + largeDead.add(new (object) DeadObject(length)); + } + else + { + /* calculate the dead chain */ + /* and add that to the appropriate chain */ + size_t deadChain = LengthToDeadPool(length); + subpools[deadChain].addSingle(new (object) DeadObject(length)); + /* we can mark this subpool as having items again */ + lastUsedSubpool[deadChain] = deadChain; + } +} + + +void MemorySegmentSet::addSegment(MemorySegment *segment, bool createDeadObject) +/******************************************************************************/ +/* Function: Add a segment to the segment pool. */ +/******************************************************************************/ +{ + /* we want to keep these segments ordered by address so we can */ + /* potentially combine them later. */ + MemorySegment *insertPosition = anchor.next; + while (insertPosition->isReal()) + { + /* we want to insert these in sorted order, by address. */ + /* This allows us to merge segments later, if necessary. */ + if (segment < insertPosition) + { + break; + } + insertPosition = insertPosition->next; + } + + /* first check to see if we can merge this with the previous */ + /* segment. This will give us larger segment sections for reuse. */ + MemorySegment *previous = insertPosition->previous; + if (previous->isReal() && previous->isAdjacentTo(segment)) + { + /* just combine this with the previous segment and add the */ + /* entire block as a dead object. */ + size_t deadLength = segment->realSize(); + previous->combine(segment); + memory->verboseMessage("Combining newly allocated segment of %d bytes to create new segment of %d bytes\n", deadLength, previous->size()); + addDeadObject((char *)segment, deadLength); + } + else + { + /* insert this into position */ + insertPosition->insertBefore(segment); + /* Insert the segment's dead space into the proper chain */ + if (createDeadObject) + { + DeadObject *ptr = segment->createDeadObject(); + addDeadObject(ptr); + } + } +} + + +DeadObject *MemorySegmentSet::donateObject(size_t allocationLength) +/******************************************************************************/ +/* Function: Search the cache of dead objects for an object of sufficient */ +/* size to fulfill this request. For the default implementation, we always */ +/* return NULL. Different segment sets may have different strategies for */ +/* determining which block is most suitable for donation. */ +/******************************************************************************/ +{ + return NULL; +} + + +DeadObject *NormalSegmentSet::donateObject(size_t allocationLength) +/******************************************************************************/ +/* Function: Search the cache of dead objects for an object of sufficient */ +/* size to fulfill this request. This just uses normal large block */ +/* allocation strategy to decide on the block to donate, give a best fit */ +/* for the allocation. */ +/******************************************************************************/ +{ + /* find a large object and return it */ + return (DeadObject *)findLargeDeadObject(allocationLength); +} + + +DeadObject *LargeSegmentSet::donateObject(size_t allocationLength) +/******************************************************************************/ +/* Function: Search the cache of dead objects for an object of sufficient */ +/* size to fulfill this request. This just uses normal large block */ +/* allocation strategy to decide on the block to donate, give a best fit */ +/* for the allocation. */ +/******************************************************************************/ +{ + /* find an object in the cache return it. This will likely be */ + /* larger than the request, as we shouldn't have may small */ + /* objects in the dead chains. */ + return deadCache.findSmallestFit(allocationLength); +} + + +MemorySegment *MemorySegmentSet::donateSegment(size_t allocationLength) +/******************************************************************************/ +/* Function: Search the set of segments to se... [truncated message content] |
From: <bi...@us...> - 2008-08-10 12:16:22
|
Revision: 2927 http://oorexx.svn.sourceforge.net/oorexx/?rev=2927&view=rev Author: bigrixx Date: 2008-08-10 12:16:31 +0000 (Sun, 10 Aug 2008) Log Message: ----------- move package files Modified Paths: -------------- main/trunk/Makefile.am main/trunk/kernel/kernel.mak main/trunk/orxdb.bat Added Paths: ----------- main/trunk/kernel/package/LibraryPackage.cpp main/trunk/kernel/package/LibraryPackage.hpp main/trunk/kernel/package/PackageManager.cpp main/trunk/kernel/package/PackageManager.hpp Removed Paths: ------------- main/trunk/kernel/runtime/LibraryPackage.cpp main/trunk/kernel/runtime/LibraryPackage.hpp main/trunk/kernel/runtime/PackageManager.cpp main/trunk/kernel/runtime/PackageManager.hpp Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-10 11:54:33 UTC (rev 2926) +++ main/trunk/Makefile.am 2008-08-10 12:16:31 UTC (rev 2927) @@ -76,6 +76,7 @@ build_behaviour_dir = $(build_kernel_dir)/behaviour build_execution_dir = $(build_kernel_dir)/execution build_memory_dir = $(build_kernel_dir)/memory +build_package_dir = $(build_kernel_dir)/package build_instructions_dir = $(build_kernel_dir)/instructions build_parser_dir = $(build_kernel_dir)/parser build_runtime_dir = $(build_kernel_dir)/runtime @@ -167,6 +168,8 @@ $(build_expression_dir)/ExpressionVariable.hpp \ $(build_expression_dir)/IndirectVariableReference.hpp \ $(build_expression_dir)/ExpressionLogical.hpp +packageHeaders = $(build_package_dir)/LibraryPackage.hpp \ + $(build_package_dir)/PackageManager.hpp memoryHeaders = $(build_memory_dir)/DeadObject.hpp \ $(build_memory_dir)/MemorySegment.hpp \ $(build_memory_dir)/MemoryStats.hpp \ @@ -467,6 +470,8 @@ $(build_classes_dir)/SupplierClass.cpp \ $(build_classes_dir)/TableClass.cpp \ $(build_classes_dir)/WeakReferenceClass.cpp +package_sources = $(build_package_dir)/LibraryPackage.cpp \ + $(build_package_dir)/PackageManager.cpp memory_sources = $(build_memory_dir)/DeadObject.cpp \ $(build_memory_dir)/MemorySegment.cpp \ $(build_memory_dir)/MemoryStats.cpp \ @@ -601,6 +606,7 @@ $(behaviour_sources) \ $(execution_sources) \ $(memory_sources) \ + $(package_sources) \ $(concurrency_sources) \ $(expression_sources) \ $(instructions_sources) \ @@ -627,6 +633,7 @@ -I$(build_behaviour_dir) \ -I$(build_execution_dir) \ -I$(build_memory_dir) \ + -I$(build_package_dir) \ -I$(build_concurrency_dir) \ -I$(build_expression_dir) \ -I$(build_instructions_dir) \ Modified: main/trunk/kernel/kernel.mak =================================================================== --- main/trunk/kernel/kernel.mak 2008-08-10 11:54:33 UTC (rev 2926) +++ main/trunk/kernel/kernel.mak 2008-08-10 12:16:31 UTC (rev 2927) @@ -478,6 +478,15 @@ # *** Inference Rule for CPP->OBJ # *** For .CPP files in OR_LIBSRC directory # +{$(PACKAGE)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# {$(INSTRUCTIONS)}.cpp{$(OR_OUTDIR)}.obj: @ECHO . @ECHO Compiling $(**) Copied: main/trunk/kernel/package/LibraryPackage.cpp (from rev 2921, main/trunk/kernel/runtime/LibraryPackage.cpp) =================================================================== --- main/trunk/kernel/package/LibraryPackage.cpp (rev 0) +++ main/trunk/kernel/package/LibraryPackage.cpp 2008-08-10 12:16:31 UTC (rev 2927) @@ -0,0 +1,519 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* 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 */ +/* */ +/* Primitive LibraryPackage management */ +/* */ +/******************************************************************************/ + +#include "RexxCore.h" +#include "LibraryPackage.hpp" +#include "PackageManager.hpp" +#include "Interpreter.hpp" +#include "RexxNativeCode.hpp" +#include "DirectoryClass.hpp" +#include "RoutineClass.hpp" +#include "ProtectedObject.hpp" + +/** + * Create a new LibraryPackage object instance. + * + * @param size Size of the object. + * + * @return Pointer to new object storage. + */ +void *LibraryPackage::operator new(size_t size) +{ + return new_object(size, T_LibraryPackage); +} + + +/** + * Constructor for a loaded package. + * + * @param n Name of the library associated with this package. This is + * also the name used to load the library when requested. + */ +LibraryPackage::LibraryPackage(RexxString *n) +{ + this->clearObject(); + OrefSet(this, libraryName, n); +} + +/** + * Constructor for a loaded package. + * + * @param n Name of the library associated with this package. This is + * also the name used to load the library when requested. + * @param m The package manager that orchestrates the loading operations. + * @param p The packag table attached to this package name. + */ +LibraryPackage::LibraryPackage(RexxString *n, RexxPackageEntry *p) +{ + this->clearObject(); + OrefSet(this, libraryName, n); + ProtectedObject p2(this); + // this is an internal package. + internal = true; + loadPackage(p); +} + +/** + * Normal live marking. + */ +void LibraryPackage::live(size_t liveMark) +{ + memory_mark(libraryName); + memory_mark(routines); + memory_mark(methods); +} + +/** + * Generalized live marking. + */ +void LibraryPackage::liveGeneral(int reason) +{ + memory_mark_general(libraryName); + memory_mark_general(routines); + memory_mark_general(methods); +} + + +/** + * Perform the initial loading of a package. The loading + * process involves resolving the external library and + * attempting to resolve a Rexx package exporter routine + * in the library. If the library loads, but does not have + * the package exporter function, this is a classic library. + * + * If we do find a package exporter, then we can load all of + * the routines immediately. Method loads are deferred until + * the first request. + * + * @param manager The package manager we're attached to. + * + * @return True if we were able to load this as proper ooRexx package + * file, false if either step failed. We do not throw + * exceptions here, since these are usually loaded in the + * context of operations that return an error result instead + * of an exception. + */ +bool LibraryPackage::load() +{ + // try to load the package table. + RexxPackageEntry *table = getPackageTable(); + // if this is NULL, return false to the manager + if (table == NULL) + { + return false; + } + // call the loader to get the package tables and set them up. + loadPackage(table); + return true; +} + + + +/** + * Unload a package library. + */ +void LibraryPackage::unload() +{ + // the internal packages don't get unloaded + if (!loaded) + { + return; + } + + // call an unloader, if we have one. + if (package->unloader != NULL) + { + // go run the dispatcher call + LibraryUnloaderDispatcher dispatcher(package->unloader); + + ActivityManager::currentActivity->run(dispatcher); + } + lib.unload(); +} + + +/** + * Load a library and see if it is possible to retrieve + * a package entry from the library. + * + * @return A package table entry, if possible. A load failure or + * no package loading routines returns NULL. + */ +RexxPackageEntry *LibraryPackage::getPackageTable() +{ + // first try to load the libary + PACKAGE_LOADER loader; + // reset the library handle that was saved in the image. + lib.reset(); + + if (!lib.load(libraryName->getStringData())) + { + // we don't report an exception here. This may have + // just been a probe attempt to see if we're real. We'll + // leave the exception decisions up to the package manager. + return NULL; + } + + // we're loaded now, vs. just a package fronting a name. + loaded = true; + // the try to resolve a package getting structure + // resolve the function address + void *entry = lib.getProcedure("RexxGetPackage"); + if (entry == NULL) + { + // again, this is not an exception...this could just be + // a classic style function registration. + return NULL; + } + loader = (PACKAGE_LOADER)entry; + // call the loader to get the package tables and set them up. + return (*loader)(); +} + + +/** + * Load a package with a provided package definition. + * + * @param p The package table entry. + */ +void LibraryPackage::loadPackage(RexxPackageEntry *p) +{ + package = p; //NB: this is NOT an object, so OrefSet is not needed. + + // verify that this library is compatible + if (package->requiredVersion != 0 && package->requiredVersion < REXX_CURRENT_INTERPRETER_VERSION) + { + reportException(Error_Execution_library_version, libraryName); + } + // load the function table + loadRoutines(package->routines); + + // call a loader, if we have one. + if (p->loader != NULL) + { + // go run the dispatcher call + LibraryLoaderDispatcher dispatcher(p->loader); + + ActivityManager::currentActivity->run(dispatcher); + } +} + + +/** + * Load all of the routines in a package, registering them with + * the package manager. + * + * @param table The package table describing this package. + */ +void LibraryPackage::loadRoutines(RexxRoutineEntry *table) +{ + // no routines exported by this package? Just return without + // doing anything. + if (table == NULL) + { + return; + } + + // create a directory of loaded routines + OrefSet(this, routines, new_directory()); + + while (table->style != 0) + { + // table names tend to be specified in friendly form, we need to + // convert them to uppercase because "normal" Rexx function names + // tend to be uppercase. + RexxString *target = new_upper_string(table->name)->upper(); + RexxString *routineName = new_string(table->name); + + RexxRoutine *func = OREF_NULL; + if (table->style == ROUTINE_CLASSIC_STYLE) + { + func = new RegisteredRoutine(libraryName, routineName, (RexxRoutineHandler *)table->entryPoint); + } + else + { + func = new RexxNativeRoutine(libraryName, routineName, (PNATIVEROUTINE)table->entryPoint); + } + + RoutineClass *routine = new RoutineClass(routineName, func); + // add this to our local table + routines->put(routine, target); + + // add this to the global function pool + PackageManager::addPackageRoutine(target, routine); + // step to the next table entry + table++; + } +} + + + +/** + * Locate a named method entry from the package registration + * table. + * + * @param name The target name. + * + * @return The entry associated with the target entry, if it exists. + * NULL indicates a not found condition. + */ +RexxMethodEntry *LibraryPackage::locateMethodEntry(RexxString *name) +{ + RexxMethodEntry *entry = package->methods; + + // scan the exported method table for the required method + while (entry->style != 0) + { + // is this one a name match? Make a method, add it to + // the table, and return. + if (name->strICompare(entry->name)) + { + return entry; + } + entry++; + } + return NULL; +} + + +/** + * Locate a named function entry from the package registration + * table. + * + * @param name The target name. + * + * @return A pointer to the located function structure. Returns NULL + * if the package doesn't exist. + */ +RexxRoutineEntry *LibraryPackage::locateRoutineEntry(RexxString *name) +{ + RexxRoutineEntry *entry = package->routines; + + // scan the exported method table for the required method + while (entry->style != 0) + { + // is this one a name match? Make a method, add it to + // the table, and return. + if (name->strICompare(entry->name)) + { + return entry; + } + entry++; + } + return NULL; +} + + +/** + * Get a NativeCode object for a method associated with a + * package. + * + * @param name Name of the target method. + * + * @return A RexxNativeCode object for this method, if located. + */ +RexxNativeMethod *LibraryPackage::resolveMethod(RexxString *name) +{ + // create our methods table if not yet created. + if (methods == OREF_NULL) + { + OrefSet(this, methods, new_directory()); + } + + // see if this is in the table yet. + RexxNativeMethod *code = (RexxNativeMethod *)methods->at(name); + if (code == OREF_NULL) + { + // find the package definition + RexxMethodEntry *entry = locateMethodEntry(name); + // if we found one with this name, create a native method out of it. + if (entry != NULL) + { + code = new RexxNativeMethod(libraryName, name, (PNATIVEMETHOD)entry->entryPoint); + methods->put((RexxObject *)code, name); + return code; + } + // This, we know from nothing.... + return OREF_NULL; + } + // had this cached already. + return code; +} + + +/** + * Get a Routine object for a method associated with a package. + * + * @param name Name of the target method. + * + * @return A RexxNativeCode object for this method, if located. + */ +RoutineClass *LibraryPackage::resolveRoutine(RexxString *name) +{ + // we resolve all of these at load time, so this is either in the table, or it's not. + return (RoutineClass *)routines->at(name); +} + + +/** + * Resolve an entry point for a package method entry (used on a + * restore or reflatten); + * + * @param name Name of the target method. + * + * @return The target entry point. + */ +PNATIVEMETHOD LibraryPackage::resolveMethodEntry(RexxString *name) +{ + // find the package definition + RexxMethodEntry *entry = locateMethodEntry(name); + // if no entry, something bad has gone wrong + if (entry == NULL) + { + reportException(Error_Execution_library_method, name, libraryName); + } + return (PNATIVEMETHOD)entry->entryPoint; +} + + +/** + * Resolve an entry point for a package function entry (used on + * a restore or reflatten); + * + * @param name Name of the target function. + * + * @return The target entry point. + */ +PNATIVEROUTINE LibraryPackage::resolveRoutineEntry(RexxString *name) +{ + // find the package definition + RexxRoutineEntry *entry = locateRoutineEntry(name); + // if no entry, something bad has gone wrong + if (entry == NULL) + { + reportException(Error_Execution_library_routine, name, libraryName); + } + + // style mismatch...this is incompatible + if (entry->style == ROUTINE_CLASSIC_STYLE) + { + reportException(Error_Execution_library_routine, name, libraryName); + } + return (PNATIVEROUTINE)entry->entryPoint; +} + + +/** + * Resolve an entry point for a package function entry (used on + * a restore or reflatten); + * + * @param name Name of the target function. + * + * @return The target entry point. + */ +PREGISTEREDROUTINE LibraryPackage::resolveRegisteredRoutineEntry(RexxString *name) +{ + // find the package definition + RexxRoutineEntry *entry = locateRoutineEntry(name); + // if no entry, something bad has gone wrong + if (entry == NULL) + { + reportException(Error_Execution_library_routine, name, libraryName); + } + + // style mismatch...this is incompatible + if (entry->style != ROUTINE_CLASSIC_STYLE) + { + reportException(Error_Execution_library_routine, name, libraryName); + } + return (PREGISTEREDROUTINE)entry->entryPoint; +} + + +/** + * Refresh a non-internal package after an image restore. + */ +void LibraryPackage::reload() +{ + package = getPackageTable(); + if (package == OREF_NULL) + { + Interpreter::logicError("Failure loading required base library"); + } +} + + +/** + * Refresh an internal package after an image restore. + * + * @param pack The internal package entry. + */ +void LibraryPackage::reload(RexxPackageEntry *pack) +{ + package = pack; +} + + + +/** + * Process a callout to package loader function + */ +void LibraryLoaderDispatcher::run() +{ + RexxThreadContext *context = activity->getThreadContext(); + + loader(context); +} + + + +/** + * Process a callout to package loader function + */ +void LibraryUnloaderDispatcher::run() +{ + RexxThreadContext *context = activity->getThreadContext(); + + unloader(context); +} Copied: main/trunk/kernel/package/LibraryPackage.hpp (from rev 2921, main/trunk/kernel/runtime/LibraryPackage.hpp) =================================================================== --- main/trunk/kernel/package/LibraryPackage.hpp (rev 0) +++ main/trunk/kernel/package/LibraryPackage.hpp 2008-08-10 12:16:31 UTC (rev 2927) @@ -0,0 +1,126 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* 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 */ +/* */ +/* Primitive Rexx function/method package */ +/* */ +/******************************************************************************/ +#ifndef LibraryPackage_Included +#define LibraryPackage_Included + +#include "RexxCore.h" +#include "SysLibrary.hpp" +#include "RexxNativeCode.hpp" +#include "CallbackDispatcher.hpp" + +class PackageManager; +class RexxNativeMethod; + +typedef RexxPackageEntry * (RexxEntry *PACKAGE_LOADER)(); + +class LibraryPackage : public RexxInternalObject +{ +public: + inline void *operator new(size_t, void *ptr) {return ptr;} + inline void operator delete(void *, void *) {;} + void *operator new(size_t); + inline void operator delete(void *) {;} + + LibraryPackage(RexxString *n); + LibraryPackage(RexxString *n, RexxPackageEntry *p); + inline LibraryPackage(RESTORETYPE restoreType) { ; }; + + void live(size_t liveMark); + void liveGeneral(int reason); + bool load(); + void unload(); + RexxPackageEntry *getPackageTable(); + void loadPackage(RexxPackageEntry *p); + void loadRoutines(RexxRoutineEntry *table); + RexxMethodEntry *locateMethodEntry(RexxString *name); + RexxRoutineEntry *locateRoutineEntry(RexxString *name); + RexxNativeMethod *resolveMethod(RexxString *name); + RoutineClass *resolveRoutine(RexxString *name); + PNATIVEMETHOD resolveMethodEntry(RexxString *name); + PNATIVEROUTINE resolveRoutineEntry(RexxString *name); + PREGISTEREDROUTINE resolveRegisteredRoutineEntry(RexxString *name); + void reload(); + void reload(RexxPackageEntry *pack); + inline bool isLoaded() { return loaded; } + inline bool isInternal() { return internal; } + +protected: + + RexxPackageEntry *package; // loaded package information + RexxString *libraryName; // the name of the library + RexxDirectory *routines; // loaded routines + RexxDirectory *methods; // loaded methods + SysLibrary lib; // the library management handle + bool loaded; // we've at least been able to load the library + bool internal; // this is an internal package...no library load required. +}; + + +class LibraryLoaderDispatcher : public CallbackDispatcher +{ +public: + inline LibraryLoaderDispatcher(RexxPackageLoader l) : loader(l) { } + virtual ~LibraryLoaderDispatcher() { ; } + + virtual void run(); + +protected: + RexxPackageLoader loader; +}; + + +class LibraryUnloaderDispatcher : public CallbackDispatcher +{ +public: + inline LibraryUnloaderDispatcher(RexxPackageUnloader u) : unloader(u) { } + virtual ~LibraryUnloaderDispatcher() { ; } + + virtual void run(); + +protected: + RexxPackageUnloader unloader; +}; + +#endif + Copied: main/trunk/kernel/package/PackageManager.cpp (from rev 2921, main/trunk/kernel/runtime/PackageManager.cpp) =================================================================== --- main/trunk/kernel/package/PackageManager.cpp (rev 0) +++ main/trunk/kernel/package/PackageManager.cpp 2008-08-10 12:16:31 UTC (rev 2927) @@ -0,0 +1,890 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* 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 */ +/* */ +/* Primitive Package management */ +/* */ +/******************************************************************************/ + +#include "RexxCore.h" +#include "PackageManager.hpp" +#include "LibraryPackage.hpp" +#include "Interpreter.hpp" +#include "RexxNativeCode.hpp" +#include "DirectoryClass.hpp" +#include "ActivityManager.hpp" +#include "RoutineClass.hpp" +#include "RexxInternalApis.h" +#include "ProtectedObject.hpp" +#include "SecurityManager.hpp" +#include "WeakReferenceClass.hpp" +#include "RexxActivation.hpp" +#include "PackageClass.hpp" + + +RexxDirectory *PackageManager::packages = OREF_NULL; // our loaded packages +RexxDirectory *PackageManager::packageRoutines = OREF_NULL; // table of functions loaded from packages +RexxDirectory *PackageManager::registeredRoutines = OREF_NULL; +RexxDirectory *PackageManager::loadedRequires = OREF_NULL; + +/** + * Initialize the package manager global state. + */ +void PackageManager::initialize() +{ + packages = new_directory(); // create the tables for the manager + packageRoutines = new_directory(); + registeredRoutines = new_directory(); + loadedRequires = new_directory(); + // load the internal library first + loadInternalPackage(OREF_REXX, rexxPackage); + loadLibrary(OREF_REXXUTIL); // load the rexxutil package automatically +} + + +/** + * Return the information that needs to be saved in the saved + * image. + * + * @return An array of the items added to the saved image. + */ +RexxArray *PackageManager::getImageData() +{ + + RexxArray *imageArray = new_array(IMAGE_ARRAY_SIZE); + imageArray->put(packages, IMAGE_PACKAGES); + imageArray->put(packageRoutines, IMAGE_PACKAGE_ROUTINES); + imageArray->put(registeredRoutines, IMAGE_REGISTERED_ROUTINES); + imageArray->put(loadedRequires, IMAGE_REQUIRES); + + return imageArray; +} + + +/** + * Restore the saved image data. + * + * @param imageArray The array we placed in the save image originally. + */ +void PackageManager::restore(RexxArray *imageArray) +{ + // The memory manager is not initialized yet, so we just store the references + // at this point. A little later, we'll replace these with copies. + packages = (RexxDirectory *)imageArray->get(IMAGE_PACKAGES); + packageRoutines = (RexxDirectory *)imageArray->get(IMAGE_PACKAGE_ROUTINES); + registeredRoutines = (RexxDirectory *)imageArray->get(IMAGE_REGISTERED_ROUTINES); + loadedRequires = (RexxDirectory *)imageArray->get(IMAGE_REQUIRES); +} + + +/** + * Restore the saved image data to operational status + */ +void PackageManager::restore() +{ + // we use copies of these directories to avoid old-to-new image problems. + packages = (RexxDirectory *)packages->copy(); + packageRoutines = (RexxDirectory *)packageRoutines->copy(); + registeredRoutines = (RexxDirectory *)registeredRoutines->copy(); + loadedRequires = (RexxDirectory *)loadedRequires->copy(); + + for (HashLink i = packages->first(); packages->available(i); i = packages->next(i)) + { + // get the next package + LibraryPackage *package = (LibraryPackage *)packages->value(i); + // not one of the internal packages, so reload. + if (!package->isInternal()) + { + package->reload(); + } + else + { + // the only internal package is the Rexx one + package->reload(rexxPackage); + } + } +} + + +/** + * Normal live marking. + */ +void PackageManager::live(size_t liveMark) +{ + memory_mark(packages); + memory_mark(packageRoutines); + memory_mark(registeredRoutines); + memory_mark(loadedRequires); +} + +/** + * Generalized live marking. + */ +void PackageManager::liveGeneral(int reason) +{ + memory_mark_general(packages); + memory_mark_general(packageRoutines); + memory_mark_general(registeredRoutines); + memory_mark_general(loadedRequires); +} + + +/** + * Resolve a named package, dynamically loading the package + * if not already in the table. + * + * @param name The name of the library associated with this package. + * + * @return A resolved package...throws an exception if the package + * is not loadable. + */ +LibraryPackage *PackageManager::getLibrary(RexxString *name) +{ + // have we already loaded this package? + // may need to bootstrap it up first. + LibraryPackage *package = loadLibrary(name); + if (package == NULL) + { + // this is an error + reportException(Error_Execution_library, name); + } + return package; +} + + +/** + * Attempt to load a library without raising an error. Returns + * a LibraryPackage object for the library if the load was successful. + * + * @param name The target library name. + * + * @return A LibraryPackage object for the library, or OREF_NULL if was + * not resolvable. + */ +LibraryPackage *PackageManager::loadLibrary(RexxString *name) +{ + // have we already loaded this package? + // may need to bootstrap it up first. + LibraryPackage *package = (LibraryPackage *)packages->at(name); + if (package == NULL) + { + package = new LibraryPackage(name); + // add this to our package list. + packages->put((RexxObject *)package, name); + // now force the package to load. + if (!package->load()) + { + // unable to load the library, so remove this and return NULL. + packages->remove(name); + return OREF_NULL; + } + } + return package; +} + + +/** + * Create a Native method from a registered package. + * + * @param packageName + * The name of the package the library is loaded from. + * + * @param methodName The name of the procedure to resolve from the package. + * + * @return A Native method that represents this package entry. Returns + * NULL if not found. + */ +RexxNativeMethod *PackageManager::resolveMethod(RexxString *packageName, RexxString *methodName) +{ + // have we already loaded this package? + // may need to bootstrap it up first. + LibraryPackage *package = getLibrary(packageName); + + // now see if this can be resolved. + return package->resolveMethod(methodName); +} + + + +/** + * Resolve a package function activator. + * + * @param function The function name. + * @param package The package/library name. + * @param procedure Procedure name. Only used if directly loaded from a library + * file. + * + * @return A function activator for this function, if it can be + * resolved. + */ +RoutineClass *PackageManager::resolveRoutine(RexxString *function, RexxString *packageName, RexxString *procedure) +{ + // see if we have this one already + RoutineClass *func = (RoutineClass *)registeredRoutines->at(function); + + // if we have this, then we can return it directly. + if (func != OREF_NULL) + { + return func; + } + + // go register this (unconditionally....at this point, we don't care if this fails) + RexxRegisterFunctionDll(function->getStringData(), packageName->getStringData(), procedure->getStringData()); + + // resolve a registered entry, if we can and add it to the cache + return createRegisteredRoutine(function); +} + + + +/** + * Resolve a registered function. + * + * @param function The function name. + * + * @return A function activator for this function, if it can be + * resolved. + */ +RoutineClass *PackageManager::resolveRoutine(RexxString *function) +{ + // see if we have this one already as a package function + RoutineClass *func = getLoadedRoutine(function); + + // if we have this, then we can return it directly. + if (func != OREF_NULL) + { + return func; + } + + // resolve a registered entry, if we can and add it to the cache + return createRegisteredRoutine(function); +} + + + +/** + * Resolve a registered function. This goes explicitly to a + * loaded package to resolve the name rather than relying + * on the global cache. This will resolve to the same routine + * object as the global cache, but this prevents us from + * picking one a different one in case of a name conflict. + * + * @param packageName + * The package name. + * @param function The function name. + * + * @return A routine object for this function. + */ +RoutineClass *PackageManager::resolveRoutine(RexxString *packageName, RexxString *function) +{ + // have we already loaded this package? + // may need to bootstrap it up first. + LibraryPackage *package = getLibrary(packageName); + + // now see if this can be resolved. + return package->resolveRoutine(function); +} + + + +/** + * Locate an already loaded function. + * + * @param function The function name. + * + * @return A function activator for this function, if it can be + * resolved. + */ +RoutineClass *PackageManager::getLoadedRoutine(RexxString *function) +{ + // see if we have this one already as a package function + RoutineClass *func = (RoutineClass *)packageRoutines->at(function); + + // if we have this, then we can return it directly. + if (func != OREF_NULL) + { + return func; + } + + // see if we have this one already as a registered function + return (RoutineClass *)registeredRoutines->at(function); +} + + +/** + * Create a new registered function entry and add to the + * function cache. + * + * @param function + * + * @return + */ +RoutineClass *PackageManager::createRegisteredRoutine(RexxString *function) +{ + REXXPFN entry = NULL; + + // now go resolve this entry pointer + RexxResolveRoutine(function->getStringData(), &entry); + + // this is a failure + if (entry == NULL) + { + return OREF_NULL; + } + + // create a code handler and add to the cache + RoutineClass *func = new RoutineClass(function, new RegisteredRoutine(function, (RexxRoutineHandler *)entry)); + registeredRoutines->put(func, function); + // we got this + return func; +} + + + +/** + * Load an internal package into our list. This does not + * load a library, but links package routines ones already + * contained inside the interpreter. + * + * @param name Name of the package...this is probably "REXX" or "REXXUTIL". + * @param p The package descriptor with the method and function list. + */ +void PackageManager::loadInternalPackage(RexxString *name, RexxPackageEntry *p) +{ + // load up the package and add it to our cache + LibraryPackage *package = new LibraryPackage(name, p); + // have we already loaded this package? + packages->put((RexxObject *)package, name); +} + + +/** + * Add a function to the package-defined functions table. + * + * @param name The name of the function. + * @param func + */ +void PackageManager::addPackageRoutine(RexxString *name, RoutineClass *func) +{ + packageRoutines->put(func, name); +} + + +/** + * Process the basics of RxFuncAdd(). This will return true + * if the function can be resolved and is callable, false + * otherwise. If the target function is not in a loadable + * package file, this will also do the global registration. + * + * @param name The name of the registered function. + * @param module The name of the library containing the function. + * @param proc The target procedure name (ignored if the target library + * is a self-loading one). + * + * @return True if the function registration worked and the function + * is callable. False otherwise. + */ +RexxObject *PackageManager::addRegisteredRoutine(RexxString *name, RexxString *module, RexxString *proc) +{ + // make sure we're using uppercase name versions here. + name = name->upper(); + ProtectedObject p1(name); + + // see if we have this one already, either from a package or previously loaded + RoutineClass *func = getLoadedRoutine(name); + + // if we have this, then we can return it directly. + if (func != OREF_NULL) + { + return func; + } + + // see if this package is resolveable/loadable. + LibraryPackage *package = loadLibrary(module); + if (package != OREF_NULL) + { + // See if this is resolvable in this context. If we got it, + // return True. + return getLoadedRoutine(name) != OREF_NULL ? TheTrueObject : TheFalseObject; + } + + // ok, this is not a converted new-style package. Now try registering the function and + // resolving it in this process. This will also add this to the local cache + return resolveRoutine(name, module, proc) != OREF_NULL ? TheTrueObject : TheFalseObject; +} + + +/** + * Drop a registered function. + * + * @param name Name of the registered function. + * + * @return True if this was deregistered from the global table, false + * otherwise. + */ +RexxObject *PackageManager::dropRegisteredRoutine(RexxString *name) +{ + // remove this from the local cache, then remove it from the global function + // registration. + registeredRoutines->remove(name); + + // just allow this to pass through to Rexxapi. If this was truely registered + // instead of loaded implicitly, this will remove the entry. Otherwise, it will + // return false. Regardless, we leave it in our internal tables until we exit. + return RexxDeregisterFunction(name->getStringData()) ? TheTrueObject : TheFalseObject; +} + + +/** + * The query method backing RxFuncQuery(). This checks both + * our local tables and the global tables to see if something + * has been registered. + * + * @param name Target name. + * + * @return True if the external function exists in our local tables or + * in the global registry. + */ +RexxObject *PackageManager::queryRegisteredRoutine(RexxString *name) +{ + // does this name exist in our table? + if (getLoadedRoutine(name) != OREF_NULL) + { + return TheTrueObject; + } + // just allow this to pass through to Rexxapi. If this was truly registered + // instead of loaded implicitly, it will find it. + return RexxQueryFunction(name->getStringData()) ? TheTrueObject : TheFalseObject; +} + + +/** + * Unload all of the libraries loaded in this Rexx process. + */ +void PackageManager::unload() +{ + // traverse the package table, and force an unload for each library we've loaded up. + for (HashLink i = packages->first(); packages->available(i); i = packages->next(i)) + { + // get the next package + LibraryPackage *package = (LibraryPackage *)packages->value(i); + // not one of the internal packages, so reload. + if (!package->isInternal()) + { + package->unload(); + } + } +} + + +/** + * Attempt to call a native code function. This will call either + * new-style package functions or old-style registered functions. + * + * @param activity The activity we're running under. + * @param name The target name of the routine. + * @param arguments The function arguments. + * @param argcount The argument count. + * @param result The return result. + * + * @return true if we located and successfully called this function. false + * means the function is not located as a native function. + */ +bool PackageManager::callNativeRoutine(RexxActivity *activity, RexxString *name, + RexxObject **arguments, size_t argcount, ProtectedObject &result) +{ + // package functions come first + RoutineClass *function = (RoutineClass *)packageRoutines->at(name); + if (function != OREF_NULL) + { + function->call(activity, name, arguments, argcount, result); + return true; + } + + // now check for registered functions. This will either return a cached value, + // or resolve a routine for the first time and return the cached value. + function = resolveRoutine(name); + if (function != OREF_NULL) + { + function->call(activity, name, arguments, argcount, result); + return true; + } + + // not one of these + return false; +} + + +/** + * Retrieve a ::REQUIRES file. This will cache the entries so + * that the same requires entry is returned for every request. + * + * @param activity The current activity. + * @param shortName The short name of the package. + * @param resolvedName + * The fully resolved name of a potential package file. The short + * name is used for checking in the MacroSpace, the long name + * is used for file searches. + * @param result The return package routine. + * + * @return The package routine (also returned in the result protected object). + */ +PackageClass *PackageManager::loadRequires(RexxActivity *activity, RexxString *shortName, RexxString *resolvedName, ProtectedObject &result) +{ + result = OREF_NULL; + + SecurityManager *manager = activity->getEffectiveSecurityManager(); + RexxObject *securityManager = OREF_NULL; + + shortName = manager->checkRequiresAccess(shortName, securityManager); + // no return means forbidden access to this name. Just return + // nothing + if (shortName == OREF_NULL) + { + return OREF_NULL; + } + + + // first check this using the specified name. Since we need to perform checks in the + // macro space, it's possible this will be loaded under the simple name. We'll need to check + // table again using the fully resolved name afterward. + + PackageClass *package = checkRequiresCache(shortName, result); + if (package != OREF_NULL) + { + return package; + } + + unsigned short macroPosition; // a macrospace position marker + + // we need to look in the macrospace before we try checking for a file-based + // requires. The macrospace version uses the original name for all checks. Once we + // get to the file-based version, we switch to the full resolved name. + bool checkMacroSpace = RexxQueryMacro(shortName->getStringData(), ¯oPosition) == 0; + if (checkMacroSpace && (macroPosition == RXMACRO_SEARCH_BEFORE)) + { + return getMacroSpaceRequires(activity, shortName, result, securityManager); + } + + // it's possible we don't have a file version of this + if (resolvedName != OREF_NULL) + { + resolvedName = manager->checkRequiresAccess(resolvedName, securityManager); + // no return means forbidden access to this name. Just return + // nothing + if (resolvedName == OREF_NULL) + { + return OREF_NULL; + } + + + // now check again using the longer name + package = checkRequiresCache(resolvedName, result); + if (package != OREF_NULL) + { + return package; + } + + // load the file version of this. + return getRequiresFile(activity, resolvedName, securityManager, result); + } + + // do the macrospace after checks + if (checkMacroSpace) + { + return getMacroSpaceRequires(activity, shortName, result, securityManager); + } + + // nothing to return + return OREF_NULL; +} + + +/** + * Retrieve a ::REQUIRES file from the macrospace. + * + * @param activity The current activity. + * @param name The target name. + * @param result The returned Routine object for the package. + * @param securityManager + * A security manager to associated with the package. + * + * @return The located ::REQUIRES file. + */ +PackageClass *PackageManager::getMacroSpaceRequires(RexxActivity *activity, RexxString *name, ProtectedObject &result, RexxObject *securityManager) +{ + // make sure we're not stuck in a circular reference + activity->checkRequires(name); + // unflatten the method and protect it + RoutineClass *code = RexxActivation::getMacroCode(name); + PackageClass *package = code->getPackage(); + result = package; + + if (securityManager == OREF_NULL) + { + code->setSecurityManager(securityManager); + } + runRequires(activity, name, code); + + WeakReference *ref = new WeakReference(package); + loadedRequires->put(ref, name); + return package; +} + + +/** + * Retrieve a file version of a ::REQUIRES file. + * + * @param activity The current activity. + * @param name The fully resolved file name. + * @param result The return routine object. + * + * @return The return Routine instance. + */ +PackageClass *PackageManager::getRequiresFile(RexxActivity *activity, RexxString *name, RexxObject *securityManager, ProtectedObject &result) +{ + // make sure we're not stuck in a circular reference + activity->checkRequires(name); + // try to load this from a previously compiled source file or + // translate it a new if not. + RoutineClass *code = RoutineClass::fromFile(name); + + PackageClass *package = code->getPackage(); + result = package; + if (securityManager == OREF_NULL) + { + code->setSecurityManager(securityManager); + } + + runRequires(activity, name, code); + + WeakReference *ref = new WeakReference(package); + loadedRequires->put(ref, name); + return package; +} + + +/** + * Loade a requires file from an in-store source. NOTE: This + * is not cached like the other requires files + * + * @param activity The current activity. + * @param name The fully resolved file name. + * @param result The return routine object. + * + * @return The return Routine instance. + */ +PackageClass *PackageManager::loadRequires(RexxActivity *activity, RexxString *name, const char *data, size_t length, ProtectedObject &result) +{ + // first check this using the specified name. + PackageClass *resolved = checkRequiresCache(name, result); + if (resolved != OREF_NULL) + { + return resolved; + } + + RoutineClass *code = new RoutineClass(name, data, length); + PackageClass *package = code->getPackage(); + result = package; + + runRequires(activity, name, code); + + + WeakReference *ref = new WeakReference(package); + loadedRequires->put(ref, name); + return package; +} + + +/** + * Loade a requires file from an array source. NOTE: This is + * not cached like the other requires files + * + * @param activity The current activity. + * @param name The fully resolved file name. + * @param result The return routine object. + * + * @return The return Routine instance. + */ +PackageClass *PackageManager::loadRequires(RexxActivity *activity, RexxString *name, RexxArray *data, ProtectedObject &result) +{ + // first check this using the specified name. + PackageClass *resolved = checkRequiresCache(name, result); + if (resolved == OREF_NULL) + { + RoutineClass *code = new RoutineClass(name, data); + resolved = code->getPackage(); + result = resolved; + + runRequires(activity, name, code); + + WeakReference *ref = new WeakReference(resolved); + loadedRequires->put(ref, name); + } + return resolved; +} + + +/** + * Check for a package already in the requires cache. + * + * @param name The name of the target. + * + * @return The PackageClass instance, if any. + */ +PackageClass *PackageManager::checkRequiresCache(RexxString *name, ProtectedObject &result) +{ + // first check this using the specified name. Since we need to perform checks in the + // macro space, it's possible this will be loaded under the simple name. We'll need to check + // table again using the fully resolved name afterward. + WeakReference *requiresRef = (WeakReference *)loadedRequires->get(name); + if (requiresRef != OREF_NULL) + { + PackageClass *resolved = (PackageClass *)requiresRef->get(); + if (resolved != OREF_NULL) + { + result = resolved; + return resolved; + } + // this was garbage collected, remove it from the table + loadedRequires->remove(name); + } + return OREF_NULL; +} + + +/** + * Do the initial run of a ::REQUIRES file. + * + * @param activity The current activity. + * @param name The name of the requires file. + * @param code The routine instance to run. + */ +void PackageManager::runRequires(RexxActivity *activity, RexxString *name, RoutineClass *code) +{ + ProtectedObject dummy; + + // make sure we reference the circular reference stack + activity->addRunningRequires(name); + code->call(activity, name, NULL, 0, dummy); + /* No longer installing routine. */ + activity->removeRunningRequires(name); +} + + +/** + * Resolve an entry point for a package method entry (used on a + * restore or reflatten); + * + * @param name Name of the target method. + * + * @return The target entry point. + */ +PNATIVEMETHOD PackageManager::resolveMethodEntry(RexxString *packageName, RexxString *name) +{ + LibraryPackage *package = loadLibrary(packageName); + + // if no entry, something bad has gone wrong + if (package == NULL) + { + reportException(Error_Execution_library_method, name, packageName); + } + return package->resolveMethodEntry(name); +} + + +/** + * Resolve an entry point for a package function entry (used on + * a restore or reflatten); + * + * @param name Name of the target function. + * + * @return The target entry point. + */ +PNATIVEROUTINE PackageManager::resolveRoutineEntry(RexxString *packageName, RexxString *name) +{ + LibraryPackage *package = loadLibrary(packageName); + + // if no entry, something bad has gone wrong + if (package == NULL) + { + reportException(Error_Execution_library_method, name, packageName); + } + return package->resolveRoutineEntry(name); +} + + +/** + * Resolve an entry point for a package function entry (used on + * a restore or reflatten); + * + * @param name Name of the target function. + * + * @return The target entry point. + */ +PREGISTEREDROUTINE PackageManager::resolveRegisteredRoutineEntry(RexxString *packageName, RexxString *name) +{ + // if there's no package name, then this is stored in raw name form (I don't believe this should + // ever happen....but. + if (packageName == OREF_NULL) + { + REXXPFN entry = NULL; + + // now go resolve this entry pointer + RexxResolveRoutine(name->getStringData(), &entry); + + // this is a failure + if (entry == NULL) + { + reportException(Error_Execution_library_routine, name); + } + return (PREGISTEREDROUTINE)entry; + } + else + { + LibraryPackage *package = loadLibrary(packageName); + + // if no entry, something bad has gone wrong + if (package == NULL) + { + reportException(Error_Execution_library_routine, name, packageName); + } + return package->resolveRegisteredRoutineEntry(name); + } +} Copied: main/trunk/kernel/package/PackageManager.hpp (from rev 2921, main/trunk/kernel/runtime/PackageManager.hpp) =================================================================== --- main/trunk/kernel/package/PackageManager.hpp (rev 0) +++ main/trunk/kernel/package/PackageManager.hpp 2008-08-10 12:16:31 UTC (rev 2927) @@ -0,0 +1,119 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* 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... [truncated message content] |
From: <bi...@us...> - 2008-08-10 13:00:37
|
Revision: 2929 http://oorexx.svn.sourceforge.net/oorexx/?rev=2929&view=rev Author: bigrixx Date: 2008-08-10 13:00:45 +0000 (Sun, 10 Aug 2008) Log Message: ----------- move class support files Modified Paths: -------------- main/trunk/Makefile.am main/trunk/kernel/kernel.mak main/trunk/orxdb.bat Added Paths: ----------- main/trunk/kernel/classes/support/ProgramMetaData.cpp main/trunk/kernel/classes/support/ProgramMetaData.hpp main/trunk/kernel/classes/support/RexxCollection.cpp main/trunk/kernel/classes/support/RexxCollection.hpp main/trunk/kernel/classes/support/RexxCompoundElement.cpp main/trunk/kernel/classes/support/RexxCompoundElement.hpp main/trunk/kernel/classes/support/RexxCompoundTable.cpp main/trunk/kernel/classes/support/RexxCompoundTable.hpp main/trunk/kernel/classes/support/RexxCompoundTail.cpp main/trunk/kernel/classes/support/RexxCompoundTail.hpp main/trunk/kernel/classes/support/RexxDateTime.cpp main/trunk/kernel/classes/support/RexxDateTime.hpp main/trunk/kernel/classes/support/RexxHashTable.cpp main/trunk/kernel/classes/support/RexxHashTable.hpp main/trunk/kernel/classes/support/RexxListTable.cpp main/trunk/kernel/classes/support/RexxListTable.hpp main/trunk/kernel/concurrency/TranslateDispatcher.cpp main/trunk/kernel/concurrency/TranslateDispatcher.hpp main/trunk/kernel/memory/RexxSmartBuffer.cpp main/trunk/kernel/memory/RexxSmartBuffer.hpp main/trunk/kernel/memory/Setup.cpp Removed Paths: ------------- main/trunk/kernel/runtime/ProgramMetaData.cpp main/trunk/kernel/runtime/ProgramMetaData.hpp main/trunk/kernel/runtime/RexxCollection.cpp main/trunk/kernel/runtime/RexxCollection.hpp main/trunk/kernel/runtime/RexxCompoundElement.cpp main/trunk/kernel/runtime/RexxCompoundElement.hpp main/trunk/kernel/runtime/RexxCompoundTable.cpp main/trunk/kernel/runtime/RexxCompoundTable.hpp main/trunk/kernel/runtime/RexxCompoundTail.cpp main/trunk/kernel/runtime/RexxCompoundTail.hpp main/trunk/kernel/runtime/RexxDateTime.cpp main/trunk/kernel/runtime/RexxDateTime.hpp main/trunk/kernel/runtime/RexxHashTable.cpp main/trunk/kernel/runtime/RexxHashTable.hpp main/trunk/kernel/runtime/RexxListTable.cpp main/trunk/kernel/runtime/RexxListTable.hpp main/trunk/kernel/runtime/RexxSmartBuffer.cpp main/trunk/kernel/runtime/RexxSmartBuffer.hpp main/trunk/kernel/runtime/Setup.cpp main/trunk/kernel/runtime/TranslateDispatcher.cpp main/trunk/kernel/runtime/TranslateDispatcher.hpp Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-10 12:27:25 UTC (rev 2928) +++ main/trunk/Makefile.am 2008-08-10 13:00:45 UTC (rev 2929) @@ -71,6 +71,7 @@ build_kernel_common_dir = $(build_kernel_dir)/platform/common build_kernel_api_dir = $(build_kernel_dir)/api build_classes_dir = $(build_kernel_dir)/classes +build_classes_support_dir = $(build_kernel_dir)/classes/support build_expression_dir = $(build_kernel_dir)/expression build_concurrency_dir = $(build_kernel_dir)/concurrency build_behaviour_dir = $(build_kernel_dir)/behaviour @@ -131,6 +132,14 @@ $(build_messages_dir)/RexxErrorCodes.h \ $(build_messages_dir)/RexxMessageTable.h kernelApiHeaders = $(build_kernel_api_dir)/ContextApi.hpp +classesSupportHeaders = $(build_classes_support_dir)/ProgramMetaData.hpp \ + $(build_classes_support_dir)/RexxCollection.hpp \ + $(build_classes_support_dir)/RexxCompoundElement.hpp \ + $(build_classes_support_dir)/RexxCompoundTable.hpp \ + $(build_classes_support_dir)/RexxCompoundTail.hpp \ + $(build_classes_support_dir)/RexxDateTime.hpp \ + $(build_classes_support_dir)/RexxHashTable.hpp \ + $(build_classes_support_dir)/RexxListTable.hpp classesHeaders = $(build_classes_dir)/ArrayClass.hpp \ $(build_classes_dir)/BufferClass.hpp \ $(build_classes_dir)/ClassClass.hpp \ @@ -176,6 +185,7 @@ $(build_memory_dir)/ProtectedObject.hpp \ $(build_memory_dir)/RexxEnvelope.hpp \ $(build_memory_dir)/RexxInternalStack.hpp \ + $(build_memory_dir)/RexxSmartBuffer.hpp \ $(build_memory_dir)/RexxMemory.hpp executionHeaders = $(build_execution_dir)/CPPCode.hpp \ $(build_execution_dir)/RexxActivation.hpp \ @@ -198,6 +208,7 @@ $(build_concurrency_dir)/MessageDispatcher.hpp \ $(build_concurrency_dir)/RexxActivity.hpp \ $(build_concurrency_dir)/RexxStartDispatcher.hpp \ + $(build_concurrency_dir)/TranslateDispatcher.hpp instructionsHeaders = $(build_instructions_dir)/AddressInstruction.hpp \ $(build_instructions_dir)/AssignmentInstruction.hpp \ $(build_instructions_dir)/CallInstruction.hpp \ @@ -267,20 +278,10 @@ $(build_runtime_dir)/NativeFunctions.h \ $(build_runtime_dir)/NativeMethods.h \ $(build_runtime_dir)/Numerics.hpp \ - $(build_runtime_dir)/ProgramMetaData.hpp \ $(build_runtime_dir)/RexxBuiltinFunctions.h \ - $(build_runtime_dir)/RexxCollection.hpp \ - $(build_runtime_dir)/RexxCompoundElement.hpp \ - $(build_runtime_dir)/RexxCompoundTable.hpp \ - $(build_runtime_dir)/RexxCompoundTail.hpp \ $(build_runtime_dir)/RexxConstants.hpp \ $(build_runtime_dir)/RexxCore.h \ - $(build_runtime_dir)/RexxDateTime.hpp \ - $(build_runtime_dir)/RexxHashTable.hpp \ - $(build_runtime_dir)/RexxListTable.hpp \ - $(build_runtime_dir)/RexxMisc.hpp \ - $(build_runtime_dir)/RexxSmartBuffer.hpp \ - $(build_runtime_dir)/TranslateDispatcher.hpp + $(build_runtime_dir)/RexxMisc.hpp streamlibraryHeaders = $(build_streamlibrary_dir)/StreamCommandParser.h \ $(build_streamlibrary_dir)/StreamNative.hpp libHeaders = $(build_lib_dir)/RexxPlatformDefinitions.h \ @@ -435,6 +436,14 @@ $(build_kernel_api_dir)/InterpreterInstanceStubs.cpp \ $(build_kernel_api_dir)/MethodContextStubs.cpp \ $(build_kernel_api_dir)/ThreadContextStubs.cpp +classes_support_sources = $(build_classes_support_dir)/ProgramMetaData.cpp \ + $(build_classes_support_dir)/RexxCollection.cpp \ + $(build_classes_support_dir)/RexxCompoundElement.cpp \ + $(build_classes_support_dir)/RexxCompoundTable.cpp \ + $(build_classes_support_dir)/RexxCompoundTail.cpp \ + $(build_classes_support_dir)/RexxDateTime.cpp \ + $(build_classes_support_dir)/RexxHashTable.cpp \ + $(build_classes_support_dir)/RexxListTable.cpp classes_sources = $(build_classes_dir)/ArrayClass.cpp \ $(build_classes_dir)/BufferClass.cpp \ $(build_classes_dir)/ClassClass.cpp \ @@ -476,6 +485,8 @@ $(build_memory_dir)/ProtectedObject.cpp \ $(build_memory_dir)/RexxEnvelope.cpp \ $(build_memory_dir)/RexxInternalStack.cpp \ + $(build_memory_dir)/RexxSmartBuffer.cpp \ + $(build_memory_dir)/Setup.cpp \ $(build_memory_dir)/RexxMemory.cpp execution_sources = $(build_execution_dir)/CPPCode.cpp \ $(build_execution_dir)/RexxActivation.cpp \ @@ -496,7 +507,8 @@ $(build_concurrency_dir)/ExitHandler.cpp \ $(build_concurrency_dir)/MessageDispatcher.cpp \ $(build_concurrency_dir)/RexxActivity.cpp \ - $(build_concurrency_dir)/RexxStartDispatcher.cpp + $(build_concurrency_dir)/RexxStartDispatcher.cpp \ + $(build_concurrency_dir)/TranslateDispatcher.cpp expression_sources = $(build_expression_dir)/BuiltinFunctions.cpp \ $(build_expression_dir)/CommonExternalFunctions.cpp \ $(build_expression_dir)/ExpressionCompoundVariable.cpp \ @@ -582,22 +594,13 @@ $(build_runtime_dir)/Interpreter.cpp \ $(build_runtime_dir)/InterpreterInstance.cpp \ $(build_runtime_dir)/Numerics.cpp \ - $(build_runtime_dir)/ProgramMetaData.cpp \ - $(build_runtime_dir)/RexxCollection.cpp \ - $(build_runtime_dir)/RexxCompoundElement.cpp \ - $(build_runtime_dir)/RexxCompoundTable.cpp \ - $(build_runtime_dir)/RexxCompoundTail.cpp \ - $(build_runtime_dir)/RexxDateTime.cpp \ - $(build_runtime_dir)/RexxHashTable.cpp \ - $(build_runtime_dir)/RexxListTable.cpp \ $(build_runtime_dir)/RexxMisc.cpp \ - $(build_runtime_dir)/RexxSmartBuffer.cpp \ - $(build_runtime_dir)/Setup.cpp \ $(build_runtime_dir)/TranslateDispatcher.cpp \ $(build_runtime_dir)/Version.cpp streamlibrary_sources = $(build_streamlibrary_dir)/StreamCommandParser.cpp \ $(build_streamlibrary_dir)/StreamNative.cpp librexx_la_SOURCES = $(classes_sources) \ + $(classes_support_sources) \ $(kernel_api_sources) \ $(behaviour_sources) \ $(execution_sources) \ @@ -634,6 +637,7 @@ -I$(build_expression_dir) \ -I$(build_instructions_dir) \ -I$(build_classes_dir) \ + -I$(build_classes_support_dir) \ -I$(build_runtime_dir) \ -I$(build_parser_dir) \ -I$(build_messages_dir) \ @@ -863,15 +867,7 @@ -I$(build_lib_dir) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ - -I$(build_kernel_dir) \ - -I$(build_expression_dir) \ - -I$(build_classes_dir) \ - -I$(build_messages_dir) \ - -I$(build_parser_dir) \ - -I$(build_kernel_common_dir) \ - -I$(build_runtime_dir) \ - -I$(build_kernel_platform_dir) \ - -I$(build_rexxapi_platform_dir) + -I$(build_messages_dir) # # Extra libraries for librxregexp.so (maybe) # Copied: main/trunk/kernel/classes/support/ProgramMetaData.cpp (from rev 2928, main/trunk/kernel/runtime/ProgramMetaData.cpp) =================================================================== --- main/trunk/kernel/classes/support/ProgramMetaData.cpp (rev 0) +++ main/trunk/kernel/classes/support/ProgramMetaData.cpp 2008-08-10 13:00:45 UTC (rev 2929) @@ -0,0 +1,257 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + + +#include "RexxCore.h" +#include "ProgramMetaData.hpp" +#include "BufferClass.hpp" +#include "Interpreter.hpp" +#include <stdio.h> +#include <fcntl.h> + + +const char * compiledHeader = "/**/@REXX"; + + +/** + * Allocate a combined metadata object with the flattened + * program data after it. + * + * @param size The size of the object + * @param buff The appended buffer. + * + * @return The storage allocated for the new instance. + */ +void *ProgramMetaData::operator new (size_t size, RexxBuffer *buff) +{ + // allocate a new buffer for this + return SystemInterpreter::allocateResultMemory(buff->getLength() + size - sizeof(char[4])); +} + + +/** + * Initialize the meta data directly from a buffer. + * + * @param image The image buffer. + */ +ProgramMetaData::ProgramMetaData(RexxBuffer *image) +{ + // add the leading header + strcpy(fileTag, compiledHeader); + // fill in the version specifics and the hardward architecture type + magicNumber = MAGICNUMBER; + imageVersion = METAVERSION; + // this is the number of bits in a word + wordSize = Interpreter::getWordSize(); + bigEndian = Interpreter::isBigEndian(); + + RexxString *versionNumber = Interpreter::getVersionNumber(); + strncpy(rexxVersion, versionNumber->getStringData(), sizeof(rexxVersion)); + + // copy in the image information + imageSize = image->getLength(); + memcpy(imageData, image->getData(), imageSize); +} + + +/** + * Initialize program metadata for a specific size image. + * + * @param size The size of the program data. + */ +ProgramMetaData::ProgramMetaData(size_t size) +{ + // fill in the version specifics and the hardward architecture type + magicNumber = MAGICNUMBER; + imageVersion = METAVERSION; + // this is the number of bits in a word + wordSize = Interpreter::getWordSize(); + bigEndian = Interpreter::isBigEndian(); + + RexxString *versionNumber = Interpreter::getVersionNumber(); + strncpy(rexxVersion, versionNumber->getStringData(), sizeof(rexxVersion)); + + // copy in the image information + imageSize = size; +} + + +/** + * Initialized a default metadata descriptor. + */ +ProgramMetaData::ProgramMetaData() +{ + // this is for the purposes of reading in...force everything to zero. + magicNumber = 0; + imageVersion = 0; + // this is the number of bits in a word + wordSize = 0; + bigEndian = 0; + imageSize = 0; +} + + +/** + * Get the final size of a copied buffer + * + * @return The data image size. + */ +size_t ProgramMetaData::getDataSize() +{ + return imageSize + sizeof(*this) - sizeof(imageData); +} + + +/** + * Get the final size of a copied buffer + * + * @return The data image size. + */ +size_t ProgramMetaData::getHeaderSize() +{ + return (char *)&imageData - (char *)this; +} + + +/** + * Extract the following data as a RexxBuffer object. + * + * @return The extracted buffer object. + */ +RexxBuffer *ProgramMetaData::extractBufferData() +{ + return new_buffer(imageData, imageSize); +} + + +/** + * Return a pointer to the inline image data. + * + * @return The pointer to the image data following the metadata header. + */ +char *ProgramMetaData::getImageData() +{ + return imageData; +} + + +/** + * Validate that this saved program image is valid for this + * interpreter. + * + * @return true if this is good data, false otherwise. + */ +bool ProgramMetaData::validate() +{ + // we always add the compiled program tag to the front + if (strcmp(fileTag, compiledHeader) != 0) + { + return false; + } + return (magicNumber == MAGICNUMBER) && (imageVersion == METAVERSION) && (wordSize == Interpreter::getWordSize()) && + ((bigEndian != 0) == Interpreter::isBigEndian()); +} + + +/** + * Write the metadata to a file. + * + * @param handle The handle of the output file. + * @param program The program buffer data (also written out). + */ +void ProgramMetaData::write(FILE *handle, RexxBuffer *program) +{ + fwrite(this, 1, getHeaderSize(), handle); + /* and finally the flattened method */ + fwrite(program->getData(), 1, program->getLength(), handle); +} + + +/** + * Read the program meta data and the image data from a file, with + * image validation. + * + * @param handle The input file handle. + * + * @return A RexxBuffer instance containing the program data, or OREF_NULL + * if the file is not a valid image. + */ +RexxBuffer *ProgramMetaData::read(FILE *handle) +{ + // now read the control info + fread((char *)this, 1, getHeaderSize(), handle); + // validate all of the meta information + if (!validate()) + { + // if it didn't validate, it might be because we have a unix-style "hash bang" line at the + // beginning of the file. The first read in bit has a "#!", then we need to read + // beyond the first linend and try again. + if (fileTag[0] == '#' && fileTag[1] == '!') + { + // back to the start (ok, just past the hash bang) + fseek(handle, 2, SEEK_SET); + + while (true) + { + if (fread(fileTag, 1, 1, handle) <= 0) + { + fclose(handle); + return OREF_NULL; + } + // if we hit a newline, this is our stopping point. + // NB: this works with both \n and \r\n sequences. + if (fileTag[0] == '\n') + { + break; + } + // ok, try to read the control information one more time. + // if this doesn't work, no point in being pushy about it. + fread((char *)this, 1, getHeaderSize(), handle); + // validate all of the meta information + if (!validate()) + { + fclose(handle); /* close the file */ + return OREF_NULL; + } + } + } + } + RexxBuffer *buffer = new_buffer(imageSize); + fread(buffer->getData(), 1, imageSize, handle); + return buffer; +} Copied: main/trunk/kernel/classes/support/ProgramMetaData.hpp (from rev 2928, main/trunk/kernel/runtime/ProgramMetaData.hpp) =================================================================== --- main/trunk/kernel/classes/support/ProgramMetaData.hpp (rev 0) +++ main/trunk/kernel/classes/support/ProgramMetaData.hpp 2008-08-10 13:00:45 UTC (rev 2929) @@ -0,0 +1,81 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +#ifndef ProgramMetaData_Included +#define ProgramMetaData_Included + +#include "SystemInterpreter.hpp" + +class RexxBuffer; + +class ProgramMetaData +{ +public: + void *operator new (size_t size, RexxBuffer *buff); + void operator delete (void *p, RexxBuffer *buff) { SystemInterpreter::releaseResultMemory(p); } + + ProgramMetaData(); + ProgramMetaData(RexxBuffer *); + ProgramMetaData(size_t size); + + size_t getDataSize(); + size_t getHeaderSize(); + RexxBuffer *extractBufferData(); + char *getImageData(); + bool validate(); + void write(FILE *handle, RexxBuffer *program); + RexxBuffer *read(FILE *handle); + +protected: + enum + { + MAGICNUMBER = 11111, // remains constant from release-to-release + METAVERSION = 40 // gets updated when internal form changes + }; + + + char fileTag[16]; // special header for file tagging + unsigned short magicNumber; // special tag to indicate good meta data + unsigned short imageVersion; // version identifier for validity + unsigned short wordSize; // size of a word + unsigned short bigEndian; // true if this is a big-endian platform + char rexxVersion[40]; // Rexx version string info + size_t imageSize; // size of the image + char imageData[4]; // the copied image data +}; + +#endif Copied: main/trunk/kernel/classes/support/RexxCollection.cpp (from rev 2928, main/trunk/kernel/runtime/RexxCollection.cpp) =================================================================== --- main/trunk/kernel/classes/support/RexxCollection.cpp (rev 0) +++ main/trunk/kernel/classes/support/RexxCollection.cpp 2008-08-10 13:00:45 UTC (rev 2929) @@ -0,0 +1,398 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/******************************************************************************/ +/* REXX Kernel RexxCollection.cpp */ +/* */ +/* Primitive HashTableCollection Class */ +/* */ +/******************************************************************************/ + +#include "RexxCore.h" +#include "RexxCollection.hpp" +#include "StringClass.hpp" +#include "ArrayClass.hpp" +#include "DirectoryClass.hpp" +#include "Interpreter.hpp" + +void RexxHashTableCollection::live(size_t liveMark) +/******************************************************************************/ +/* Function: Normal garbage collection live marking */ +/******************************************************************************/ +{ + memory_mark(this->contents); + memory_mark(this->objectVariables); +} + +void RexxHashTableCollection::liveGeneral(int reason) +/******************************************************************************/ +/* Function: Generalized object marking */ +/******************************************************************************/ +{ + memory_mark_general(this->contents); + memory_mark_general(this->objectVariables); +} + +void RexxHashTableCollection::flatten(RexxEnvelope *envelope) +/******************************************************************************/ +/* Function: Flatten an object */ +/******************************************************************************/ +{ + setUpFlatten(RexxHashTableCollection) + + flatten_reference(newThis->contents, envelope); + flatten_reference(newThis->objectVariables, envelope); + + cleanUpFlatten +} + +RexxObject *RexxHashTableCollection::unflatten(RexxEnvelope *envelope) +/******************************************************************************/ +/* Function: unflatten an object */ +/******************************************************************************/ +{ + envelope->addTable(this); + return this; +} + +RexxObject *RexxHashTableCollection::makeProxy(RexxEnvelope *envelope) +/******************************************************************************/ +/* Function: Create a proxy object for a standard collection */ +/******************************************************************************/ +{ + /* Determine which special object */ + /* this is and compute code for it. */ + if (this == TheEnvironment) /* the environment directory */ + { + return new_proxy(CHAR_ENVIRONMENT); + } + else if (this == TheKernel) /* the kernel directory */ + { + return new_proxy(CHAR_KERNEL); + } + else if (this == TheSystem) /* the system directory */ + { + return new_proxy(CHAR_SYSTEM); + } + else + { + Interpreter::logicError("Don't know how to generate a proxy object for an object"); + } + return OREF_NULL; +} + + +RexxObject *RexxHashTableCollection::copy(void) +/******************************************************************************/ +/* Function: Copy a hash based collection object */ +/******************************************************************************/ +{ + /* make a copy of ourself (this also */ + /* copies the object variables */ + RexxHashTableCollection *newObj = (RexxHashTableCollection *)this->RexxObject::copy(); + /* We copy the Hash table as well */ + OrefSet(newObj, newObj->contents, (RexxHashTable *)this->contents->copy()); + return newObj; /* return the new object */ +} + +RexxArray *RexxHashTableCollection::makeArray(void) +/******************************************************************************/ +/* Function: Return all of the collection indices in an array */ +/******************************************************************************/ +{ + return this->contents->makeArray(); +} + +RexxObject *RexxHashTableCollection::mergeItem(RexxObject *_value, RexxObject *_index) +/******************************************************************************/ +/* Arguments: Value, index */ +/* */ +/* Returned: Nothing */ +/******************************************************************************/ +{ + // put this in with duplicate protection + RexxHashTable *newHash = this->contents->putNodupe(_value, _index); + // the put can expand, so protect against that + if (newHash != OREF_NULL) + { + OrefSet(this, this->contents, newHash); + } + return OREF_NULL; +} + +RexxObject *RexxHashTableCollection::removeRexx( + RexxObject *_index) /* removed item index */ +/******************************************************************************/ +/* Arguments: Index */ +/* */ +/* Returned: Value, or null if no entry found */ +/******************************************************************************/ +{ + required_arg(_index, ONE); /* make sure we have an index */ + + RexxObject *RemovedItem = this->remove(_index); /* remove the item */ + if (RemovedItem == OREF_NULL) /* If nothing found, give back .nil */ + { + /* (never return OREF_NULL to REXX) */ + RemovedItem = (RexxObject *)TheNilObject; + } + return RemovedItem; /* return removed value */ +} + +RexxObject *RexxHashTableCollection::allAt( + RexxObject *_index) /* target index */ +/******************************************************************************/ +/* Arguments: Index */ +/* */ +/* Returned: Array of all values with the same index */ +/******************************************************************************/ +{ + required_arg(_index, ONE); /* make sure we have an index */ + /* do the get */ + return this->contents->getAll(_index); +} + +RexxObject *RexxHashTableCollection::getRexx( + RexxObject *_index) /* target index */ +/******************************************************************************/ +/* Arguments: Index */ +/* */ +/* Returned: Associated value, or nil if index not found */ +/******************************************************************************/ +{ + required_arg(_index, ONE); /* make sure we have an index */ + RexxObject *object = this->get(_index); /* get the item */ + if (object == OREF_NULL) /* If nothing found, give back .nil */ + { + object = TheNilObject; /* (never return OREF_NULL to REXX) */ + } + return object; /* return the item */ +} + +RexxObject *RexxHashTableCollection::put( + RexxObject *_value, /* value to insert */ + RexxObject *_index) /* item index */ +/******************************************************************************/ +/* Arguments: Value, index */ +/* */ +/* Returned: Nothing */ +/******************************************************************************/ +{ + required_arg(_value, ONE); /* make sure we have an value */ + required_arg(_index, TWO); /* make sure we have an index */ + /* try to place in existing hashtab */ + RexxHashTable *newHash = this->contents->put(_value, _index); + if (newHash != OREF_NULL) /* have a reallocation occur? */ + { + /* hook on the new hash table */ + OrefSet(this, this->contents, newHash); + } + return OREF_NULL; /* always return nothing */ +} + +RexxObject *RexxHashTableCollection::add( + RexxObject *_value, /* object to add */ + RexxObject *_index) /* added index */ +/******************************************************************************/ +/* Arguments: Value, index */ +/* */ +/* Returned: Nothing */ +/******************************************************************************/ +{ + required_arg(_value, ONE); /* make sure we have an value */ + required_arg(_index, TWO); /* make sure we have an index */ + /* try to place in existing hashtab */ + RexxHashTable *newHash = this->contents->add(_value, _index); + if (newHash != OREF_NULL) /* have a reallocation occur? */ + { + /* hook on the new hash table */ + OrefSet(this, this->contents, newHash); + } + return OREF_NULL; /* always return nothing */ +} + +RexxObject *RexxHashTableCollection::merge( + RexxHashTableCollection * target) /* merge "partner" collection */ +/******************************************************************************/ +/* Function: Merge a hash table collection into another similar collection. */ +/******************************************************************************/ +{ + return this->contents->merge(target); +} + + +RexxObject *RexxHashTableCollection::copyValues( + int depth) /* depth to propagate the copy to */ +/******************************************************************************/ +/* Arguments: Recursion depth */ +/* */ +/* Returned: Nothing */ +/******************************************************************************/ +{ + /* Get hash table. */ + RexxHashTable *hashTable = this->contents; + /* For all indices. */ + for (HashLink i = hashTable->first(); i < hashTable->totalSlotsSize(); i = hashTable->next(i)) + { + RexxObject *_value = hashTable->value(i); /* Get this value */ + RexxObject *valueCopy = _value->copy(); /* make a copy. */ + hashTable->replace(valueCopy, i); /* Replace original w/ copy */ + if (depth > 1) /* gone depth requested. */ + /* nope, copy these values */ + ((RexxHashTableCollection *)valueCopy)->copyValues(depth-1); + } + + return OREF_NULL; +} + +RexxObject *RexxHashTableCollection::hasIndex( + RexxObject *_index) /* requested index */ +/******************************************************************************/ +/* Arguments: Index */ +/* */ +/* Returned: True if table has an entry for the index, false otherwise */ +/******************************************************************************/ +{ + required_arg(_index, ONE); /* make sure we have an index */ + /* try to get the item */ + RexxObject *_value = this->contents->get(_index); + /* tell caller if we succeeded */ + return(_value != OREF_NULL) ? (RexxObject *)TheTrueObject : (RexxObject *)TheFalseObject; +} + + +/** + * Retrieve an index for a given item. Which index is returned + * is indeterminate. + * + * @param target The target object. + * + * @return The index for the target object, or .nil if no object was + * found. + */ +RexxObject *RexxHashTableCollection::indexRexx(RexxObject *target) +{ + // required argument + required_arg(target, ONE); + // retrieve this from the hash table + RexxObject *result = this->contents->getIndex(target); + // not found, return .nil + if (result == OREF_NULL) + { + return TheNilObject; + } + return result; +} + + +/** + * Remove an item specified by value. + * + * @param target The target object. + * + * @return The target object again. + */ +RexxObject *RexxHashTableCollection::removeItem(RexxObject *target) +{ + // required argument + required_arg(target, ONE); + // the contents handle all of this. + return this->contents->removeItem(target); +} + + +/** + * Test if a given item exists in the collection. + * + * @param target The target object. + * + * @return .true if the object exists, .false otherwise. + */ +RexxObject *RexxHashTableCollection::hasItem(RexxObject *target) +{ + required_arg(target, ONE); + return this->contents->hasItem(target); +} + + +RexxSupplier *RexxHashTableCollection::supplier() +/******************************************************************************/ +/* Function: create a table supplier */ +/******************************************************************************/ +{ + /* 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(); +} + + +/** + * Empty a hash table collection. + * + * @return nothing + */ +RexxObject *RexxHashTableCollection::empty() +{ + contents->empty(); + return OREF_NULL; +} + + +/** + * Test if a HashTableCollection is empty. + * + * @return + */ +RexxObject *RexxHashTableCollection::isEmpty() +{ + return contents->isEmpty() ? TheTrueObject : TheFalseObject; +} Copied: main/trunk/kernel/classes/support/RexxCollection.hpp (from rev 2928, main/trunk/kernel/runtime/RexxCollection.hpp) =================================================================== --- main/trunk/kernel/classes/support/RexxCollection.hpp (rev 0) +++ main/trunk/kernel/classes/support/RexxCollection.hpp 2008-08-10 13:00:45 UTC (rev 2929) @@ -0,0 +1,89 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/******************************************************************************/ +/* REXX Kernel RexxCollection.hpp */ +/* */ +/* Primitive HashTableCollection Class */ +/* */ +/******************************************************************************/ +#ifndef Included_RexxHashTableCollection +#define Included_RexxHashTableCollection + +#include "RexxHashTable.hpp" + + class RexxHashTableCollection : public RexxObject { + public: + void live(size_t); + void liveGeneral(int reason); + void flatten(RexxEnvelope *); + RexxObject * unflatten(RexxEnvelope *); + RexxObject * makeProxy(RexxEnvelope *); + RexxObject * copy(); + RexxArray * makeArray(); + + virtual RexxObject *mergeItem(RexxObject *, RexxObject *); + + RexxObject *copyValues(int depth); + RexxObject *removeRexx(RexxObject *); + RexxObject *getRexx(RexxObject *); + RexxObject *put(RexxObject *, RexxObject *); + RexxObject *add(RexxObject *, RexxObject *); + RexxObject *allAt(RexxObject *); + RexxObject *hasItem(RexxObject *); + RexxObject *hasIndex(RexxObject *); + RexxObject *indexRexx(RexxObject * value); + RexxSupplier *supplier(); + RexxObject *merge(RexxHashTableCollection *); + RexxArray *allItems(); + RexxArray *allIndexes(); + RexxObject *empty(); + RexxObject *isEmpty(); + RexxObject *removeItem(RexxObject *value); + + inline HashLink items() { return this->contents->totalEntries(); }; + inline HashLink first() { return this->contents->first(); }; + inline HashLink next(HashLink pos) { return this->contents->next(pos);}; + inline RexxObject *value(HashLink pos) {return this->contents->value(pos); }; + inline RexxObject *index(HashLink pos) {return this->contents->index(pos); }; + inline bool available(HashLink pos) {return this->contents->available(pos); }; + inline RexxObject *remove(RexxObject *key) {return this->contents->remove(key); }; + inline RexxObject *get(RexxObject *key) {return this->contents->get(key); }; + + RexxHashTable *contents; /* collection associated hash table */ + }; + #endif Copied: main/trunk/kernel/classes/support/RexxCompoundElement.cpp (from rev 2928, main/trunk/kernel/runtime/RexxCompoundElement.cpp) =================================================================== --- main/trunk/kernel/classes/support/RexxCompoundElement.cpp (rev 0) +++ main/trunk/kernel/classes/support/RexxCompoundElement.cpp 2008-08-10 13:00:45 UTC (rev 2929) @@ -0,0 +1,106 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/****************************************************************************/ +/* REXX Kernel RexxCompoundElement.cpp */ +/* */ +/* Primitive Compound Variable Element Class */ +/* */ +/****************************************************************************/ +#include "RexxCore.h" +#include "RexxCompoundElement.hpp" +#include "RexxActivity.hpp" + +void RexxCompoundElement::live(size_t liveMark) +/******************************************************************************/ +/* Function: Normal garbage collection live marking */ +/******************************************************************************/ +{ + memory_mark(this->variableValue); + memory_mark(this->variable_name); + memory_mark(this->dependents); + memory_mark(this->parent); + memory_mark(this->left); + memory_mark(this->right); + memory_mark(this->real_element); +} + +void RexxCompoundElement::liveGeneral(int reason) +/******************************************************************************/ +/* Function: Normal garbage collection live marking */ +/******************************************************************************/ +{ + memory_mark_general(this->variableValue); + memory_mark_general(this->variable_name); + memory_mark_general(this->dependents); + memory_mark_general(this->parent); + memory_mark_general(this->left); + memory_mark_general(this->right); + memory_mark_general(this->real_element); +} + +void RexxCompoundElement::flatten(RexxEnvelope *envelope) +/******************************************************************************/ +/* Function: Flatten an object */ +/******************************************************************************/ +{ + setUpFlatten(RexxCompoundElement) + + flatten_reference(newThis->variableValue, envelope); + flatten_reference(newThis->variable_name, envelope); + flatten_reference(newThis->dependents, envelope); + flatten_reference(newThis->parent, envelope); + flatten_reference(newThis->left, envelope); + flatten_reference(newThis->right, envelope); + flatten_reference(newThis->real_element, envelope); + + cleanUpFlatten +} + + +RexxCompoundElement *RexxCompoundElement::newInstance( + RexxString *name) /* the name of the variable */ +/****************************************************************************/ +/* Function: Create a new REXX compound variable object */ +/****************************************************************************/ +{ + /* Get new object */ + RexxCompoundElement *newObj = (RexxCompoundElement *)new_object(sizeof(RexxCompoundElement), T_CompoundElement); + newObj->clearObject(); /* clear everything out */ + newObj->variable_name = name; /* fill in the name */ + return newObj; /* return the new object */ +} Copied: main/trunk/kernel/classes/support/RexxCompoundElement.hpp (from rev 2928, main/trunk/kernel/runtime/RexxCompoundElement.hpp) =================================================================== --- main/trunk/kernel/classes/support/RexxCompoundElement.hpp (rev 0) +++ main/trunk/kernel/classes/support/RexxCompoundElement.hpp 2008-08-10 13:00:45 UTC (rev 2929) @@ -0,0 +1,86 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/******************************************************************************/ +/* REXX Kernel RexxCompoundElement.hpp */ +/* ... [truncated message content] |
From: <bi...@us...> - 2008-08-10 13:19:51
|
Revision: 2931 http://oorexx.svn.sourceforge.net/oorexx/?rev=2931&view=rev Author: bigrixx Date: 2008-08-10 13:20:01 +0000 (Sun, 10 Aug 2008) Log Message: ----------- staging commit of kernel dir rename Modified Paths: -------------- main/trunk/orxdb.bat main/trunk/platform/windows/buildorx.bat Added Paths: ----------- main/trunk/interpreter/ Removed Paths: ------------- main/trunk/kernel/ Modified: main/trunk/orxdb.bat =================================================================== --- main/trunk/orxdb.bat 2008-08-10 13:10:06 UTC (rev 2930) +++ main/trunk/orxdb.bat 2008-08-10 13:20:01 UTC (rev 2931) @@ -79,8 +79,8 @@ set OR_LIBSRC=%SRC_DRV%%SRC_DIR%\lib set OR_APISRC=%SRC_DRV%%SRC_DIR%\api set OR_APIWINSRC=%SRC_DRV%%SRC_DIR%\api\platform\windows -set OR_INTERPRETER_SRC=%SRC_DRV%%SRC_DIR%\kernel -set OR_MESSAGESRC=%SRC_DRV%%SRC_DIR%\kernel\messages +set OR_INTERPRETER_SRC=%SRC_DRV%%SRC_DIR%\interpreter +set OR_MESSAGESRC=%SRC_DRV%%SRC_DIR%\interpreter\messages set OR_WINKERNELSRC=%SRC_DRV%%SRC_DIR%\platform\windows set OR_REXXAPISRC=%SRC_DRV%%SRC_DIR%\rexxapi set OR_OODIALOGSRC=%SRC_DRV%%SRC_DIR%\platform\windows\oodialog @@ -110,17 +110,17 @@ set INT_PLATFORM=%INTERPRETER%\platform\windows set STREAM=%INTERPRETER%\streamLibrary -set OR_KERNELPATH=%INTERPRETER%;%INTERPRETER_CLASSES%;%CLASSES_SUPPORT%;%INTERPRETER_RUNTIME%;%BEHAVIOUR%;%CONCURRENCY%;%EXECUTION%;%MEMORY%;%PACKAGE%;%INSTRUCTIONS%;%PARSER%;%KPLATFORM%;%INT_PLATFORM%;%STREAM%;%INTERPRETER_MESSAGES -set OR_KERNELINCL=-I%INTERPRETER%\ -I%INTERPRETER_CLASSES%\ -I%CLASSES_SUPPORT%\ -I%INTERPRETER_RUNTIME%\ -I%BEHAVIOUR%\ -I%CONCURRENCY%\ -I%EXECUTION%\ -I%MEMORY%\ -I%PACKAGE%\ -I%EXPRESSIONS%\ -I%INSTRUCTIONS%\ -I%PARSER%\ -I%INT_PLATFORM%\ -I%STREAM%\ -I%INTERPRETER_MESSAGES%\ +set OR_INTERPRETERPATH=%INTERPRETER%;%INTERPRETER_CLASSES%;%CLASSES_SUPPORT%;%INTERPRETER_RUNTIME%;%BEHAVIOUR%;%CONCURRENCY%;%EXECUTION%;%MEMORY%;%PACKAGE%;%INSTRUCTIONS%;%PARSER%;%KPLATFORM%;%INT_PLATFORM%;%STREAM%;%INTERPRETER_MESSAGES +set OR_INTERPRETERINCL=-I%INTERPRETER%\ -I%INTERPRETER_CLASSES%\ -I%CLASSES_SUPPORT%\ -I%INTERPRETER_RUNTIME%\ -I%BEHAVIOUR%\ -I%CONCURRENCY%\ -I%EXECUTION%\ -I%MEMORY%\ -I%PACKAGE%\ -I%EXPRESSIONS%\ -I%INSTRUCTIONS%\ -I%PARSER%\ -I%INT_PLATFORM%\ -I%STREAM%\ -I%INTERPRETER_MESSAGES%\ REM REM set up the directory search orders for the source include files REM -set OR_ORYXINCL=-I%OR_LIBSRC%\ -I%OR_COMMONSRC%\ -I%OR_COMMONPLATFORMSRC%\ -I%OR_APISRC%\ -I%OR_APIWINSRC%\ %OR_KERNELINCL% -I%OR_WINKERNELSRC%\ -I%XPLATFORM% -I%OR_OODIALOGSRC%\ -I%OR_ORYXFSRC%\ -I%OR_OLEOBJECTSRC%\ -I%OR_ORXSCRIPTSRC%\ -I%OR_MESSAGESRC%\ +set OR_ORYXINCL=-I%OR_LIBSRC%\ -I%OR_COMMONSRC%\ -I%OR_COMMONPLATFORMSRC%\ -I%OR_APISRC%\ -I%OR_APIWINSRC%\ %OR_INTERPRETERINCL% -I%OR_WINKERNELSRC%\ -I%XPLATFORM% -I%OR_OODIALOGSRC%\ -I%OR_ORYXFSRC%\ -I%OR_OLEOBJECTSRC%\ -I%OR_ORXSCRIPTSRC%\ -I%OR_MESSAGESRC%\ set OR_ORYXRCINCL=-I%INTERPRETER_MESSAGES% REM REM set up the search order for the dependency list REM -set OR_SP={%OR_KERNELPATH%;%OR_LIBSRC%;%OR_APISRC;%OR_APIWINSRC;%OR_WINKERNELSRC%;} +set OR_SP={%OR_INTERPRETERPATH%;%OR_LIBSRC%;%OR_APISRC;%OR_APIWINSRC;%OR_WINKERNELSRC%;} REM REM set up the search order for the api samples REM Modified: main/trunk/platform/windows/buildorx.bat =================================================================== --- main/trunk/platform/windows/buildorx.bat 2008-08-10 13:10:06 UTC (rev 2930) +++ main/trunk/platform/windows/buildorx.bat 2008-08-10 13:20:01 UTC (rev 2931) @@ -63,11 +63,11 @@ if ERRORLEVEL 1 goto error REM -REM *** Kernel +REM *** Interpreter REM -@ECHO Building Kernel.... +@ECHO Building Interpreter.... CD %OR_INTERPRETER_SRC% -IF %USELOGFILE% equ 1 ( NMAKE /F KERNEL.MAK >>%OR_ERRLOG% 2>&1 ) else ( NMAKE /F KERNEL.MAK ) +IF %USELOGFILE% equ 1 ( NMAKE /F INTERPRETER.MAK >>%OR_ERRLOG% 2>&1 ) else ( NMAKE /F INTERPRETER.MAK ) if ERRORLEVEL 1 goto error REM *** orexxole @@ -89,7 +89,7 @@ REM -REM *** These are the commmand lanuchers, need the kernel and rexxapi +REM *** These are the commmand lanuchers, need the interpreter and rexxapi REM @ECHO Building Command launchers CD %OR_WINKERNELSRC% This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-10 13:29:47
|
Revision: 2932 http://oorexx.svn.sourceforge.net/oorexx/?rev=2932&view=rev Author: bigrixx Date: 2008-08-10 13:29:57 +0000 (Sun, 10 Aug 2008) Log Message: ----------- final commit of kernel rename Modified Paths: -------------- main/trunk/Makefile.am Added Paths: ----------- main/trunk/interpreter/interpreter.mak Removed Paths: ------------- main/trunk/interpreter/kernel.mak Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-10 13:20:01 UTC (rev 2931) +++ main/trunk/Makefile.am 2008-08-10 13:29:57 UTC (rev 2932) @@ -67,33 +67,33 @@ build_rexxapi_common_platform_dir = $(build_rexxapi_dir)/common/platform/unix build_common_dir = $(top_srcdir)/common build_common_platform_dir = $(top_srcdir)/common/platform/unix -build_kernel_dir = $(top_srcdir)/kernel -build_kernel_common_dir = $(build_kernel_dir)/platform/common -build_kernel_api_dir = $(build_kernel_dir)/api -build_classes_dir = $(build_kernel_dir)/classes -build_classes_support_dir = $(build_kernel_dir)/classes/support -build_expression_dir = $(build_kernel_dir)/expression -build_concurrency_dir = $(build_kernel_dir)/concurrency -build_behaviour_dir = $(build_kernel_dir)/behaviour -build_execution_dir = $(build_kernel_dir)/execution -build_memory_dir = $(build_kernel_dir)/memory -build_package_dir = $(build_kernel_dir)/package -build_instructions_dir = $(build_kernel_dir)/instructions -build_parser_dir = $(build_kernel_dir)/parser -build_runtime_dir = $(build_kernel_dir)/runtime -build_streamlibrary_dir = $(build_kernel_dir)/streamLibrary -build_messages_dir = $(build_kernel_dir)/messages +build_interpreter_dir = $(top_srcdir)/interpreter +build_interpreter_common_dir = $(build_interpreter_dir)/platform/common +build_interpreter_api_dir = $(build_interpreter_dir)/api +build_classes_dir = $(build_interpreter_dir)/classes +build_classes_support_dir = $(build_interpreter_dir)/classes/support +build_expression_dir = $(build_interpreter_dir)/expression +build_concurrency_dir = $(build_interpreter_dir)/concurrency +build_behaviour_dir = $(build_interpreter_dir)/behaviour +build_execution_dir = $(build_interpreter_dir)/execution +build_memory_dir = $(build_interpreter_dir)/memory +build_package_dir = $(build_interpreter_dir)/package +build_instructions_dir = $(build_interpreter_dir)/instructions +build_parser_dir = $(build_interpreter_dir)/parser +build_runtime_dir = $(build_interpreter_dir)/runtime +build_streamlibrary_dir = $(build_interpreter_dir)/streamLibrary +build_messages_dir = $(build_interpreter_dir)/messages build_lib_dir = $(top_srcdir)/lib build_api_dir = $(top_srcdir)/api build_rexutils_dir = $(top_srcdir)/rexutils build_rxregexp_dir = $(top_srcdir)/rxregexp build_samples_dir = $(top_srcdir)/samples -build_rexxclasses_dir = $(build_kernel_dir)/RexxClasses +build_rexxclasses_dir = $(build_interpreter_dir)/RexxClasses build_utilities_dir = $(top_srcdir)/utilities # These are the *nix directories utils_unix_dir = $(build_utils_dir)/unix -kernel_unix_dir = $(build_kernel_dir)/platform/unix +interpreter_unix_dir = $(build_interpreter_dir)/platform/unix api_unix_dir = $(build_api_dir)/platform/unix rexutils_unix_dir = $(build_rexutils_dir)/unix samples_unix_dir = $(build_samples_dir)/unix @@ -101,7 +101,7 @@ # These are the Windows directories utils_windows_dir = $(build_utils_dir)/windows rexxapi_windows_dir = $(build_rexxapi_dir)/windows -kernel_windows_dir = $(build_kernel_dir)/platform/windows +interpreter_windows_dir = $(build_interpreter_dir)/platform/windows api_windows_dir = $(build_api_dir)/platform/windows rexutils_windows_dir = $(build_rexutils_dir)/windows samples_windows_dir = $(build_samples_dir)/windows @@ -109,7 +109,7 @@ # These are the platform specific build directories build_utils_platform_dir = $(utils_@ORX_PLATFORM@_dir) build_rexxapi_platform_dir = $(rexxapi_@ORX_PLATFORM@_dir) -build_kernel_platform_dir = $(kernel_@ORX_PLATFORM@_dir) +build_interpreter_platform_dir = $(interpreter_@ORX_PLATFORM@_dir) build_api_platform_dir = $(api_@ORX_PLATFORM@_dir) build_rexutils_platform_dir = $(rexutils_@ORX_PLATFORM@_dir) build_samples_platform_dir = $(samples_@ORX_PLATFORM@_dir) @@ -131,7 +131,7 @@ errorHeaders = $(build_messages_dir)/RexxMessageNumbers.h \ $(build_messages_dir)/RexxErrorCodes.h \ $(build_messages_dir)/RexxMessageTable.h -kernelApiHeaders = $(build_kernel_api_dir)/ContextApi.hpp +interpreterApiHeaders = $(build_interpreter_api_dir)/ContextApi.hpp classesSupportHeaders = $(build_classes_support_dir)/ProgramMetaData.hpp \ $(build_classes_support_dir)/RexxCollection.hpp \ $(build_classes_support_dir)/RexxCompoundElement.hpp \ @@ -255,16 +255,16 @@ $(build_parser_dir)/SourceFile.hpp \ $(build_parser_dir)/SourceLocation.hpp \ $(build_parser_dir)/Token.hpp -platformHeaders = $(build_kernel_platform_dir)/APIDefinitions.h \ - $(build_kernel_platform_dir)/PlatformDefinitions.h \ - $(build_kernel_platform_dir)/SharedMemorySupport.h \ - $(build_kernel_platform_dir)/SysActivity.hpp \ - $(build_kernel_platform_dir)/SysFileSystem.hpp \ - $(build_kernel_platform_dir)/SysInterpreterInstance.hpp \ - $(build_kernel_platform_dir)/SysNativeFunctions.h \ - $(build_kernel_platform_dir)/SysNativeMethods.h \ - $(build_kernel_platform_dir)/SystemCommands.h \ - $(build_kernel_platform_dir)/SystemInterpreter.hpp +platformHeaders = $(build_interpreter_platform_dir)/APIDefinitions.h \ + $(build_interpreter_platform_dir)/PlatformDefinitions.h \ + $(build_interpreter_platform_dir)/SharedMemorySupport.h \ + $(build_interpreter_platform_dir)/SysActivity.hpp \ + $(build_interpreter_platform_dir)/SysFileSystem.hpp \ + $(build_interpreter_platform_dir)/SysInterpreterInstance.hpp \ + $(build_interpreter_platform_dir)/SysNativeFunctions.h \ + $(build_interpreter_platform_dir)/SysNativeMethods.h \ + $(build_interpreter_platform_dir)/SystemCommands.h \ + $(build_interpreter_platform_dir)/SystemInterpreter.hpp commonHeaders = $(build_common_dir)/SynchronizedBlock.hpp \ $(build_common_dir)/Utilities.hpp \ $(build_common_platform_dir)/SysFile.hpp \ @@ -317,7 +317,7 @@ $(build_rexutils_dir)/*.exp \ $(build_rexxapi_dir)/*.exp \ $(build_rxregexp_dir)/*.exp -windowsDefFiles = $(kernel_windows_dir)/*.def \ +windowsDefFiles = $(interpreter_windows_dir)/*.def \ $(build_lib_dir)/*.def \ $(build_rexutils_dir)/*.def \ $(build_rxregexp_dir)/*.def @@ -337,12 +337,12 @@ $(top_srcdir)/orxdb.bat \ $(top_srcdir)/windows-build.txt \ $(build_lib_dir)/*.mak \ - $(kernel_windows_dir)/*.cpp \ - $(kernel_windows_dir)/*.h \ - $(kernel_windows_dir)/*.rc \ - $(kernel_windows_dir)/*.xsl \ - $(kernel_windows_dir)/*.orx \ - $(build_kernel_dir)/*.mak \ + $(interpreter_windows_dir)/*.cpp \ + $(interpreter_windows_dir)/*.h \ + $(interpreter_windows_dir)/*.rc \ + $(interpreter_windows_dir)/*.xsl \ + $(interpreter_windows_dir)/*.orx \ + $(build_interpreter_dir)/*.mak \ $(build_rexxapi_dir)/*.mak \ $(build_rexutils_dir)/*.mak \ $(build_rxregexp_dir)/*.mak \ @@ -431,11 +431,11 @@ #################### librexx.so ########################## # Sources for librexx.so # -kernel_api_sources = $(build_kernel_api_dir)/CallContextStubs.cpp \ - $(build_kernel_api_dir)/InterpreterAPI.cpp \ - $(build_kernel_api_dir)/InterpreterInstanceStubs.cpp \ - $(build_kernel_api_dir)/MethodContextStubs.cpp \ - $(build_kernel_api_dir)/ThreadContextStubs.cpp +interpreter_api_sources = $(build_interpreter_api_dir)/CallContextStubs.cpp \ + $(build_interpreter_api_dir)/InterpreterAPI.cpp \ + $(build_interpreter_api_dir)/InterpreterInstanceStubs.cpp \ + $(build_interpreter_api_dir)/MethodContextStubs.cpp \ + $(build_interpreter_api_dir)/ThreadContextStubs.cpp classes_support_sources = $(build_classes_support_dir)/ProgramMetaData.cpp \ $(build_classes_support_dir)/RexxCollection.cpp \ $(build_classes_support_dir)/RexxCompoundElement.cpp \ @@ -568,21 +568,21 @@ $(build_parser_dir)/Scanner.cpp \ $(build_parser_dir)/SourceFile.cpp \ $(build_parser_dir)/Token.cpp -platform_sources = $(build_kernel_platform_dir)/ErrorMessages.cpp \ - $(build_kernel_platform_dir)/ExternalFunctions.cpp \ - $(build_kernel_platform_dir)/FileSystem.cpp \ - $(build_kernel_platform_dir)/MemorySupport.cpp \ - $(build_kernel_platform_dir)/MiscSystem.cpp \ - $(build_kernel_platform_dir)/RexxMain.cpp \ - $(build_kernel_platform_dir)/SysActivity.cpp \ - $(build_kernel_platform_dir)/SysFileSystem.cpp \ - $(build_kernel_platform_dir)/SysInterpreterInstance.cpp \ - $(build_kernel_platform_dir)/SystemCommands.cpp \ - $(build_kernel_platform_dir)/SystemInitialization.cpp \ - $(build_kernel_platform_dir)/SystemInterpreter.cpp \ - $(build_kernel_platform_dir)/TimeSupport.cpp \ - $(build_kernel_platform_dir)/UseridFunction.cpp \ - $(build_kernel_platform_dir)/ValueFunction.cpp +platform_sources = $(build_interpreter_platform_dir)/ErrorMessages.cpp \ + $(build_interpreter_platform_dir)/ExternalFunctions.cpp \ + $(build_interpreter_platform_dir)/FileSystem.cpp \ + $(build_interpreter_platform_dir)/MemorySupport.cpp \ + $(build_interpreter_platform_dir)/MiscSystem.cpp \ + $(build_interpreter_platform_dir)/RexxMain.cpp \ + $(build_interpreter_platform_dir)/SysActivity.cpp \ + $(build_interpreter_platform_dir)/SysFileSystem.cpp \ + $(build_interpreter_platform_dir)/SysInterpreterInstance.cpp \ + $(build_interpreter_platform_dir)/SystemCommands.cpp \ + $(build_interpreter_platform_dir)/SystemInitialization.cpp \ + $(build_interpreter_platform_dir)/SystemInterpreter.cpp \ + $(build_interpreter_platform_dir)/TimeSupport.cpp \ + $(build_interpreter_platform_dir)/UseridFunction.cpp \ + $(build_interpreter_platform_dir)/ValueFunction.cpp common_sources = $(build_common_dir)/Utilities.cpp \ $(build_common_platform_dir)/SysFile.cpp \ $(build_common_platform_dir)/SysLibrary.cpp \ @@ -600,7 +600,7 @@ $(build_streamlibrary_dir)/StreamNative.cpp librexx_la_SOURCES = $(classes_sources) \ $(classes_support_sources) \ - $(kernel_api_sources) \ + $(interpreter_api_sources) \ $(behaviour_sources) \ $(execution_sources) \ $(memory_sources) \ @@ -616,8 +616,8 @@ core_classes = $(build_rexxclasses_dir)/CoreClasses.orx \ $(build_rexxclasses_dir)/StreamClasses.orx \ $(build_rexxclasses_dir)/SystemMethods.orx -core_platform_classes = $(build_kernel_platform_dir)/PlatformObjects.orx \ - $(build_kernel_platform_dir)/UnixMethods.orx +core_platform_classes = $(build_interpreter_platform_dir)/PlatformObjects.orx \ + $(build_interpreter_platform_dir)/UnixMethods.orx # # Preprocessor flags for librexx.so # @@ -627,7 +627,7 @@ -I$(build_api_platform_dir) \ -I$(build_common_dir) \ -I$(build_common_platform_dir) \ - -I$(build_kernel_dir) \ + -I$(build_interpreter_dir) \ -I$(build_behaviour_dir) \ -I$(build_execution_dir) \ -I$(build_memory_dir) \ @@ -641,8 +641,8 @@ -I$(build_parser_dir) \ -I$(build_messages_dir) \ -I$(build_streamlibrary_dir) \ - -I$(build_kernel_common_dir) \ - -I$(build_kernel_platform_dir) \ + -I$(build_interpreter_common_dir) \ + -I$(build_interpreter_platform_dir) \ -I$(build_rexxapi_platform_dir) librexx_la_LDFLAGS = $(VERSION_INFO) -nostartfiles @@ -695,7 +695,7 @@ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ -I$(build_messages_dir) \ - -I$(build_kernel_platform_dir) \ + -I$(build_interpreter_platform_dir) \ -I$(build_rexxapi_platform_dir) # # Extra libraries for rexx @@ -716,7 +716,7 @@ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ -I$(build_messages_dir) \ - -I$(build_kernel_platform_dir) \ + -I$(build_interpreter_platform_dir) \ -I$(build_rexxapi_platform_dir) # # Extra libraries for rexx @@ -736,7 +736,7 @@ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ -I$(build_messages_dir) \ - -I$(build_kernel_platform_dir) \ + -I$(build_interpreter_platform_dir) \ -I$(build_rexxapi_platform_dir) # @@ -757,7 +757,7 @@ -I$(build_lib_dir) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ - -I$(build_kernel_platform_dir) \ + -I$(build_interpreter_platform_dir) \ -I$(build_messages_dir) \ -I$(build_rexxapi_platform_dir) # @@ -777,7 +777,7 @@ -I$(build_lib_dir) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ - -I$(build_kernel_platform_dir) \ + -I$(build_interpreter_platform_dir) \ -I$(build_messages_dir) \ -I$(build_rexxapi_platform_dir) # @@ -798,10 +798,10 @@ -I$(build_lib_dir) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ - -I$(build_kernel_dir) \ + -I$(build_interpreter_dir) \ -I$(build_messages_dir) \ - -I$(build_kernel_common_dir) \ - -I$(build_kernel_platform_dir) \ + -I$(build_interpreter_common_dir) \ + -I$(build_interpreter_platform_dir) \ -I$(build_rexxapi_platform_dir) # # Extra libraries for librexxutil.so (maybe) @@ -821,11 +821,11 @@ -I$(build_lib_dir) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ - -I$(build_kernel_dir) \ + -I$(build_interpreter_dir) \ -I$(build_messages_dir) \ - -I$(build_kernel_common_dir) \ + -I$(build_interpreter_common_dir) \ -I$(build_runtime_dir) \ - -I$(build_kernel_platform_dir) \ + -I$(build_interpreter_platform_dir) \ -I$(build_rexxapi_platform_dir) # # Extra libraries for librxmath.so (maybe) @@ -888,8 +888,8 @@ $(build_messages_dir)/RexxMessageTable.h: $(build_messages_dir)/RexxMessageTable.xsl $(messageXML) sh ./xsl.sh $(@) $(messageXML) $(build_messages_dir)/RexxMessageTable.xsl -$(build_messages_dir)/gencat.inp: $(build_kernel_platform_dir)/UnixGencat.xsl $(messageXML) - sh ./xsl.sh $(@) $(messageXML) $(build_kernel_platform_dir)/UnixGencat.xsl +$(build_messages_dir)/gencat.inp: $(build_interpreter_platform_dir)/UnixGencat.xsl $(messageXML) + sh ./xsl.sh $(@) $(messageXML) $(build_interpreter_platform_dir)/UnixGencat.xsl $(build_behaviour_dir)/ClassTypeCodes.h: $(build_behaviour_dir)/ClassTypeCodes.xsl $(classesXML) sh ./xsl.sh $(@) $(classesXML) $(build_behaviour_dir)/ClassTypeCodes.xsl @@ -905,7 +905,7 @@ rexx.img: rexximage librexxutil.la $(core_classes) $(core_platform_classes) cp $(build_rexxclasses_dir)/*.orx . - cp $(build_kernel_platform_dir)/*.orx . + cp $(build_interpreter_platform_dir)/*.orx . ./rexximage -i rm -f *.orx @@ -927,7 +927,7 @@ $(build_messages_dir)/gencat.inp \ $(messageXML) \ $(classesXML) \ - $(build_kernel_platform_dir)/UnixGencat.xsl \ + $(build_interpreter_platform_dir)/UnixGencat.xsl \ $(build_behaviour_dir)/ClassTypeCodes.xsl \ $(build_behaviour_dir)/PrimitiveBehaviourNames.xsl \ $(build_behaviour_dir)/PrimitiveBehaviours.xsl \ @@ -936,11 +936,11 @@ $(build_utils_platform_dir)/rexx.sh \ $(build_utils_platform_dir)/rexx.csh \ $(build_rxregexp_dir)/rxregexp.cls \ - $(build_kernel_platform_dir)/UnixMethods.orx \ - $(build_kernel_platform_dir)/PlatformObjects.orx \ + $(build_interpreter_platform_dir)/UnixMethods.orx \ + $(build_interpreter_platform_dir)/PlatformObjects.orx \ $(build_rexxclasses_dir) \ $(classesHeaders) \ - $(kernelApiHeaders) \ + $(interpreterApiHeaders) \ $(expressionHeaders) \ $(instructionsHeaders) \ $(parserHeaders) \ @@ -969,9 +969,9 @@ # Force the timestamp of the message headers and the input to gencat # to have a later date than the source XML, so Xalan is not needed to # be executed by the user - touch $(distdir)/kernel/messages/*.h - touch $(distdir)/kernel/messages/DocErrorMessages.sgml - touch $(distdir)/kernel/messages/gencat.inp + touch $(distdir)/interpreter/messages/*.h + touch $(distdir)/interpreter/messages/DocErrorMessages.sgml + touch $(distdir)/interpreter/messages/gencat.inp # # Add oorexx.ver.incl, a file used by the Windows build, to the source # distribution. Copied: main/trunk/interpreter/interpreter.mak (from rev 2931, main/trunk/interpreter/kernel.mak) =================================================================== --- main/trunk/interpreter/interpreter.mak (rev 0) +++ main/trunk/interpreter/interpreter.mak 2008-08-10 13:29:57 UTC (rev 2932) @@ -0,0 +1,541 @@ +# ******************************************************************************* +# +# Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. +# Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. +# +# This program and the accompanying materials are made available under +# the terms of the Common Public License v1.0 which accompanies this +# distribution. A copy is also available at the following address: +# http://www.oorexx.org/license.html +# +# Redistribution and use in source and binary forms, with or +# without modification, are permitted provided that the following +# conditions are met: +# +# Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the distribution. +# +# Neither the name of Rexx Language Association nor the names +# of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# ******************************************************************************* +#------------------------ +# INTERPRETER.MAK make file +#------------------------ + + +# ------------------------------------------------------------------------- +# Main (default) target: +# ------------------------------------------------------------------------- +# CHM moved target definition to top +all : ORXHEADERS $(OR_OUTDIR)\rexx.dll \ + $(OR_OUTDIR)\rexxc.exe \ + COPYORXFILES + @ECHO ... + @ECHO All done .... + +# Include compiler specific macro definitions +!include "$(OR_LIBSRC)\ORXWIN32.MAK" + +# Check for oryxk source variable set +# This is where the source files are.... +!IFNDEF OR_INTERPRETER_SRC +!ERROR Build error, OR_INTERPRETER_SRC not set +!ENDIF + +# Check for lib source path +!IFNDEF OR_LIBSRC +!ERROR Build error, OR_LIBSRC not set +!ENDIF + + +# ------------------------------------------------------------------------- +# Object list: +# ------------------------------------------------------------------------- +# Add .orx file to list of possible inference rule targets +.SUFFIXES: .orx .rex .cmd .cls +OBJ = obj + + +# Following all part of rexx +OTSOBJ1=$(OR_OUTDIR)\BuiltinFunctions.$(OBJ) $(OR_OUTDIR)\DoBlock.$(OBJ) $(OR_OUTDIR)\Clause.$(OBJ) \ + $(OR_OUTDIR)\RexxInstruction.$(OBJ) $(OR_OUTDIR)\CommonExternalFunctions.$(OBJ) +OTSOBJ2=$(OR_OUTDIR)\SourceFile.$(OBJ) $(OR_OUTDIR)\ExpressionStack.$(OBJ) $(OR_OUTDIR)\Token.$(OBJ) +OTIOBJ1=$(OR_OUTDIR)\AddressInstruction.$(OBJ) $(OR_OUTDIR)\AssignmentInstruction.$(OBJ) $(OR_OUTDIR)\CallInstruction.$(OBJ) \ + $(OR_OUTDIR)\CommandInstruction.$(OBJ) +OTIOBJ2=$(OR_OUTDIR)\DoInstruction.$(OBJ) $(OR_OUTDIR)\DropInstruction.$(OBJ) +OTIOBJ3=$(OR_OUTDIR)\ElseInstruction.$(OBJ) $(OR_OUTDIR)\EndInstruction.$(OBJ) $(OR_OUTDIR)\EndIf.$(OBJ) +OTIOBJ4=$(OR_OUTDIR)\ExitInstruction.$(OBJ) $(OR_OUTDIR)\ExposeInstruction.$(OBJ) $(OR_OUTDIR)\ForwardInstruction.$(OBJ) \ + $(OR_OUTDIR)\GuardInstruction.$(OBJ) +OTIOBJ5=$(OR_OUTDIR)\IfInstruction.$(OBJ) $(OR_OUTDIR)\InterpretInstruction.$(OBJ) $(OR_OUTDIR)\LabelInstruction.$(OBJ) +OTIOBJ6=$(OR_OUTDIR)\LeaveInstruction.$(OBJ) $(OR_OUTDIR)\MessageInstruction.$(OBJ) $(OR_OUTDIR)\NopInstruction.$(OBJ) \ + $(OR_OUTDIR)\NumericInstruction.$(OBJ) +OTIOBJ7=$(OR_OUTDIR)\OptionsInstruction.$(OBJ) $(OR_OUTDIR)\OtherwiseInstruction.$(OBJ) $(OR_OUTDIR)\ParseInstruction.$(OBJ) \ + $(OR_OUTDIR)\ProcedureInstruction.$(OBJ) + +OTIOBJ8=$(OR_OUTDIR)\QueueInstruction.$(OBJ) $(OR_OUTDIR)\RaiseInstruction.$(OBJ) \ + $(OR_OUTDIR)\RequiresDirective.$(OBJ) $(OR_OUTDIR)\LibraryDirective.$(OBJ) $(OR_OUTDIR)\ClassDirective.$(OBJ) +OTIOBJ9=$(OR_OUTDIR)\ReplyInstruction.$(OBJ) $(OR_OUTDIR)\ReturnInstruction.$(OBJ) $(OR_OUTDIR)\SayInstruction.$(OBJ) \ + $(OR_OUTDIR)\SelectInstruction.$(OBJ) +OTIOBJ10=$(OR_OUTDIR)\SignalInstruction.$(OBJ) $(OR_OUTDIR)\ThenInstruction.$(OBJ) $(OR_OUTDIR)\TraceInstruction.$(OBJ) \ + $(OR_OUTDIR)\UseStrictInstruction.$(OBJ) +OTEOBJ1=$(OR_OUTDIR)\ExpressionCompoundVariable.$(OBJ) $(OR_OUTDIR)\ExpressionDotVariable.$(OBJ) $(OR_OUTDIR)\ExpressionFunction.$(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) \ + $(OR_OUTDIR)\RexxLocalVariables.$(OBJ) $(OR_OUTDIR)\RexxActivationStack.$(OBJ) $(OR_OUTDIR)\ProtectedObject.$(OBJ) \ + $(OR_OUTDIR)\ExitHandler.$(OBJ) +OTPOBJS=$(OTSOBJ1) $(OTSOBJ2) $(OTIOBJ1) $(OTIOBJ2) $(OTIOBJ3) \ + $(OTIOBJ4) $(OTIOBJ5) $(OTIOBJ6) $(OTIOBJ7) $(OTIOBJ8) $(OTIOBJ9) \ + $(OTIOBJ10) $(OTEOBJ1) $(OTEOBJ2) $(OTEOBJ3) + +# Following all part of rexx +OKCOBJ1=$(OR_OUTDIR)\Version.$(OBJ) +OKCOBJ2= $(OR_OUTDIR)\Utilities.$(OBJ) +OKAOBJS= $(OR_OUTDIR)\GlobalData.$(OBJ) $(OR_OUTDIR)\GlobalNames.$(OBJ) +OKLOBJS=$(OR_OUTDIR)\Setup.$(OBJ) $(OR_OUTDIR)\InstructionParser.$(OBJ) \ + $(OR_OUTDIR)\Scanner.$(OBJ) +OKCOBJS=$(OKCOBJ1) $(OKCOBJ2) $(OKLOBJS) + +# Following all part of rexx +OKPOBJ1=$(OR_OUTDIR)\RexxEnvelope.$(OBJ) $(OR_OUTDIR)\ArrayClass.$(OBJ) $(OR_OUTDIR)\RexxMisc.$(OBJ) \ + $(OR_OUTDIR)\ClassClass.$(OBJ) $(OR_OUTDIR)\DeadObject.$(OBJ) $(OR_OUTDIR)\PointerClass.$(OBJ) \ + $(OR_OUTDIR)\WeakReferenceClass.$(OBJ) +OKPOBJ2=$(OR_OUTDIR)\DirectoryClass.$(OBJ) $(OR_OUTDIR)\MethodClass.$(OBJ) $(OR_OUTDIR)\RoutineClass.$(OBJ) \ + $(OR_OUTDIR)\PackageClass.$(OBJ) $(OR_OUTDIR)\ContextClass.$(OBJ) +OKPOBJ3=$(OR_OUTDIR)\ListClass.$(OBJ) $(OR_OUTDIR)\RexxMemory.$(OBJ) $(OR_OUTDIR)\MemorySegment.$(OBJ) \ + $(OR_OUTDIR)\MemoryStats.$(OBJ) $(OR_OUTDIR)\MessageClass.$(OBJ) \ + $(OR_OUTDIR)\StemClass.$(OBJ) $(OR_OUTDIR)\ObjectClass.$(OBJ) $(OR_OUTDIR)\RexxCompoundTail.$(OBJ) \ + $(OR_OUTDIR)\RexxCompoundElement.$(OBJ) $(OR_OUTDIR)\RexxCompoundTable.$(OBJ) +OKPOBJ4=$(OR_OUTDIR)\QueueClass.$(OBJ) $(OR_OUTDIR)\SupplierClass.$(OBJ) $(OR_OUTDIR)\RexxQueueMethods.$(OBJ) \ + $(OR_OUTDIR)\RelationClass.$(OBJ) $(OR_OUTDIR)\TableClass.$(OBJ) \ + $(OR_OUTDIR)\PrimitiveBehaviours.$(OBJ) $(OR_OUTDIR)\VirtualFunctionTable.$(OBJ) +OKPOBJ5=$(OR_OUTDIR)\IntegerClass.$(OBJ) $(OR_OUTDIR)\NumberStringClass.$(OBJ) +OKIOBJ1=$(OR_OUTDIR)\RexxActivation.$(OBJ) $(OR_OUTDIR)\RexxActivity.$(OBJ) $(OR_OUTDIR)\KeywordConstants.$(OBJ) \ + $(OR_OUTDIR)\RexxBehaviour.$(OBJ) $(OR_OUTDIR)\BufferClass.$(OBJ) $(OR_OUTDIR)\ActivityManager.$(OBJ) \ + $(OR_OUTDIR)\Interpreter.$(OBJ) $(OR_OUTDIR)\SystemInterpreter.$(OBJ) $(OR_OUTDIR)\RexxStartDispatcher.$(OBJ) \ + $(OR_OUTDIR)\InterpreterInstance.$(OBJ) $(OR_OUTDIR)\ActivityDispatcher.$(OBJ) $(OR_OUTDIR)\TranslateDispatcher.$(OBJ) \ + $(OR_OUTDIR)\CallbackDispatcher.$(OBJ) $(OR_OUTDIR)\SecurityManager.$(OBJ) \ + $(OR_OUTDIR)\MessageDispatcher.$(OBJ) $(OR_OUTDIR)\SysInterpreterInstance.$(OBJ) +OKIOBJ2=$(OR_OUTDIR)\RexxHashTable.$(OBJ) $(OR_OUTDIR)\RexxCode.$(OBJ) $(OR_OUTDIR)\PackageManager.$(OBJ) \ + $(OR_OUTDIR)\RexxListTable.$(OBJ) $(OR_OUTDIR)\RexxNativeActivation.$(OBJ) $(OR_OUTDIR)\RexxNativeCode.$(OBJ) \ + $(OR_OUTDIR)\CPPCode.$(OBJ) $(OR_OUTDIR)\LibraryPackage.$(OBJ) $(OR_OUTDIR)\InternalPackage.$(OBJ) +OKIOBJ3=$(OR_OUTDIR)\RexxCollection.$(OBJ) $(OR_OUTDIR)\RexxSmartBuffer.$(OBJ) $(OR_OUTDIR)\StackClass.$(OBJ) \ + $(OR_OUTDIR)\RexxVariable.$(OBJ) $(OR_OUTDIR)\RexxVariableDictionary.$(OBJ) $(OR_OUTDIR)\RexxDateTime.$(OBJ) \ + $(OR_OUTDIR)\Numerics.$(OBJ) $(OR_OUTDIR)\CallContextStubs.$(OBJ) $(OR_OUTDIR)\InterpreterAPI.$(OBJ) \ + $(OR_OUTDIR)\InterpreterInstanceStubs.$(OBJ) $(OR_OUTDIR)\MethodContextStubs.$(OBJ) $(OR_OUTDIR)\ThreadContextStubs.$(OBJ) + +OKPOBJS=$(OKPOBJ1) $(OKPOBJ2) $(OKPOBJ3) $(OKPOBJ4) $(OKPOBJ5) +OKIOBJS=$(OKIOBJ1) $(OKIOBJ2) $(OKIOBJ3) +#part of rexx + +SYSOBJ1=$(OR_OUTDIR)\TimeSupport.$(OBJ) \ + $(OR_OUTDIR)\FileSystem.$(OBJ) $(OR_OUTDIR)\ValueFunction.$(OBJ) $(OR_OUTDIR)\UseridFunction.$(OBJ) + +SYSOBJ2=$(OR_OUTDIR)\ExternalFunctions.$(OBJ) $(OR_OUTDIR)\RexxMain.$(OBJ) $(OR_OUTDIR)\SystemCommands.$(OBJ) \ + $(OR_OUTDIR)\StreamNative.$(OBJ) $(OR_OUTDIR)\StreamCommandParser.$(OBJ) $(OR_OUTDIR)\ProgramMetaData.$(OBJ) \ + $(OR_OUTDIR)\SysFile.$(OBJ) $(OR_OUTDIR)\SysFileSystem.$(OBJ) $(OR_OUTDIR)\SysLibrary.$(OBJ) $(OR_OUTDIR)\SysActivity.$(OBJ) \ + $(OR_OUTDIR)\SysSemaphore.$(OBJ) + +SYSOBJ3=$(OR_OUTDIR)\MemorySupport.$(OBJ) $(OR_OUTDIR)\MiscSystem.$(OBJ) $(OR_OUTDIR)\SystemInitialization.$(OBJ) + +SYSOBJS=$(SYSOBJ1) $(SYSOBJ2) $(SYSOBJ3) + + +#part of rexx +OEPOBJS=$(OR_OUTDIR)\NumberStringMath.$(OBJ) $(OR_OUTDIR)\NumberStringMath2.$(OBJ) + +#part of rexx +OKSOBJS=$(OR_OUTDIR)\StringClass.$(OBJ) $(OR_OUTDIR)\StringClassUtil.$(OBJ) $(OR_OUTDIR)\StringClassSub.$(OBJ) \ + $(OR_OUTDIR)\StringClassWord.$(OBJ) $(OR_OUTDIR)\StringClassMisc.$(OBJ) $(OR_OUTDIR)\StringClassBit.$(OBJ) \ + $(OR_OUTDIR)\StringClassConversion.$(OBJ) $(OR_OUTDIR)\MutableBufferClass.$(OBJ) $(OR_OUTDIR)\StringUtil.$(OBJ) + +SYSERR= $(OR_OUTDIR)\ErrorMessages.$(OBJ) + +# rexx +ORYXKOBJ= $(OKCOBJS) $(OKAOBJS) $(OKPOBJS) $(OKIOBJS) $(OKSOBJS) $(OEPOBJS)\ + $(OTPOBJS) $(SYSOBJS) $(SYSERR) + +# Windows Universal Thunk 32-bit stub +# 16-bit side must be built with 16-bit compiler +# Also, you will need to get some components from the \win32s\ut +# directory from your VC++32 CD-Rom. In particular the W32sUT.h needs +# to go in msvc20\h (and also in a directory in the INCLUDE path for +# our Win16 development environment.) W32sUT32.Lib needs to go in +# msvc20\h and W32sUT16.Lib needs to go in a directory in the LIB +# path for our Win16 development environment. +# +# SYSUT32OBJ = $(OR_OUTDIR)\rxcmd32.$(OBJ) + +# define files copied by the make to the test directory +ORXFILES=$(OR_OUTDIR)\CoreClasses.orx $(OR_OUTDIR)\StreamClasses.orx \ + $(OR_OUTDIR)\SystemMethods.orx $(OR_OUTDIR)\WindowsMethods.orx \ + $(OR_OUTDIR)\PlatformObjects.orx $(OR_OUTDIR)\orexxole.cls + +#define critical header files for forcing recomp +ORXHEADERS=$(OR_APISRC)\oorexxerrors.h $(INTERPRETER_MESSAGES)\RexxErrorCodes.h $(INTERPRETER_MESSAGES)\RexxMessageNumbers.h $(INTERPRETER_MESSAGES)\RexxMessageTable.h $(INTERPRETER_RUNTIME)\RexxCore.h \ + $(BEHAVIOUR)\PrimitiveBehaviourNames.h $(BEHAVIOUR)\ClassTypeCodes.h + + +# +# *** rexx.LIB : Creates .lib import library +# .exp export library for use with this link +# +# the type command creates a file of all objects as input to the lib +# +$(OR_OUTDIR)\rexx.lib : $(ORYXKOBJ) \ + $(INT_PLATFORM)\wrexx.def + type <<$(OR_OUTDIR)\oryxk.lst + $(ORYXKOBJ) $(ORYXLOBJ) +<< + $(OR_IMPLIB) \ + -machine:$(CPU) \ + -def:$(INT_PLATFORM)\wrexx.def \ + @$(OR_OUTDIR)\oryxk.lst \ + -out:$(OR_OUTDIR)\$(@B).lib + +# +# *** rexx.DLL +# +# need import libraries and def files still +# +$(OR_OUTDIR)\rexx.dll : $(ORXHEADERS) $(ORYXKOBJ) $(ORYXLOBJ) $(RXDBG_OBJ) \ + $(OR_OUTDIR)\$(@B).lib $(INT_PLATFORM)\wrexx.def \ + $(OR_OUTDIR)\winmsgtb.res $(OR_OUTDIR)\verinfo.res + type <<$(OR_OUTDIR)\oryxk.lst + $(ORYXKOBJ) $(RXDBG_OBJ) $(ORYXLOBJ) +<< + $(OR_LINK) $(lflags_common) $(lflags_dll) -out:$(OR_OUTDIR)\$(@B).dll \ + @$(OR_OUTDIR)\oryxk.lst \ + $(OR_OUTDIR)\winmsgtb.res \ + $(OR_OUTDIR)\$(@B).exp \ + $(OR_OUTDIR)\rexxapi.lib + +# +# *** rxcmd32.LIB : Creates .lib import library +# .exp export library for use with this link +# +# the type command creates a file of all objects as input to the lib +# +$(OR_OUTDIR)\rxcmd32.lib : $(SYSUT32OBJ) $(OR_INTERPRETER_SRC)\$(@B).def + $(OR_IMPLIB) \ + -machine:$(CPU) \ + -def:$(OR_INTERPRETER_SRC)\$(@B).def \ + $(SYSUT32OBJ) \ + -out:$(OR_OUTDIR)\$(@B).lib + +# +# *** rxcmd32.DLL +# +# need import libraries and def files still +# w32sut32.lib needed for this Universal Thunk DLL +# +$(OR_OUTDIR)\rxcmd32.dll : $(SYSUT32OBJ) $(OR_OUTDIR)\$(@B).lib \ + $(OR_INTERPRETER_SRC)\$(@B).def + $(OR_LINK) $(lflags_common) $(lflags_dll) -out:$(OR_OUTDIR)\$(@B).dll \ + $(SYSUT32OBJ) \ + $(OR_OUTDIR)\$(@B).exp \ + w32sut32.lib + + +# Update the Windows Message Table resource if necessary + +$(INT_PLATFORM)\winmsgtb.rc: $(INT_PLATFORM)\WinMessageResource.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml + @ECHO . + @ECHO Generating $(@) + xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INT_PLATFORM)\WinMessageResource.xsl + +$(INTERPRETER_MESSAGES)\RexxErrorCodes.h: $(INTERPRETER_MESSAGES)\RexxErrorCodes.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml + @ECHO. + @ECHO Generating $(@) + xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\RexxErrorCodes.xsl + +$(OR_ORYXAPI)\oorexxerrors.h: $(INTERPRETER_MESSAGES)\ApiErrorCodes.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml + @ECHO. + @ECHO Generating $(@) + xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\ApiErrorCodes.xsl + +$(INTERPRETER_MESSAGES)\DocErrorMessages.sgml: $(INTERPRETER_MESSAGES)\DocBookErrors.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml + @ECHO. + @ECHO Generating $(@) + xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\DocBookErrors.xsl + +$(INTERPRETER_MESSAGES)\RexxMessageNumbers.h: $(INTERPRETER_MESSAGES)\RexxMessageNumbers.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml + @ECHO. + @ECHO Generating $(@) + xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\RexxMessageNumbers.xsl + +$(INTERPRETER_MESSAGES)\RexxMessageTable.h: $(INTERPRETER_MESSAGES)\RexxMessageTable.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml + @ECHO. + @ECHO Generating $(@) + xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\RexxMessageTable.xsl + +$(OR_APISRC)\api\oorexxerrors.h: $(INTERPRETER_MESSAGES)\ApiErrorCodes.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml + @ECHO . + @ECHO Generating $(@) + xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\ApiErrorCodes.xsl + +$(BEHAVIOUR)\PrimitiveBehaviourNames.h: $(BEHAVIOUR)\PrimitiveBehaviourNames.xsl $(BEHAVIOUR)\PrimitiveClasses.xml + @ECHO. + @ECHO Generating $(@) + xalan -o $(@) $(BEHAVIOUR)\PrimitiveClasses.xml $(BEHAVIOUR)\PrimitiveBehaviourNames.xsl + +$(BEHAVIOUR)\PrimitiveBehaviours.cpp: $(BEHAVIOUR)\PrimitiveBehaviours.xsl $(BEHAVIOUR)\PrimitiveClasses.xml + @ECHO. + @ECHO Generating $(@) + xalan -o $(@) $(BEHAVIOUR)\PrimitiveClasses.xml $(BEHAVIOUR)\PrimitiveBehaviours.xsl + +$(BEHAVIOUR)\VirtualFunctionTable.cpp: $(BEHAVIOUR)\VirtualFunctionTable.xsl $(BEHAVIOUR)\PrimitiveClasses.xml + @ECHO. + @ECHO Generating $(@) + xalan -o $(@) $(BEHAVIOUR)\PrimitiveClasses.xml $(BEHAVIOUR)\VirtualFunctionTable.xsl + +$(BEHAVIOUR)\ClassTypeCodes.h: $(BEHAVIOUR)\ClassTypeCodes.xsl $(BEHAVIOUR)\PrimitiveClasses.xml + @ECHO. + @ECHO Generating $(@) + xalan -o $(@) $(BEHAVIOUR)\PrimitiveClasses.xml $(BEHAVIOUR)\ClassTypeCodes.xsl + +$(OR_OUTDIR)\winmsgtb.res: $(INT_PLATFORM)\winmsgtb.rc $(INTERPRETER_MESSAGES)\DocErrorMessages.sgml + @ECHO. + @ECHO ResourceCompiling $(@) + $(rc) $(rcflags_common) $(OR_ORYXRCINCL) -r -fo$(@) $(INT_PLATFORM)\winmsgtb.rc + + +# Update the version information block +$(OR_OUTDIR)\verinfo.res: $(INT_PLATFORM)\verinfo.rc + @ECHO. + @ECHO ResourceCompiling $(@B).res + $(rc) $(rcflags_common) -r -fo$(OR_OUTDIR)\$(@B).res $(OR_INTERPRETER_SRC)\$(@B).rc + +$(OR_OUTDIR)\rexxc.exe : $(OR_OUTDIR)\RexxCompiler.obj + $(OR_LINK) $(**) $(lflags_common_console) \ + $(OR_OUTDIR)\verinfo.res \ + $(OR_OUTDIR)\rexx.lib \ + -out:$(@) + +# +# +# *** Copy ORX files to target dir... +# +COPYORXFILES: $(ORXFILES) + +# +# +# *** Make sure headers are generated +# +ORXHEADERS: $(ORXHEADERS) + +# +# *** Inference Rule for Rexx Class files +# +{$(REXX_CLASSES)}.orx{$(OR_OUTDIR)}.orx: + @ECHO . + @ECHO Copying $(**) + COPY $(**) $(@) + +# +# *** Inference Rule for Rexx Class files +# +{$(INT_PLATFORM)}.orx{$(OR_OUTDIR)}.orx: + @ECHO . + @ECHO Copying $(**) + COPY $(**) $(@) + +# +# *** Inference Rule for Rexx samples +# +{$(OR_SAMPLESRC)}.rex{$(OR_OUTDIR)}.rex: + @ECHO . + @ECHO Copying $(**) + COPY $(**) $(@) + +# +# *** Inference Rule for Rexx samples +# +{$(OR_OLEOBJECTSRC)}.cls{$(OR_OUTDIR)}.cls: + @ECHO . + @ECHO Copying $(**) + COPY $(**) $(@) + + +# +# *** Inference Rule for C->OBJ +# *** For .C files in OR_LIBSRC directory +# +{$(OR_LIBSRC)}.c{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(@B).c + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(OR_OUTDIR)\$(@B).obj $(Tp)$(OR_LIBSRC)\$(@B).c $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(OR_LIBSRC)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(OR_OUTDIR)\$(@B).obj $(Tp)$(OR_LIBSRC)\$(@B).cpp $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(INTERPRETER_RUNTIME)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(INTERPRETER_API)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(PARSER)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(EXPRESSIONS)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(CONCURRENCY)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(BEHAVIOUR)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(EXECUTION)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(MEMORY)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(PACKAGE)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(INSTRUCTIONS)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(INTERPRETER_CLASSES)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(CLASSES_SUPPORT)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(INT_PLATFORM)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(Tp)$(**) $(OR_ORYXINCL) + +# +# *** Inference Rule for C->OBJ +# *** For .C files in OR_LIBSRC directory +# +{$(INTERPRETER_RUNTIME)}.c{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(OR_ORYXINCL) $(Tp)$(**) + +# +# *** Inference Rule for C->OBJ +# *** For .C files in OR_LIBSRC directory +# +{$(INT_PLATFORM)}.c{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(OR_ORYXINCL) $(Tp)$(**) + +# +# *** Inference Rule for CPP->OBJ +# *** For .CPP files in OR_LIBSRC directory +# +{$(STREAM)}.cpp{$(OR_OUTDIR)}.obj: + @ECHO . + @ECHO Compiling $(**) + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(@) $(OR_ORYXINCL) $(Tp)$(**) + + Deleted: main/trunk/interpreter/kernel.mak =================================================================== --- main/trunk/interpreter/kernel.mak 2008-08-10 13:20:01 UTC (rev 2931) +++ main/trunk/interpreter/kernel.mak 2008-08-10 13:29:57 UTC (rev 2932) @@ -1,549 +0,0 @@ -# ******************************************************************************* -# -# Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. -# Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. -# -# This program and the accompanying materials are made available under -# the terms of the Common Public License v1.0 which accompanies this -# distribution. A copy is also available at the following address: -# http://www.oorexx.org/license.html -# -# Redistribution and use in source and binary forms, with or -# without modification, are permitted provided that the following -# conditions are met: -# -# Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the distribution. -# -# Neither the name of Rexx Language Association nor the names -# of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# ******************************************************************************* -#------------------------ -# KERNEL.MAK make file -#------------------------ - - -# ------------------------------------------------------------------------- -# Main (default) target: -# ------------------------------------------------------------------------- -# CHM moved target definition to top -all : ORXHEADERS $(OR_OUTDIR)\rexx.dll \ - $(OR_OUTDIR)\rexxc.exe \ - COPYORXFILES - @ECHO ... - @ECHO All done .... - -# Include compiler specific macro definitions -!include "$(OR_LIBSRC)\ORXWIN32.MAK" - -# Check for oryxk source variable set -# This is where the source files are.... -!IFNDEF OR_INTERPRETER_SRC -!ERROR Build error, OR_INTERPRETER_SRC not set -!ENDIF - -# Check for lib source path -!IFNDEF OR_LIBSRC -!ERROR Build error, OR_LIBSRC not set -!ENDIF - - -# ------------------------------------------------------------------------- -# Object list: -# ------------------------------------------------------------------------- -# Add .orx file to list of possible inference rule targets -.SUFFIXES: .orx .rex .cmd .cls -OBJ = obj - - -# Following all part of rexx -OTSOBJ1=$(OR_OUTDIR)\BuiltinFunctions.$(OBJ) $(OR_OUTDIR)\DoBlock.$(OBJ) $(OR_OUTDIR)\Clause.$(OBJ) \ - $(OR_OUTDIR)\RexxInstruction.$(OBJ) $(OR_OUTDIR)\CommonExternalFunctions.$(OBJ) -OTSOBJ2=$(OR_OUTDIR)\SourceFile.$(OBJ) $(OR_OUTDIR)\ExpressionStack.$(OBJ) $(OR_OUTDIR)\Token.$(OBJ) -OTIOBJ1=$(OR_OUTDIR)\AddressInstruction.$(OBJ) $(OR_OUTDIR)\AssignmentInstruction.$(OBJ) $(OR_OUTDIR)\CallInstruction.$(OBJ) \ - $(OR_OUTDIR)\CommandInstruction.$(OBJ) -OTIOBJ2=$(OR_OUTDIR)\DoInstruction.$(OBJ) $(OR_OUTDIR)\DropInstruction.$(OBJ) -OTIOBJ3=$(OR_OUTDIR)\ElseInstruction.$(OBJ) $(OR_OUTDIR)\EndInstruction.$(OBJ) $(OR_OUTDIR)\EndIf.$(OBJ) -OTIOBJ4=$(OR_OUTDIR)\ExitInstruction.$(OBJ) $(OR_OUTDIR)\ExposeInstruction.$(OBJ) $(OR_OUTDIR)\ForwardInstruction.$(OBJ) \ - $(OR_OUTDIR)\GuardInstruction.$(OBJ) -OTIOBJ5=$(OR_OUTDIR)\IfInstruction.$(OBJ) $(OR_OUTDIR)\InterpretInstruction.$(OBJ) $(OR_OUTDIR)\LabelInstruction.$(OBJ) -OTIOBJ6=$(OR_OUTDIR)\LeaveInstruction.$(OBJ) $(OR_OUTDIR)\MessageInstruction.$(OBJ) $(OR_OUTDIR)\NopInstruction.$(OBJ) \ - $(OR_OUTDIR)\NumericInstruction.$(OBJ) -OTIOBJ7=$(OR_OUTDIR)\OptionsInstruction.$(OBJ) $(OR_OUTDIR)\OtherwiseInstruction.$(OBJ) $(OR_OUTDIR)\ParseInstruction.$(OBJ) \ - $(OR_OUTDIR)\ProcedureInstruction.$(OBJ) - -OTIOBJ8=$(OR_OUTDIR)\QueueInstruction.$(OBJ) $(OR_OUTDIR)\RaiseInstruction.$(OBJ) \ - $(OR_OUTDIR)\RequiresDirective.$(OBJ) $(OR_OUTDIR)\LibraryDirective.$(OBJ) $(OR_OUTDIR)\ClassDirective.$(OBJ) -OTIOBJ9=$(OR_OUTDIR)\ReplyInstruction.$(OBJ) $(OR_OUTDIR)\ReturnInstruction.$(OBJ) $(OR_OUTDIR)\SayInstruction.$(OBJ) \ - $(OR_OUTDIR)\SelectInstruction.$(OBJ) -OTIOBJ10=$(OR_OUTDIR)\SignalInstruction.$(OBJ) $(OR_OUTDIR)\ThenInstruction.$(OBJ) $(OR_OUTDIR)\TraceInstruction.$(OBJ) \ - $(OR_OUTDIR)\UseStrictInstruction.$(OBJ) -OTEOBJ1=$(OR_OUTDIR)\ExpressionCompoundVariable.$(OBJ) $(OR_OUTDIR)\ExpressionDotVariable.$(OBJ) $(OR_OUTDIR)\ExpressionFunction.$(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) \ - $(OR_OUTDIR)\RexxLocalVariables.$(OBJ) $(OR_OUTDIR)\RexxActivationStack.$(OBJ) $(OR_OUTDIR)\ProtectedObject.$(OBJ) \ - $(OR_OUTDIR)\ExitHandler.$(OBJ) -OTPOBJS=$(OTSOBJ1) $(OTSOBJ2) $(OTIOBJ1) $(OTIOBJ2) $(OTIOBJ3) \ - $(OTIOBJ4) $(OTIOBJ5) $(OTIOBJ6) $(OTIOBJ7) $(OTIOBJ8) $(OTIOBJ9) \ - $(OTIOBJ10) $(OTEOBJ1) $(OTEOBJ2) $(OTEOBJ3) - -# Following all part of rexx -OKCOBJ1=$(OR_OUTDIR)\Version.$(OBJ) -OKCOBJ2= $(OR_OUTDIR)\Utilities.$(OBJ) -OKAOBJS= $(OR_OUTDIR)\GlobalData.$(OBJ) $(OR_OUTDIR)\GlobalNames.$(OBJ) -OKLOBJS=$(OR_OUTDIR)\Setup.$(OBJ) $(OR_OUTDIR)\InstructionParser.$(OBJ) \ - $(OR_OUTDIR)\Scanner.$(OBJ) -OKCOBJS=$(OKCOBJ1) $(OKCOBJ2) $(OKLOBJS) - -# Following all part of rexx -OKPOBJ1=$(OR_OUTDIR)\RexxEnvelope.$(OBJ) $(OR_OUTDIR)\ArrayClass.$(OBJ) $(OR_OUTDIR)\RexxMisc.$(OBJ) \ - $(OR_OUTDIR)\ClassClass.$(OBJ) $(OR_OUTDIR)\DeadObject.$(OBJ) $(OR_OUTDIR)\PointerClass.$(OBJ) \ - $(OR_OUTDIR)\WeakReferenceClass.$(OBJ) -OKPOBJ2=$(OR_OUTDIR)\DirectoryClass.$(OBJ) $(OR_OUTDIR)\MethodClass.$(OBJ) $(OR_OUTDIR)\RoutineClass.$(OBJ) \ - $(OR_OUTDIR)\PackageClass.$(OBJ) $(OR_OUTDIR)\ContextClass.$(OBJ) -OKPOBJ3=$(OR_OUTDIR)\ListClass.$(OBJ) $(OR_OUTDIR)\RexxMemory.$(OBJ) $(OR_OUTDIR)\MemorySegment.$(OBJ) \ - $(OR_OUTDIR)\MemoryStats.$(OBJ) $(OR_OUTDIR)\MessageClass.$(OBJ) \ - $(OR_OUTDIR)\StemClass.$(OBJ) $(OR_OUTDIR)\ObjectClass.$(OBJ) $(OR_OUTDIR)\RexxCompoundTail.$(OBJ) \ - $(OR_OUTDIR)\RexxCompoundElement.$(OBJ) $(OR_OUTDIR)\RexxCompoundTable.$(OBJ) -OKPOBJ4=$(OR_OUTDIR)\QueueClass.$(OBJ) $(OR_OUTDIR)\SupplierClass.$(OBJ) $(OR_OUTDIR)\RexxQueueMethods.$(OBJ) \ - $(OR_OUTDIR)\RelationClass.$(OBJ) $(OR_OUTDIR)\TableClass.$(OBJ) \ - $(OR_OUTDIR)\PrimitiveBehaviours.$(OBJ) $(OR_OUTDIR)\VirtualFunctionTable.$(OBJ) -OKPOBJ5=$(OR_OUTDIR)\IntegerClass.$(OBJ) $(OR_OUTDIR)\NumberStringClass.$(OBJ) -OKIOBJ1=$(OR_OUTDIR)\RexxActivation.$(OBJ) $(OR_OUTDIR)\RexxActivity.$(OBJ) $(OR_OUTDIR)\KeywordConstants.$(OBJ) \ - $(OR_OUTDIR)\RexxBehaviour.$(OBJ) $(OR_OUTDIR)\BufferClass.$(OBJ) $(OR_OUTDIR)\ActivityManager.$(OBJ) \ - $(OR_OUTDIR)\Interpreter.$(OBJ) $(OR_OUTDIR)\SystemInterpreter.$(OBJ) $(OR_OUTDIR)\RexxStartDispatcher.$(OBJ) \ - $(OR_OUTDIR)\InterpreterInstance.$(OBJ) $(OR_OUTDIR)\ActivityDispatcher.$(OBJ) $(OR_OUTDIR)\TranslateDispatcher.$(OBJ) \ - $(OR_OUTDIR)\CallbackDispatcher.$(OBJ) $(OR_OUTDIR)\SecurityManager.$(OBJ) \ - $(OR_OUTDIR)\MessageDispatcher.$(OBJ) $(OR_OUTDIR)\SysInterpreterInstance.$(OBJ) -OKIOBJ2=$(OR_OUTDIR)\RexxHashTable.$(OBJ) $(OR_OUTDIR)\RexxCode.$(OBJ) $(OR_OUTDIR)\PackageManager.$(OBJ) \ - $(OR_OUTDIR)\RexxListTable.$(OBJ) $(OR_OUTDIR)\RexxNativeActivation.$(OBJ) $(OR_OUTDIR)\RexxNativeCode.$(OBJ) \ - $(OR_OUTDIR)\CPPCode.$(OBJ) $(OR_OUTDIR)\LibraryPackage.$(OBJ) $(OR_OUTDIR)\InternalPackage.$(OBJ) -OKIOBJ3=$(OR_OUTDIR)\RexxCollection.$(OBJ) $(OR_OUTDIR)\RexxSmartBuffer.$(OBJ) $(OR_OUTDIR)\StackClass.$(OBJ) \ - $(OR_OUTDIR)\RexxVariable.$(OBJ) $(OR_OUTDIR)\RexxVariableDictionary.$(OBJ) $(OR_OUTDIR)\RexxDateTime.$(OBJ) \ - $(OR_OUTDIR)\Numerics.$(OBJ) $(OR_OUTDIR)\CallContextStubs.$(OBJ) $(OR_OUTDIR)\InterpreterAPI.$(OBJ) \ - $(OR_OUTDIR)\InterpreterInstanceStubs.$(OBJ) $(OR_OUTDIR)\MethodContextStubs.$(OBJ) $(OR_OUTDIR)\ThreadContextStubs.$(OBJ) - -OKPOBJS=$(OKPOBJ1) $(OKPOBJ2) $(OKPOBJ3) $(OKPOBJ4) $(OKPOBJ5) -OKIOBJS=$(OKIOBJ1) $(OKIOBJ2) $(OKIOBJ3) -#part of rexx - -SYSOBJ1=$(OR_OUTDIR)\TimeSupport.$(OBJ) \ - $(OR_OUTDIR)\FileSystem.$(OBJ) $(OR_OUTDIR)\ValueFunction.$(OBJ) $(OR_OUTDIR)\UseridFunction.$(OBJ) - -SYSOBJ2=$(OR_OUTDIR)\ExternalFunctions.$(OBJ) $(OR_OUTDIR)\RexxMain.$(OBJ) $(OR_OUTDIR)\SystemCommands.$(OBJ) \ - $(OR_OUTDIR)\StreamNative.$(OBJ) $(OR_OUTDIR)\StreamCommandParser.$(OBJ) $(OR_OUTDIR)\ProgramMetaData.$(OBJ) \ - $(OR_OUTDIR)\SysFile.$(OBJ) $(OR_OUTDIR)\SysFileSystem.$(OBJ) $(OR_OUTDIR)\SysLibrary.$(OBJ) $(OR_OUTDIR)\SysActivity.$(OBJ) \ - $(OR_OUTDIR)\SysSemaphore.$(OBJ) - -SYSOBJ3=$(OR_OUTDIR)\MemorySupport.$(OBJ) $(OR_OUTDIR)\MiscSystem.$(OBJ) $(OR_OUTDIR)\SystemInitialization.$(OBJ) - -SYSOBJS=$(SYSOBJ1) $(SYSOBJ2) $(SYSOBJ3) - - -#part of rexx -OEPOBJS=$(OR_OUTDIR)\NumberStringMath.$(OBJ) $(OR_OUTDIR)\NumberStringMath2.$(OBJ) - -#part of rexx -OKSOBJS=$(OR_OUTDIR)\StringClass.$(OBJ) $(OR_OUTDIR)\StringClassUtil.$(OBJ) $(OR_OUTDIR)\StringClassSub.$(OBJ) \ - $(OR_OUTDIR)\StringClassWord.$(OBJ) $(OR_OUTDIR)\StringClassMisc.$(OBJ) $(OR_OUTDIR)\StringClassBit.$(OBJ) \ - $(OR_OUTDIR)\StringClassConversion.$(OBJ) $(OR_OUTDIR)\MutableBufferClass.$(OBJ) $(OR_OUTDIR)\StringUtil.$(OBJ) - -SYSERR= $(OR_OUTDIR)\ErrorMessages.$(OBJ) - -# rexx -ORYXKOBJ= $(OKCOBJS) $(OKAOBJS) $(OKPOBJS) $(OKIOBJS) $(OKSOBJS) $(OEPOBJS)\ - $(OTPOBJS) $(SYSOBJS) $(SYSERR) - -# Windows Universal Thunk 32-bit stub -# 16-bit side must be built with 16-bit compiler -# Also, you will need to get some components from the \win32s\ut -# directory from your VC++32 CD-Rom. In particular the W32sUT.h needs -# to go in msvc20\h (and also in a directory in the INCLUDE path for -# our Win16 development environment.) W32sUT32.Lib needs to go in -# msvc20\h and W32sUT16.Lib needs to go in a directory in the LIB -# path for our Win16 development environment. -# -# SYSUT32OBJ = $(OR_OUTDIR)\rxcmd32.$(OBJ) - -# define files copied by the make to the test directory -ORXFILES=$(OR_OUTDIR)\CoreClasses.orx $(OR_OUTDIR)\StreamClasses.orx \ - $(OR_OUTDIR)\SystemMethods.orx $(OR_OUTDIR)\WindowsMethods.orx \ - $(OR_OUTDIR)\PlatformObjects.orx $(OR_OUTDIR)\orexxole.cls - -#define critical header files for forcing recomp -ORXHEADERS=$(OR_APISRC)\oorexxerrors.h $(INTERPRETER_MESSAGES)\RexxErrorCodes.h $(INTERPRETER_MESSAGES)\RexxMessageNumbers.h $(INTERPRETER_MESSAGES)\RexxMessageTable.h $(INTERPRETER_RUNTIME)\RexxCore.h \ - $(BEHAVIOUR)\PrimitiveBehaviourNames.h $(BEHAVIOUR)\ClassTypeCodes.h - - -# -# *** rexx.LIB : Creates .lib import library -# .exp export library for use with this link -# -# the type command creates a file of all objects as input to the lib -# -$(OR_OUTDIR)\rexx.lib : $(ORYXKOBJ) \ - $(INT_PLATFORM)\wrexx.def - type <<$(OR_OUTDIR)\oryxk.lst - $(ORYXKOBJ) $(ORYXLOBJ) -<< - $(OR_IMPLIB) \ - -machine:$(CPU) \ - -def:$(INT_PLATFORM)\wrexx.def \ - @$(OR_OUTDIR)\oryxk.lst \ - -out:$(OR_OUTDIR)\$(@B).lib - -# -# *** rexx.DLL -# -# need import libraries and def files still -# -$(OR_OUTDIR)\rexx.dll : $(ORXHEADERS) $(ORYXKOBJ) $(ORYXLOBJ) $(RXDBG_OBJ) \ - $(OR_OUTDIR)\$(@B).lib $(INT_PLATFORM)\wrexx.def \ - $(OR_OUTDIR)\winmsgtb.res $(OR_OUTDIR)\verinfo.res - type <<$(OR_OUTDIR)\oryxk.lst - $(ORYXKOBJ) $(RXDBG_OBJ) $(ORYXLOBJ) -<< - $(OR_LINK) $(lflags_common) $(lflags_dll) -out:$(OR_OUTDIR)\$(@B).dll \ - @$(OR_OUTDIR)\oryxk.lst \ - $(OR_OUTDIR)\winmsgtb.res \ - $(OR_OUTDIR)\$(@B).exp \ - $(OR_OUTDIR)\rexxapi.lib - -# -# *** rxcmd32.LIB : Creates .lib import library -# .exp export library for use with this link -# -# the type command creates a file of all objects as input to the lib -# -$(OR_OUTDIR)\rxcmd32.lib : $(SYSUT32OBJ) $(OR_INTERPRETER_SRC)\$(@B).def - $(OR_IMPLIB) \ - -machine:$(CPU) \ - -def:$(OR_INTERPRETER_SRC)\$(@B).def \ - $(SYSUT32OBJ) \ - -out:$(OR_OUTDIR)\$(@B).lib - -# -# *** rxcmd32.DLL -# -# need import libraries and def files still -# w32sut32.lib needed for this Universal Thunk DLL -# -$(OR_OUTDIR)\rxcmd32.dll : $(SYSUT32OBJ) $(OR_OUTDIR)\$(@B).lib \ - $(OR_INTERPRETER_SRC)\$(@B).def - $(OR_LINK) $(lflags_common) $(lflags_dll) -out:$(OR_OUTDIR)\$(@B).dll \ - $(SYSUT32OBJ) \ - $(OR_OUTDIR)\$(@B).exp \ - w32sut32.lib - -# -# *** rxcmd16.DLL -# -# Created with 16-bit compiler stored in CMVC in \kernel directory -$(OR_OUTDIR)\rxcmd16.dll : $(OR_INTERPRETER_SRC)\$(@B).dll - @ECHO . - @ECHO Copying $(@B).dll from kernel directory - COPY $(OR_INTERPRETER_SRC)\$(@B).dll $(OR_OUTDIR)\$(@B).dll - -# Update the Windows Message Table resource if necessary - -$(INT_PLATFORM)\winmsgtb.rc: $(INT_PLATFORM)\WinMessageResource.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml - @ECHO . - @ECHO Generating $(@) - xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INT_PLATFORM)\WinMessageResource.xsl - -$(INTERPRETER_MESSAGES)\RexxErrorCodes.h: $(INTERPRETER_MESSAGES)\RexxErrorCodes.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml - @ECHO. - @ECHO Generating $(@) - xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\RexxErrorCodes.xsl - -$(OR_ORYXAPI)\oorexxerrors.h: $(INTERPRETER_MESSAGES)\ApiErrorCodes.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml - @ECHO. - @ECHO Generating $(@) - xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\ApiErrorCodes.xsl - -$(INTERPRETER_MESSAGES)\DocErrorMessages.sgml: $(INTERPRETER_MESSAGES)\DocBookErrors.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml - @ECHO. - @ECHO Generating $(@) - xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\DocBookErrors.xsl - -$(INTERPRETER_MESSAGES)\RexxMessageNumbers.h: $(INTERPRETER_MESSAGES)\RexxMessageNumbers.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml - @ECHO. - @ECHO Generating $(@) - xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\RexxMessageNumbers.xsl - -$(INTERPRETER_MESSAGES)\RexxMessageTable.h: $(INTERPRETER_MESSAGES)\RexxMessageTable.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml - @ECHO. - @ECHO Generating $(@) - xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\RexxMessageTable.xsl - -$(OR_APISRC)\api\oorexxerrors.h: $(INTERPRETER_MESSAGES)\ApiErrorCodes.xsl $(INTERPRETER_MESSAGES)\rexxmsg.xml - @ECHO . - @ECHO Generating $(@) - xalan -o $(@) $(INTERPRETER_MESSAGES)\rexxmsg.xml $(INTERPRETER_MESSAGES)\ApiErrorCodes.xsl - -$(BEHAVIOUR)\PrimitiveBehaviourNames.h: $(BEHAVIOUR)\PrimitiveBehaviourNames.xsl $(BEHAVIOUR)\PrimitiveClasses.xml - @ECHO. - @ECHO Generating $(@) - xalan -o $(@) $(BEHAVIOUR)\PrimitiveClasses.xml $(BEHAVIOUR)\PrimitiveBehaviourNames.xsl - -$(BEHAVIOUR)\PrimitiveBehaviours.cpp: $(BEHAVIOUR)\PrimitiveBehaviours.xsl $(BEHAVIOUR)\PrimitiveClasses.xml - @ECHO. - @ECHO Generating $(@) - xalan -o $(@) $(BEHAVIOUR)\PrimitiveClasses.xml $(BEHAVIOUR)\PrimitiveBehaviours.xsl - -$(BEHAVIOUR)\VirtualFunctionTable.cpp: $(BEHAVIOUR)\VirtualFunctionTable.xsl $(BEHAVIOUR)\PrimitiveClasses.xml - @ECHO. - @ECHO Generating $(@) - xalan -o $(@) $(BEHAVIOUR)\PrimitiveClasses.xml $(BEHAVIOUR)\VirtualFunctionTable.xsl - -$(BEHAVIOUR)\ClassTypeCodes.h: $(BEHAVIOUR)\ClassTypeCodes.xsl $(BEHAVIOUR)\PrimitiveClasses.xml - @ECHO. - @ECHO Generating $(@) - xalan -o $(@) $(BEHAVIOUR)\PrimitiveClasses.xml $(BEHAVIOUR)\ClassTypeCodes.xsl - -$(OR_OUTDIR)\winmsgtb.res: $(INT_PLATFORM)\winmsgtb.rc $(INTERPRETER_MESSAGES)\DocErrorMessages.sgml - @ECHO. - @ECHO ResourceCompiling $(@) - $(rc) $(rcflags_common) $(OR_ORYXRCINCL) -r -fo$(@) $(INT_PLATFORM)\winmsgtb.rc - - -# Update the version information block -$(OR_OUTDIR)\verinfo.res: $(INT_PLATFORM)\verinfo.rc - @ECHO. - @ECHO ResourceCompiling $(@B).res - $(rc) $(rcflags_common) -r -fo$(OR_OUTDIR)\$(@B).res $(OR_INTERPRETER_SRC)\$(@B).rc - -$(OR_OUTDIR)\rexxc.exe : $(OR_OUTDIR)\RexxCompiler.obj - $(OR_LINK) $(**) $(lflags_common_console) \ - $(OR_OUTDIR)\verinfo.res \ - $(OR_OUTDIR)\rexx.lib \ - -out:$(@) - -# -# -# *** Copy ORX files to target dir... -# -COPYORXFILES: $(ORXFILES) - -# -# -# *** Make sure headers are generated -# -ORXHEADERS: $(ORXHEADERS) - -# -# *** Inference Rule for Rexx Class files -# -{$(REXX_CLASSES)}.orx{$(OR_OUTDIR)}.orx: - @ECHO . - @ECHO Copying $(**) - COPY $(**) $(@) - -# -# *** Inference Rule for Rexx Class files -# -{$(INT_PLATFORM)}.orx{$(OR_OUTDIR)}.orx: - @ECHO . - @ECHO Copying $(**) - COPY $(**) $(@) - -# -# *** Inference Rule for Rexx samples -# -{$(OR_SAMPLESRC)}.rex{$(OR_OUTDIR)}.rex: - @ECHO . - @ECHO Copying $(**) - COPY $(**) $(@) - -# -# *** Inference Rule for Rexx samples -# -{$(OR_OLEOBJECTSRC)}.cls{$(OR_OUTDIR)}.cls: - @ECHO . - @ECHO Copying $(**) - COPY $(**) $(@) - - -# -# *** Inference Rule for C->OBJ -# *** For .C files in OR_LIBSRC directory -# -{$(OR_LIBSRC)}.c{$(OR_OUTDIR)}.obj: - @ECHO . - @ECHO Compiling $(@B).c - $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(OR_OUTDIR)\$(@B).obj $(Tp)$(OR_LIBSRC)\$(@B).c $(OR_ORYXINCL) - -# -# *** Inference Rule for CPP->OBJ -# *** For .CPP files in OR_LIBSRC directory -# -{$(OR_LIBSRC)}.cpp{$(OR_OUTDIR)}.obj: - @ECHO . - @ECHO Compiling $(**) - $(OR_CC) $(cflags_common) $(cflags_dll... [truncated message content] |
From: <bi...@us...> - 2008-08-10 13:59:24
|
Revision: 2933 http://oorexx.svn.sourceforge.net/oorexx/?rev=2933&view=rev Author: bigrixx Date: 2008-08-10 13:59:33 +0000 (Sun, 10 Aug 2008) Log Message: ----------- delete obsolete *ix files Modified Paths: -------------- main/trunk/Makefile.am Removed Paths: ------------- main/trunk/interpreter/platform/unix/SharedMemorySupport.cpp main/trunk/interpreter/platform/unix/SharedMemorySupport.h Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-10 13:29:57 UTC (rev 2932) +++ main/trunk/Makefile.am 2008-08-10 13:59:33 UTC (rev 2933) @@ -257,7 +257,6 @@ $(build_parser_dir)/Token.hpp platformHeaders = $(build_interpreter_platform_dir)/APIDefinitions.h \ $(build_interpreter_platform_dir)/PlatformDefinitions.h \ - $(build_interpreter_platform_dir)/SharedMemorySupport.h \ $(build_interpreter_platform_dir)/SysActivity.hpp \ $(build_interpreter_platform_dir)/SysFileSystem.hpp \ $(build_interpreter_platform_dir)/SysInterpreterInstance.hpp \ Deleted: main/trunk/interpreter/platform/unix/SharedMemorySupport.cpp =================================================================== --- main/trunk/interpreter/platform/unix/SharedMemorySupport.cpp 2008-08-10 13:29:57 UTC (rev 2932) +++ main/trunk/interpreter/platform/unix/SharedMemorySupport.cpp 2008-08-10 13:59:33 UTC (rev 2933) @@ -1,139 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ -/*****************************************************************************/ -/* REXX AIX Support aixshmem.c */ -/* */ -/* Module for greating shared memory segments */ -/* */ -/* Implemented via the System V IPC interface. */ -/* Both, IBM AIX and Linux do support the System V IPC standard form AT&T, */ -/* so it should work the same way on both systems. (weigold) */ -/*****************************************************************************/ - - -#include <stdio.h> -#include "SharedMemorySupport.h" -#include <sys/shm.h> -#include <errno.h> - -/******************************************************************************/ -/* Name: getshmem */ -/* */ -/* Arguments: key - the "name" of the shared memory segment */ -/* segsize - the size of the memory segment */ -/* */ -/* Returned: >0 - worked well, return the memory ID */ -/* -1 - already exitsts */ -/* */ -/* */ -/******************************************************************************/ -int getshmem(key_t key, int segsize){ - - int rc; - rc=(shmget(key, segsize, IPC_CREAT|IPC_EXCL|432)); - //if((errno == ENOSPC) || (segsize>SHMMAX)) - if ( ( rc == -1 ) && ( errno != EEXIST ) ) - return (-2); /* system limit reached */ - else - return rc; -} - - -/******************************************************************************/ -/* Name: openshmem */ -/* */ -/* Arguments: key - the "name" of the shared memory segment */ -/* segsize - the size of the memory segment */ -/* */ -/* Returned: >0 - worked well, return the memory ID */ -/* -1 - error */ -/* */ -/* */ -/******************************************************************************/ -int openshmem(key_t key, int segsize){ - - return (shmget(key, segsize, 0)); -} - -/******************************************************************************/ -/* Name: attachshmem */ -/* */ -/* Arguments: shmid - ID of the shared memory segment */ -/* */ -/* Returned: >0 - worked well, return the segment pointer */ -/* -1 - error */ -/* */ -/* */ -/******************************************************************************/ -char * attachshmem(int shmid){ - -#if defined(OPSYS_SUN) - return ((char*)shmat(shmid, 0, SHM_SHARE_MMU)); /* explicit conversion */ -#else - return ((char*)shmat(shmid, 0, 0)); /* explicit conversion */ -#endif -} - -/******************************************************************************/ -/* Name: detachshmem */ -/* */ -/* Arguments: shmidptr - ptr to the shared memory segment */ -/* */ -/* Returned: none */ -/* */ -/* */ -/******************************************************************************/ -void detachshmem(char * shmptr){ - - shmdt(shmptr); -} - -/******************************************************************************/ -/* Name: removeshmem */ -/* */ -/* Arguments: shmid - ID of the shared memory segment */ -/* */ -/* Returned: none */ -/* */ -/* */ -/******************************************************************************/ -void removeshmem(int shmid){ - - shmctl(shmid, IPC_RMID, 0); -} - Deleted: main/trunk/interpreter/platform/unix/SharedMemorySupport.h =================================================================== --- main/trunk/interpreter/platform/unix/SharedMemorySupport.h 2008-08-10 13:29:57 UTC (rev 2932) +++ main/trunk/interpreter/platform/unix/SharedMemorySupport.h 2008-08-10 13:59:33 UTC (rev 2933) @@ -1,67 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ -/*****************************************************************************/ -/* REXX AIX Support aixshmem.h */ -/* */ -/* Module for greating shared memory segments */ -/* */ -/* Implemented via the System V IPC interface. */ -/* Both, IBM AIX and Linux do support the System V IPC standard form AT&T, */ -/* so it should work the same way on both systems. (weigold) */ -/*****************************************************************************/ - - -/* Module: aixshmem.h */ - - -#include <sys/types.h> -#include <sys/ipc.h> - -#ifndef AIXSHMEM_H_INCLUDED -#define AIXSHMEM_H_INCLUDED - -//#ifndef LINUX -#define SHMMAX 0x10000000 /* not defined in AIX */ -//#endif -int getshmem(key_t, int); -int openshmem(key_t, int); -char * attachshmem(int); -void detachshmem(char *); -void removeshmem(int); - -#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-10 14:58:59
|
Revision: 2934 http://oorexx.svn.sourceforge.net/oorexx/?rev=2934&view=rev Author: bigrixx Date: 2008-08-10 14:59:03 +0000 (Sun, 10 Aug 2008) Log Message: ----------- redistribute stuff in RexxBuiltinFunctions.h Modified Paths: -------------- main/trunk/Makefile.am main/trunk/interpreter/classes/IntegerClass.cpp main/trunk/interpreter/classes/MutableBufferClass.cpp main/trunk/interpreter/classes/NumberStringClass.cpp main/trunk/interpreter/classes/NumberStringClass.hpp main/trunk/interpreter/classes/PackageClass.cpp main/trunk/interpreter/classes/StringClass.cpp main/trunk/interpreter/classes/StringClass.hpp main/trunk/interpreter/classes/StringClassBit.cpp main/trunk/interpreter/classes/StringClassConversion.cpp main/trunk/interpreter/classes/StringClassMisc.cpp main/trunk/interpreter/classes/StringClassSub.cpp main/trunk/interpreter/classes/StringClassUtil.cpp main/trunk/interpreter/classes/StringClassWord.cpp main/trunk/interpreter/classes/StringUtil.cpp main/trunk/interpreter/runtime/RexxCore.h Removed Paths: ------------- main/trunk/interpreter/runtime/RexxBuiltinFunctions.h Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/Makefile.am 2008-08-10 14:59:03 UTC (rev 2934) @@ -277,7 +277,6 @@ $(build_runtime_dir)/NativeFunctions.h \ $(build_runtime_dir)/NativeMethods.h \ $(build_runtime_dir)/Numerics.hpp \ - $(build_runtime_dir)/RexxBuiltinFunctions.h \ $(build_runtime_dir)/RexxConstants.hpp \ $(build_runtime_dir)/RexxCore.h \ $(build_runtime_dir)/RexxMisc.hpp Modified: main/trunk/interpreter/classes/IntegerClass.cpp =================================================================== --- main/trunk/interpreter/classes/IntegerClass.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/IntegerClass.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -50,7 +50,6 @@ #include "ArrayClass.hpp" #include "RexxActivation.hpp" #include "RexxActivity.hpp" -#include "RexxBuiltinFunctions.h" #include "Numerics.hpp" #include "RexxCompoundTail.hpp" Modified: main/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/MutableBufferClass.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -48,7 +48,6 @@ #include "RexxCore.h" #include "StringClass.hpp" #include "MutableBufferClass.hpp" -#include "RexxBuiltinFunctions.h" /* Gneral purpose BIF Header file */ #include "ProtectedObject.hpp" #include "StringUtil.hpp" @@ -83,7 +82,7 @@ if (args[0] != NULL) { /* force argument to string value */ - string = (RexxString *)get_string(args[0], ARG_ONE); + string = stringArgument(args[0], ARG_ONE); } else { @@ -97,7 +96,7 @@ if (argc >= 2) { - bufferLength = optional_length(args[1], DEFAULT_BUFFER_LENGTH, ARG_TWO); + bufferLength = optionalLengthArgument(args[1], DEFAULT_BUFFER_LENGTH, ARG_TWO); } defaultSize = bufferLength; /* remember initial default size */ @@ -295,9 +294,9 @@ // we're using optional length because 0 is valid for insert. size_t begin = optionalNonNegative(pos, 0, ARG_TWO); - size_t insertLength = optional_length(len, string->getLength(), ARG_THREE); + size_t insertLength = optionalLengthArgument(len, string->getLength(), ARG_THREE); - char padChar = get_pad(pad, ' ', ARG_FOUR); + char padChar = optionalPadArgument(pad, ' ', ARG_FOUR); size_t copyLength = Numerics::minVal(insertLength, string->getLength()); size_t padLength = insertLength - copyLength; @@ -356,11 +355,11 @@ /* Function: replace characters in buffer contents */ /******************************************************************************/ { - RexxString *string = get_string(str, ARG_ONE); - size_t begin = optional_position(pos, 1, ARG_TWO) - 1; - size_t replaceLength = optional_length(len, string->getLength(), ARG_THREE); + RexxString *string = stringArgument(str, ARG_ONE); + size_t begin = optionalPositionArgument(pos, 1, ARG_TWO) - 1; + size_t replaceLength = optionalLengthArgument(len, string->getLength(), ARG_THREE); - char padChar = get_pad(pad, ' ', ARG_FOUR); + char padChar = optionalPadArgument(pad, ' ', ARG_FOUR); // make sure we have room for this ensureCapacity(begin + replaceLength); @@ -396,8 +395,8 @@ /* Function: delete character range in buffer */ /******************************************************************************/ { - size_t begin = get_position(_start, ARG_ONE) - 1; - size_t range = optional_length(len, this->data->getLength() - begin, ARG_TWO); + size_t begin = positionArgument(_start, ARG_ONE) - 1; + size_t range = optionalLengthArgument(len, this->data->getLength() - begin, ARG_TWO); // is the begin point actually within the string? if (begin < dataLength) @@ -424,7 +423,7 @@ /* Function: set the size of the buffer */ /******************************************************************************/ { - size_t newsize = get_length(size, ARG_ONE); + size_t newsize = lengthArgument(size, ARG_ONE); // has a reset to zero been requested? if (newsize == 0) { Modified: main/trunk/interpreter/classes/NumberStringClass.cpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/NumberStringClass.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -51,7 +51,6 @@ #include "BufferClass.hpp" #include "RexxActivation.hpp" #include "NumberStringMath.hpp" -#include "RexxBuiltinFunctions.h" #include "Numerics.hpp" #include "StringUtil.hpp" @@ -2867,7 +2866,7 @@ /* get the target length */ - ResultSize = optional_length(_length, SIZE_MAX, ARG_ONE); + ResultSize = optionalLengthArgument(_length, SIZE_MAX, ARG_ONE); CurrentDigits = number_digits(); /* get the current digits setting */ TargetLength = this->length; /* copy the length */ /* too big to process? */ Modified: main/trunk/interpreter/classes/NumberStringClass.hpp =================================================================== --- main/trunk/interpreter/classes/NumberStringClass.hpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/NumberStringClass.hpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -71,6 +71,8 @@ #define NumberRounded 0x00000010 /* Indicate the number was rounded once */ /* at NumDigits, avoid double rounding */ +#define OVERFLOWSPACE 2 /* space for numeric buffer overflow */ + #define SetNumberStringZero() \ this->number[0] = '\0'; /* Make value a zero.*/ \ this->length = 1; /* Length is 1 */ \ Modified: main/trunk/interpreter/classes/PackageClass.cpp =================================================================== --- main/trunk/interpreter/classes/PackageClass.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/PackageClass.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -47,7 +47,6 @@ #include "DirectoryClass.hpp" #include "ProtectedObject.hpp" #include "PackageClass.hpp" -#include "RexxBuiltinFunctions.h" #include "RoutineClass.hpp" #include "InterpreterInstance.hpp" #include "PackageManager.hpp" @@ -163,7 +162,7 @@ RexxString *PackageClass::getSourceLineRexx(RexxObject *position) { // the starting position isn't optional - size_t n = get_position(position, ARG_ONE); + size_t n = positionArgument(position, ARG_ONE); return source->get(n); } Modified: main/trunk/interpreter/classes/StringClass.cpp =================================================================== --- main/trunk/interpreter/classes/StringClass.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/StringClass.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -51,7 +51,6 @@ #include "DirectoryClass.hpp" #include "RexxActivation.hpp" #include "RexxActivity.hpp" -#include "RexxBuiltinFunctions.h" #include "ProtectedObject.hpp" #include "StringUtil.hpp" #include "RexxCompoundTail.hpp" @@ -1425,8 +1424,8 @@ */ 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); + size_t startPos = optionalPositionArgument(_start, 1, ARG_ONE) - 1; + size_t rangeLength = optionalLengthArgument(_length, getLength(), ARG_TWO); // if we're starting beyond the end bounds, return unchanged if (startPos >= getLength()) @@ -1458,8 +1457,8 @@ */ 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); + size_t startPos = optionalPositionArgument(_start, 1, ARG_ONE) - 1; + size_t rangeLength = optionalLengthArgument(_length, getLength(), ARG_TWO); // if we're starting beyond the end bounds, return unchanged if (startPos >= getLength()) Modified: main/trunk/interpreter/classes/StringClass.hpp =================================================================== --- main/trunk/interpreter/classes/StringClass.hpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/StringClass.hpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -64,8 +64,58 @@ #define INITIAL_NAME_SIZE 10 /* first name table allocation */ #define EXTENDED_NAME_SIZE 10 /* amount to extend table by */ + /* Strip function options */ +#define STRIP_BOTH 'B' +#define STRIP_LEADING 'L' +#define STRIP_TRAILING 'T' + /* Datatype function options */ +#define DATATYPE_ALPHANUMERIC 'A' +#define DATATYPE_BINARY 'B' +#define DATATYPE_LOWERCASE 'L' +#define DATATYPE_MIXEDCASE 'M' +#define DATATYPE_NUMBER 'N' +#define DATATYPE_SYMBOL 'S' +#define DATATYPE_VARIABLE 'V' +#define DATATYPE_UPPERCASE 'U' +#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' +#define ch_SPACE ' ' + /* character validation sets for the */ + /* datatype function */ +#define HEX_CHAR_STR "0123456789ABCDEFabcdef" +#define ALPHANUM \ +"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" +#define BINARI "01" +#define LOWER_ALPHA "abcdefghijklmnopqrstuvwxyz" +#define MIXED_ALPHA \ +"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define UPPER_ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +/*********************************************************************/ +/* */ +/* Name: IntToHexdigit */ +/* */ +/* Descriptive name: convert int to hexadecimal digit */ +/* */ +/* Returns: A hexadecimal digit representing n. */ +/* */ +/*********************************************************************/ + + /* convert the number */ +inline char IntToHexDigit(int n) +{ + return "0123456789ABCDEF"[n]; +} + + class RexxString : public RexxObject { public: inline void *operator new(size_t size, void *ptr){return ptr;}; Modified: main/trunk/interpreter/classes/StringClassBit.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassBit.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/StringClassBit.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -48,7 +48,6 @@ #include <math.h> #include "RexxCore.h" #include "StringClass.hpp" -#include "RexxBuiltinFunctions.h" /******************************************************************************/ /* Arguments: String to bitand with self */ @@ -74,11 +73,11 @@ /* get string we will be doing bit */ /* stuff to... */ - string2 = optional_string(string2, OREF_NULLSTRING, ARG_ONE); + string2 = optionalStringArgument(string2, OREF_NULLSTRING, ARG_ONE); String2Len = string2->getLength(); /* get the string length */ String2 = string2->getStringData(); /* get the string data pointer */ /* get the pad character */ - PadChar = get_pad(pad, 0xff, ARG_TWO); + PadChar = optionalPadArgument(pad, (char)0xff, ARG_TWO); String1 = this->getStringData(); /* point to the first string */ String1Len = this->getLength(); /* get the length */ @@ -143,11 +142,11 @@ /* get string we will be doing bit */ /* stuff to... */ - string2 = optional_string(string2, OREF_NULLSTRING, ARG_ONE); + string2 = optionalStringArgument(string2, OREF_NULLSTRING, ARG_ONE); String2Len = string2->getLength(); /* get the string length */ String2 = string2->getStringData(); /* get the string data pointer */ /* get the pad character */ - PadChar = get_pad(pad, 0x00, ARG_TWO); + PadChar = optionalPadArgument(pad, 0x00, ARG_TWO); String1 = this->getStringData(); /* point to the first string */ String1Len = this->getLength(); /* get the length */ @@ -212,11 +211,11 @@ /* get string we will be doing bit */ /* stuff to... */ - string2 = optional_string(string2, OREF_NULLSTRING, ARG_ONE); + string2 = optionalStringArgument(string2, OREF_NULLSTRING, ARG_ONE); String2Len = string2->getLength(); /* get the string length */ String2 = string2->getStringData(); /* get the string data pointer */ /* get the pad character */ - PadChar = get_pad(pad, 0x00, ARG_TWO); + PadChar = optionalPadArgument(pad, 0x00, ARG_TWO); String1 = this->getStringData(); /* point to the first string */ String1Len = this->getLength(); /* get the length */ Modified: main/trunk/interpreter/classes/StringClassConversion.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassConversion.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/StringClassConversion.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -48,7 +48,6 @@ #include "RexxCore.h" #include "StringClass.hpp" #include "BufferClass.hpp" -#include "RexxBuiltinFunctions.h" #include "NumberStringMath.hpp" #include "ActivityManager.hpp" @@ -336,7 +335,7 @@ CurrentDigits = number_digits(); /* get the current digits setting */ StringLength = this->getLength(); /* get Argument string length */ /* get the target length */ - ResultSize = optional_length(_length, -1, ARG_ONE); + ResultSize = optionalLengthArgument(_length, -1, ARG_ONE); if (!ResultSize) /* zero requested */ { return(RexxString *)IntegerZero; /* always returns zero */ Modified: main/trunk/interpreter/classes/StringClassMisc.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/StringClassMisc.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -48,7 +48,6 @@ #include <math.h> #include "RexxCore.h" #include "StringClass.hpp" -#include "RexxBuiltinFunctions.h" #include "SourceFile.hpp" #include "ActivityManager.hpp" #include "StringUtil.hpp" @@ -195,11 +194,11 @@ size_t ChkLen; /* required check length */ int rc; /* compare result */ - info = get_string(info, ARG_ONE); /* process the information string */ + info = stringArgument(info, ARG_ONE); /* process the information string */ Len2 = info->getLength(); /* get the length also */ /* get the optional check length */ /* get the optional check length */ - ChkLen = optional_length(_length, Len2, ARG_TWO); + ChkLen = optionalLengthArgument(_length, Len2, ARG_TWO); Len1 = this->getLength(); /* get this length */ if (ChkLen == 0 && Len2 == 0) /* if null string match */ @@ -226,10 +225,10 @@ RexxInteger *RexxString::caselessAbbrev(RexxString *info, RexxInteger *_length) { // the info must be a string value - info = get_string(info, ARG_ONE); + info = stringArgument(info, ARG_ONE); stringsize_t len2 = info->getLength(); // the check length is optional, and defaults to the length of info. - stringsize_t chkLen = optional_length(_length, len2, ARG_TWO); + stringsize_t chkLen = optionalLengthArgument(_length, len2, ARG_TWO); stringsize_t len1 = this->getLength(); @@ -271,9 +270,9 @@ Length1 = this->getLength(); /* get this strings length */ /* validate the compare string */ - string2 = get_string(string2, ARG_ONE); + string2 = stringArgument(string2, ARG_ONE); Length2 = string2->getLength(); /* get the length also */ - PadChar = get_pad(pad, ' ', ARG_TWO);/* get the pad character */ + PadChar = optionalPadArgument(pad, ' ', ARG_TWO);/* get the pad character */ if (Length1 > Length2) { /* first longer? */ String1 = this->getStringData(); /* make arg 1 first string */ @@ -337,10 +336,10 @@ { stringsize_t length1 = this->getLength(); /* get this strings length */ /* validate the compare string */ - other = get_string(other, ARG_ONE); + other = stringArgument(other, ARG_ONE); stringsize_t length2 = other->getLength(); /* get the length also */ // we uppercase the pad character now since this is caseless - char padChar = toupper(get_pad(pad, ' ', ARG_TWO)); + char padChar = toupper(optionalPadArgument(pad, ' ', ARG_TWO)); const char *string1; const char *string2; @@ -442,7 +441,7 @@ if (pType != OREF_NULL) { /* see if type was specified? */ /* yes, specified, get 1st char */ - int type = option_character(pType, 0, ARG_ONE); + int type = optionalOptionArgument(pType, 0, ARG_ONE); /* and call datatype routine to */ return StringUtil::dataType(this, type); /* determine if its type specified. */ } @@ -465,7 +464,7 @@ // validate that this is a good string argument needle = REQUIRED_STRING(needle, ARG_ONE); // find out where to start the search. The default is at the very end. - size_t startPos = optional_position(_start, getLength(), ARG_TWO); + size_t startPos = optionalPositionArgument(_start, getLength(), ARG_TWO); // now perform the actual search. return new_integer(caselessLastPos(needle, startPos)); } @@ -743,7 +742,7 @@ /* force needle to a string */ needle = REQUIRED_STRING(needle, ARG_ONE); /* get the starting position */ - size_t _start = optional_position(pstart, 1, ARG_TWO); + size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); /* pass on to the primitive function */ /* and return as an integer object */ return new_integer(this->caselessPos(needle, _start - 1)); @@ -841,15 +840,15 @@ } /* validate the tables */ /* validate the tables */ - tableo = optional_string(tableo, OREF_NULLSTRING, ARG_ONE); + tableo = optionalStringArgument(tableo, OREF_NULLSTRING, ARG_ONE); OutTableLength = tableo->getLength(); /* get the table length */ /* input table too */ - tablei = optional_string(tablei, OREF_NULLSTRING, ARG_TWO); + tablei = optionalStringArgument(tablei, OREF_NULLSTRING, ARG_TWO); InTableLength = tablei->getLength(); /* get the table length */ InTable = tablei->getStringData(); /* point at the input table */ OutTable = tableo->getStringData(); /* and the output table */ /* get the pad character */ - PadChar = get_pad(pad, ' ', ARG_THREE); + PadChar = optionalPadArgument(pad, ' ', ARG_THREE); /* allocate space for answer */ /* and copy the string */ Retval = new_string(this->getStringData(), this->getLength()); @@ -906,10 +905,10 @@ char ch; /* scan character */ bool Match; /* found a match */ - ref = get_string(ref, ARG_ONE); /* get the reference string */ + ref = stringArgument(ref, ARG_ONE); /* get the reference string */ ReferenceLen = ref->getLength(); /* get a length also */ /* get the option, default 'Nomatch' */ - Option = option_character(option, VERIFY_NOMATCH, ARG_TWO); + Option = optionalOptionArgument(option, VERIFY_NOMATCH, ARG_TWO); if (Option != VERIFY_MATCH && /* options are 'Match' and */ Option != VERIFY_NOMATCH) /* 'NoMatch' */ { @@ -918,7 +917,7 @@ } /* get starting position */ - StartPos = optional_position(_start, 1, ARG_THREE); + StartPos = optionalPositionArgument(_start, 1, ARG_THREE); StringLen = this->getLength(); /* get the string length */ if (StartPos > StringLen) /* beyond end of string? */ { Modified: main/trunk/interpreter/classes/StringClassSub.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassSub.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/StringClassSub.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -48,7 +48,6 @@ #include <math.h> #include "RexxCore.h" #include "StringClass.hpp" -#include "RexxBuiltinFunctions.h" #include "ActivityManager.hpp" #include "StringUtil.hpp" @@ -71,11 +70,11 @@ RexxString *Retval; /* return string */ /* see how long result should be */ - Width = get_length(_length, ARG_ONE); + Width = lengthArgument(_length, ARG_ONE); /* Get pad character (optional) blank*/ /* is used if omitted. */ - PadChar = get_pad(pad, ' ', ARG_TWO); + PadChar = optionalPadArgument(pad, ' ', ARG_TWO); Len = this->getLength(); /* get length of input to center */ if (Width == Len) /* if input length and */ { @@ -135,9 +134,9 @@ StringLen = this->getLength(); /* get string length */ /* get start string position */ - DeletePos = get_position(position, ARG_ONE); + DeletePos = positionArgument(position, ARG_ONE); /* get the length to delete */ - DeleteLen = optional_length(_length, StringLen - DeletePos + 1, ARG_TWO); + DeleteLen = optionalLengthArgument(_length, StringLen - DeletePos + 1, ARG_TWO); if (DeletePos > StringLen) /* beyond string bounds? */ { @@ -205,18 +204,18 @@ TCharLen = this->getLength(); /* get the target string length */ /* get the needle string (and length)*/ - newStr = (RexxString *)get_string(newStrObj, ARG_ONE); + newStr = stringArgument(newStrObj, ARG_ONE); NCharLen = newStr->getLength(); - /* use optional_length for starting */ + /* use optionalLengthArgument for starting */ /* position becase a value of 0 IS */ /* valid for INSERT */ - NChar = optional_length(position, 0, ARG_TWO); + NChar = optionalLengthArgument(position, 0, ARG_TWO); /* get the optional length, using the*/ /* needle length as the defaul */ - ReqLenChar = optional_length(_length, NCharLen, ARG_THREE); + ReqLenChar = optionalLengthArgument(_length, NCharLen, ARG_THREE); /* is used if omitted. */ - PadChar = get_pad(pad, ' ', ARG_FOUR); + PadChar = optionalPadArgument(pad, ' ', ARG_FOUR); ReqLeadPad = 0; /* set lead pad to zero */ TargetSize = TCharLen; /* copy the target size */ @@ -297,10 +296,10 @@ size_t CopyLength; /* length to copy */ /* get the target length */ - Size = get_length(_length, ARG_ONE); + Size = lengthArgument(_length, ARG_ONE); /* is used if omitted. */ - PadChar = get_pad(pad, ' ', ARG_TWO); + PadChar = optionalPadArgument(pad, ' ', ARG_TWO); Length = this->getLength(); /* get input length */ if (!Size) /* requesting zero bytes? */ @@ -352,14 +351,14 @@ TargetLen = this->getLength(); /* get the haystack length */ /* get the overlay string value */ - newStr = (RexxString *)get_string(newStrObj, ARG_ONE); + newStr = stringArgument(newStrObj, ARG_ONE); NewLen = newStr->getLength(); /* get the overlay position */ - OverlayPos = optional_position(position, 1, ARG_TWO); + OverlayPos = optionalPositionArgument(position, 1, ARG_TWO); /* get final overlay length */ - OverlayLen = optional_length(_length, NewLen, ARG_THREE); + OverlayLen = optionalLengthArgument(_length, NewLen, ARG_THREE); /* is used if omitted. */ - PadChar = get_pad(pad, ' ', ARG_FOUR); + PadChar = optionalPadArgument(pad, ' ', ARG_FOUR); if (OverlayLen > NewLen) /* need to pad? */ BackPad = OverlayLen - NewLen; /* get the pad size */ @@ -483,10 +482,10 @@ size_t CopyLength; /* length to copy */ /* get the target length */ - Size = get_length(_length, ARG_ONE); + Size = lengthArgument(_length, ARG_ONE); /* is used if omitted. */ - PadChar = get_pad(pad, ' ', ARG_TWO); + PadChar = optionalPadArgument(pad, ' ', ARG_TWO); Length = this->getLength(); /* get input length */ if (!Size) /* requesting zero bytes? */ @@ -533,7 +532,7 @@ RexxString *Retval; /* return value */ /* get the option character */ - Option = option_character(option, STRIP_BOTH, ARG_ONE); + Option = optionalOptionArgument(option, STRIP_BOTH, ARG_ONE); if (Option != STRIP_TRAILING && /* must be a valid option */ Option != STRIP_LEADING && Option != STRIP_BOTH ) @@ -542,7 +541,7 @@ } // get the strip character. This is a phony default, as the // real default strips the entire set of recognized whitespace characters. - RemoveChar = get_pad(stripchar, ' ', ARG_TWO); + RemoveChar = optionalPadArgument(stripchar, ' ', ARG_TWO); // and get a special processing flag bool stripWhite = stripchar == OREF_NULL; Modified: main/trunk/interpreter/classes/StringClassUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassUtil.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/StringClassUtil.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -47,7 +47,6 @@ #include "RexxCore.h" #include "StringClass.hpp" -#include "RexxBuiltinFunctions.h" /* include BIF util prototype/macros */ #include "ActivityManager.hpp" @@ -56,7 +55,7 @@ /* object, verifying that the number is a non-negative value. */ /* If the argument is omitted, an error is raised. */ /******************************************************************************/ -stringsize_t get_length( +stringsize_t lengthArgument( RexxObject * argument, /* input argument */ size_t position ) /* position of the argument */ { @@ -80,7 +79,7 @@ /* value, verifying that the number is a positive value. */ /* If the argument is omitted, an error is raised. */ /******************************************************************************/ -stringsize_t get_position( +stringsize_t positionArgument( RexxObject *argument, /* input argument */ size_t position ) /* position of the argument */ { @@ -103,7 +102,7 @@ /* character, if it exists otherwise return the default */ /* character as defined (passed in) by the BIF. */ /******************************************************************************/ -char get_pad_character( +char padArgument( RexxObject *argument, /* method argument */ size_t position ) /* argument position */ { @@ -124,7 +123,7 @@ /* character, if it exists otherwise return the default */ /* character as defined (passed in) by the BIF. */ /******************************************************************************/ -char get_option_character( +char optionArgument( RexxObject *argument, /* method argument */ size_t position ) /* argument position */ { Modified: main/trunk/interpreter/classes/StringClassWord.cpp =================================================================== --- main/trunk/interpreter/classes/StringClassWord.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/StringClassWord.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -48,7 +48,6 @@ #include <math.h> #include "RexxCore.h" #include "StringClass.hpp" -#include "RexxBuiltinFunctions.h" #include "StringUtil.hpp" @@ -73,10 +72,10 @@ RexxString *Retval; /* return value */ /* convert position to binary */ - WordPos = get_position(position, ARG_ONE); + WordPos = positionArgument(position, ARG_ONE); /* get num of words to delete, the */ /* default is "a very large number" */ - Count = optional_length(plength, MAXNUM, ARG_TWO); + Count = optionalLengthArgument(plength, MAXNUM, ARG_TWO); Length = this->getLength(); /* get string length */ if (!Length) /* null string? */ @@ -158,10 +157,10 @@ RexxString *Retval; /* return value */ /* get the spacing count */ - Spaces = optional_length(space_count, 1, ARG_ONE); + Spaces = optionalLengthArgument(space_count, 1, ARG_ONE); /* get the pad character */ - PadChar = get_pad(pad, ' ', ARG_TWO); + PadChar = optionalPadArgument(pad, ' ', ARG_TWO); Length = this->getLength(); /* get the string length */ Count = 0; /* no words yet */ @@ -237,10 +236,10 @@ RexxString *Retval; /* return value */ /* convert position to binary */ - WordPos = get_position(position, ARG_ONE); + WordPos = positionArgument(position, ARG_ONE); /* get num of words to delete, the */ /* default is "a very large number" */ - Count = optional_length(plength, MAXNUM, ARG_TWO); + Count = optionalLengthArgument(plength, MAXNUM, ARG_TWO); Length = this->getLength(); /* get Argument length */ if (!Length || !Count) /* null string? */ @@ -297,7 +296,7 @@ RexxString *Retval; /* return value */ /* convert position to binary */ - WordPos = get_position(position, ARG_ONE); + WordPos = positionArgument(position, ARG_ONE); Length = this->getLength(); /* get Argument length */ if (Length == 0) /* null string? */ @@ -346,7 +345,7 @@ Length = this->getLength(); /* get the string length */ /* convert count to binary */ - WordPos = get_position(position, ARG_ONE); + WordPos = positionArgument(position, ARG_ONE); Word = this->getStringData(); /* point to word data */ /* get the first word */ @@ -385,7 +384,7 @@ Length = this->getLength(); /* get the string length */ /* convert count to binary */ - WordPos = get_position(position , ARG_ONE); + WordPos = positionArgument(position , ARG_ONE); Word = this->getStringData(); /* point to word data */ /* get the first word */ @@ -431,11 +430,11 @@ const char *NextNeedlePtr; /* pointer to next word */ size_t i; /* loop counter */ - phrase = get_string(phrase, ARG_ONE);/* get the phrase we are looking for */ + phrase = stringArgument(phrase, ARG_ONE);/* get the phrase we are looking for */ NeedleLength = phrase->getLength(); /* get the length also */ /* get starting position, the default*/ /* is the first word */ - Count = optional_position(pstart, 1, ARG_TWO); + Count = optionalPositionArgument(pstart, 1, ARG_TWO); Needle = phrase->getStringData(); /* get friendly pointer */ Haystack = this->getStringData(); /* and the second also */ @@ -542,11 +541,11 @@ RexxInteger *RexxString::caselessWordPos(RexxString *phrase, RexxInteger *pstart) { - phrase = get_string(phrase, ARG_ONE);/* get the phrase we are looking for */ + phrase = stringArgument(phrase, ARG_ONE);/* get the phrase we are looking for */ stringsize_t needleLength = phrase->getLength(); /* get the length also */ /* get starting position, the default*/ /* is the first word */ - stringsize_t count = optional_position(pstart, 1, ARG_TWO); + stringsize_t count = optionalPositionArgument(pstart, 1, ARG_TWO); const char *needle = phrase->getStringData(); /* get friendly pointer */ const char *haystack = this->getStringData(); /* and the second also */ Modified: main/trunk/interpreter/classes/StringUtil.cpp =================================================================== --- main/trunk/interpreter/classes/StringUtil.cpp 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/classes/StringUtil.cpp 2008-08-10 14:59:03 UTC (rev 2934) @@ -46,7 +46,6 @@ #include "RexxCore.h" #include "StringClass.hpp" -#include "RexxBuiltinFunctions.h" #include "ProtectedObject.hpp" #include "StringUtil.hpp" #include "QueueClass.hpp" @@ -67,7 +66,7 @@ RexxString *StringUtil::substr(const char *string, size_t stringLength, RexxInteger *_position, RexxInteger *_length, RexxString *pad) { - size_t position = get_position(_position, ARG_ONE) - 1; + size_t position = positionArgument(_position, ARG_ONE) - 1; // assume nothing is pulled from this string size_t length = 0; // is the position within the string bounds? @@ -77,9 +76,9 @@ length = stringLength - position; } // now we process any overrides on this - length = optional_length(_length, length, ARG_TWO); + length = optionalLengthArgument(_length, length, ARG_TWO); // get a padding character (blank is default) - char padChar = get_pad(pad, ' ', ARG_THREE); + char padChar = optionalPadArgument(pad, ' ', ARG_THREE); // if our target length is zero, we can just return the null string singleton if (length == 0) @@ -133,7 +132,7 @@ /* force needle to a string */ needle = REQUIRED_STRING(needle, ARG_ONE); /* get the starting position */ - size_t _start = optional_position(pstart, 1, ARG_TWO); + size_t _start = optionalPositionArgument(pstart, 1, ARG_TWO); /* pass on to the primitive function */ /* and return as an integer object */ return new_integer(pos(stringData, length, needle, _start - 1)); @@ -203,7 +202,7 @@ { needle = REQUIRED_STRING(needle, ARG_ONE); // find out where to start the search. The default is at the very end. - size_t startPos = optional_position(_start, haystackLen, ARG_TWO); + size_t startPos = optionalPositionArgument(_start, haystackLen, ARG_TWO); // now perform the actual search. return new_integer(lastPos(stringData, haystackLen, needle, startPos)); } @@ -342,7 +341,7 @@ RexxString *StringUtil::subchar(const char *stringData, size_t stringLength, RexxInteger *positionArg) { // the starting position isn't optional - size_t position = get_position(positionArg, ARG_ONE) - 1; + size_t position = positionArgument(positionArg, ARG_ONE) - 1; // beyond the bounds, this is a null string if (position >= stringLength) Deleted: main/trunk/interpreter/runtime/RexxBuiltinFunctions.h =================================================================== --- main/trunk/interpreter/runtime/RexxBuiltinFunctions.h 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/runtime/RexxBuiltinFunctions.h 2008-08-10 14:59:03 UTC (rev 2934) @@ -1,119 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ -/******************************************************************************/ -/* REXX Kernel RexxBuiltinFunctions.h */ -/* */ -/* REXX String method utility definitions */ -/* */ -/******************************************************************************/ - -#ifndef OKBIF_INCLUDED -#define OKBIF_INCLUDED - -#define get_string(s, p) REQUIRED_STRING(s, p) -#define optional_string(o, d, p) (o == OREF_NULL ? d : get_string(o, p)) -size_t get_length(RexxObject *, size_t); -#define optional_length(o, d, p) (o == OREF_NULL ? d : get_length(o, p)) -size_t get_position(RexxObject *, size_t); -#define optional_position(o, d, p) (o == OREF_NULL ? d : get_position(o, p)) -char get_pad_character(RexxObject *, size_t); -#define get_pad(o, d, p) (o == OREF_NULL ? d : get_pad_character(o, p)) -char get_option_character(RexxObject *, size_t); -#define option_character(o, d, p) (o == OREF_NULL ? d : get_option_character(o, p)) -#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) - - -#define ch_SPACE ' ' -#define ch_NULL '\0' -#define OVERFLOWSPACE 2 /* space for numeric buffer overflow */ - - /* Strip function options */ -#define STRIP_BOTH 'B' -#define STRIP_LEADING 'L' -#define STRIP_TRAILING 'T' - /* Datatype function options */ -#define DATATYPE_ALPHANUMERIC 'A' -#define DATATYPE_BINARY 'B' -#define DATATYPE_LOWERCASE 'L' -#define DATATYPE_MIXEDCASE 'M' -#define DATATYPE_NUMBER 'N' -#define DATATYPE_SYMBOL 'S' -#define DATATYPE_VARIABLE 'V' -#define DATATYPE_UPPERCASE 'U' -#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' - - /* character validation sets for the */ - /* datatype function */ -#define HEX_CHAR_STR "0123456789ABCDEFabcdef" -#define ALPHANUM \ -"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -#define BINARI "01" -#define LOWER_ALPHA "abcdefghijklmnopqrstuvwxyz" -#define MIXED_ALPHA \ -"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" -#define UPPER_ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - -/*********************************************************************/ -/* */ -/* Name: IntToHexdigit */ -/* */ -/* Descriptive name: convert int to hexadecimal digit */ -/* */ -/* Returns: A hexadecimal digit representing n. */ -/* */ -/*********************************************************************/ - - /* convert the number */ -#define IntToHexDigit(n) "0123456789ABCDEF"[(int)n]; - -#endif Modified: main/trunk/interpreter/runtime/RexxCore.h =================================================================== --- main/trunk/interpreter/runtime/RexxCore.h 2008-08-10 13:59:33 UTC (rev 2933) +++ main/trunk/interpreter/runtime/RexxCore.h 2008-08-10 14:59:03 UTC (rev 2934) @@ -330,6 +330,56 @@ return object->requiredString(position); } +inline RexxString *stringArgument(RexxObject *s, size_t p) +{ + return REQUIRED_STRING(s, p); +} + +inline RexxString *optionalStringArgument(RexxObject *o, RexxString *d, size_t p) +{ + return (o == OREF_NULL ? d : stringArgument(o, p)); +} + +// resides in the string class util +size_t lengthArgument(RexxObject *o, size_t p); + +inline size_t optionalLengthArgument(RexxObject *o, size_t d, size_t p) +{ + return (o == OREF_NULL ? d : lengthArgument(o, p)); +} + +// resides in the string class util +size_t positionArgument(RexxObject *o, size_t p); + +inline size_t optionalPositionArgument(RexxObject *o, size_t d, size_t p) +{ + return (o == OREF_NULL ? d : positionArgument(o, p)); +} + +char padArgument(RexxObject *o, size_t p); + +inline char optionalPadArgument(RexxObject *o, char d, size_t p) +{ + return (o == OREF_NULL ? d : padArgument(o, p)); +} + +char optionArgument(RexxObject *o, size_t p); + +inline char optionalOptionArgument(RexxObject *o, char d, size_t p) +{ + return (o == OREF_NULL ? d : optionArgument(o, p)); +} + +inline size_t optionalNonNegative(RexxObject *o, size_t d, size_t p) +{ + return (o == OREF_NULL ? d : o->requiredNonNegative(p)); +} + +inline size_t optionalPositive(RexxObject *o, size_t d, size_t p) +{ + return (o == OREF_NULL ? d : o->requiredPositive(p)); +} + /* The next routine is specifically for REQUESTing an ARRAY needed as a method*/ /* argument. This raises an error if the object cannot be converted to a */ /* single dimensional array item */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-10 17:27:25
|
Revision: 2936 http://oorexx.svn.sourceforge.net/oorexx/?rev=2936&view=rev Author: bigrixx Date: 2008-08-10 17:27:30 +0000 (Sun, 10 Aug 2008) Log Message: ----------- move rexximage to utilities and use a single source file Modified Paths: -------------- main/trunk/Makefile.am main/trunk/platform/windows/oryxwin.mak Added Paths: ----------- main/trunk/utilities/rexximage/ main/trunk/utilities/rexximage/rexximage.cpp Removed Paths: ------------- main/trunk/platform/unix/rexximage.cpp main/trunk/platform/windows/rexximage.cpp Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-10 16:44:24 UTC (rev 2935) +++ main/trunk/Makefile.am 2008-08-10 17:27:30 UTC (rev 2936) @@ -705,17 +705,14 @@ #################### rexx ########################## # Sources for rexx # -rexximage_SOURCES = $(build_utils_platform_dir)/rexximage.cpp +rexximage_SOURCES = $(build_utilities_)/rexximage/rexximage.cpp # # Preprocessor flags for rexximage # rexximage_CXXFLAGS = $(COMMON_CPPFLAGS) \ -I$(build_lib_dir) \ -I$(build_api_dir) \ - -I$(build_api_platform_dir) \ - -I$(build_messages_dir) \ - -I$(build_interpreter_platform_dir) \ - -I$(build_rexxapi_platform_dir) + -I$(build_api_platform_dir) # # Extra libraries for rexx # @@ -904,7 +901,7 @@ rexx.img: rexximage librexxutil.la $(core_classes) $(core_platform_classes) cp $(build_rexxclasses_dir)/*.orx . cp $(build_interpreter_platform_dir)/*.orx . - ./rexximage -i + ./rexximage rm -f *.orx # Deleted: main/trunk/platform/unix/rexximage.cpp =================================================================== --- main/trunk/platform/unix/rexximage.cpp 2008-08-10 16:44:24 UTC (rev 2935) +++ main/trunk/platform/unix/rexximage.cpp 2008-08-10 17:27:30 UTC (rev 2936) @@ -1,45 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ - -#include "rexx.h" -#include "RexxInternalApis.h" - -int main(int argc, char *argv[]) -{ - RexxCreateInterpreterImage(); -} Modified: main/trunk/platform/windows/oryxwin.mak =================================================================== --- main/trunk/platform/windows/oryxwin.mak 2008-08-10 16:44:24 UTC (rev 2935) +++ main/trunk/platform/windows/oryxwin.mak 2008-08-10 17:27:30 UTC (rev 2936) @@ -130,10 +130,10 @@ @ECHO Compiling $(@B).c $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(OR_OUTDIR)\$(@B).obj $(OR_ORYXINCL) $(Tp)$(OR_WINKERNELSRC)\$(@B).c -$(OR_OUTDIR)\rexximage.obj: $(OR_WINKERNELSRC)\rexximage.cpp +$(OR_OUTDIR)\rexximage.obj: $(OR_UTILITIES)\rexximage\rexximage.cpp @ECHO . @ECHO Compiling $(@B).c - $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(OR_OUTDIR)\$(@B).obj $(OR_ORYXINCL) $(Tp)$(OR_WINKERNELSRC)\$(@B).cpp + $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(OR_OUTDIR)\$(@B).obj $(OR_ORYXINCL) $(Tp)$(OR_UTILITIES)\rexximage\rexximage.cpp # # *** Copy ICO files to target dir... Deleted: main/trunk/platform/windows/rexximage.cpp =================================================================== --- main/trunk/platform/windows/rexximage.cpp 2008-08-10 16:44:24 UTC (rev 2935) +++ main/trunk/platform/windows/rexximage.cpp 2008-08-10 17:27:30 UTC (rev 2936) @@ -1,45 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ - -#include "rexx.h" -#include "RexxInternalApis.h" - -int __cdecl main(int argc, char *argv[]) -{ - RexxCreateInterpreterImage(); -} Copied: main/trunk/utilities/rexximage/rexximage.cpp (from rev 2930, main/trunk/platform/windows/rexximage.cpp) =================================================================== --- main/trunk/utilities/rexximage/rexximage.cpp (rev 0) +++ main/trunk/utilities/rexximage/rexximage.cpp 2008-08-10 17:27:30 UTC (rev 2936) @@ -0,0 +1,45 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "rexx.h" +#include "RexxInternalApis.h" + +int main(int argc, char *argv[]) +{ + RexxCreateInterpreterImage(); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-11 00:03:02
|
Revision: 2939 http://oorexx.svn.sourceforge.net/oorexx/?rev=2939&view=rev Author: bigrixx Date: 2008-08-11 00:03:09 +0000 (Mon, 11 Aug 2008) Log Message: ----------- create directories for restructuring Added Paths: ----------- main/trunk/extensions/rexxutil/ main/trunk/extensions/rexxutil/platform/ main/trunk/extensions/rexxutil/platform/unix/ main/trunk/extensions/rexxutil/platform/windows/ main/trunk/extensions/rxmath/ main/trunk/extensions/rxsock/ main/trunk/utilities/rexx/ main/trunk/utilities/rexx/platform/ main/trunk/utilities/rexx/platform/unix/ main/trunk/utilities/rexx/platform/windows/ main/trunk/utilities/rexxc/ main/trunk/utilities/rexxc/platform/ main/trunk/utilities/rexxc/platform/unix/ main/trunk/utilities/rexxc/platform/windows/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-11 22:04:52
|
Revision: 2942 http://oorexx.svn.sourceforge.net/oorexx/?rev=2942&view=rev Author: bigrixx Date: 2008-08-11 22:04:46 +0000 (Mon, 11 Aug 2008) Log Message: ----------- move rexxutils and rxftp Modified Paths: -------------- main/trunk/Makefile.am main/trunk/orxdb.bat main/trunk/platform/windows/buildorx.bat Added Paths: ----------- main/trunk/extensions/platform/ main/trunk/extensions/platform/unix/ main/trunk/extensions/platform/windows/ main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp main/trunk/extensions/rexxutil/platform/windows/rexxutil.cpp main/trunk/extensions/rexxutil/platform/windows/rexxutil.def main/trunk/extensions/rexxutil/platform/windows/rexxutil.mak main/trunk/extensions/rxftp/ main/trunk/extensions/rxftp/rxftp.cls main/trunk/platform/windows/rxftp.mak main/trunk/utilities/platform/ main/trunk/utilities/platform/windows/ main/trunk/utilities/platform/windows/unix/ Removed Paths: ------------- main/trunk/rexutils/rexxutil.mak main/trunk/rexutils/rxftp.cls main/trunk/rexutils/unix/rexxutil.cpp main/trunk/rexutils/windows/rexxutil.cpp main/trunk/rexutils/windows/rexxutil.def Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-11 11:42:17 UTC (rev 2941) +++ main/trunk/Makefile.am 2008-08-11 22:04:46 UTC (rev 2942) @@ -90,6 +90,7 @@ build_samples_dir = $(top_srcdir)/samples build_rexxclasses_dir = $(build_interpreter_dir)/RexxClasses build_utilities_dir = $(top_srcdir)/utilities +build_extensions_dir = $(top_srcdir)/extensions # These are the *nix directories utils_unix_dir = $(build_utils_dir)/unix @@ -785,7 +786,7 @@ # # Sources for librexxutil.so # -librexxutil_la_SOURCES = $(build_rexutils_platform_dir)/rexxutil.cpp +librexxutil_la_SOURCES = $(build_extensions_dir)/platform/unix/rexxutil.cpp # # Preprocessor flags for librexxutil.so # @@ -793,11 +794,7 @@ -I$(build_lib_dir) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ - -I$(build_interpreter_dir) \ - -I$(build_messages_dir) \ - -I$(build_interpreter_common_dir) \ - -I$(build_interpreter_platform_dir) \ - -I$(build_rexxapi_platform_dir) + -I$(build_messages_dir) # # Extra libraries for librexxutil.so (maybe) # @@ -816,12 +813,7 @@ -I$(build_lib_dir) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ - -I$(build_interpreter_dir) \ - -I$(build_messages_dir) \ - -I$(build_interpreter_common_dir) \ - -I$(build_runtime_dir) \ - -I$(build_interpreter_platform_dir) \ - -I$(build_rexxapi_platform_dir) + -I$(build_messages_dir) # # Extra libraries for librxmath.so (maybe) # @@ -909,7 +901,7 @@ # ooTest: cp $(build_rxregexp_dir)/rxregexp.cls . - cp $(build_rexutils_dir)/rxftp.cls . + cp $(build_extensions_dir)/extensions/rxftp/rxftp.cls . # # distribution files @@ -995,7 +987,7 @@ fi $(install_sh_SCRIPT) $(build_utils_platform_dir)/oorexx-config $(DESTDIR)$(prefix)/bin/oorexx-config $(install_sh_SCRIPT) $(build_rxregexp_dir)/rxregexp.cls $(DESTDIR)$(prefix)/bin/rxregexp.cls - $(install_sh_SCRIPT) $(build_rexutils_dir)/rxftp.cls $(DESTDIR)$(prefix)/bin/rxftp.cls + $(install_sh_SCRIPT) $(build_extensions_dir)/rxftp/rxftp.cls $(DESTDIR)$(prefix)/bin/rxftp.cls for a in $(build_samples_dir)/*.rex; do \ bn=`basename $$a`; \ $(install_sh_SCRIPT) $$a $(DESTDIR)$(prefix)/share/ooRexx/$$bn; \ Copied: main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp (from rev 2930, main/trunk/rexutils/unix/rexxutil.cpp) =================================================================== --- main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp (rev 0) +++ main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp 2008-08-11 22:04:46 UTC (rev 2942) @@ -0,0 +1,5244 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/******************************************************************************/ +/* REXX AIX/LINUX Support lrxutil.c */ +/* */ +/* AIX system utility functions */ +/* */ +/******************************************************************************/ +/********************************************************************** +* LRXUTIL.C * +* * +* This program extends the REXX language by providing many * +* REXX external functions. * +* These functions are: * +* SysCls -- Clear the screen in an OS/2 fullscreen * +* or windowed command prompt session. * +* SysCurPos -- Set and/or Query the cursor position * +* in an OS/2 fullscreen or windowed * +* command prompt session. * +* SysCurState -- Make the cursor visible or invisible * +* in an OS/2 fullscreen or windowed * +* command prompt session. * +* SysDriveInfo -- Returns information about a specific * +* drive. * +* SysDriveMap -- Returns a list of the drives on the * +* machine * +* SysDropFuncs -- Makes all functions in this package * +* unknown to REXX. * +* SysFileDelete -- Deletes a file * +* SysFileSearch -- Searches for a file matching a given * +* filespec. * +* SysFileTree -- Searches for files matching a given * +* filespec, including files in * +* subdirectories. * +* SysGetKey -- Returns one by of data indicating the * +* key which was pressed, * +* in an OS/2 fullscreen or windowed * +* command prompt session. * +* SysGetMessage -- Retrieves a message text from an OS/2 * +* message file, substituting values * +* provided. * +* SysIni -- Reads and/or updates entries in .INI * +* files. * +* SysLoadFuncs -- Makes all functions in this package * +* known to REXX so REXX programs may * +* call them. * +* SysMkDir -- Creates a directory * +* SysVersion -- Returns the AIX Version number * +* SysLinVer -- Returns the OS/2 Version number * +* SysRmDir -- Removes a directory * +* SysSearchPath -- Searches throught a specified path * +* for a file. * +* SysSleep -- Suspends execution for a number of * +* seconds. * +* SysTempFilename -- Creates a unique filename * +* SysTextScreenRead -- Reads characters from the screen, * +* in an OS/2 fullscreen or windowed * +* command prompt session. * +* SysTextScreenSize -- Returns the size of the window in * +* rows and columns, * +* in an OS/2 fullscreen or windowed * +* command prompt session. * +*EX SysGetEA -- Reads an extended attribute * +* for a file. * +*EX SysPutEA -- Writes an extended attribute * +* for a file. * +*EX SysWaitNamedPipe -- Wait on a named pipe. * +*EX SysSetIcon -- Set a file icon * +*EX SysRegisterObjectClass -- Register a new object class * +*EX SysDeregisterObjectClass -- Remove class registration * +*EX SysQueryClassList -- Get list of registered classes * +*EX SysCreateObject -- Create an object instance * +*EX SysDestroyObject -- Delete an object instance * +*EX SysSetObjectData -- Change object settings data * +*EX SysElapsedTime -- Return the OS/2 elapsed time count * +*EX SysBootDrive -- Return the OS/2 boot drive * +*EX SysQueryEAList -- Return list of file EA names * +*EX SysWildCard -- Perform file wild card editting * +*EX SysFileSystemType -- Return drive file system type * +*EX SysAddFileHandle -- Add file handles to a process * +*EX SysSetFileHandle -- Set file handles for a process * +* SysCreateMutexSem -- Create a Mutex semaphore * +* SysOpenMutexSem -- Open a Mutex semaphore * +* SysCloseMutexSem -- Close a Mutex semaphore * +* SysRequestMutexSem -- Request a Mutex semaphore * +* SysReleaseMutexSem -- Release a Mutex semaphore * +* SysCreateEventSem -- Create an Event semaphore * +* SysOpenEventSem -- Open an Event semaphore * +* SysCloseEventSem -- Close an Event semaphore * +* SysPostEventSem -- Post an Event semaphore * +* SysResetEventSem -- Reset an Event semaphore * +* SysWaitEventSem -- Wait on an Event semaphore * +*EX SysProcessType -- Return type of process * +*EX SysSetPriority -- Set current thread priority * +*EX SysGetCollate -- Get country/codepage collating sequence* +*EX SysNationalLanguageCompare -- NLS strict compare * +*EX SysMapCase -- NLS uppercasing * +*EX SysSetProcessCodePage -- Set current code page * +*EX SysQueryProcessCodePage -- Get current code page * +* SysAddRexxMacro -- Load program into macro space * +* SysDropRexxMacro -- Drop program from macro space * +* SysReorderRexxMacro -- Reorder program in macro space * +* SysQueryRexxMacro -- Query ordering of macro space program * +* SysClearRexxMacroSpace -- Remove all programs from macro space* +* SysLoadRexxMacroSpace -- Load a Rexx macro space * +* SysSaveRexxMacroSpace -- Save a Rexx macro space * +*EX SysShutDownSystem -- Shutdown the system * +*EX SysSwitchSession -- Switch to a named session * +*EX SysDropLibrary -- Drop a function package * +* EX SysPi -- Return Pi to given precision * +* EX SysSqrt -- Calculate a square root * +* EX SysExp -- Calculate an exponent * +* EX SysLog -- Return natural log of a number * +* EX SysLog10 -- Return log base 10 of a number * +* EX SysSinh -- Hyperbolic sine function * +* EX SysCosh -- Hyperbolic cosine function * +* EX SysTanh -- Hyperbolic tangent function * +* EX SysPower -- raise number to non-integer power * +* EX SysSin -- Sine function * +* EX SysCos -- Cosine function * +* EX SysTan -- Tangent function * +* EX SysCotan -- Cotangent function * +* EX SysArcSin -- ArcSine function * +* EX SysArcCos -- ArcCosine function * +* EX SysArcTan -- ArcTangent function * +*EX SysSaveObject -- Save an object either Async or Sync * +*EX SysOpenObject -- Open a view of an object * +*EX SysMoveObject -- Move an object from the existing folder* +* to the destination folder * +*EX SysCopyObject -- Copy an object from the existing folder* +* to the destination folder * +*EX SysCreateShadow -- Create a shadow of an object * +*EX SysWaitForShell -- Wait for WPS initialization * +* (Merlin only). * +*EX SysQuerySwitchList -- query the entries of the switch list * +* (for SysSwitchSession) * +* SysDumpVariables -- Dump current variables to a file * +* SysSetFileDateTime -- Set the last modified date of a file * +* SysGetFileDateTime -- Get the last modified date of a file * +* SysStemSort -- sort a stem array * +* SysStemDelete -- delete items in a stem array * +* SysStemInsert -- insert items into a stem array * +* SysStemCopy -- copy items from one stem array to other* +* SysGetErrortext -- Retrieve textual desc. of error number * +* SysQueryProcess -- Get information on current proc/thread * +* SysUtilVersion -- query version of REXXUTIL.DLL * +* * +* SysAddFuncPkg -- CREXX for AIX function support * +* SysAddCmdPkg -- CREXX for AIX function support * +* SysDropFuncPkg -- CREXX for AIX function support * +* SysDropCmdPkg -- CREXX for AIX function support * +* SysGetpid -- CREXX for AIX function support * +* SysFork -- CREXX for AIX function support * +* SysWait -- CREXX for AIX function support * +* SysCreatePipe -- CREXX for AIX function support * +* * +* SysIsFile -- does file exist? * +* SysIsFileDirectory -- is file a subdirectory? * +* SysIsFileLink -- is file a link? * +* * +**********************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "PlatformDefinitions.h" +#if defined( HAVE_LOCALE_H ) +# include <locale.h> +#endif + +#include "oorexxapi.h" + +#if defined( HAVE_SYS_WAIT_H ) +# include <sys/wait.h> +#endif + +#include <sys/ipc.h> +#include <memory.h> + +#if defined( HAVE_MALLOC_H ) +# include <malloc.h> +#endif + +#include <fcntl.h> +#include <ctype.h> +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <limits.h> +#include <math.h> +#include <limits.h> +#include <sys/stat.h> /* mkdir() function */ +#include <errno.h> /* get the errno variable */ +#include <stddef.h> +#include <sys/types.h> +#include <sys/ipc.h> +#include <pthread.h> +#include <semaphore.h> + +#if defined( HAVE_SYS_SEM_H ) +# include <sys/sem.h> +#endif + +#include <dirent.h> /* directory functions */ +#include <sys/time.h> /* needed for the select func */ + +#include <time.h> /* needed for the select func */ + +#if defined( HAVE_SYS_SELECT_H ) +# include <sys/select.h> /* needed for the select func */ +#endif + +#if defined( HAVE_SYS_LDR_H ) +# include <sys/ldr.h> /* needed for the load func */ +#endif + +#if defined( HAVE_STRINGS_H ) +# include <strings.h> +#endif + +#include <utime.h> /* moved, used by AIX & Linux */ + +#if defined( HAVE_SYS_UTSNAME_H ) +# include <sys/utsname.h> /* get the uname() function */ +#endif + +#include <signal.h> + +#if defined( HAVE_SYS_RESOURCE_H ) +# include <sys/resource.h> /* get the getpriority() func */ +#endif + +#if defined( HAVE_FEATURES_H ) +# include <features.h> /* catopen() */ +#endif + +#if defined( HAVE_NL_TYPES_H ) +# include <nl_types.h> /* catopen() */ +#endif + +#include <termios.h> /* needed for SysGetKey */ +#include <fnmatch.h> /* fnmatch() */ + +#if !defined( HAVE_UNION_SEMUN ) +union semun { + int val; + struct semid_ds *buf; + unsigned short *array; +}; +#endif + +extern thread_id_t opencnt[][2]; /* open count array for sems */ +extern char *resolve_tilde(const char *); + +#define INVALID_ROUTINE 40 +#define MAX_DIGITS 9 +#define NO_UTIL_ERROR "0" /* No error whatsoever */ +#define VALID_ROUTINE 0 /* Successful completion */ +//#define MAX_LINE_LEN 2048 /* max line length */ +#define MAX_LINE_LEN 4096 /* max line length */ +#define MAX_READ 0x10000 /* full segment of buffer */ +#define CH_EOF 0x1A /* end of file marker */ +#define CH_CR '\r' /* carriage return character */ +#define CH_NL '\n' /* new line character */ +#define MAX 256 /* temporary buffer length */ +#define IBUF_LEN 4096 /* Input buffer length */ +#define CURRENT_DIR_FIRST 0 /* search flag 'C' */ +#define ENVIRONMENT_ONLY 1 /* search flag 'N' */ +#define OFFSET 1000 /* needed to prevent collision*/ + /* with the return codes */ +#define MAXUSECOUNT 65535 /* max semaphore usecount */ + + +/*********************************************************************/ +/* Various definitions used by the math functions */ +/*********************************************************************/ +#define SINE 0 /* trig function defines... */ +#define COSINE 3 /* the ordering is important, */ +#define TANGENT 1 /* as these get transformed */ +#define COTANGENT 2 /* depending on the angle */ +#define MAXTRIG 3 /* value */ +#define ARCSINE 0 /* defines for arc trig */ +#define ARCCOSINE 1 /* functions. Ordering is */ +#define ARCTANGENT 2 /* not as important here */ + + +#define pi 3.14159265358979323846l /* pi value */ + +#define DEGREES 'D' /* degrees option */ +#define RADIANS 'R' /* radians option */ +#define GRADES 'G' /* grades option */ + +#define DEFAULT_PRECISION 9 /* default precision to use */ +#define MAX_PRECISION 16 /* maximum available precision*/ + + + +/*********************************************************************/ +/* Numeric Error Return Strings */ +/*********************************************************************/ + +#define NO_UTIL_ERROR "0" /* No error whatsoever */ +#define ERROR_NOMEM "2" /* Insufficient memory */ +#define ERROR_FILEOPEN "3" /* Error opening text file */ + +/*********************************************************************/ +/* Alpha Numeric Return Strings */ +/*********************************************************************/ + +#define ERROR_RETSTR "ERROR:" + +/*********************************************************************/ +/* Numeric Return calls */ +/*********************************************************************/ + +#define INVALID_ROUTINE 40 /* Raise Rexx error */ +#define VALID_ROUTINE 0 /* Successful completion */ + +/*********************************************************************/ +/* Defines used by SysStemSort */ +/*********************************************************************/ +#define SORT_CASESENSITIVE 0 +#define SORT_CASEIGNORE 1 + + +#define SORT_ASCENDING 0 +#define SORT_DECENDING 1 + +#define SORT_NUMERIC 3 + +#define SORT_DEF_AVG_SIZE 20 + +/*********************************************************************/ +/* Some useful macros */ +/*********************************************************************/ + +#define BUILDRXSTRING(t, s) { \ + strcpy((t)->strptr,(s));\ + (t)->strlength = strlen((s)); \ +} + + +#define RETVAL(retc) { \ + sprintf(retstr->strptr, "%d", retc); \ + retstr->strlength = strlen(retstr->strptr); \ + return VALID_ROUTINE; \ +} + +/*********************************************************************/ +/* Defines uses by SysTree */ +/*********************************************************************/ + +#define RECURSE 0x0002 +#define DO_DIRS 0x0004 +#define DO_FILES 0x0008 +#define NAME_ONLY 0x0010 +#define EDITABLE_TIME 0x0020 +#define LONG_TIME 0x0040 +#define CASELESS 0x0080 +#define IGNORE 2 /* Ignore attributes entirely */ + + +/******************************************************************************/ +/* Defines used by SysGetKey */ +/******************************************************************************/ + +#define stty(a,b) (void)tcsetattr(a,TCSANOW,b) /* simple set attr. */ +#define gtty(a,b) (void)tcgetattr(a,b) /* simple get attr. */ +#define discard_input(a) tcflush(a,TCIFLUSH) /* simple flush */ +#define restore_tty(a) stty(ttyfd,a) /* new settings STDIN */ + + +/* original terminal settings */ +struct termios in_orig; /* original settings (important!!) */ + + +/*********************************************************************/ +/* RxTree Structure used by SysTree. */ +/*********************************************************************/ + +typedef struct RxTreeData { + size_t count; /* Number of lines processed */ + SHVBLOCK shvb; /* Request block for RxVar */ + size_t stemlen; /* Length of stem */ + size_t vlen; /* Length of variable value */ + char TargetSpec[MAX+1]; /* Target filespec */ + char truefile[MAX+1]; /* expanded file name */ + char Temp[MAX+80]; /* buffer for returned values */ + char varname[MAX]; /* Buffer for variable name */ + size_t nattrib; /* New attrib, diff for each */ +} RXTREEDATA; + + +/*********************************************************************/ +/* RxTree Structure used by GetLine, OpenFile and CloseFile */ +/*********************************************************************/ + +typedef struct _GetFileData { + char * buffer; /* file read buffer */ + size_t size; /* file size */ + size_t data; /* data left in buffer */ + size_t residual; /* size left to read */ + const char *scan; /* current scan position */ + FILE *handle; /* file handle */ +} GetFileData; + +/*********************************************************************/ +/* RxStemData */ +/* Structure which describes as generic */ +/* stem variable. */ +/*********************************************************************/ + +typedef struct RxStemData { + SHVBLOCK shvb; /* Request block for RxVar */ + char ibuf[IBUF_LEN]; /* Input buffer */ + char varname[MAX]; /* Buffer for the variable */ + /* name */ + char stemname[MAX]; /* Buffer for the variable */ + /* name */ + size_t stemlen; /* Length of stem. */ + size_t vlen; /* Length of variable value */ + size_t j; /* Temp counter */ + size_t tlong; /* Temp counter */ + size_t count; /* Number of elements */ + /* processed */ +} RXSTEMDATA; + +/*********************************************************************/ +/* SORTMEM used by SysStemSort */ +/*********************************************************************/ +typedef struct _SORT_MEM { + size_t ulSize; + size_t ulRemaining; + size_t ulItems; + char * pNextBlock; + struct _SORT_MEM *pNext; + char pData; +} SORTMEM, *PSORTMEM; + + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************** +* Function: string2ulong(string, number) * +* * +* Purpose: Validates and converts an ASCII-Z string from string * +* form to an unsigned long. Returns false if the number * +* is not valid, true if the number was successfully * +* converted. * +* * +* RC: true - Good number converted * +* false - Invalid number supplied. * +*********************************************************************/ +bool string2size_t( + const char *string, /* string to convert */ + size_t *number) /* converted number */ +{ + size_t accumulator; /* converted number */ + size_t length; /* length of number */ + + length = strlen(string); /* get length of string */ + if (length == 0 || /* if null string */ + length > MAX_DIGITS + 1) /* or too long */ + return false; /* not valid */ + + accumulator = 0; /* start with zero */ + + while (length) { /* while more digits */ + if (!isdigit(*string)) /* not a digit? */ + return false; /* tell caller */ + /* add to accumulator */ + accumulator = accumulator * 10 + (*string - '0'); + length--; /* reduce length */ + string++; /* step pointer */ + } + *number = accumulator; /* return the value */ + return true; /* good number */ +} + +/*********************************************************************/ +/**************** REXXUTIL Supporting Functions ********************/ +/**************** REXXUTIL Supporting Functions ********************/ +/**************** REXXUTIL Supporting Functions ********************/ +/*********************************************************************/ + +/******************************************************************** +* Function: ReadNextBuffer(filedata) * +* * +* Purpose: Reads the next buffer of data. * +* * +* RC: 0 buffer was read * +* 1 - error occurred reading buffer * +*********************************************************************/ +int ReadNextBuffer( + GetFileData *filedata ) /* global file information */ +{ + size_t size; /* size to read */ + char *endptr; /* end of file pointer */ + /* get size of this read */ + if(filedata->residual >= MAX_READ) + size = MAX_READ; /* read as much as possible */ + else + size = filedata->residual; /* take the rest */ + /* read the file in */ + filedata->data = fread(filedata->buffer, 1, size, filedata->handle); + if(!filedata->data) /* problems ? */ + return (1); /* get out */ + if (filedata->data != size) /* not get all of it? */ + filedata->residual = 0; /* no residual */ + else /* residual is remainder */ + filedata->residual = filedata->residual - size; + /* look for a EOF mark */ + endptr = (char *)memchr(filedata->buffer, CH_EOF, filedata->data); + + if (endptr) { /* found an EOF mark */ + /* set new length */ + filedata->data = (size_t)(endptr - filedata->buffer); + filedata->residual = 0; /* no residual */ + } + filedata->scan = filedata->buffer; /* set position to beginning */ + return 0; +} + +/***********************************************************************/ +/* Function: strupr(string) */ +/* Purpose: Uppercas the given string */ +/***********************************************************************/ +void strupr(char * string){ + + for(;*string != '\0';string++){ /* while not at the end */ + *string = toupper(*string); + } +} + +/******************************************************************** +* Function: OpenFile(file, filedata) * +* * +* Purpose: Prepares a file for reading. * +* * +* RC: 0 - file was opened successfully * +* 1 - file open error occurred * +*********************************************************************/ + +int OpenFile( + const char *file, /* file name */ + GetFileData *filedata ) /* global file information */ +{ + struct stat finfo; /* file information */ + char * endptr = NULL; /* end of buffer pointer */ + + /* try to open the file */ + if((filedata->handle = fopen(file,"r")) == NULL) + return (1); /* return failure */ + /* retrieve the file size */ + if((stat(file,&finfo) == -1)||(!finfo.st_size)){ + fclose(filedata->handle); /* close the file */ + return (1); /* and quit */ + } + if (finfo.st_size <= MAX_READ) { /* less than a single buffer */ + /* allocate buffer for file */ + if((filedata->buffer = (char *)malloc(finfo.st_size)) == NULL ){ + fclose(filedata->handle); /* close the file */ + return (1); /* and quit */ + } + filedata->size = finfo.st_size; /* save file size */ + filedata->residual = 0; /* no left over information */ + /* read the file in */ + filedata->data = fread(filedata->buffer, 1, + finfo.st_size, filedata->handle); + if(filedata->data != (size_t)finfo.st_size){/* problems ? */ + free(filedata->buffer); /* free the buffer */ + fclose(filedata->handle); /* close the file */ + return (1); /* and quit */ + } /* look for a EOF mark */ + endptr = (char *)memchr(filedata->buffer, CH_EOF, filedata->data); + if (endptr) /* found an EOF mark */ + /* set new length */ + filedata->data = (size_t)(endptr - filedata->buffer); + filedata->scan = filedata->buffer; /* set position to beginning */ + } + else { /* need to read partial */ + /* allocate buffer for read */ + if((filedata->buffer = (char *)malloc(MAX_READ)) == NULL ){ + fclose(filedata->handle); /* close the file */ + return (1); /* and quit */ + } + filedata->size = finfo.st_size; /* save file size */ + /* and set remainder */ + filedata->residual = filedata->size; + /* read the file in */ + if (ReadNextBuffer(filedata)) { + free(filedata->buffer); /* free the buffer */ + fclose(filedata->handle); /* close the file */ + return 1; + } + } + return 0; /* file is opened */ +} + +/******************************************************************** +* Function: CloseFile(filedata) * +* * +* Purpose: Close a file * +*********************************************************************/ +void CloseFile( + GetFileData *filedata ) /* global file information */ +{ + fclose(filedata->handle); /* close the file */ + free(filedata->buffer); /* release the file buffer */ +} + +/********************************************************************* +* Function: GetLine(line, size, filedata) * +* * +* Purpose: Reads a line of data using buffered reads. At end of * +* file, zero is returned to indicate nothing left. * +* * +* RC: true - line was read successfully * +* false - end of file was reached * +*********************************************************************/ + +int GetLine( + char *line, /* returned line */ + size_t size, /* size of line buffer */ + GetFileData *filedata ) /* file handle */ +{ + const char *scan; /* current scan pointer */ + size_t length; /* line length */ + size_t copylength; /* copied length */ + + + if (!(filedata->data)) { /* if out of current buffer */ + if (filedata->residual) { /* may be another buffer */ + ReadNextBuffer(filedata); /* try to read one */ + if (!filedata->data) /* nothing more? */ + return 1; /* all done */ + } + else + return (1); /* return EOF condition */ + } + /* look for a line feed */ + scan = (const char *)memchr(filedata->scan, CH_NL, filedata->data); + if (scan) { /* found one */ + /* calculate the length */ + length = scan - filedata->scan; + copylength = length; + if (copylength > size) + { + copylength = size; + } + /* copy over the data */ + memcpy(line, filedata->scan, copylength); + line[copylength] = '\0'; /* make into ASCIIZ string */ + + /* we don't want the CR character in the result string*/ + if ( line[copylength - 1] == CH_CR ) { + line[copylength - 1] = '\0'; + } + + filedata->data -= length + 1; /* reduce the length */ + filedata->scan = scan + 1; /* set new scan point */ + + if (!filedata->data) { /* all used up */ + if (filedata->residual) /* more to read */ + ReadNextBuffer(filedata); /* read the next buffer */ + } + return 0; /* this worked ok */ + } + else /* ran off the end */ + { +/* now we have scanned the whole buffer, but didn't find LF. */ +/* we have two situation that can appear: */ +/* 1.) size > filedata->data ==> there is still room in the working */ +/* buffer, we can see whether we have scanned the whole file */ +/* --> ReadNextBuffer, or this was it, and we return */ +/* 2.) size < filedata->buffer ==> we have scanned to the end of the */ +/* buffer, more than what would fit into it, but still we */ +/* haven't had a hit. So copy all elements into the buffer */ +/* read the next buffer, GetLine to get the next LF */ +/* and return what was put into buffer. Be ALWAYS AWARE that */ +/* that buffer limits to 2047 bytes, and that we only return up */ +/* to 2047 bytes of a line. The rest of the line is not returned */ +/* and not checked for search argument. Nevertheless, this */ +/* garantees, that the line counter (argument 'N') corresponds */ +/* with the input file */ + + /* get length to copy */ + if (size > filedata->data) + { + copylength = filedata->data; /* copy the rest into linebuffer */ + /* copy over the data */ + memcpy(line, filedata->scan, copylength); + line[copylength] = '\0'; /* make into ASCIIZ string */ + + /* all data should be read, filedata->data must be zero */ + filedata->data -= copylength; + /* scan should be at the end */ + filedata->scan += copylength; /* set new scan point */ + + /* if no more data to read in the file, return OK */ + if (!filedata->residual) + return 0; + else + return GetLine(line + copylength, size - copylength, filedata); + } + else /* the line is full, scan until LF found but no copy */ + { + copylength = filedata->data; + if (size < copylength) + { + copylength = size; + } + /* copy over the data */ + memcpy(line, filedata->scan, copylength); + line[copylength] = '\0'; /* make into ASCIIZ string */ + + /* we don't want the CR character in the result string*/ + filedata->data = 0; /* no data in buffer */ + filedata->scan += filedata->data; /* set scan point to end */ + + if (filedata->residual) /* more to read */ + { + ReadNextBuffer(filedata); /* read the next buffer */ + return GetLine(line + copylength, 0, filedata); + } + else + return 0; + } + } +} + +/******************************************************************** +* Function: mystrstr(haystack, needle, hlen, nlen, sensitive) * +* * +* Purpose: Determines if the string 'needle' is in the * +* string 'haystack' by returning it's position or * +* a NULL if not found. The length of haystack and * +* needle are given by 'hlen' and 'nlen' respectively. * +* * +* If 'sensitive' is true, then the search is case * +* sensitive, else it is case insensitive. * +* * +* RC: num - The pos where needle was found. * +* NULL - needle not found. * +* * +* Used By: SysFileSearch() * +*********************************************************************/ + +const char *mystrstr( + const char *haystack, + const char *needle, + size_t hlen, + size_t nlen, + bool sensitive) + +{ + char line[MAX_LINE_LEN]; + char target[MAX_LINE_LEN]; + size_t p; + + /* Copy line - Change nulls to spaces and uppercase if needed */ + + for (p = 0; p < hlen; p++) { + + if (haystack[p] == '\0') + line[p] = ' '; + else if (sensitive) + line[p] = haystack[p]; + else line[p] = toupper(haystack[p]); + } + line[p] = '\0'; + /* Copy target - Change nulls to spaces and uppercase if needed */ + + for (p = 0; p < nlen; p++) { + + if (needle[p] == '\0') + target[p] = ' '; + else if (sensitive) + target[p] = needle[p]; + else target[p] = toupper(needle[p]); + } + target[p] = '\0'; + const char *hit = strstr(line, target); + if (hit == NULL) + { + return NULL; + } + // adjust original pointer to offset + return haystack + (hit - line); +} + +/************************************************************************* +* Function: get_next_path * +* * +* Purpose: Read one path out of an environment value pointed to by * +* ppenv. * +* Used by the 'SearchPath' func. * +* Return: 0 - read successful * +* 1 - end of environment entry * +*************************************************************************/ +int get_next_path( + char * *ppenv, /* environment pointer */ + char * path_buf) /* path buffer */ +{ + int i; /* counter */ + + if(*ppenv == NULL) /* environment entry available ? */ + return (1); /* return end of envrionment */ + if(**ppenv == ':') /* if we point to the seperator */ + (*ppenv)++; /* jump over */ + if(**ppenv == '\0') /* if end of environment entry */ + return (1); /* return so */ + /* copy the path out of the */ + /* environment entry */ + for(i=0;(**ppenv != ':')&&(**ppenv != '\0');(*ppenv)++){ + if(i>MAX_LINE_LEN) /* if buffer to short */ + return (1); /* get out */ + path_buf[i++] = **ppenv; /* copy this character */ + } + path_buf[i] = '\0'; /* terminate the string */ + return (0); /* found another path */ +} + +/************************************************************************* +* Function: SearchPath * +* * +* Purpose: Search a file along the given environment entry and return * +* the full filespec if found. * +* * +* Return: 0 - found the file(=>buf is modified) * +* 1 - not found * +*************************************************************************/ +int SearchPath( + int SearchFlag, /* search curr dir first ? */ + const char * path, /* environment variable name */ + const char * filename, /* searched file */ + char * buf, /* returned filespec if found */ + size_t buf_size) /* size of the return buffer */ +{ + + int rc = 1; /* init rc to not found */ + DIR *dp; /* directory pointer */ + struct dirent *ep; /* directory entry pointer */ + int length; /* path length */ + char path_buf[IBUF_LEN]; /* current search path */ + char * penv; /* ptr to the environment */ + + if(!SearchFlag){ /* search curr dir first ? */ + dp = opendir("./"); /* open current directory */ + if(dp != NULL){ /* worked well ? */ + while((ep = readdir(dp))){ /* while entries in the dir */ + /* if we have a match */ + if(!strcmp(ep->d_name,filename)){ + if(!getcwd(buf,buf_size)) /* copy the cwd to return buf */ + return rc; /* failed, get out */ + length = strlen(buf); /* get the length of the path */ + if((length+2+strlen(filename))>buf_size)/* check buf space */ + return rc; /* not enough, get out */ + buf[length] = '/'; /* add a slash */ + buf[length+1] = '\0'; /* and update the terminater */ + strcat(buf,filename); /* now complete the filespec */ + rc = 0; /* Yep,found ! */ + } + } + (void)closedir(dp); /* close the directory */ + } + } + if(!rc) /* if we already found it */ + return rc; /* return to caller */ + + /* Now search along the environment entry */ + penv = getenv(path); /* get the environment entry */ + if(!penv) /* if couldn't get the env */ + return rc; /* get out */ + /* while we have another path */ + /* to search for the file */ + while(!get_next_path(&penv,path_buf)){ + dp = opendir(path_buf); /* open the directory */ + if(dp != NULL){ /* worked well ? */ + while((ep = readdir(dp))){ /* while entries in the dir */ + /* if we have a match */ + if(!strcmp(ep->d_name,filename)){ + if(strlen(path_buf)>buf_size)/* check the size */ + return rc; /* get out */ + strcpy(buf,path_buf); /* copy path to the return buf*/ + length = strlen(buf); /* get the length of the path */ + if((length+2+strlen(filename))>buf_size)/* check buf space */ + return rc; /* not enough, get out */ + buf[length] = '/'; /* add a slash */ + buf[length+1] = '\0'; /* and update the terminater */ + strcat(buf,filename); /* now complete the filespec */ + (void)closedir(dp); /* close the directory */ + return 0; /* Yep,found ! */ + } + } + (void)closedir(dp); /* close the directory */ + } + } + return rc; /* return not found */ +} + + +/***************************************************************** +* Function: getpath(string, path, filename) * +* * +* Purpose: This function gets the PATH and FILENAME of the file * +* target contained in STRING. The path will end with * +* the '/' char if a path is supplied. * +* * +*****************************************************************/ + +void getpath( + char *string, + char *path, + char *filename ) +{ + int iLen; /* length of filespec */ + int LastSlashPos; /* position of last slash */ + char szSavePath[IBUF_LEN]; /* Keep path to get back to */ + + if (!strcmp(string, ".")) /* period case? */ + strcpy(string, "./*"); /* make it a * request */ + else if (!strcmp(string, "..")) /* double period case? */ + strcpy(string, "../*"); /* make it a ../ * request */ + iLen = strlen(string); /* Get length of full file */ + /* spec */ + LastSlashPos = iLen-1; /* Get max pos of last '/' */ + + /* Step back through string until it begins or at last '/' char */ + do + LastSlashPos--; + while((string[LastSlashPos] != '/') && (LastSlashPos>=0)); + + if (string[LastSlashPos] == '/'){ /* if we have a slash */ + /* Get file name from filespec (just after last '/') */ + if (string[LastSlashPos+1]) /* have a real name? */ + /* copy it over */ + strcpy(filename, &string[LastSlashPos+1]); + else + strcpy(filename, "*"); /* just use wildcards */ + } + else { /* no '/' just filename */ + strcpy(filename, &string[LastSlashPos+1]); + } + + /* Now resolve to fully qualified path ---------------------------- */ + iLen = strlen(filename); /* Get file name length */ + if (string[LastSlashPos] != '/') /* if we have no slash */ + { /* resolve current dir */ + if (!getcwd(path, (IBUF_LEN - iLen - 2))) + strcpy(path, "./"); /* if no cwd set current dir */ + else + strcat(path, "/"); + } + else { /* there is path info */ + strncpy(path, string, LastSlashPos+1);/* copy the path out */ + *(path+LastSlashPos+1) = '\0'; /* make ASCII-Z string */ + if (getcwd(szSavePath, (IBUF_LEN - 1 ))) + { + if (!chdir(path)) /* If successful get */ + { /* reolved path name */ + if ((getcwd(path, (IBUF_LEN - iLen - 2 ))) && + ( LastSlashPos > 0 )) + strcat(path, "/"); /* Add if not root dir */ + chdir(szSavePath); /* Back to current dir */ + } + } + } +} + + +/***************************************************************************** +* Function: LinFindNextFile(path, dir_handle, finfo, d_name, caseless) * +* * +* Purpose: This function finds the next file in the directory PATH pointed * +* by DIR_HANDLE which matchs the filespec. All needed info is * +* returned via the FINFO struct and the D_NAME pointer. * +* * +* Note: '?' is currently not supported. Add the impletmentation here ! * +******************************************************************************/ +int LinFindNextFile( + const char * filespec, /* filespec to search for */ + const char * path, /* current path */ + DIR *dir_handle, /* directory handle */ + struct stat *finfo, /* return buf for the finfo */ + char * *d_name, /* name of the file found */ + size_t caseless) /* case insensitive matching */ +{ + struct dirent *dir_entry; /* Directory entry */ + char full_path[IBUF_LEN+1]; + /* strtok routine */ + + if(!(dir_entry = readdir(dir_handle)))/* get first entry */ + return 0; /* no entry or EOF */ + + do{ + + /* make full spec */ + sprintf(full_path, "%s%s", path, dir_entry->d_name); + lstat(full_path, finfo); /* read the info about it */ + + if(S_ISREG(finfo->st_mode) || /* if it is a file */ + S_ISCHR(finfo->st_mode) || /* or a device special */ + S_ISBLK(finfo->st_mode) || /* file */ + S_ISSOCK(finfo->st_mode) || /* or a socket */ + S_ISLNK(finfo->st_mode) || /* or a symbolic link */ + S_ISFIFO(finfo->st_mode)){ /* or a FIFO */ + + if (caseless) { /* if caseless search */ + char dup_d_name[IBUF_LEN+1]; /* compare upper cased copy */ + char * pDest = dup_d_name; /* of the entry name */ + char * pSrc = dir_entry->d_name; + + for ( ; *pSrc; pDest++, pSrc++ ) + *pDest = toupper(*pSrc); + *pDest = '\x0'; + + if(fnmatch(filespec,dup_d_name,FNM_NOESCAPE|FNM_PATHNAME|FNM_PERIOD)==0){ + *d_name = dir_entry->d_name; /* retptr to the name location*/ + return 1; /* return success */ + } + } + else { /* else compare normally */ + if(fnmatch(filespec,dir_entry->d_name,FNM_NOESCAPE|FNM_PATHNAME|FNM_PERIOD)==0){ + *d_name = dir_entry->d_name; /* retptr to the name location*/ + return 1; /* return success */ + } + } + } + } + while((dir_entry = readdir(dir_handle)));/* while have entries */ + return 0; /* no file found or EOF ... [truncated message content] |
From: <bi...@us...> - 2008-08-11 22:38:23
|
Revision: 2943 http://oorexx.svn.sourceforge.net/oorexx/?rev=2943&view=rev Author: bigrixx Date: 2008-08-11 22:38:29 +0000 (Mon, 11 Aug 2008) Log Message: ----------- fix linux build errors Modified Paths: -------------- main/trunk/Makefile.am main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-11 22:04:46 UTC (rev 2942) +++ main/trunk/Makefile.am 2008-08-11 22:38:29 UTC (rev 2943) @@ -786,7 +786,7 @@ # # Sources for librexxutil.so # -librexxutil_la_SOURCES = $(build_extensions_dir)/platform/unix/rexxutil.cpp +librexxutil_la_SOURCES = $(build_extensions_dir)/rexxutil/platform/unix/rexxutil.cpp # # Preprocessor flags for librexxutil.so # @@ -901,7 +901,7 @@ # ooTest: cp $(build_rxregexp_dir)/rxregexp.cls . - cp $(build_extensions_dir)/extensions/rxftp/rxftp.cls . + cp $(build_extensions_dir)/rxftp/rxftp.cls . # # distribution files Modified: main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp =================================================================== --- main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp 2008-08-11 22:04:46 UTC (rev 2942) +++ main/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp 2008-08-11 22:38:29 UTC (rev 2943) @@ -198,7 +198,6 @@ # include "config.h" #endif -#include "PlatformDefinitions.h" #if defined( HAVE_LOCALE_H ) # include <locale.h> #endif @@ -305,6 +304,7 @@ #define OFFSET 1000 /* needed to prevent collision*/ /* with the return codes */ #define MAXUSECOUNT 65535 /* max semaphore usecount */ +#define REXXMESSAGEFILE "rexx.cat" /*********************************************************************/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bi...@us...> - 2008-08-11 23:23:59
|
Revision: 2944 http://oorexx.svn.sourceforge.net/oorexx/?rev=2944&view=rev Author: bigrixx Date: 2008-08-11 23:24:06 +0000 (Mon, 11 Aug 2008) Log Message: ----------- move rxsock and rxmath Modified Paths: -------------- main/trunk/Makefile.am main/trunk/platform/windows/buildorx.bat Added Paths: ----------- main/trunk/extensions/rxmath/rxmath.cpp main/trunk/extensions/rxsock/rxsock.cpp main/trunk/extensions/rxsock/rxsock.h main/trunk/extensions/rxsock/rxsockfn.cpp main/trunk/platform/windows/rxmath.def main/trunk/platform/windows/rxmath.mak main/trunk/platform/windows/rxsock.def main/trunk/platform/windows/rxsock.mak Removed Paths: ------------- main/trunk/rexutils/rxmath.cpp main/trunk/rexutils/rxmath.def main/trunk/rexutils/rxmath.mak main/trunk/rexutils/rxsock.cpp main/trunk/rexutils/rxsock.def main/trunk/rexutils/rxsock.h main/trunk/rexutils/rxsock.mak main/trunk/rexutils/rxsockfn.cpp Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-11 22:38:29 UTC (rev 2943) +++ main/trunk/Makefile.am 2008-08-11 23:24:06 UTC (rev 2944) @@ -311,7 +311,7 @@ $(build_rxregexp_dir)/dblqueue.cpp \ $(build_rxregexp_dir)/dblqueue.hpp \ $(build_rxregexp_dir)/regexp.hpp -rexutilsHeaders = $(build_rexutils_dir)/rxsock.h +rxsockHeaders = $(build_extensions_dir)/rxsock/rxsock.h aixExportFiles = $(build_rexutils_platform_dir)/*.exp \ $(build_rexutils_dir)/*.exp \ $(build_rexxapi_dir)/*.exp \ @@ -805,15 +805,14 @@ # # Sources for librxmath.so # -librxmath_la_SOURCES = $(build_rexutils_dir)/rxmath.cpp +librxmath_la_SOURCES = $(build_extensions_dir)/rxmath/rxmath.cpp # # Preprocessor flags for librxmath.so # librxmath_la_CXXFLAGS = $(COMMON_CPPFLAGS) \ -I$(build_lib_dir) \ -I$(build_api_dir) \ - -I$(build_api_platform_dir) \ - -I$(build_messages_dir) + -I$(build_api_platform_dir) # # Extra libraries for librxmath.so (maybe) # @@ -824,15 +823,15 @@ # # Sources for librxsock.so # -librxsock_la_SOURCES = $(build_rexutils_dir)/rxsock.cpp \ - $(build_rexutils_dir)/rxsockfn.cpp +librxsock_la_SOURCES = $(build_extensions_dir)/rxsock/rxsock.cpp \ + $(build_extensions_dir)/rxsock/rxsockfn.cpp # # Preprocessor flags for librxsock.so # librxsock_la_CXXFLAGS = $(COMMON_CPPFLAGS) \ -I$(build_api_dir) \ -I$(build_api_platform_dir) \ - -I$(build_rexxapi_platform_dir) + -I$(build_extensions_dir) # # Extra libraries for librxsock.so (maybe) # @@ -940,7 +939,7 @@ $(rexxapiHeaders) \ $(rexxapiunixHeaders) \ $(rxregexpHeaders) \ - $(rexutilsHeaders) \ + $(rxsockHeaders) \ $(man_MANS) \ $(miscFiles) \ $(windowsFiles) \ Copied: main/trunk/extensions/rxmath/rxmath.cpp (from rev 2943, main/trunk/rexutils/rxmath.cpp) =================================================================== --- main/trunk/extensions/rxmath/rxmath.cpp (rev 0) +++ main/trunk/extensions/rxmath/rxmath.cpp 2008-08-11 23:24:06 UTC (rev 2944) @@ -0,0 +1,1131 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ +/******************************************************************************/ +/* REXX mathematical function support rxmath.c */ +/* */ +/* AIX mathematical utility function package */ +/* */ +/******************************************************************************/ + +/********************************************************************** +* RXMATH.C * +* * +* This program extends the REXX language by providing many * +* external mathematical functions * +* These functions are: * +* RxCalcPi -- Return Pi to given precision * +* RxCalcSqrt -- Calculate a square root * +* RxCalcExp -- Calculate an exponent * +* RxCalcLog -- Return natural log of a number * +* RxCalcLog10 -- Return log base 10 of a number * +* RxCalcSinh -- Hyperbolic sine function * +* RxCalcCosh -- Hyperbolic cosine function * +* RxCalcTanh -- Hyperbolic tangent function * +* RxCalcPower -- raise number to non-integer power * +* RxCalcSin -- Sine function * +* RxCalcCos -- Cosine function * +* RxCalcTan -- Tangent function * +* RxCalcCotan -- Cotangent function * +* RxCalcArcSin -- ArcSine function * +* RxCalcArcCos -- ArcCosine function * +* RxCalcArcTan -- ArcTangent function * +* * +**********************************************************************/ + +extern int errno; + +/*------------------------------------------------------------------ + * program defines + *------------------------------------------------------------------*/ +#if defined(OPSYS_AIX) || defined(LINUX) +#define PROG_NAME "rxmath" +#else +#define PROG_NAME "RxMath" +#endif + +#define PROG_DESC "REXX mathematical function package" +#define PROG_COPY "(c) Copyright RexxLanguage Association 2005-2006." +#define PROG_ALRR "All Rights Reserved." + +/*------------------------------------------------------------------ + * standard includes + *------------------------------------------------------------------*/ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <ctype.h> +#include <sys/types.h> + +#include <math.h> +#include <fcntl.h> + +/*------------------------------------------------------------------ + * rexx includes + *------------------------------------------------------------------*/ +#include "oorexxapi.h" +#include "RexxInternalApis.h" + +#if defined(OPSYS_AIX) || defined(LINUX) +#include "locale.h" +#endif + +#include <sys/types.h> +#include <errno.h> + +#define MAX_DIGITS 9 + +/*********************************************************************/ +/* Various definitions used by the math functions */ +/*********************************************************************/ +#define SINE 0 /* trig function defines... */ +#define COSINE 3 /* the ordering is important, */ +#define TANGENT 1 /* as these get transformed */ +#define COTANGENT 2 /* depending on the angle */ +#define MAXTRIG 3 /* value */ +#define ARCSINE 0 /* defines for arc trig */ +#define ARCCOSINE 1 /* functions. Ordering is */ +#define ARCTANGENT 2 /* not as important here */ + + +#define pi 3.14159265358979323846l /* pi value */ + +#define DEGREES 'D' /* degrees option */ +#define RADIANS 'R' /* radians option */ +#define GRADES 'G' /* grades option */ + +#define DEFAULT_PRECISION 9 /* default precision to use */ +#define MAX_PRECISION 16 /* maximum available precision*/ +#define MIN_PRECISION 1 /* minimum available precision*/ + +/*********************************************************************/ +/* Numeric Return calls */ +/*********************************************************************/ + +#define INVALID_ROUTINE 40 /* Raise Rexx error */ +#define VALID_ROUTINE 0 /* Successful completion */ + + +bool bErrorFlag = false; + +/* Turn off optimization under Windows. If this is compiler under */ +/* Windows with the MS Visual C++ copiler and optimization is on */ +/* then the function _matherr is not called */ +#ifdef WIN32 +#pragma optimize( "", off ) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +void RxErrMsgSet(const char *); +void RxErrMsgSet1(const char *); + +/************************************************************************* +* Function: MathLoadFuncs * +* * +* Syntax: call MathLoadFuncs * +* * +* Purpose: load the function package * +* * +* Params: none * +* * +* Return: null string * +*************************************************************************/ +/*------------------------------------------------------------------ + * load the function package + *------------------------------------------------------------------*/ +size_t RexxEntry MathLoadFuncs ( + const char *name, /* Function name */ + size_t argc, /* Number of arguments */ + PCONSTRXSTRING argv, /* Argument array */ + const char * qName, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + // this is a NOP now + retstr->strlength = 0; /* set return value */ + return VALID_ROUTINE; +} + +/************************************************************************* +* Function: MathDropFuncs * +* * +* Syntax: call MathDropFuncs * +* * +* Return: NO_UTIL_ERROR - Successful. * +*************************************************************************/ + +size_t RexxEntry MathDropFuncs( + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + PCONSTRXSTRING argv, /* Argument array */ + const char * qName, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + // this is a NOP now + retstr->strlength = 0; /* set return value */ + return VALID_ROUTINE; +} + + +/* Helper functions **************************************************/ + +/************************************************************************* +* Function: matherr * +* * +* Syntax: matherr is called by the system if exist whenever a mathe * +* matical function fails. * +* * +* Return: NO_UTIL_ERROR - Successful. * +*************************************************************************/ +#ifdef WIN32 +int _cdecl _matherr( struct _exception *x ) +#elif OPSYS_SUN +int matherr(struct __math_exception *x) /* return string */ +#elif OPSYS_AIX +int matherr(struct __exception *x) /* return string */ +#endif +#if defined(WIN32) || defined(OPSYS_SUN) || defined(OPSYS_AIX) +{ + int rc; + rc = errno; + bErrorFlag = true; + + if (x->type == DOMAIN) + { + RxErrMsgSet1("Argument domain error"); + } + else if (x->type == OVERFLOW) + { + RxErrMsgSet1("Overflow range error"); + } + else if (x->type == UNDERFLOW) + { + RxErrMsgSet1("Underflow range error"); + } + else if (x->type == SING) + { + RxErrMsgSet1("Argument singularity"); + } + else if (x->type == TLOSS) + { + RxErrMsgSet1("Total loss of significance"); + } + else if (x->type == PLOSS) + { + RxErrMsgSet1("Total loss of significance"); + } + else + { + RxErrMsgSet1("Mathematical error occured"); + } + + return(1); /* otherwhile system throws exception */ + +} +#endif + +/******************************************************************** +* Function: string2size_t(string, number) * +* * +* Purpose: Validates and converts an ASCII-Z string from string * +* form to an unsigned long. Returns false if the number * +* is not valid, true if the number was successfully * +* converted. * +* * +* RC: true - Good number converted * +* false - Invalid number supplied. * +*********************************************************************/ +bool string2size_t( + const char *string, /* string to convert */ + size_t *number) /* converted number */ +{ + size_t accumulator; /* converted number */ + size_t length; /* length of number */ + + length = strlen(string); /* get length of string */ + if (length == 0 || /* if null string */ + length > MAX_DIGITS + 1) /* or too long */ + return false; /* not valid */ + + accumulator = 0; /* start with zero */ + + while (length) { /* while more digits */ + if (!isdigit(*string)) /* not a digit? */ + return false; /* tell caller */ + /* add to accumulator */ + accumulator = accumulator * 10 + (*string - '0'); + length--; /* reduce length */ + string++; /* step pointer */ + } + *number = accumulator; /* return the value */ + return true; /* good number */ +} + +/*********************************************************************/ +/* Function FormatFloat: Common routine to format a floating point */ +/* result for the math functions */ +/*********************************************************************/ +int MathFormatResult( + double result, /* formatted result */ + size_t precision, /* required precision */ + PRXSTRING retstr ) /* return string */ +{ + + int rc; /* validation code */ + rc = VALID_ROUTINE; /* set default completion */ + + if (bErrorFlag) /* error occured during */ + { + bErrorFlag = false; + strcpy(retstr->strptr, "ERROR"); /* matherr has set bErrorFlag */ + retstr->strlength = strlen(retstr->strptr); + rc = VALID_ROUTINE; + return rc; + } + else if (result == 0) /* zero result? */ + strcpy(retstr->strptr, "0"); /* make exactly 0 */ + else + sprintf(retstr->strptr, "%.*g", precision, result); + /* set the length */ + retstr->strlength = strlen(retstr->strptr); + /* end in a period? */ + if (retstr->strptr[retstr->strlength - 1] == '.') + retstr->strlength--; /* remove the period */ + return rc; +} + +/*********************************************************************/ +/* Function ValidateMath: Common validation routine for math */ +/* that are of the form fn(number, <precision>) */ +/*********************************************************************/ +int ValidateMath( + size_t numargs, /* Number of arguments. */ + CONSTRXSTRING args[], /* Function arguments. */ + double *x, /* input number */ + size_t *precision ) /* returned precision */ +{ + int rc; /* validation code */ + + rc = VALID_ROUTINE; /* set default completion */ + + RxErrMsgSet1("0"); + + *precision = RexxGetCurrentPrecision(); + + if (numargs < 1 || numargs > 2) + { + RxErrMsgSet1("Invalid number of arguments"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if (!RXVALIDSTRING(args[0])) /* first is omitted */ + { + RxErrMsgSet1("The first argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + /* convert input number */ + else if (sscanf(args[0].strptr, " %lf", x) != 1) + { + RxErrMsgSet1("The first argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if (numargs == 2 && /* have a precision, override activity precision */ + !string2size_t(args[1].strptr, precision)) + { + RxErrMsgSet1("The second argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if ( (*precision > MAX_PRECISION) || (*precision < MIN_PRECISION) ) + { + RxErrMsgSet1("The precision is not in the valid range (1-16)"); + rc = INVALID_ROUTINE; + } + return rc; /* return success code */ +} + +/*********************************************************************/ +/* Function ValidateTrig: Common validation routine for math */ +/* that are of the form fn(number, <precision>, <unit>) */ +/*********************************************************************/ +int ValidateTrig( + size_t numargs, /* Number of arguments. */ + CONSTRXSTRING args[], /* Function arguments. */ + PRXSTRING retstr, /* return string */ + int function ) /* function to perform */ +{ + int rc; /* validation code */ + int units; /* angle type */ + double angle; /* working angle */ + double nsi; /* convertion factor */ + double nco; /* convertion factor */ + size_t precision; /* returned precision */ + double result = 0.0; /* result */ + + rc = VALID_ROUTINE; /* set default completion */ + units = DEGREES; /* default angle is degrees */ + nsi = 1.; /* set default conversion */ + nco = 1.; /* set default conversion */ + + + RxErrMsgSet1("0"); + +/* give me the numeric digits settings of the current actitity */ + + precision = RexxGetCurrentPrecision(); + + if (numargs < 1 || numargs > 3) + { + RxErrMsgSet1("Invalid number of arguments"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if (!RXVALIDSTRING(args[0])) /* first is omitted */ + { + RxErrMsgSet1("The first argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + /* convert input number */ + else if (sscanf(args[0].strptr, " %lf", &angle) != 1) + { + RxErrMsgSet1("The first argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if (numargs >= 2 && /* have a precision */ + RXVALIDSTRING(args[1]) && /* and it is real string */ + !string2size_t(args[1].strptr, &precision)) + { + RxErrMsgSet1("The second argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if ( (precision > MAX_PRECISION) | (precision < MIN_PRECISION) ) + { + RxErrMsgSet1("The precision is not in the valid range (1-16)"); + rc = INVALID_ROUTINE; + } + else if (numargs == 3) + { /* have an option */ + if (RXZEROLENSTRING(args[2])) /* null string? */ + { + RxErrMsgSet1("The third argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else + { /* process the options */ + /* get the option character */ + units = toupper(args[2].strptr[0]); + /* was it a good option? */ + if (units != DEGREES && units != RADIANS && units != GRADES) + { + rc = INVALID_ROUTINE; /* bad option is error */ + RxErrMsgSet1("The third argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + } + } + if (!rc) + { /* everything went well? */ + if (units == DEGREES) { /* need to convert degrees */ + nsi = (angle < 0.) ? -1. : 1.; /* get the direction */ + angle = fmod(fabs(angle), 360.); /* make modulo 360 */ + if (angle <= 45.) /* less than 45? */ + angle = angle * pi / 180.; + else if (angle < 135.) { /* over on the other side? */ + angle = (90. - angle) * pi / 180.; + function = MAXTRIG - function; /* change the function */ + nco = nsi; /* swap around the conversions*/ + nsi = 1.; + } + else if (angle <= 225.) { /* around the other way? */ + angle = (180. - angle) * pi / 180.; + nco = -1.; + } + else if (angle < 315.) { /* close to the origin? */ + angle = (angle - 270.) * pi / 180.; + function = MAXTRIG - function; /* change the function */ + nco = -nsi; + nsi = 1.; + } + else + angle = (angle - 360.) * pi / 180.; + } + else if (units == GRADES) { /* need to convert degrees */ + nsi = (angle < 0.) ? -1. : 1.; /* get the direction */ + angle = fmod(fabs(angle), 400.); /* make modulo 400 */ + if (angle <= 50.) + angle = angle * pi / 200.; + else if (angle < 150.) { + angle = (100. - angle) * pi / 200.; + function = MAXTRIG - function; /* change the function */ + nco = nsi; /* swap the conversions */ + nsi = 1.; + } + else if (angle <= 250.) { + angle = (200. - angle) * pi / 200.; + nco = -1.; + } + else if (angle < 350.) { + angle = (angle - 300.) * pi / 200.; + function = MAXTRIG - function; /* change the function */ + nco = -nsi; + nsi = 1.; + } + else + angle = (angle - 400.) * pi / 200.; + } + switch (function) { /* process the function */ + case SINE: /* Sine function */ + result = nsi * sin(angle); + break; + case COSINE: /* Cosine function */ + result = nco * cos(angle); + break; + case TANGENT: /* Tangent function */ + result = nsi * nco * tan(angle); + break; + case COTANGENT: /* cotangent function */ + /* overflow? */ + if ((result = tan(angle)) == 0.0) + { + RxErrMsgSet1("Unable to calculate value. Overflow occured"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else + result = nsi * nco / result; /* real result */ + break; + } + if (!rc) /* good result? */ + /* format the result */ + rc = MathFormatResult(result, precision, retstr); + } + return rc; /* return success code */ +} + +/*********************************************************************/ +/* Function ValidateATrig: Common validation routine for math */ +/* that are of the form fn(number, <precision>, <units>) */ +/*********************************************************************/ +int ValidateArcTrig( + size_t numargs, /* Number of arguments. */ + CONSTRXSTRING args[], /* Function arguments. */ + PRXSTRING retstr, /* return string */ + int function ) /* function to perform */ +{ + int rc; /* validation code */ + int units; /* angle type */ + double angle = 0.0; /* working angle */ + double nsi; /* convertion factor */ + double nco; /* convertion factor */ + size_t precision; /* returned precision */ + double x; /* input number */ + + rc = VALID_ROUTINE; /* set default completion */ + units = DEGREES; /* default angle is degrees */ + nsi = 1.; /* set default conversion */ + nco = 1.; /* set default conversion */ + + RxErrMsgSet1("0"); + precision = RexxGetCurrentPrecision(); + + if (numargs < 1 || numargs > 3) + { + RxErrMsgSet1("Invalid number of arguments"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if (!RXVALIDSTRING(args[0])) /* first is omitted */ + { + RxErrMsgSet1("The first argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + /* convert input number */ + else if (sscanf(args[0].strptr, " %lf", &x) != 1) + { + RxErrMsgSet1("The first argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if (numargs >= 2 && /* have a precision */ + RXVALIDSTRING(args[1]) && /* and it is real string */ + !string2size_t(args[1].strptr, &precision)) + { + RxErrMsgSet1("The second argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if ( (precision > MAX_PRECISION) || (precision < MIN_PRECISION) ) + { + RxErrMsgSet1("The precision is not in the valid range (1-16)"); + rc = INVALID_ROUTINE; + } + else if (numargs == 3) + { /* have an option */ + if (RXZEROLENSTRING(args[2])) /* null string? */ + { + RxErrMsgSet1("The third argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else + { /* process the options */ + /* get the option character */ + units = toupper(args[2].strptr[0]); + /* was it a good option? */ + if (units != DEGREES && units != RADIANS && units != GRADES) + { + rc = INVALID_ROUTINE; /* bad option is error */ + RxErrMsgSet1("The third argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + } + } + + if (!rc) { /* everything went well? */ + /* truncate to maximum */ +// precision = min(precision, MAX_PRECISION); + switch (function) { /* process the function */ + case ARCSINE: /* ArcSine function */ + angle = asin(x); + break; + case ARCCOSINE: /* ArcCosine function */ + angle = acos(x); + break; + case ARCTANGENT: /* ArcTangent function */ + angle = atan(x); + break; + } + if (units == DEGREES) /* have to convert the result?*/ + angle = angle * 180. / pi; /* make into degrees */ + else if (units == GRADES) /* need it in grades? */ + angle = angle * 200. / pi; /* convert to base 400 */ + /* format the result */ + rc = MathFormatResult(angle, precision, retstr); + } + return rc; /* return success code */ +} + +/* Mathematical function package *************************************/ + +/********************************************************************/ +/* Functions: RxCalcSqrt(), RxCalcExp(), RxCalcLog(), RxCalcLog10, */ +/* Functions: RxCalcSinH(), RxCalcCosH(), RxCalcTanH() */ +/* Description: Returns function value of argument. */ +/* Input: One number. */ +/* Output: Value of the function requested for arg. */ +/* Returns 0 if the function executed OK, */ +/* 40 otherwise. The interpreter will fail */ +/* if the function returns a negative result. */ +/* Notes: */ +/* These routines take one to two parameters. */ +/* The form of the call is: */ +/* result = func_name(x <, prec>) */ +/* */ +/********************************************************************/ +size_t RexxEntry RxCalcSqrt( /* Square root function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + double x; /* input number */ + size_t precision; /* precision used */ + int rc; /* function return code */ + + errno = 0; /* validate the inputs */ + /* validate the inputs */ + rc = ValidateMath(numargs, args, &x, &precision); + if (!rc) /* good function call */ + /* format the result */ + rc = MathFormatResult(sqrt(x), precision, retstr); + return rc; /* return error code */ +} + +/*==================================================================*/ +size_t RexxEntry RxCalcExp( /* Exponential function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + double x; /* input number */ + size_t precision; /* precision used */ + + int rc; /* validation return code */ + + errno = 0; /* validate the inputs */ + + rc = ValidateMath(numargs, args, &x, &precision); + if (!rc) /* good function call */ + /* format the result */ + rc = MathFormatResult(exp(x), precision, retstr); + return rc; /* return error code */ +} + +/*==================================================================*/ +size_t RexxEntry RxCalcLog( /* Logarithm function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + double x; /* input number */ + size_t precision; /* precision used */ + + int rc; /* validation return code */ + + errno = 0; /* validate the inputs */ + /* validate the inputs */ + rc = ValidateMath(numargs, args, &x, &precision); + if (!rc) /* good function call */ + /* format the result */ + rc = MathFormatResult(log(x), precision, retstr); + return rc; /* return error code */ +} + + +/*==================================================================*/ +size_t RexxEntry RxCalcLog10( /* Log base 10 function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + double x; /* input number */ + size_t precision; /* precision used */ + + int rc; /* validation return code */ + + errno = 0; /* validate the inputs */ + /* validate the inputs */ + rc = ValidateMath(numargs, args, &x, &precision); + if (!rc) /* good function call */ + /* format the result */ + rc = MathFormatResult(log10(x), precision, retstr); + return rc; /* return error code */ +} + +/*==================================================================*/ +size_t RexxEntry RxCalcSinH( /* Hyperbolic sine function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + double x; /* input number */ + size_t precision; /* precision used */ + + int rc; /* validation return code */ + + errno = 0; /* validate the inputs */ + /* validate the inputs */ + rc = ValidateMath(numargs, args, &x, &precision); + if (!rc) /* good function call */ + /* format the result */ + rc = MathFormatResult(sinh(x), precision, retstr); + return rc; /* return error code */ +} + +/*==================================================================*/ +size_t RexxEntry RxCalcCosH( /* Hyperbolic cosine funct. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + double x; /* input number */ + size_t precision; /* precision used */ + + int rc; /* validation return code */ + + errno = 0; /* validate the inputs */ + /* validate the inputs */ + rc = ValidateMath(numargs, args, &x, &precision); + if (!rc) /* good function call */ + /* format the result */ + rc = MathFormatResult(cosh(x), precision, retstr); + return rc; /* return error code */ +} + +/*==================================================================*/ +size_t RexxEntry RxCalcTanH( /* Hyperbolic tangent funct. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + double x; /* input number */ + size_t precision; /* precision used */ + + int rc; /* validation return code */ + + errno = 0; /* validate the inputs */ + /* validate the inputs */ + rc = ValidateMath(numargs, args, &x, &precision); + if (!rc) /* good function call */ + /* format the result */ + rc = MathFormatResult(tanh(x), precision, retstr); + return rc; /* return error code */ +} + +/********************************************************************/ +/* Functions: RxCalcPower() */ +/* Description: Returns function value of arguments. */ +/* Input: Two numbers. */ +/* Output: Value of the x to the power y. */ +/* Returns 0 if the function executed OK, */ +/* -1 otherwise. The interpreter will fail */ +/* if the function returns a negative result. */ +/* Notes: */ +/* This routine takes two to three parameters. */ +/* The form of the call is: */ +/* result = func_name(x, y <, prec>) */ +/* */ +/********************************************************************/ +size_t RexxEntry RxCalcPower( /* Power function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + double x; /* input number */ + double y; /* second input number */ + size_t precision; /* precision used */ + + int rc; /* validation code */ + + errno = 0; /* validate the inputs */ + + rc = VALID_ROUTINE; /* set default completion */ + + RxErrMsgSet1("0"); + + precision = RexxGetCurrentPrecision(); + + if (numargs < 2 || numargs > 3) + { + RxErrMsgSet1("Invalid number of arguments"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + /* convert input number */ + else if (!RXVALIDSTRING(args[0]) ) /* first is omitted */ + { + RxErrMsgSet1("The first argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if (sscanf(args[0].strptr, " %lf", &x) != 1) + { + RxErrMsgSet1("The first argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if (!RXVALIDSTRING(args[1]) ) /* first is omitted */ + { + RxErrMsgSet1("The second argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + /* convert second input */ + else if (sscanf(args[1].strptr, " %lf", &y) != 1) + { + RxErrMsgSet1("The second argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if (numargs == 3 && /* have a precision */ + !string2size_t(args[2].strptr, &precision)) + { + RxErrMsgSet1("The third argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + + else if ( (precision > MAX_PRECISION) || (precision < MIN_PRECISION) ) + { + RxErrMsgSet1("The precision is not in the valid range (1-16)"); + rc = INVALID_ROUTINE; + } + /* format the result */ + if (!rc) + { + rc = MathFormatResult(pow(x,y), precision, retstr); + } + return rc; /* return error code */ +} + +/********************************************************************/ +/* Functions: RxCalcSin(), RxCalcCos(), RxCalcTan(), RxCalcCotan() */ +/* Description: Returns trigonometric angle value. */ +/* Input: Angle in radian or degree or grade */ +/* Output: Trigonometric function value for Angle. */ +/* Returns 0 if the function executed OK, */ +/* -1 otherwise. The interpreter will fail */ +/* if the function returns a negative result. */ +/* Notes: */ +/* These routines take one to three parameters. */ +/* The form of the call is: */ +/* x = func_name(angle <, prec> <, [R | D | G]>) */ +/* */ +/********************************************************************/ +size_t RexxEntry RxCalcSin( /* Sine function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + /* call common routine */ + errno = 0; /* validate the inputs */ + return ValidateTrig(numargs, args, retstr, SINE); +} + +/*==================================================================*/ +size_t RexxEntry RxCalcCos( /* Cosine function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + /* call common routine */ + errno = 0; /* validate the inputs */ + return ValidateTrig(numargs, args, retstr, COSINE); +} + +/*==================================================================*/ +size_t RexxEntry RxCalcTan( /* Tangent function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + /* call common routine */ + errno = 0; /* validate the inputs */ + return ValidateTrig(numargs, args, retstr, TANGENT); +} + +/*==================================================================*/ +size_t RexxEntry RxCalcCotan( /* Cotangent function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + /* call common routine */ + errno = 0; /* validate the inputs */ + return ValidateTrig(numargs, args, retstr, COTANGENT); +} + +/********************************************************************/ +/* Functions: RxCalcPi() */ +/* Description: Returns value of pi for given precision */ +/* Input: Precision. Default is 9 */ +/* Output: Value of the pi to given precision */ +/* Notes: */ +/* This routine takes one parameters. */ +/* The form of the call is: */ +/* result = RxCalcpi(<precision>) */ +/* */ +/********************************************************************/ +size_t RexxEntry RxCalcPi( /* Pi function */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + size_t precision; /* required precision */ + int rc; + errno = 0; /* validate the inputs */ + rc = VALID_ROUTINE; + + precision = RexxGetCurrentPrecision(); + + RxErrMsgSet1("0"); /* setting MATHERROR to 0 */ + + if (numargs > 1) + { + RxErrMsgSet1("Invalid number of arguments"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + else if ( (numargs == 1) && (!string2size_t(args[0].strptr, &precision)) ) + { + RxErrMsgSet1("The argument is invalid"); + rc = INVALID_ROUTINE; /* this is invalid */ + } + /* keep to maximum */ + else if ( (precision > MAX_PRECISION) || (precision < MIN_PRECISION) ) + { + RxErrMsgSet1("The precision is not in the valid range (1-16)"); + rc = INVALID_ROUTINE; + } + /* format the result */ + if (!rc) + { /* good function call */ + rc = MathFormatResult(pi, precision, retstr); /* format the result */ + } + return rc; /* good result */ +} + +/********************************************************************/ +/* Functions: RxCalcArcSin(), RxCalcArcCos(), RxCalcArcTan()*/ +/* Description: Returns angle from trigonometric value. */ +/* Input: Angle in radian or degree or grade */ +/* Output: Angle for matching trigonometric value. */ +/* Returns 0 if the function executed OK, */ +/* -1 otherwise. The interpreter will fail */ +/* if the function returns a negative result. */ +/* Notes: */ +/* These routines take one to three parameters. */ +/* The form of the call is: */ +/* a = func_name(arg <, prec> <, [R | D | G]>) */ +/* */ +/********************************************************************/ +size_t RexxEntry RxCalcArcSin( /* Arc Sine function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + /* call common routine */ + errno = 0; /* validate the inputs */ + return ValidateArcTrig(numargs, args, retstr, ARCSINE); +} + +/*==================================================================*/ +size_t RexxEntry RxCalcArcCos( /* Arc Cosine function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + /* call common routine */ + errno = 0; /* validate the inputs */ + return ValidateArcTrig(numargs, args, retstr, ARCCOSINE); +} + +/*==================================================================*/ +size_t RexxEntry RxCalcArcTan( /* Arc Tangent function. */ + const char *name, /* Function name */ + size_t numargs, /* Number of arguments */ + CONSTRXSTRING args[], /* Argument array */ + const char * queuename, /* Current queue */ + PRXSTRING retstr ) /* Return RXSTRING */ +{ + /* call common routine */ + errno = 0; /* validate the inputs */ + return ValidateArcTrig(numargs, args, retstr, ARCTANGENT); + +} + +void RxErrMsgSet1( + const char * name) +{ + SHVBLOCK shv; + char * pszVariable; + char * pszValue; + + pszVariable = (char *)malloc((strlen("MATHERRNO"))+1); + strcpy(pszVariable,"MATHERRNO"); + pszValue = (char *)malloc((strlen(name)+1)); + strcpy(pszValue, name); + + /*--------------------------------------------------------------- + * set variable pool + *---------------------------------------------------------------*/ + shv.shvcode = RXSHV_SYSET; + shv.shvnext = NULL; + shv.shvname.strptr = pszVariable; + shv.shvname.strlength = strlen(pszVariable); + shv.shvvalue.strptr = pszValue; + shv.shvvalue.strlength = strlen(pszValue); + + RexxVariablePool(&shv); + free(pszVariable); + free(pszValue); +} + +#ifdef __cplusplus +} +#endif + +#ifdef WIN32 +#pragma optimize( "", on ) +#endif + + +// now build the actual entry list +RexxRoutineEntry rxmath_functions[] = +{ + REXX_CLASSIC_ROUTINE(MathLoadFuncs, MathLoadFuncs), + REXX_CLASSIC_ROUTINE(MathDropFuncs, MathDropFuncs), + REXX_CLASSIC_ROUTINE(RxCalcPi, RxCalcPi), + REXX_CLASSIC_ROUTINE(RxCalcSqrt, RxCalcSqrt), + REXX_CLASSIC_ROUTINE(RxCalcExp, RxCalcExp), + REXX_CLASSIC_ROUTINE(RxCalcLog, RxCalcLog), + REXX_CLASSIC_ROUTINE(RxCalcLog10, RxCalcLog10), + REXX_CLASSIC_ROUTINE(RxCalcSinH, RxCalcSinH), + REXX_CLASSIC_ROUTINE(RxCalcCosH, RxCalcCosH), + REXX_CLASSIC_ROUTINE(RxCalcTanH, RxCalcTanH), + REXX_CLASSIC_ROUTINE(RxCalcPower, RxCalcPower), + REXX_CLASSIC_ROUTINE(RxCalcSin, RxCalcSin), + REXX_CLASSIC_ROUTINE(RxCalcCos, RxCalcCos), + REXX_CLASSIC_ROUTINE(RxCalcTan, RxCalcTan), + REXX_CLASSIC_ROUTINE(RxCalcCotan, RxCalcCotan), + REXX_CLASSIC_ROUTINE(RxCalcArcSin, RxCalcArcSin), + REXX_CLASSIC_ROUTINE(RxCalcArcCos, RxCalcArcCos), + REXX_CLASSIC_ROUTINE(RxCalcArcTan, RxCalcArcTan), + REXX_LAST_ROUTINE() +}; + +RexxPackageEntry rxmath_package_entry = +{ + STANDARD_PACKAGE_HEADER + REXX_INTERPRETER_4_0_0, // anything after 4.0.0 will work + "RXMATH", // name of the package + "4.0", // package information + NULL, // no load/unload functions + NULL, + rxmath_functions, // the exported functions + NULL // no methods in this package +}; + +// package loading stub. +OOREXX_GET_PACKAGE(rxmath); Copied: main/trunk/extensions/rxsock/rxsock.cpp (from rev 2943, main/trunk/rexutils/rxsock.cpp) =================================================================== --- main/trunk/extensions/rxsock/rxsock.cpp (rev 0) +++ main/trunk/extensions/rxsock/rxsock.cpp 2008-08-11 23:24:06 UTC (rev 2944) @@ -0,0 +1,901 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2008 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following... [truncated message content] |
From: <bi...@us...> - 2008-08-11 23:58:31
|
Revision: 2945 http://oorexx.svn.sourceforge.net/oorexx/?rev=2945&view=rev Author: bigrixx Date: 2008-08-11 23:58:38 +0000 (Mon, 11 Aug 2008) Log Message: ----------- move rxwinsys and delete rexutils Modified Paths: -------------- main/trunk/Makefile.am main/trunk/platform/windows/buildorx.bat main/trunk/platform/windows/rxmath.def main/trunk/platform/windows/rxsock.def Added Paths: ----------- main/trunk/extensions/platform/windows/rxwinsys/ main/trunk/extensions/platform/windows/rxwinsys/rxwinsys.cpp main/trunk/extensions/platform/windows/rxwinsys/rxwinsys.def main/trunk/extensions/platform/windows/rxwinsys/rxwinsys.mak main/trunk/extensions/platform/windows/rxwinsys/winsystm.cls Removed Paths: ------------- main/trunk/rexutils/ Modified: main/trunk/Makefile.am =================================================================== --- main/trunk/Makefile.am 2008-08-11 23:24:06 UTC (rev 2944) +++ main/trunk/Makefile.am 2008-08-11 23:58:38 UTC (rev 2945) @@ -85,7 +85,6 @@ build_messages_dir = $(build_interpreter_dir)/messages build_lib_dir = $(top_srcdir)/lib build_api_dir = $(top_srcdir)/api -build_rexutils_dir = $(top_srcdir)/rexutils build_rxregexp_dir = $(top_srcdir)/rxregexp build_samples_dir = $(top_srcdir)/samples build_rexxclasses_dir = $(build_interpreter_dir)/RexxClasses @@ -96,7 +95,6 @@ utils_unix_dir = $(build_utils_dir)/unix interpreter_unix_dir = $(build_interpreter_dir)/platform/unix api_unix_dir = $(build_api_dir)/platform/unix -rexutils_unix_dir = $(build_rexutils_dir)/unix samples_unix_dir = $(build_samples_dir)/unix # These are the Windows directories @@ -104,7 +102,6 @@ rexxapi_windows_dir = $(build_rexxapi_dir)/windows interpreter_windows_dir = $(build_interpreter_dir)/platform/windows api_windows_dir = $(build_api_dir)/platform/windows -rexutils_windows_dir = $(build_rexutils_dir)/windows samples_windows_dir = $(build_samples_dir)/windows # These are the platform specific build directories @@ -112,7 +109,6 @@ build_rexxapi_platform_dir = $(rexxapi_@ORX_PLATFORM@_dir) build_interpreter_platform_dir = $(interpreter_@ORX_PLATFORM@_dir) build_api_platform_dir = $(api_@ORX_PLATFORM@_dir) -build_rexutils_platform_dir = $(rexutils_@ORX_PLATFORM@_dir) build_samples_platform_dir = $(samples_@ORX_PLATFORM@_dir) catdir = $(prefix)/bin @@ -312,10 +308,6 @@ $(build_rxregexp_dir)/dblqueue.hpp \ $(build_rxregexp_dir)/regexp.hpp rxsockHeaders = $(build_extensions_dir)/rxsock/rxsock.h -aixExportFiles = $(build_rexutils_platform_dir)/*.exp \ - $(build_rexutils_dir)/*.exp \ - $(build_rexxapi_dir)/*.exp \ - $(build_rxregexp_dir)/*.exp windowsDefFiles = $(interpreter_windows_dir)/*.def \ $(build_lib_dir)/*.def \ $(build_rexutils_dir)/*.def \ @@ -326,7 +318,6 @@ $(top_srcdir)/NOTICE \ $(top_srcdir)/oorexx.ver \ $(top_srcdir)/unix-like-build.txt \ - $(aixExportFiles) \ $(utils_unix_dir)/oorexx.spec \ $(utils_unix_dir)/makepkg.rex \ $(build_rxregexp_dir)/*.cls \ Copied: main/trunk/extensions/platform/windows/rxwinsys/rxwinsys.cpp (from rev 2943, main/trunk/rexutils/windows/rxwinsys.cpp) =================================================================== --- main/trunk/extensions/platform/windows/rxwinsys/rxwinsys.cpp (rev 0) +++ main/trunk/extensions/platform/windows/rxwinsys/rxwinsys.cpp 2008-08-11 23:58:38 UTC (rev 2945) @@ -0,0 +1,3317 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include <windows.h> +#include "oorexxapi.h" +#include <stdio.h> +#include <string.h> +#include <ddeml.h> +#include <time.h> +#include <shlobj.h> + +#define STR_BUFFER 256 +#define MAX_TIME_DATE 128 +#define MAX_VARNAME 256 + +#define MSG_TIMEOUT 5000 // 5000ms +#if (WINVER >= 0x0500) +#define MSG_TIMEOUT_OPTS (SMTO_ABORTIFHUNG|SMTO_NORMAL|SMTO_NOTIMEOUTIFNOTHUNG) +#else +#define MSG_TIMEOUT_OPTS (SMTO_ABORTIFHUNG|SMTO_NORMAL) +#endif + + +/*********************************************************************/ +/* */ +/* Subroutine Name: memupper */ +/* */ +/* Descriptive Name: uppercase a memory location */ +/* */ +/* Entry Point: memupper */ +/* */ +/* Input: memory to upper case */ +/* length of memory location */ +/* */ +/*********************************************************************/ + +void memupper( + char *location, /* location to uppercase */ + size_t length) /* length to uppercase */ +{ + for (; length--; location++) /* loop for entire string */ + /* uppercase in place */ + *location = toupper(*location); +} + + +/*********************************************************************/ +/* Numeric Return calls */ +/*********************************************************************/ + +#define INVALID_ROUTINE 40 /* Raise Rexx error */ +#define VALID_ROUTINE 0 /* Successful completion */ + +VOID Little2BigEndian(BYTE *pbInt, INT iSize); + + +LONG HandleArgError(PRXSTRING r, BOOL ToMuch) +{ + r->strlength = 2; + r->strptr[0] = '4'; + r->strptr[1] = '0'; + r->strptr[2] = '\0'; + return 40; +} + +#define CHECKARG(argexpctl, argexpcth) \ + if ((argc < argexpctl) || (argc > argexpcth)) return HandleArgError(retstr, (argc > argexpcth)) + + +/* macros for a easier return code */ +#define RETC(retcode) { \ + retstr->strlength = 1;\ + if (retcode) retstr->strptr[0] = '1'; else retstr->strptr[0] = '0'; \ + retstr->strptr[1] = '\0'; \ + return 0; \ + } + +#define RETERR { \ + retstr->strlength = 1;\ + retstr->strptr[0] = '1'; \ + retstr->strptr[1] = '\0'; \ + return 40; \ + } + + +#define RETVAL(retvalue) { \ + itoa(retvalue, retstr->strptr, 10); \ + retstr->strlength = strlen(retstr->strptr);\ + return 0; \ + } + + +#define RET_HANDLE(retvalue) { \ + pointer2string(retstr, retvalue); \ + return 0; \ + } + + +#define ISHEX(value) \ + ((value[0] == '0') && (toupper(value[1]) == 'X')) + + +/* Note many existing programs abbreviate HKEY_LOCAL_MACHINE to "LOCAL_MACHINE", + * or "MACHINE", and many do not. Many existing programs use the full + * HKEY_LOCAL_MACHINE. So the comparison needs to remain strstr. + * + */ +#define GET_HKEY(argum, ghk) { \ + ghk = NULL; \ + if (strstr(argum,"MACHINE")) ghk = HKEY_LOCAL_MACHINE; else \ + if (strstr(argum,"CLASSES")) ghk = HKEY_CLASSES_ROOT; else \ + if (strstr(argum,"CURRENT_USER")) ghk = HKEY_CURRENT_USER; else \ + if (strstr(argum,"USERS")) ghk = HKEY_USERS; else \ + if (strstr(argum,"PERFORMANCE")) ghk = HKEY_PERFORMANCE_DATA; else \ + if (strstr(argum,"CURRENT_CONFIG")) ghk = HKEY_CURRENT_CONFIG; else \ + if (strstr(argum,"DYN_DATA")) ghk = HKEY_DYN_DATA; else \ + string2pointer(argum, (void **)&ghk); \ +} + + +#define GET_HANDLE(argum, ghk) string2pointer(argum, (void **)&(ghk)) + + +#define SET_VARIABLE(varname, data, retc) {\ + shvb.shvnext = NULL; \ + shvb.shvname.strptr = varname; \ + shvb.shvname.strlength = strlen(varname); \ + shvb.shvnamelen = shvb.shvname.strlength; \ + shvb.shvvalue.strptr = data; \ + shvb.shvvalue.strlength = strlen(data); \ + shvb.shvvaluelen = strlen(data); \ + shvb.shvcode = RXSHV_SYSET; \ + shvb.shvret = 0; \ + if (RexxVariablePool(&shvb) == RXSHV_BADN) RETC(retc); \ + } + + +#define GET_ACCESS(argu, acc) \ +{ \ + if (!stricmp(argu,"READ")) acc = 'R'; else \ + if (!stricmp(argu,"OPEN")) acc = 'O'; else \ + if (!stricmp(argu,"CLOSE")) acc = 'C'; else \ + if (!stricmp(argu,"NUM")) acc = 'N'; else \ + if (!stricmp(argu,"CLEAR")) acc = 'L'; else \ + if (!stricmp(argu,"WRITE")) acc = 'W'; else \ + RETERR; \ +} + +#define GET_TYPE_INDEX(type, index) \ +{ \ + switch (type) \ + { \ + case EVENTLOG_ERROR_TYPE: \ + index=0; \ + break; \ + case EVENTLOG_WARNING_TYPE: \ + index=1; \ + break; \ + case EVENTLOG_INFORMATION_TYPE: \ + index=2; \ + break; \ + case EVENTLOG_AUDIT_SUCCESS: \ + index=3; \ + break; \ + case EVENTLOG_AUDIT_FAILURE: \ + index=4; \ + break; \ + default: \ + index=4; \ + } \ +} + + +/******************************************************************** +* Function: string2pointer(string) * +* * +* Purpose: Validates and converts an ASCII-Z string from string * +* form to a pointer value. Returns false if the number * +* is not valid, true if the number was successfully * +* converted. * +* * +* RC: true - Good number converted * +* false - Invalid number supplied. * +*********************************************************************/ + +BOOL string2pointer( + const char *string, /* string to convert */ + void **pointer) /* converted number */ +{ + return sscanf(string, "0x%p", pointer) == 1; +} + + +void pointer2string(PRXSTRING result, void *pointer) +{ + sprintf(result->strptr, "0x%p", pointer); + result->strlength = strlen(result->strptr); +} + + +BOOL IsRunningNT() +{ + OSVERSIONINFO version_info={0}; + + version_info.dwOSVersionInfoSize = sizeof(version_info); + GetVersionEx(&version_info); + if (version_info.dwPlatformId == VER_PLATFORM_WIN32_NT) return TRUE; // Windows NT + else return FALSE; // Windows 95 +} + + +size_t RexxEntry WSRegistryKey(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr) +{ + HKEY hk; + LONG rc; + + CHECKARG(2,5); + + if ( strcmp(argv[0].strptr, "CREATE") == 0 ) + { + HKEY hkResult; + + GET_HANDLE(argv[1].strptr, hk); + if (RegCreateKey(hk, argv[2].strptr, &hkResult ) == ERROR_SUCCESS) + { + RET_HANDLE(hkResult); + } + else + { + RETC(0); + } + } + else if ( strcmp(argv[0].strptr, "OPEN") == 0 ) + { + HKEY hkResult; + DWORD access=0; + + GET_HKEY(argv[1].strptr, hk); + + if (argc == 2) + { + RET_HANDLE(hk); // return the predefined handle + } + + if ((argc < 4) || strcmp(argv[3].strptr,"ALL")) + { + access = KEY_ALL_ACCESS; + } + else + { + if (strstr(argv[3].strptr,"WRITE")) access |= KEY_WRITE; + if (strstr(argv[3].strptr,"READ")) access |= KEY_READ; + if (strstr(argv[3].strptr,"QUERY")) access |= KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE; + if (strstr(argv[3].strptr,"EXECUTE")) access |= KEY_EXECUTE; + if (strstr(argv[3].strptr,"NOTIFY")) access |= KEY_NOTIFY; + if (strstr(argv[3].strptr,"LINK")) access |= KEY_CREATE_LINK; + } + + if (RegOpenKeyEx(hk, argv[2].strptr, 0, access, &hkResult ) == ERROR_SUCCESS) + { + RET_HANDLE(hkResult); + } + else + { + RETC(0); + } + } + else if ( strcmp(argv[0].strptr, "CLOSE") == 0 ) + { + GET_HANDLE(argv[1].strptr, hk); + if (RegCloseKey(hk) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETC(1); + } + } + else if ( strcmp(argv[0].strptr, "DELETE") == 0 ) + { + GET_HKEY(argv[1].strptr, hk); + + if ((rc = RegDeleteKey(hk, argv[2].strptr)) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETVAL(rc); + } + } + else if ( strcmp(argv[0].strptr, "QUERY") == 0 ) + { + char Class[256]; + DWORD retcode, cbClass, cSubKeys, cbMaxSubKeyLen, + cbMaxClassLen, cValues, cbMaxValueNameLen, cbMaxValueLen, cbSecurityDescriptor; + FILETIME ftLastWriteTime; + SYSTEMTIME stTime; + + cbClass = 256; + + GET_HANDLE(argv[1].strptr, hk); + + if ((retcode=RegQueryInfoKey(hk, // handle of key to query + Class, // address of buffer for class string + &cbClass, // address of size of class string buffer + NULL, // reserved + &cSubKeys, // address of buffer for number of subkeys + &cbMaxSubKeyLen, // address of buffer for longest subkey name length + &cbMaxClassLen, // address of buffer for longest class string length + &cValues, // address of buffer for number of value entries + &cbMaxValueNameLen, // address of buffer for longest value name length + &cbMaxValueLen, // address of buffer for longest value data length + &cbSecurityDescriptor, // address of buffer for security descriptor length + &ftLastWriteTime // address of buffer for last write time + )) == ERROR_SUCCESS) + { + if (FileTimeToSystemTime(&ftLastWriteTime, &stTime)) + { + + sprintf(retstr->strptr,"%s, %ld, %ld, %04d/%02d/%02d, %02d:%02d:%02d", + Class, cSubKeys, cValues, stTime.wYear, stTime.wMonth, stTime.wDay, + stTime.wHour, stTime.wMinute, stTime.wSecond); + } + else + { + sprintf(retstr->strptr,"%s, %ld, %ld",Class, cSubKeys, cValues); + } + + retstr->strlength = strlen(retstr->strptr); + return 0; + } + else + { + RETC(0); + } + } + else if ( strcmp(argv[0].strptr, "LIST") == 0 ) + { + DWORD retcode, ndx=0; + char Name[256]; + char sname[64]; + SHVBLOCK shvb; + + GET_HKEY(argv[1].strptr, hk); + do + { + retcode = RegEnumKey(hk, // handle of key to query + ndx++, // index of subkey to query + Name, // address of buffer for subkey name + sizeof(Name)); // size of subkey buffer + if (retcode == ERROR_SUCCESS) + { + strcpy(sname, argv[2].strptr); + // make sure there is a period on the stem name + if (sname[argv[2].strlength - 1] != '.') + { + strcat(sname, "."); + } + sprintf(sname + strlen(sname),"%d", ndx); + SET_VARIABLE(sname, Name, 2); + } + else if (retcode != ERROR_NO_MORE_ITEMS) + { + RETC(1); + } + } while (retcode == ERROR_SUCCESS); + RETC(0); + } + else if ( strcmp(argv[0].strptr, "FLUSH") == 0 ) + { + GET_HKEY(argv[1].strptr, hk); + + if (RegFlushKey(hk) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETC(1); + } + } + else + { + RETC(1); + } +} + + +size_t RexxEntry WSRegistryValue(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr) +{ + HKEY hk; + LONG rc; + + CHECKARG(2,5); + + if ( strcmp(argv[0].strptr, "SET") == 0 ) + { + DWORD valType; + DWORD dwNumber; + DWORD dataLen; + const BYTE * data; + + GET_HKEY(argv[1].strptr, hk); + + if (!strcmp(argv[4].strptr,"EXPAND")) valType = REG_EXPAND_SZ; + else + if (!strcmp(argv[4].strptr,"MULTI")) valType = REG_MULTI_SZ; + else + if (!strcmp(argv[4].strptr,"NUMBER")) valType = REG_DWORD; + else + if (!strcmp(argv[4].strptr,"BINARY")) valType = REG_BINARY; + else + if (!strcmp(argv[4].strptr,"LINK")) valType = REG_LINK; + else + if (!strcmp(argv[4].strptr,"RESOURCELIST")) valType = REG_RESOURCE_LIST; + else + if (!strcmp(argv[4].strptr,"RESOURCEDESC")) valType = REG_FULL_RESOURCE_DESCRIPTOR; + else + if (!strcmp(argv[4].strptr,"RESOURCEREQS")) valType = REG_RESOURCE_REQUIREMENTS_LIST; + else + if (!strcmp(argv[4].strptr,"BIGENDIAN")) valType = REG_DWORD_BIG_ENDIAN; + else + if (!strcmp(argv[4].strptr,"NONE")) valType = REG_NONE; + else + valType = REG_SZ; + + if ((valType == REG_DWORD) || (valType == REG_DWORD_BIG_ENDIAN)) + { + dwNumber = atoi(argv[3].strptr); + + if (valType == REG_DWORD_BIG_ENDIAN) + { + Little2BigEndian((BYTE *) &dwNumber, sizeof(dwNumber)); + } + + data = (const BYTE *) &dwNumber; + dataLen = sizeof(dwNumber); + } + else + { + data = (const BYTE *) argv[3].strptr; + switch (valType) + { + case REG_BINARY: + case REG_NONE: + case REG_LINK: + case REG_RESOURCE_LIST: + case REG_FULL_RESOURCE_DESCRIPTOR: + case REG_RESOURCE_REQUIREMENTS_LIST: + dataLen = (DWORD)argv[3].strlength; + break; + + case REG_EXPAND_SZ: + case REG_MULTI_SZ: + case REG_SZ: + dataLen = (DWORD)argv[3].strlength+1; + break; + } + } + + if (RegSetValueEx(hk, argv[2].strptr, 0, valType, data, dataLen) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETC(1); + } + + } + else if ( strcmp(argv[0].strptr, "QUERY") == 0 ) + { + DWORD valType, cbData; + char * valData, *vType; + ULONG intsize; + + cbData = sizeof(valData); + + GET_HKEY(argv[1].strptr, hk); + + if (RegQueryValueEx(hk, // handle of key to query + argv[2].strptr, // address of name of value to query + NULL, // reserved + &valType, // address of buffer for value type + NULL, // NULL to get the size + &cbData) == ERROR_SUCCESS) + { // address of data buffer size + valData = (char *)GlobalAlloc(GPTR, cbData); + + if (!valData) + { + RETERR; + } + + if (RegQueryValueEx(hk, // handle of key to query + argv[2].strptr, // address of name of value to query + NULL, // reserved + &valType, // address of buffer for value type + (LPBYTE)valData, // address of data buffer + &cbData) == ERROR_SUCCESS) + { // address of data buffer size + + if ((GlobalFlags(retstr->strptr) != GMEM_INVALID_HANDLE) && !GetLastError()) + { + intsize = (ULONG)GlobalSize(retstr->strptr); + } + else + { + intsize = STR_BUFFER; + } + if (intsize > retstr->strlength+1) + { + intsize = (ULONG)retstr->strlength+1; + } + if (cbData+10 > intsize) + { + if ((GlobalFlags(retstr->strptr) != GMEM_INVALID_HANDLE) && !GetLastError()) + { + GlobalFree(retstr->strptr); + } + retstr->strptr = (char *)GlobalAlloc(GMEM_FIXED, cbData + 10); + } + + switch (valType) + { + case REG_MULTI_SZ: + vType = "MULTI"; + sprintf(retstr->strptr,"%s, ",vType); + memcpy(&retstr->strptr[strlen(retstr->strptr)], valData, cbData); + break; + case REG_DWORD: + vType = "NUMBER"; + sprintf(retstr->strptr,"%s, %ld",vType, *(DWORD *)valData); + break; + case REG_BINARY: + vType = "BINARY"; + sprintf(retstr->strptr,"%s, ",vType); + memcpy(&retstr->strptr[strlen(retstr->strptr)], valData, cbData); + break; + case REG_NONE: + vType = "NONE"; + sprintf(retstr->strptr,"%s, ",vType); + memcpy(&retstr->strptr[strlen(retstr->strptr)], valData, cbData); + break; + case REG_SZ: + vType = "NORMAL"; + sprintf(retstr->strptr,"%s, %s",vType, valData); + break; + case REG_EXPAND_SZ: + vType = "EXPAND"; + sprintf(retstr->strptr,"%s, %s",vType, valData); + break; + case REG_RESOURCE_LIST: + vType = "RESOURCELIST"; + sprintf(retstr->strptr,"%s, ",vType); + memcpy(&retstr->strptr[strlen(retstr->strptr)], valData, cbData); + break; + case REG_FULL_RESOURCE_DESCRIPTOR: + vType = "RESOURCEDESC"; + sprintf(retstr->strptr,"%s, ",vType); + memcpy(&retstr->strptr[strlen(retstr->strptr)], valData, cbData); + break; + case REG_RESOURCE_REQUIREMENTS_LIST: + vType = "RESOURCEREQS"; + sprintf(retstr->strptr,"%s, ",vType); + memcpy(&retstr->strptr[strlen(retstr->strptr)], valData, cbData); + break; + case REG_LINK: + vType = "LINK"; + sprintf(retstr->strptr,"%s, ",vType); + memcpy(&retstr->strptr[strlen(retstr->strptr)], valData, cbData); + break; + case REG_DWORD_BIG_ENDIAN: + { + DWORD dwNumber; + vType = "BIGENDIAN"; + dwNumber = * (DWORD *)valData; + Little2BigEndian((BYTE *) &dwNumber, sizeof(dwNumber)); + sprintf(retstr->strptr,"%s, %ld",vType, dwNumber); + } + break; + + default: + vType = "OTHER"; + sprintf(retstr->strptr,"%s,",vType); + } + if ((valType == REG_MULTI_SZ) || + (valType == REG_BINARY) || + (valType == REG_RESOURCE_LIST) || + (valType == REG_FULL_RESOURCE_DESCRIPTOR) || + (valType == REG_RESOURCE_REQUIREMENTS_LIST) || + (valType == REG_NONE)) + { + retstr->strlength = strlen(vType) + 2 + cbData; + } + else + { + retstr->strlength = strlen(retstr->strptr); + } + + GlobalFree(valData); + + return 0; + } + else + { + RETC(0); + } + GlobalFree(valData); + } + else + { + RETC(0); + } + } + else if ( strcmp(argv[0].strptr, "LIST") == 0 ) + { + DWORD retcode, ndx=0, valType, cbValue, cbData, initData = 1024; + char * valData, Name[256]; + char sname[300]; + SHVBLOCK shvb; + + GET_HKEY(argv[1].strptr, hk); + valData = (char *)GlobalAlloc(GPTR, initData); + if (!valData) RETERR + + do + { + cbData = initData; + cbValue = sizeof(Name); + retcode = RegEnumValue(hk, // handle of key to query + ndx++, // index of subkey to query + Name, // address of buffer for subkey name + &cbValue, + NULL, // reserved + &valType, // address of buffer for type code + (LPBYTE)valData, // address of buffer for value data + &cbData); // address for size of data buffer + + if ((retcode == ERROR_MORE_DATA) && (cbData > initData)) /* we need more memory */ + { + GlobalFree(valData); + initData = cbData; + valData = (char *)GlobalAlloc(GPTR, cbData); + if (!valData) RETERR + ndx--; /* try to get the previous one again */ + cbValue = sizeof(Name); + retcode = RegEnumValue(hk, // handle of key to query + ndx++, // index of subkey to query + Name, // address of buffer for subkey name + &cbValue, + NULL, // reserved + &valType, // address of buffer for type code + (LPBYTE)valData, // address of buffer for value data + &cbData); // address for size of data buffer + } + + if (retcode == ERROR_SUCCESS) + { + strcpy(sname, argv[2].strptr); + // make sure there is a period on the stem name + if (sname[argv[2].strlength - 1] != '.') + { + strcat(sname, "."); + } + sprintf(sname + strlen(sname),"%d", ndx); + SET_VARIABLE(sname, Name, 2); + strcpy(sname, argv[2].strptr); + // make sure there is a period on the stem name + if (sname[argv[2].strlength - 1] != '.') + { + strcat(sname, "."); + } + sprintf(sname + strlen(sname),"%d.Type", ndx); + switch (valType) + { + case REG_EXPAND_SZ: + SET_VARIABLE(sname, "EXPAND", 2); + break; + case REG_NONE: + SET_VARIABLE(sname, "NONE", 2); + break; + case REG_DWORD: + SET_VARIABLE(sname, "NUMBER", 2); + break; + case REG_MULTI_SZ: + SET_VARIABLE(sname, "MULTI", 2); + break; + case REG_BINARY: + SET_VARIABLE(sname, "BINARY", 2); + break; + case REG_SZ: + SET_VARIABLE(sname, "NORMAL", 2); + break; + case REG_RESOURCE_LIST: + SET_VARIABLE(sname, "RESOURCELIST", 2); + break; + case REG_FULL_RESOURCE_DESCRIPTOR: + SET_VARIABLE(sname, "RESOURCEDESC", 2); + break; + case REG_RESOURCE_REQUIREMENTS_LIST: + SET_VARIABLE(sname, "RESOURCEREQS", 2); + break; + case REG_LINK: + SET_VARIABLE(sname, "LINK", 2); + break; + case REG_DWORD_BIG_ENDIAN: + SET_VARIABLE(sname, "BIGENDIAN", 2); + break; + default: + SET_VARIABLE(sname, "OTHER", 2); + } + strcpy(sname, argv[2].strptr); + // make sure there is a period on the stem name + if (sname[argv[2].strlength - 1] != '.') + { + strcat(sname, "."); + } + sprintf(sname + strlen(sname),"%d.Data", ndx); + if ((valType == REG_MULTI_SZ) || + (valType == REG_BINARY) || + (valType == REG_LINK) || + (valType == REG_RESOURCE_LIST) || + (valType == REG_FULL_RESOURCE_DESCRIPTOR) || + (valType == REG_RESOURCE_REQUIREMENTS_LIST) || + (valType == REG_NONE)) + { + shvb.shvnext = NULL; + shvb.shvname.strptr = sname; + shvb.shvname.strlength = strlen(sname); + shvb.shvnamelen = shvb.shvname.strlength; + shvb.shvvalue.strptr = valData; + shvb.shvvalue.strlength = cbData; + shvb.shvvaluelen = cbData; + shvb.shvcode = RXSHV_SYSET; + shvb.shvret = 0; + if (RexxVariablePool(&shvb) == RXSHV_BADN) + { + GlobalFree(valData); + RETC(2); + } + } + else if ((valType == REG_EXPAND_SZ) || (valType == REG_SZ)) + { + SET_VARIABLE(sname, valData, 2); + } + else if ((valType == REG_DWORD) || (valType == REG_DWORD_BIG_ENDIAN)) + { + char tmp[30]; + DWORD dwNumber; + + dwNumber = *(DWORD *) valData; + if (valType == REG_DWORD_BIG_ENDIAN) + { + Little2BigEndian((BYTE *)&dwNumber, sizeof(dwNumber)); + } + ltoa(dwNumber, tmp, 10); + SET_VARIABLE(sname, tmp, 2); + } + else + { + SET_VARIABLE(sname, "", 2); + } + } + else if (retcode != ERROR_NO_MORE_ITEMS) + { + GlobalFree(valData); + RETC(1); + } + } while (retcode == ERROR_SUCCESS); + GlobalFree(valData); + RETC(0); + } + else if ( strcmp(argv[0].strptr, "DELETE") == 0 ) + { + GET_HKEY(argv[1].strptr, hk); + + if ((rc = RegDeleteValue(hk, argv[2].strptr)) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETVAL(rc); + } + } + else + { + RETC(1); + } +} + + +size_t RexxEntry WSRegistryFile(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr) +{ + DWORD retc, rc; + HKEY hk; + HANDLE hToken; /* handle to process token */ + TOKEN_PRIVILEGES tkp; /* ptr. to token structure */ + + CHECKARG(2,5); + + if ( strcmp(argv[0].strptr, "CONNECT") == 0 ) + { + HKEY hkResult; + GET_HKEY(argv[1].strptr, hk); + + if (RegConnectRegistry(argv[2].strptr, hk, &hkResult ) == ERROR_SUCCESS) + { + RET_HANDLE(hkResult); + } + else + { + RETC(0); + } + } + else if ( strcmp(argv[0].strptr, "SAVE") == 0 ) + { + /* set SE_BACKUP_NAME privilege. */ + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) + { + RETVAL(GetLastError()); + } + + LookupPrivilegeValue(NULL, SE_BACKUP_NAME,&tkp.Privileges[0].Luid); + + tkp.PrivilegeCount = 1; /* one privilege to set */ + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + /* Set SE_BACKUP_NAME privilege for this process. */ + + AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, + (PTOKEN_PRIVILEGES) NULL, 0); + + if ((rc = GetLastError()) != ERROR_SUCCESS) + { + RETVAL(rc); + } + + GET_HKEY(argv[1].strptr, hk); + if ((retc = RegSaveKey(hk, argv[2].strptr, NULL)) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETVAL(retc); + } + } + else if ( strcmp(argv[0].strptr, "LOAD") == 0 || strcmp(argv[0].strptr, "RESTORE") == 0 || + strcmp(argv[0].strptr, "REPLACE") == 0 || strcmp(argv[0].strptr, "UNLOAD") == 0 ) + { + /* set SE_RESTORE_NAME privilege. */ + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) + { + RETVAL(GetLastError()) + } + + LookupPrivilegeValue(NULL, SE_RESTORE_NAME,&tkp.Privileges[0].Luid); + + tkp.PrivilegeCount = 1; /* one privilege to set */ + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + /* Set SE_BACKUP_NAME privilege for this process. */ + + AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); + + if ((rc = GetLastError()) != ERROR_SUCCESS) + { + RETVAL(rc); + } + + if ( strcmp(argv[0].strptr, "UNLOAD") == 0 ) + { + GET_HKEY(argv[1].strptr, hk); + if ((retc = RegUnLoadKey(hk, argv[2].strptr)) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETVAL(retc); + } + } + else if ( strcmp(argv[0].strptr, "LOAD") == 0 ) + { + GET_HKEY(argv[1].strptr, hk); + if ((retc = RegLoadKey(hk, argv[2].strptr, argv[3].strptr)) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETVAL(retc); + } + } + else if ( strcmp(argv[0].strptr, "RESTORE") == 0 ) + { + DWORD vola; + + GET_HKEY(argv[1].strptr, hk); + if (!strcmp(argv[3].strptr, "VOLATILE")) vola = REG_WHOLE_HIVE_VOLATILE; + else vola = 0; + + if ((retc = RegRestoreKey(hk, argv[2].strptr, vola)) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETVAL(retc); + } + } + else if ( strcmp(argv[0].strptr, "REPLACE") == 0 ) + { + const char * p; + GET_HKEY(argv[1].strptr, hk); + if (!strcmp(argv[2].strptr, "%NULL%")) + { + p = NULL; + } + else + { + p = argv[2].strptr; + } + + if ((retc = RegReplaceKey(hk, p, argv[3].strptr, argv[4].strptr)) == ERROR_SUCCESS) + { + RETC(0); + } + else + { + RETVAL(retc); + } + } + RETC(1); + } + else + { + // MessageBox(0,"Illegal registry file command!","Error",MB_OK | MB_ICONHAND | MB_SYSTEMMODAL); + RETC(1); + } +} + + +HDDEDATA CALLBACK DDECallback(UINT wType, + UINT wFmt, + HCONV hConv, + HSZ hsz1, + HSZ hsz2, + HDDEDATA hDDEData, + DWORD dwData1, + DWORD dwData2) +{ + return NULL; +} + +BOOL ProgmanCmd(LPSTR lpszCmd) +{ + DWORD dwDDEInst = 0; + UINT ui; + HSZ hszProgman; + HCONV hConv; + HDDEDATA hExecData; + HDDEDATA exRes; + + + + ui = DdeInitialize(&dwDDEInst, + DDECallback, + CBF_FAIL_ALLSVRXACTIONS, + 0l); + + if (ui != DMLERR_NO_ERROR) return FALSE; + + + + hszProgman = DdeCreateStringHandle(dwDDEInst, + "PROGMAN", + CP_WINANSI); + + hConv = DdeConnect(dwDDEInst, + hszProgman, + hszProgman, + NULL); + + + DdeFreeStringHandle(dwDDEInst, hszProgman); + + if (!hConv) return FALSE; + + + hExecData = DdeCreateDataHandle(dwDDEInst, + (LPBYTE)lpszCmd, + lstrlen(lpszCmd)+1, + 0, + NULL, + 0, + 0); + + + exRes = DdeClientTransaction((LPBYTE)hExecData, + (DWORD)-1, + hConv, + NULL, + 0, + XTYP_EXECUTE, + 2000, // ms timeout + NULL); + + + DdeDisconnect(hConv); + DdeUninitialize(dwDDEInst); + + return exRes != 0; +} + + + +BOOL AddPMGroup(const char *lpszGroup, const char *lpszPath) +{ + char buf[1024]; + + if (lpszPath && lstrlen(lpszPath)) + { + wsprintf(buf, + "[CreateGroup(%s,%s)]", + lpszGroup, + lpszPath); + } + else + { + wsprintf(buf, + "[CreateGroup(%s)]", + lpszGroup); + } + + return ProgmanCmd(buf); +} + +BOOL DeletePMGroup(const char *lpszGroup) +{ + char buf[512]; + + if (lpszGroup && lstrlen(lpszGroup)) + { + wsprintf(buf, + "[DeleteGroup(%s)]", + lpszGroup); + } + + return ProgmanCmd(buf); +} + +BOOL ShowPMGroup(const char *lpszGroup, WORD wCmd) +{ + char buf[512]; + + if (lpszGroup && lstrlen(lpszGroup)) + { + wsprintf(buf, + "[ShowGroup(%s,%u)]", + lpszGroup, + wCmd); + } + + return ProgmanCmd(buf); +} + + +BOOL AddPMItem(const char *lpszCmdLine, + const char *lpszCaption, + const char *lpszIconPath, + WORD wIconIndex, + const char *lpszDir, + BOOL bLast, + const char *lpszHotKey, + const char *lpszModifier, + BOOL bMin) +{ + char buf[2048]; + int Pos; + + if (bLast) Pos = -1; else Pos = 0; + + if (lpszIconPath && lstrlen(lpszIconPath)) + { + wsprintf(buf, + "[AddItem(%s,%s,%s,%u,%d,%d,%s,%d,%d)]", + lpszCmdLine, + lpszCaption, + lpszIconPath, + wIconIndex, + Pos,Pos, + lpszDir, + MAKEWORD( atoi(lpszHotKey), atoi(lpszModifier)), + bMin); + } + else + { + wsprintf(buf, + "[AddItem(%s,%s,"","",%d,%d,%s,%d,%d)]", + lpszCmdLine, + lpszCaption, + Pos, Pos, + lpszDir, + MAKEWORD( atoi(lpszHotKey), atoi(lpszModifier)), + bMin); + } + + return ProgmanCmd(buf); +} + + +BOOL DeletePMItem(const char *lpszItem) +{ + char buf[512]; + + if (lpszItem && lstrlen(lpszItem)) + { + wsprintf(buf, + "[DeleteItem(%s)]", + lpszItem); + } + + return ProgmanCmd(buf); +} + + +BOOL LeavePM(BOOL bSaveGroups) +{ + char buf[256]; + + wsprintf(buf, + "[ExitProgman(%u)]", + bSaveGroups ? 1 : 0); + + return ProgmanCmd(buf); +} + + +//----------------------------------------------------------------------------- +// +// Function: BOOL GetCurrentUserDesktopLocation +// +// This function reads the CurrentUser Desktop Path from the registry. +// +// Syntax: call GetCurrentUserDesktopLocation( LPBYTE szDesktopDir, LPDWORD lpcbData ) +// +// Params: +// +// szDesktopDir - Drive and Path of the Desktop to be returned +// lpcbData _ Max Size of szDesktopDir on entry, Size of szDesktopDir on exit +// +// return : TRUE - No error +// FALSE - Error +//----------------------------------------------------------------------------- +#define IDS_REGISTRY_KEY_CURRENT_SHELLFOLDER "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" +#define IDS_CURRENT_DESKTOP "Desktop" + +BOOL GetCurrentUserDesktopLocation ( LPBYTE szDesktopDir, LPDWORD lpcbData ) +{ + + + HKEY hKey; //handle of key + long rc; + DWORD Type ; + + szDesktopDir[0] ='\0'; //initialize return + + if ( (rc = RegOpenKeyEx(HKEY_CURRENT_USER, + IDS_REGISTRY_KEY_CURRENT_SHELLFOLDER, + 0, + KEY_QUERY_VALUE, + &hKey)) == ERROR_SUCCESS ) + { + if ( (rc = RegQueryValueEx(hKey, // handle of key to query + IDS_CURRENT_DESKTOP , // address of name of value to query + NULL, // reserved + &Type, // address of buffer for value type + szDesktopDir , // address of returned data + lpcbData)) == ERROR_SUCCESS ) // .. returned here + { + RegCloseKey ( hKey ) ; + return TRUE ; + } + RegCloseKey ( hKey ) ; + } + + // Error occured + return FALSE ; + +} +//----------------------------------------------------------------------------- +// +// Function: BOOL GetAllUserDesktopLocation +// +// This function reads All UsersDesktop Path from the registry. +// +// Syntax: call GetAllUserDesktopLocation( LPBYTE szDesktopDir, LPDWORD lpcbData ) +// +// Params: +// +// szDesktopDir - Drive and Path of the Desktop to be returned +// lpcbData _ Max Size of szDesktopDir on entry, Size of szDesktopDir on exit +// +// return : TRUE - No error +// FALSE - Error +//----------------------------------------------------------------------------- +#define IDS_REGISTRY_KEY_ALL_NT_SHELLFOLDER "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" +#define IDS_ALL_NT_DESKTOP "Common Desktop" + +#define IDS_REGISTRY_KEY_ALL_9x_SHELLFOLDER ".DEFAULT\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" +#define IDS_ALL_9x_DESKTOP "Desktop" + + +BOOL GetAllUserDesktopLocation ( LPBYTE szDesktopDir, LPDWORD lpcbData ) +{ + + + HKEY hKey; //handle of key + long rc; + DWORD lpType ; + LPTSTR lpValueName ; + + szDesktopDir[0] ='\0'; //initialize return + + // Test, if 95/98/Millenium or NT/Win2000 + if ( IsRunningNT() ) + { + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + IDS_REGISTRY_KEY_ALL_NT_SHELLFOLDER, + 0, + KEY_QUERY_VALUE, + &hKey) ; + lpValueName = IDS_ALL_NT_DESKTOP ; + } + else + { + rc = RegOpenKeyEx(HKEY_USERS, + IDS_REGISTRY_KEY_ALL_9x_SHELLFOLDER, + 0, + KEY_QUERY_VALUE, + &hKey) ; + lpValueName = IDS_ALL_9x_DESKTOP ; + } + if ( rc == ERROR_SUCCESS ) + { + if ( (rc = RegQueryValueEx(hKey, // handle of key to query + lpValueName , // address of name of value to query + NULL, // reserved + &lpType, // address of buffer for value type + szDesktopDir , // address of returned data + lpcbData)) == ERROR_SUCCESS ) // .. returned here + { + RegCloseKey ( hKey ) ; + return TRUE ; + } + RegCloseKey ( hKey ) ; + } + + // Error occured + return FALSE ; + +} + +//----------------------------------------------------------------------------- +// +// Function: BOOL AddPMDesktopIcon +// +// This function creates a shortcut to a file on the desktop. +// +// Syntax: call AddPmDesktopIcon( lpszName, lpszProgram, lpszIcon, iIconIndex, lpszWorkDir, +// lpszLocation, lpszArguments, iscKey, iscModifier, run ) +// +// Params: +// +// lpszName - Name of the short cut, displayed on the desktop below the icon +// lpszProgram - full name of the file of the shortcut referes to +// lpszIcon - full name of the icon file +// iIconIndex - index of the icon within the icon file +// lpszWorkDir - working directory of the shortcut +// lpszLocation - "PERSONAL" : icon is only on desktop for current user +// - "COMMON" : icon is displayed on desktop of all users +// - "" : it's a link and can be placed in any folder +// lpszArguments - arguments passed to the shortcut +// iScKey - shortcut key +// iScModifier - modifier of shortcut key +// run - run application in a : NORMAL +// MINIMIZED +// MAXIMIZED window +// +// return : TRUE - No error +// FALSE - Error +//----------------------------------------------------------------------------- + +BOOL AddPMDesktopIcon(const char *lpszName, + const char *lpszProgram, + const char *lpszIcon, + int iIconIndex, + const char *lpszWorkDir, + const char *lpszLocation, + const char *lpszArguments, + int iScKey, + int iScModifier, + const char *lpszRun ) +{ + HRESULT hres; + IShellLink* psl; + BOOL bRc = TRUE; + int iRun = SW_NORMAL; + + CoInitialize(NULL); + + // Get a pointer to the IShellLink interface. + hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl); + + if (SUCCEEDED(hres)) + { + IPersistFile* ppf; + + // Set the path to the shortcut target + psl->SetPath(lpszProgram ); + + // icon location. default of iIconIndex is 0, set in WINSYSTM.CLS + psl->SetIconLocation(lpszIcon, iIconIndex); + + // command-line arguments + psl->SetArguments(lpszArguments ); + + //shortcut key, the conversion to hex is done in WINSYSTM.CLS + // modificationflag: + // The modifier flags can be a combination of the following values: + // HOTKEYF_SHIFT = SHIFT key 0x01 + // HOTKEYF_CONTROL = CTRL key 0x02 + // HOTKEYF_ALT = ALT key 0x04 + // HOTKEYF_EXT = Extended key 0x08 + psl->SetHotkey(MAKEWORD( iScKey, iScModifier) ); + + // working directory + psl->SetWorkingDirectory(lpszWorkDir ); + + // run in normal, maximized , minimized window, default is NORMAL, set in WINSYSTM.CLS + if ( !stricmp(lpszRun,"MAXIMIZED") ) + { + iRun = SW_SHOWMAXIMIZED; + } + else if ( !stricmp(lpszRun,"MINIMIZED") ) + { + iRun = SW_SHOWMINNOACTIVE; + } + + psl->SetShowCmd(iRun ); + + // Query IShellLink for the IPersistFile interface for saving the + // shortcut in persistent storage. + hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf); + + if (SUCCEEDED(hres)) + { + WCHAR wsz[MAX_PATH]; + CHAR szShortCutName[MAX_PATH]; + CHAR szDesktopDir[MAX_PATH]; + DWORD dwSize = MAX_PATH; + + // If strlen(lpszLocation is < 6, then lpszName contains a full qualified filename + if (strlen(lpszLocation)>5) + { + // if icon should only be created on the desktop of current user + // get current user + if (!stricmp(lpszLocation,"PERSONAL")) + { + bRc = GetCurrentUserDesktopLocation ( (LPBYTE)szDesktopDir , &dwSize ) ; + } + else + { // Location is COMMON + bRc = GetAllUserDesktopLocation ( (LPBYTE)szDesktopDir , &dwSize ) ; + } + + if ( bRc) + { + //.lnk must be added to identify the file as a shortcut + sprintf( szShortCutName, "%s\\%s.lnk", szDesktopDir, lpszName); + } + } + else /* empty specifier so it's a link */ + { + sprintf( szShortCutName, "%s.lnk", lpszName); /* lpszName contains a full qualified filename */ + } + + // Continueonly, if bRC is TRUE + if ( bRc ) + { + + // Ensure that the string is Unicode. + MultiByteToWideChar(CP_ACP, 0, szShortCutName, -1, wsz, MAX_PATH); + + // Save the link by calling IPersistFile::Save. + hres = ppf->Save(wsz, TRUE); + if (!SUCCEEDED(hres)) + { + bRc = FALSE; + } + ppf->Release(); + } + else + { + bRc = FALSE; + } + } + else + { + bRc = FALSE; + } + + psl->Release(); + + } + else + { + bRc = FALSE; + } + + return bRc; +} + +//----------------------------------------------------------------------------- +// +// Function: INT DelPMDesktopIcon +// +// This function deletes a shortcut created with AddPMDektopIcon +// +// Syntax: call DelPMDesktopIcon( lpszName,lpszLocation ) +// +// Params: +// +// lpszName - Name of the short cut to be deleted +// +// return : 0 - No error +// others - Error codes from DeleteFile +// Note: The returncode of GetCurrentXXXDesktopLocation is not checked because +// this hould be handeled by DeleteFile. So if an error occured during this +// function, file nit found is returned +//----------------------------------------------------------------------------- +INT DelPMDesktopIcon( const char *lpszName, const char *lpszLocation) +{ + CHAR szDesktopDir[MAX_PATH]; + CHAR szShortCutName[MAX_PATH]; + DWORD dwSize = MAX_PATH; + + // get the location (directory) of the shortcut file in dependency of + // the specified location + if (!stricmp(lpszLocation,"PERSONAL")) + { + GetCurrentUserDesktopLocation ( (LPBYTE)szDesktopDir , &dwSize ); + } + else + { // Location is COMMON + GetAllUserDesktopLocation ( (LPBYTE)szDesktopDir , &dwSize ); + } + + //.lnk must be added to identify the file as a shortcut + sprintf( szShortCutName, "%s\\%s.lnk", szDesktopDir, lpszName); + + if (!DeleteFile(szShortCutName)) + { + return GetLastError(); + } + else + { + return 0; + } +} + +size_t RexxEntry WSProgManager(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr) +{ + CHECKARG(2,11); + + if (strcmp( argv[0].strptr, "ADDGROUP") == 0 ) + { + RETC(!AddPMGroup(argv[1].strptr, argv[2].strptr)); + } + else if ( strcmp(argv[0].strptr, "DELGROUP") == 0 ) + { + RETC(!DeletePMGroup(argv[1].strptr)); + } + else if ( strcmp(argv[0].strptr, "SHOWGROUP") == 0 ) + { + INT stype; + if ( strcmp(argv[2].strptr, "MAX") == 0 ) + { + stype = 3; + } + else if ( strcmp(argv[2].strptr, "MIN") == 0 ) + { + stype = 2; + } + else + { + stype = 1; + } + + RETC(!ShowPMGroup(argv[1].strptr, (WORD)stype)); + } + else if ( strcmp(argv[0].strptr, "ADDITEM") == 0 ) + { + if (argc > 7) + { + + RETC(!AddPMItem(argv[1].strptr, argv[2].strptr, argv[3].strptr, (WORD)atoi(argv[4].strptr), argv[5].strptr,\ + (BOOL)atoi(argv[6].strptr), argv[7].strptr, argv[8].strptr, (BOOL)atoi(argv[9].strptr))); + } + else + { + RETC(!AddPMItem(argv[1].strptr, argv[2].strptr, argv[3].strptr, (WORD)atoi(argv[4].strptr), argv[5].strptr,\ + (BOOL)atoi(argv[6].strptr), "", "", 0)); + } + + } + else if ( strcmp(argv[0].strptr, "DELITEM") == 0 ) + { + RETC(!DeletePMItem(argv[1].strptr)); + } + else if (strcmp(argv[0].strptr, "LEAVE")) + { + if ( strcmp(argv[1].strptr, "SAVE") == 0) + { + RETC(!LeavePM(TRUE)); + } + else + { + RETC(!LeavePM(FALSE)); + } + } + else if ( strcmp(argv[0].strptr, "ADDDESKTOPICON") == 0 ) + { + RETC(!AddPMDesktopIcon( argv[1].strptr, argv[2].strptr, argv[3].strptr, atoi(argv[4].strptr), + argv[5].strptr, argv[6].strptr, argv[7].strptr, atoi(argv[8].strptr), + atoi(argv[9].strptr), argv[10].strptr )); + } + else if ( strcmp(argv[0].strptr, "DELDESKTOPICON") == 0 ) + { + CHECKARG(3,3); + RETVAL(DelPMDesktopIcon( argv[1].strptr, argv[2].strptr)); + } + else + { + RETC(0); + } +} + + +size_t RexxEntry RemoveWinSysFuncs(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr) +{ + // this is a NOP now + retstr->strlength = 0; /* set return value */ + return VALID_ROUTINE; +} + + + +size_t RexxEntry InstWinSysFuncs(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr) +{ + // this is a NOP now + retstr->strlength = 0; /* set return value */ + return VALID_ROUTINE; +} + + +//Functions for reading Event Log + +//----------------------------------------------------------------------------- +// +// Function GetEvPaMessageFile +// +// Gets the name of the message file from the registry +// +// char * GetEvPaMessageFile(char * pMessageFile, char * pchSource,char * pchSourceName, char * chMessageFile) +// +// pMessaegFile - (in) What to get +// "EventMessageFile" get event message file name +// "ParameterMessageFile" get parameter message file +// +// pchSource - (in) second part of the key to build +// +// pchSourceName - (in) third part of the key to build +// +// chMessageFile - (in/out) name of the message file +// string buffer with length MAX_PATH +// +//-----------------------------------------------... [truncated message content] |
From: <bi...@us...> - 2008-08-12 17:38:08
|
Revision: 2948 http://oorexx.svn.sourceforge.net/oorexx/?rev=2948&view=rev Author: bigrixx Date: 2008-08-12 17:38:16 +0000 (Tue, 12 Aug 2008) Log Message: ----------- move ole, orxscript, and oodialg to extensions Modified Paths: -------------- main/trunk/interpreter/interpreter.mak main/trunk/lib/orxwin32.mak main/trunk/orxdb.bat main/trunk/rexxapi/rexxapi.mak main/trunk/rxregexp/rxregexp.mak Added Paths: ----------- main/trunk/extensions/platform/windows/ole/ main/trunk/extensions/platform/windows/oodialog/ main/trunk/extensions/platform/windows/orxscrpt/ Removed Paths: ------------- main/trunk/platform/windows/ole/ main/trunk/platform/windows/oodialog/ main/trunk/platform/windows/orxscrpt/ Modified: main/trunk/interpreter/interpreter.mak =================================================================== --- main/trunk/interpreter/interpreter.mak 2008-08-12 14:12:46 UTC (rev 2947) +++ main/trunk/interpreter/interpreter.mak 2008-08-12 17:38:16 UTC (rev 2948) @@ -216,11 +216,11 @@ # # need import libraries and def files still # -$(OR_OUTDIR)\rexx.dll : $(ORXHEADERS) $(ORYXKOBJ) $(ORYXLOBJ) $(RXDBG_OBJ) \ +$(OR_OUTDIR)\rexx.dll : $(ORXHEADERS) $(ORYXKOBJ) $(ORYXLOBJ) \ $(OR_OUTDIR)\$(@B).lib $(INT_PLATFORM)\wrexx.def \ $(OR_OUTDIR)\winmsgtb.res $(OR_OUTDIR)\verinfo.res type <<$(OR_OUTDIR)\oryxk.lst - $(ORYXKOBJ) $(RXDBG_OBJ) $(ORYXLOBJ) + $(ORYXKOBJ) $(ORYXLOBJ) << $(OR_LINK) $(lflags_common) $(lflags_dll) -out:$(OR_OUTDIR)\$(@B).dll \ @$(OR_OUTDIR)\oryxk.lst \ Modified: main/trunk/lib/orxwin32.mak =================================================================== --- main/trunk/lib/orxwin32.mak 2008-08-12 14:12:46 UTC (rev 2947) +++ main/trunk/lib/orxwin32.mak 2008-08-12 17:38:16 UTC (rev 2948) @@ -135,14 +135,8 @@ cflags_noopt=/nologo /D:_X86_ /DWIN32 $(WARNING_FLAGS) -c $(my_cdebug) /DNULL=0 !ENDIF -# CHM - added definition for RXDBG cflags_common=/EHsc /nologo /D:_X86_ /DWIN32 $(VER_DEF) $(WARNING_FLAGS) -c $(my_cdebug) $(MK_ASM) $(RXDBG) /DNULL=0 -# ENG - added for feature 953 -!IFDEF JAPANESE -cflags_common = $(cflags_common) /DJAPANESE -!ENDIF - # ooRexx has always been using a statically linked CRT. !IFDEF NOCRTDLL # statically linked rexx Modified: main/trunk/orxdb.bat =================================================================== --- main/trunk/orxdb.bat 2008-08-12 14:12:46 UTC (rev 2947) +++ main/trunk/orxdb.bat 2008-08-12 17:38:16 UTC (rev 2948) @@ -83,9 +83,9 @@ set OR_MESSAGESRC=%SRC_DRV%%SRC_DIR%\interpreter\messages set OR_WINKERNELSRC=%SRC_DRV%%SRC_DIR%\platform\windows set OR_REXXAPISRC=%SRC_DRV%%SRC_DIR%\rexxapi -set OR_OODIALOGSRC=%SRC_DRV%%SRC_DIR%\platform\windows\oodialog -set OR_OLEOBJECTSRC=%SRC_DRV%%SRC_DIR%\platform\windows\ole -set OR_ORXSCRIPTSRC=%SRC_DRV%%SRC_DIR%\platform\windows\orxscrpt +set OR_OODIALOGSRC=%SRC_DRV%%SRC_DIR%\extensions\platform\windows\oodialog +set OR_OLEOBJECTSRC=%SRC_DRV%%SRC_DIR%\extensions\platform\windows\ole +set OR_ORXSCRIPTSRC=%SRC_DRV%%SRC_DIR%\extensions\platform\windows\orxscrpt set OR_REGEXPSRC=%SRC_DRV%%SRC_DIR%\rxregexp set OR_SAMPLESRC=%SRC_DRV%%SRC_DIR%\samples set OR_APISAMPLESRC=%SRC_DRV%%SRC_DIR%\samples\windows\api Modified: main/trunk/rexxapi/rexxapi.mak =================================================================== --- main/trunk/rexxapi/rexxapi.mak 2008-08-12 14:12:46 UTC (rev 2947) +++ main/trunk/rexxapi/rexxapi.mak 2008-08-12 17:38:16 UTC (rev 2948) @@ -87,7 +87,7 @@ # *** REXXAPI.DLL # # need import libraries and def files still -$(OR_OUTDIR)\rexxapi.dll : $(CLIENTOBJS) $(RXDBG_OBJ) \ +$(OR_OUTDIR)\rexxapi.dll : $(CLIENTOBJS) \ $(OR_OUTDIR)\rexxapi.lib \ $(OR_REXXAPISRC)\client\platform\windows\rexxapi.def \ $(OR_OUTDIR)\rexxapi.exp \ Modified: main/trunk/rxregexp/rxregexp.mak =================================================================== --- main/trunk/rxregexp/rxregexp.mak 2008-08-12 14:12:46 UTC (rev 2947) +++ main/trunk/rxregexp/rxregexp.mak 2008-08-12 17:38:16 UTC (rev 2948) @@ -68,11 +68,11 @@ # *** RXREGEXP.DLL # # need import libraries and def files still -$(OR_OUTDIR)\rxregexp.dll : $(CPPOBJS) $(OBJS) $(RXDBG_OBJ) $(OR_OUTDIR)\RXREGEXP.lib \ +$(OR_OUTDIR)\rxregexp.dll : $(CPPOBJS) $(OBJS) $(OR_OUTDIR)\RXREGEXP.lib \ $(OR_REGEXPSRC)\RXREGEXP.def \ $(OR_OUTDIR)\RXREGEXP.exp $(OR_LINK) -map $(lflags_common) $(lflags_dll) -out:$(OR_OUTDIR)\$(@B).dll \ - $(CPPOBJS) $(RXDBG_OBJ) \ + $(CPPOBJS) \ $(OR_OUTDIR)\verinfo.res \ $(OR_OUTDIR)\$(@B).exp \ $(OR_OUTDIR)\rexx.lib \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |