From: <jfa...@us...> - 2010-04-24 21:34:01
|
Revision: 5815 http://oorexx.svn.sourceforge.net/oorexx/?rev=5815&view=rev Author: jfaucher Date: 2010-04-24 21:33:53 +0000 (Sat, 24 Apr 2010) Log Message: ----------- Added some OutputDebugString (Windows only) to analyze the locks management by the interpreter. Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/common/SynchronizedBlock.hpp sandbox/jlf/trunk/common/platform/windows/SysSemaphore.cpp sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp sandbox/jlf/trunk/interpreter/classes/MessageClass.cpp sandbox/jlf/trunk/interpreter/classes/MessageClass.hpp sandbox/jlf/trunk/interpreter/concurrency/ActivityManager.cpp sandbox/jlf/trunk/interpreter/concurrency/ActivityManager.hpp sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.hpp sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp sandbox/jlf/trunk/interpreter/memory/RexxMemory.cpp sandbox/jlf/trunk/interpreter/runtime/Interpreter.cpp sandbox/jlf/trunk/interpreter/runtime/Interpreter.hpp sandbox/jlf/trunk/interpreter/runtime/InterpreterInstance.cpp sandbox/jlf/trunk/interpreter/runtime/InterpreterInstance.hpp sandbox/jlf/trunk/rexxapi/client/LocalAPIManager.cpp sandbox/jlf/trunk/rexxapi/server/APIServer.cpp sandbox/jlf/trunk/rexxapi/server/APIServer.hpp sandbox/jlf/trunk/rexxapi/server/MacroSpaceManager.hpp sandbox/jlf/trunk/rexxapi/server/QueueManager.cpp sandbox/jlf/trunk/rexxapi/server/QueueManager.hpp sandbox/jlf/trunk/rexxapi/server/RegistrationManager.hpp Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/_diary.txt 2010-04-24 21:33:53 UTC (rev 5815) @@ -1,6 +1,7 @@ Sandbox for experimental work, some ideas to investigate : Try to understand the internal locks. +--> added some OutputDebugString (Windows only), now must analyze... Allow extension of the predefined ooRexx classes to get something similar to C# extension methods (but more powerful). Modified: sandbox/jlf/trunk/common/SynchronizedBlock.hpp =================================================================== --- sandbox/jlf/trunk/common/SynchronizedBlock.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/common/SynchronizedBlock.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -50,19 +50,21 @@ class Lock { public: - inline Lock(SysMutex &l) : lock(l) + inline Lock(SysMutex &l,const char *ds, int di) : lock(l), dbgds(ds), dbgdi(di) { - lock.request(); + lock.request(dbgds, dbgdi); } inline ~Lock() { - lock.release(); + lock.release(dbgds, dbgdi); } protected: SysMutex &lock; + const char *dbgds; + int dbgdi; }; #endif Modified: sandbox/jlf/trunk/common/platform/windows/SysSemaphore.cpp =================================================================== --- sandbox/jlf/trunk/common/platform/windows/SysSemaphore.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/common/platform/windows/SysSemaphore.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -53,8 +53,9 @@ * * @param create Indicates whether the semaphore should be created now. */ -SysSemaphore::SysSemaphore(bool createSem) +SysSemaphore::SysSemaphore(const char *variable, bool createSem) { + semVariable = variable; sem = 0; if (createSem) { @@ -94,8 +95,9 @@ * * @param create Indicates whether the semaphore should be created now. */ -SysMutex::SysMutex(bool createSem) +SysMutex::SysMutex(const char *variable, bool createSem) { + mutexVariable = variable; mutexMutex = 0; if (createSem) { Modified: sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp =================================================================== --- sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -48,26 +48,38 @@ #include "rexx.h" #include <stdlib.h> +#include <stdio.h> inline void waitHandle(HANDLE s); class SysSemaphore { public: - SysSemaphore() : sem(0) { ; } - SysSemaphore(bool); + SysSemaphore(const char *variable) : semVariable(variable), sem(0) { ; } + SysSemaphore(const char *variable, bool); ~SysSemaphore() { ; } void create(); inline void open() { ; } void close(); void post() { SetEvent(sem); }; - inline void wait() + inline void wait(const char *ds, int di) { + char buffer[1024]; + sprintf(buffer, "(SysSemaphore)%s.wait : before waitHandle(0x%x) from %s (0x%x)\n", semVariable, sem, ds, GetCurrentThreadId()); + OutputDebugString(buffer); waitHandle(sem); + sprintf(buffer, "(SysSemaphore)%s.wait : after waitHandle(0x%x) from %s (0x%x)\n", semVariable, sem, ds, GetCurrentThreadId()); + OutputDebugString(buffer); } - inline bool wait(uint32_t timeout) + inline bool wait(const char *ds, int di, uint32_t timeout) { - return WaitForSingleObject(sem, timeout) != WAIT_TIMEOUT; + char buffer[1024]; + sprintf(buffer, "(SysSemaphore)%s.wait : before WaitForSingleObject(0x%x, timemout) from %s (0x%x)\n", semVariable, sem, timeout, ds, GetCurrentThreadId()); + OutputDebugString(buffer); + bool result = WaitForSingleObject(sem, timeout) != WAIT_TIMEOUT; + sprintf(buffer, "(SysSemaphore)%s.wait : after WaitForSingleObject(0x%x, timemout) from %s (0x%x)\n", semVariable, sem, timeout, ds, GetCurrentThreadId()); + OutputDebugString(buffer); + return result; } inline void reset() { ResetEvent(sem); } @@ -89,6 +101,7 @@ static inline bool noMessageLoop() { return usingTls && ((DWORD_PTR)TlsGetValue(tlsNoMessageLoopIndex) == 1); } protected: + const char *semVariable; HANDLE sem; private: @@ -100,27 +113,44 @@ class SysMutex { public: - SysMutex() : mutexMutex(0) { } - SysMutex(bool); + SysMutex(const char *variable) : mutexVariable(variable), mutexMutex(0) { } + SysMutex(const char *, bool); ~SysMutex() { ; } void create(); void close(); - inline void request() + inline void request(const char *ds, int di) { + char buffer[1024]; + sprintf(buffer, "(SysMutex)%s.request : before waitHandle(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); + OutputDebugString(buffer); waitHandle(mutexMutex); + sprintf(buffer, "(SysMutex)%s.request : after waitHandle(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); + OutputDebugString(buffer); } - inline void release() + inline void release(const char *ds, int di) { + char buffer[1024]; + sprintf(buffer, "(SysMutex)%s.release : before ReleaseMutex(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); + OutputDebugString(buffer); ReleaseMutex(mutexMutex); + sprintf(buffer, "(SysMutex)%s.release : after ReleaseMutex(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); + OutputDebugString(buffer); } - inline bool requestImmediate() + inline bool requestImmediate(const char *ds, int di) { - return WaitForSingleObject(mutexMutex, 0) != WAIT_TIMEOUT; + char buffer[1024]; + sprintf(buffer, "(SysMutex)%s.requestImmediate : before WaitForSingleObject(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); + OutputDebugString(buffer); + bool result = WaitForSingleObject(mutexMutex, 0) != WAIT_TIMEOUT; + sprintf(buffer, "(SysMutex)%s.requestImmediate : after WaitForSingleObject(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); + OutputDebugString(buffer); + return result; } protected: + const char *mutexVariable; HANDLE mutexMutex; // the actual mutex }; Modified: sandbox/jlf/trunk/interpreter/classes/MessageClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MessageClass.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/classes/MessageClass.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -77,6 +77,7 @@ * @param _args An array of arguments to the message. */ RexxMessage::RexxMessage(RexxObject *_target, RexxString *msgName, RexxObject *scope, RexxArray *_args) + : waitResultSem("RexxMessage::waitResultSem") { /* defult target is target specified */ OrefSet(this, this->receiver, _target); Modified: sandbox/jlf/trunk/interpreter/classes/MessageClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MessageClass.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/classes/MessageClass.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -57,7 +57,7 @@ inline void * operator new(size_t size, void *objectPtr) { return objectPtr; }; /* So it doesn't need to do anythin*/ RexxMessage(RexxObject *, RexxString *, RexxObject *, RexxArray *); - inline RexxMessage(RESTORETYPE restoreType) { ; }; + inline RexxMessage(RESTORETYPE restoreType) : waitResultSem("RexxMessage::waitResultSem") { ; }; void live(size_t); void liveGeneral(int reason); Modified: sandbox/jlf/trunk/interpreter/concurrency/ActivityManager.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/concurrency/ActivityManager.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/concurrency/ActivityManager.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -68,10 +68,10 @@ size_t ActivityManager::interpreterInstances = 0; // global lock for the interpreter -SysMutex ActivityManager::kernelSemaphore; +SysMutex ActivityManager::kernelSemaphore("ActivityManager::kernelSemaphore"); // the termination complete semaphore -SysSemaphore ActivityManager::terminationSem; +SysSemaphore ActivityManager::terminationSem("ActivityManager::terminationSem"); /** * Initialize the activity manager when the interpreter starts up. @@ -124,7 +124,7 @@ */ void ActivityManager::addWaitingActivity(RexxActivity *waitingAct, bool release ) { - ResourceSection lock; // need the control block locks + ResourceSection lock("ActivityManager::addWaitingActivity", 0); // need the control block locks // nobody waiting yet? If the release flag is true, we already have the // kernel lock, but nobody is waiting. In theory, this can't really @@ -212,7 +212,7 @@ */ void ActivityManager::terminateInterpreter() { - ResourceSection lock; + ResourceSection lock("ActivityManager::terminateInterpreter", 0); interpreterInstances--; /* reduce the active count */ if (interpreterInstances == 0) /* down to nothing? */ { @@ -335,7 +335,7 @@ */ RexxActivity *ActivityManager::createNewActivity() { - ResourceSection lock; // lock the control information + ResourceSection lock("ActivityManager::createNewActivity", 0); // lock the control information /* try to get one from the free table*/ RexxActivity *activity = (RexxActivity *)availableActivities->removeFirstItem(); if (activity == OREF_NULL) @@ -368,7 +368,7 @@ { // create an activity object without creating a new thread RexxActivity *activity = new RexxActivity(false); - ResourceSection lock; // lock the control information + ResourceSection lock("ActivityManager::createCurrentActivity", 0); // lock the control information /* Add this activity to the table of */ /* in use activities and the global */ /* table */ @@ -451,7 +451,7 @@ /* Function: Flip on a bit in a target activities top activation */ /******************************************************************************/ { - ResourceSection lock; + ResourceSection lock("ActivityManager::haltActivity", 0); // locate the activity associated with this thread_id. If not found, return // a failure. RexxActivity *activity = findActivity(thread_id); @@ -470,7 +470,7 @@ /* Function: Flip on a bit in a target activities top activation */ /******************************************************************************/ { - ResourceSection lock; + ResourceSection lock("ActivityManager::setActivityTrace", 0); // locate the activity associated with this thread_id. If not found, return // a failure. RexxActivity *activity = findActivity(thread_id); @@ -487,7 +487,7 @@ /* Function: Signal an activation to yield control */ /******************************************************************************/ { - ResourceSection lock; + ResourceSection lock("ActivityManager::yieldCurrentActivity", 0); RexxActivity *activity = ActivityManager::currentActivity; if (activity != OREF_NULL) @@ -503,7 +503,7 @@ /******************************************************************************/ { // this is a critical section - ResourceSection lock; + ResourceSection lock("ActivityManager::findActivity", 0); // 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 @@ -545,7 +545,7 @@ /* Function: Request access to the kernel */ /******************************************************************************/ { - kernelSemaphore.request(); /* just request the semaphore */ + kernelSemaphore.request("ActivityManager::lockKernel", 0); /* just request the semaphore */ } void ActivityManager::unlockKernel() @@ -558,7 +558,7 @@ sentinel = false; currentActivity = OREF_NULL; /* no current activation */ sentinel = true; - kernelSemaphore.release(); /* release the kernel semaphore */ + kernelSemaphore.release("ActivityManager::unlockKernel", 0); /* release the kernel semaphore */ } /** @@ -596,7 +596,7 @@ // dispatch queue if (waitingActivities.empty()) { - return kernelSemaphore.requestImmediate(); + return kernelSemaphore.requestImmediate("ActivityManager::lockKernelImmediate", 0); } return false; } @@ -617,7 +617,7 @@ { // START OF CRITICAL SECTION { - ResourceSection lock; + ResourceSection lock("ActivityManager::returnActivity", 0); // and also remove from the global list allActivities->removeItem((RexxObject *)activityObject); // if we ended up pushing an old activity down when we attached this @@ -643,7 +643,7 @@ { // START OF CRITICAL SECTION { - ResourceSection lock; // this is a critical section + ResourceSection lock("ActivityManager::activityEnded", 0); // this is a critical section // and also remove from the global list allActivities->removeItem((RexxObject *)activityObject); // cleanup any system resources this activity might own @@ -715,7 +715,7 @@ // make sure we release any system resources used by this activity, such as the semaphores activity->cleanupActivityResources(); - ResourceSection lock; // need the control block locks + ResourceSection lock("ActivityManager::returnRootActivity", 0); // need the control block locks // remove this from the activity list so it will never get // picked up again. allActivities->removeItem((RexxObject *)activity); Modified: sandbox/jlf/trunk/interpreter/concurrency/ActivityManager.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/concurrency/ActivityManager.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/concurrency/ActivityManager.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -99,9 +99,9 @@ terminationSem.post(); /* let anyone who cares know we're done*/ } - static inline void waitForTermination() + static inline void waitForTermination(const char *ds, int di) { - terminationSem.wait(); // wait until this is posted + terminationSem.wait(ds, di); // wait until this is posted } protected: Modified: sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -96,7 +96,7 @@ try { - this->runsem.wait(); /* wait for run permission */ + this->runsem.wait("RexxActivity::runThread", 0); /* wait for run permission */ if (this->exit) /* told to exit? */ { break; /* we're out of here */ @@ -224,6 +224,7 @@ * current thread, or creating a new thread. */ RexxActivity::RexxActivity(bool createThread) +: runsem("RexxActivity::runsem"), guardsem("RexxActivity::guardsem") { // we need to protect this from garbage collection while constructing. // unfortunately, we can't use ProtectedObject because that requires an @@ -1754,7 +1755,7 @@ runsem.reset(); /* clear the run semaphore */ this->waitingObject = resource; /* save the waiting resource */ releaseAccess(); /* release the kernel access */ - runsem.wait(); /* wait for the run to be posted */ + runsem.wait("RexxActivity::waitReserve", 0); /* wait for the run to be posted */ requestAccess(); /* reaquire the kernel access */ } @@ -1764,7 +1765,7 @@ /******************************************************************************/ { releaseAccess(); /* release kernel access */ - guardsem.wait(); /* wait on the guard semaphore */ + guardsem.wait("RexxActivity::guardWait", 0); /* wait on the guard semaphore */ requestAccess(); /* reaquire the kernel lock */ } Modified: sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -132,7 +132,7 @@ inline void operator delete(void *) { ; } inline void operator delete(void *, void *) { ; } - inline RexxActivity(RESTORETYPE restoreType) { ; }; + inline RexxActivity(RESTORETYPE restoreType) : runsem("RexxActivity::runsem"), guardsem("RexxActivity::guardsem") { ; }; RexxActivity(); RexxActivity(bool); @@ -282,7 +282,7 @@ inline void removeRunningRequires(RexxObject *program) {this->requiresTable->remove(program);} inline void resetRunningRequires() {this->requiresTable->reset();} inline bool checkRequires(RexxString *n) { return runningRequires(n) != OREF_NULL; } - inline void waitForDispatch() { runsem.wait(); } + inline void waitForDispatch() { runsem.wait("runsem", 0); } inline void clearWait() { runsem.reset(); } inline uint64_t getRandomSeed() { return randomSeed; } inline void setRandomSeed(uint64_t seed) { randomSeed = seed; }; Modified: sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -1590,6 +1590,7 @@ dispatcher.setContext(activity, this); activity->releaseAccess(); /* force this to "safe" mode */ dispatcher.run(); + OutputDebugString("after dispatcher.run"); activity->requestAccess(); /* now in unsafe mode again */ } catch (ActivityException) Modified: sandbox/jlf/trunk/interpreter/memory/RexxMemory.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/memory/RexxMemory.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/memory/RexxMemory.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -99,9 +99,9 @@ RexxDirectory *RexxMemory::system = OREF_NULL; // locks for the memory process access -SysMutex RexxMemory::flattenMutex; -SysMutex RexxMemory::unflattenMutex; -SysMutex RexxMemory::envelopeMutex; +SysMutex RexxMemory::flattenMutex("RexxMemory::flattenMutex"); +SysMutex RexxMemory::unflattenMutex("RexxMemory::unflattenMutex"); +SysMutex RexxMemory::envelopeMutex("RexxMemory::envelopeMutex"); static void logMemoryCheck(FILE *outfile, const char *message, ...) { @@ -1940,12 +1940,12 @@ /* have a value, starting unflatten. See if we can get MUTEX */ /* immed */ - if (!unflattenMutex.requestImmediate()) + if (!unflattenMutex.requestImmediate("RexxMemory::setObjectOffset", 0)) { { UnsafeBlock releaser; /* wait for current unflatten to end */ - unflattenMutex.request(); + unflattenMutex.request("RexxMemory::setObjectOffset", 0); } } } @@ -1953,7 +1953,7 @@ { /* no value, ending an unflatten */ /* Release the MUTEX. */ - unflattenMutex.release(); + unflattenMutex.release("RexxMemory::setObjectOffset", 0); } /* setup offSet value. */ @@ -1974,20 +1974,20 @@ { /* have a value, starting unflatt */ /* See if we can get MUTEX immed */ - if (!envelopeMutex.requestImmediate()) + if (!envelopeMutex.requestImmediate("RexxMemory::setEnvelope", 0)) { /* Nope, have to wait for it. */ /* release kernel access. */ { UnsafeBlock releaser; - envelopeMutex.request(); /* wait for current unflat to end */ + envelopeMutex.request("RexxMemory::setEnvelope", 0); /* wait for current unflat to end */ } } } else { /* no value, ending an unflatten */ - envelopeMutex.release(); /* Release the MUTEX. */ + envelopeMutex.release("RexxMemory::setEnvelope", 0); /* Release the MUTEX. */ } this->envelope = _envelope; /* set the envelope object */ @@ -2132,13 +2132,13 @@ /* Function: Allocate and lock the flatten stack capability. */ /******************************************************************************/ { - if (!flattenMutex.requestImmediate()) + if (!flattenMutex.requestImmediate("RexxMemory::getFlattenStack", 0)) { /* Nope, have to wait for it. */ /* release kernel access. */ { UnsafeBlock releaser; - flattenMutex.request(); /* wait for current flattento end */ + flattenMutex.request("RexxMemory::getFlattenStack", 0); /* wait for current flattento end */ } } /* create a temporary stack */ @@ -2152,7 +2152,7 @@ /******************************************************************************/ { free((void *)this->flattenStack); /* release the flatten stack */ - this->flattenMutex.release(); /* and release the semaphore */ + this->flattenMutex.release("RexxMemory::returnFlattenStack", 0); /* and release the semaphore */ } RexxObject *RexxMemory::dumpImageStats(void) Modified: sandbox/jlf/trunk/interpreter/runtime/Interpreter.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/runtime/Interpreter.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/runtime/Interpreter.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -58,7 +58,7 @@ // global resource lock -SysMutex Interpreter::resourceLock; +SysMutex Interpreter::resourceLock("Interpreter::resourceLock"); RexxList *Interpreter::interpreterInstances = OREF_NULL; @@ -123,7 +123,7 @@ */ void Interpreter::startInterpreter(InterpreterStartupMode mode) { - ResourceSection lock; + ResourceSection lock("Interpreter::startInterpreter", 0); // has everything been shutdown? if (!isActive()) @@ -187,7 +187,7 @@ bool Interpreter::terminateInterpreter() { { - ResourceSection lock; // lock in this section + ResourceSection lock("Interpreter::terminateInterpreter", 0); // lock in this section // if never even started up, then we've got a quick return if (!isActive()) { @@ -289,7 +289,7 @@ // so this needs to be done carefully and the initialization needs to be protected by // the resource lock during the entire process. { - ResourceSection lock; + ResourceSection lock("Interpreter::createInterpreterInstance", 0); // if our instances list has not been created yet, then the memory subsystem has not // been created yet. Keep the lock during the entire process. if (interpreterInstances == OREF_NULL) @@ -306,7 +306,7 @@ InterpreterInstance *instance = new InterpreterInstance(); { - ResourceSection lock; + ResourceSection lock("Interpreter::createInterpreterInstance", 0); // add this to the active list interpreterInstances->append((RexxObject *)instance); @@ -330,7 +330,7 @@ { // instance has already shut itself down....we need to remove it from // the active list. - ResourceSection lock; + ResourceSection lock("Interpreter::terminateInterpreterInstance", 0); interpreterInstances->removeItem((RexxObject *)instance); return true; @@ -342,7 +342,7 @@ */ bool Interpreter::haltAllActivities() { - ResourceSection lock; + ResourceSection lock("Interpreter::haltAllActivities", 0); bool result = true; for (size_t listIndex = interpreterInstances->firstIndex() ; Modified: sandbox/jlf/trunk/interpreter/runtime/Interpreter.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/runtime/Interpreter.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/runtime/Interpreter.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -73,8 +73,8 @@ static void processStartup(); static void processShutdown(); - static inline void getResourceLock() { resourceLock.request(); } - static inline void releaseResourceLock() { resourceLock.release(); } + static inline void getResourceLock(const char *ds, int di) { resourceLock.request(ds, di); } + static inline void releaseResourceLock(const char *ds, int di) { resourceLock.release(ds, di); } static inline void createLocks() { resourceLock.create(); @@ -154,9 +154,9 @@ class ResourceSection { public: - inline ResourceSection() + inline ResourceSection(const char *ds, int di) : dbgds(ds), dbgdi(di) { - Interpreter::getResourceLock(); + Interpreter::getResourceLock(dbgds, dbgdi); terminated = false; } @@ -164,7 +164,7 @@ { if (!terminated) { - Interpreter::releaseResourceLock(); + Interpreter::releaseResourceLock(dbgds, dbgdi); } } @@ -172,7 +172,7 @@ { if (!terminated) { - Interpreter::releaseResourceLock(); + Interpreter::releaseResourceLock(dbgds, dbgdi); terminated = true; } } @@ -182,7 +182,7 @@ { if (terminated) { - Interpreter::getResourceLock(); + Interpreter::getResourceLock(dbgds, dbgdi); terminated = false; } } @@ -190,6 +190,8 @@ private: bool terminated; // we can release these as needed + const char *dbgds; + int dbgdi; }; Modified: sandbox/jlf/trunk/interpreter/runtime/InterpreterInstance.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/runtime/InterpreterInstance.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/runtime/InterpreterInstance.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -64,6 +64,7 @@ } InterpreterInstance::InterpreterInstance() +: terminationSem("InterpreterInstance::terminationSem") { // this needs to be created and set terminationSem.create(); @@ -210,7 +211,7 @@ // 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; + ResourceSection lock("InterpreterInstance::attachThread", 0); // add this to the activity lists allActivities->append((RexxObject *)activity); // associate the thread with this instance @@ -248,7 +249,7 @@ // this activity owned the kernel semaphore before entering here...release it // now. activity->releaseAccess(); - ResourceSection lock; + ResourceSection lock("InterpreterInstance::detachThread", 0); allActivities->removeItem((RexxObject *)activity); // have the activity manager remove this from the global tables @@ -291,7 +292,7 @@ // associate the thread with this instance activity->addToInstance(this); // add this to the activities list - ResourceSection lock; + ResourceSection lock("InterpreterInstance::spawnActivity", 0); allActivities->append((RexxObject *)activity); return activity; @@ -310,7 +311,7 @@ */ bool InterpreterInstance::poolActivity(RexxActivity *activity) { - ResourceSection lock; + ResourceSection lock("InterpreterInstance::poolActivity", 0); // detach from this instance activity->detachInstance(); // remove from the activities lists for the instance @@ -344,7 +345,7 @@ RexxActivity *InterpreterInstance::findActivity(thread_id_t threadId) { // this is a critical section - ResourceSection lock; + ResourceSection lock("InterpreterInstance::findActivity", 0); // 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. @@ -386,7 +387,7 @@ { RexxActivity *activity; { - ResourceSection lock; // lock the outer control block access + ResourceSection lock("InterpreterInstance::enterOnCurrentThread", 0); // lock the outer control block access // attach this thread to the current activity activity = attachThread(); // this will also get us the kernel lock, and take care of nesting @@ -460,7 +461,7 @@ { - ResourceSection lock; + ResourceSection lock("InterpreterInstance::terminate", 0); // remove the current activity from the list so we don't clean everything // up. We need to allActivities->removeItem((RexxObject *)current); @@ -476,7 +477,7 @@ // they all finish if (!terminated) { - terminationSem.wait(); + terminationSem.wait("InterpreterInstance::terminate", 0); } // if everything has terminated, then make sure we run the uninits before shutting down. @@ -540,7 +541,7 @@ { // make sure we lock this, since it is possible the table can get updated // as a result of setting these flags - ResourceSection lock; + ResourceSection lock("InterpreterInstance::haltAllActivities", 0); bool result = true; for (size_t listIndex = allActivities->firstIndex() ; listIndex != LIST_END; @@ -566,7 +567,7 @@ { // make sure we lock this, since it is possible the table can get updated // as a result of setting these flags - ResourceSection lock; + ResourceSection lock("InterpreterInstance::traceAllActivities", 0); for (size_t listIndex = allActivities->firstIndex() ; listIndex != LIST_END; listIndex = allActivities->nextIndex(listIndex) ) Modified: sandbox/jlf/trunk/interpreter/runtime/InterpreterInstance.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/runtime/InterpreterInstance.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/interpreter/runtime/InterpreterInstance.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -60,7 +60,7 @@ public: // methods associated with actual interpreter instances - inline InterpreterInstance(RESTORETYPE restoreType) { ; } + inline InterpreterInstance(RESTORETYPE restoreType) : terminationSem("InterpreterInstance::terminationSem") { ; } InterpreterInstance(); inline void *operator new(size_t, void *ptr) {return ptr;} Modified: sandbox/jlf/trunk/rexxapi/client/LocalAPIManager.cpp =================================================================== --- sandbox/jlf/trunk/rexxapi/client/LocalAPIManager.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/rexxapi/client/LocalAPIManager.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -44,7 +44,7 @@ // initialize static variables LocalAPIManager* LocalAPIManager::singleInstance = NULL; -SysMutex LocalAPIManager::messageLock(true); +SysMutex LocalAPIManager::messageLock("LocalAPIManager::messageLock", true); /** * Get the singleton instance of the local API manager. @@ -53,7 +53,7 @@ */ LocalAPIManager *LocalAPIManager::getInstance() { - Lock lock(messageLock); // make sure we single thread this + Lock lock(messageLock, "LocalAPIManager::getInstance", 0); // make sure we single thread this if (singleInstance == NULL) { // create an intialize this. If this fails, an exception is thrown @@ -70,7 +70,7 @@ */ void LocalAPIManager::deleteInstance() { - Lock lock(messageLock); // make sure we single thread this + Lock lock(messageLock, "LocalAPIManager::deleteInstance", 0); // make sure we single thread this if (singleInstance != NULL) { // clean up all local resources @@ -228,7 +228,7 @@ SysClientStream *LocalAPIManager::getConnection() { { - Lock lock(messageLock); // make sure we single thread this + Lock lock(messageLock, "LocalAPIManager::getConnection", 0); // make sure we single thread this // if we have an active connection, grab it from the cache and // reuse it. if (!connections.empty()) @@ -265,7 +265,7 @@ } { - Lock lock(messageLock); // make sure we single thread this + Lock lock(messageLock, "LocalAPIManager::returnConnection", 0); // make sure we single thread this if (connections.size() < MAX_CONNECTIONS) { connections.push_back(connection); Modified: sandbox/jlf/trunk/rexxapi/server/APIServer.cpp =================================================================== --- sandbox/jlf/trunk/rexxapi/server/APIServer.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/rexxapi/server/APIServer.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -345,7 +345,7 @@ */ void APIServer::requestLock() { - lock.request(); + lock.request("APIServer::requestLock", 0); } @@ -354,5 +354,5 @@ */ void APIServer::releaseLock() { - lock.release(); + lock.release("APIServer::releaseLock", 0); } Modified: sandbox/jlf/trunk/rexxapi/server/APIServer.hpp =================================================================== --- sandbox/jlf/trunk/rexxapi/server/APIServer.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/rexxapi/server/APIServer.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -52,7 +52,7 @@ class APIServer { public: - APIServer() : lock(), server(), serverActive(false), instances(NULL), terminatedThreads() { } + APIServer() : lock("APIServer::lock"), server(), serverActive(false), instances(NULL), terminatedThreads() { } virtual ~APIServer() { ; } void terminateServer(); void initServer(); Modified: sandbox/jlf/trunk/rexxapi/server/MacroSpaceManager.hpp =================================================================== --- sandbox/jlf/trunk/rexxapi/server/MacroSpaceManager.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/rexxapi/server/MacroSpaceManager.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -157,7 +157,7 @@ }; - ServerMacroSpaceManager() : lock(), macros() { lock.create(); } + ServerMacroSpaceManager() : lock("ServerMacroSpaceManager::lock"), macros() { lock.create(); } void terminateServer(); void addMacro(ServiceMessage &message); Modified: sandbox/jlf/trunk/rexxapi/server/QueueManager.cpp =================================================================== --- sandbox/jlf/trunk/rexxapi/server/QueueManager.cpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/rexxapi/server/QueueManager.cpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -193,7 +193,7 @@ */ bool DataQueue::pullData(ServerQueueManager *manager, ServiceMessage &message) { - Lock managerLock(manager->lock); // this needs synchronization here + Lock managerLock(manager->lock, "DataQueue::pullData", 0); // this needs synchronization here // now that we have the lock, clear the wait sem unconditionally. // this should be safe, as it is either already clear, and has waiters camped @@ -251,7 +251,7 @@ else { { - Lock managerLock(manager->lock); + Lock managerLock(manager->lock, "DataQueue::pull#1", 0); // indicate we have another waiting queue addWaiter(); } @@ -265,7 +265,7 @@ if (pullData(manager, message)) { { - Lock managerLock(manager->lock); + Lock managerLock(manager->lock, "DataQueue::pull#2", 0); // remove us as a waiter removeWaiter(); } @@ -409,7 +409,7 @@ previous = current; // remember this block current = current->next; // to the next block } - current = new DataQueue(id); // create a new session queue + current = new DataQueue(id, "QueueTable::remove", 0); // create a new session queue add(current); // and add it to the table. return current; } @@ -508,7 +508,7 @@ if (queue == NULL) { // this is easy, just create a new queue and add it to the table - queue = new DataQueue(session); + queue = new DataQueue(session, "ServerQueueManager::getSessionQueue", 0); sessionQueues.add(queue); } return queue; @@ -525,7 +525,7 @@ if (queue == NULL) { // this is easy, just create a new queue and add it to the table - queue = new DataQueue(session); + queue = new DataQueue(session, "ServerQueueManager::createSessionQueue", 0); sessionQueues.add(queue); } // name collision...we need to update @@ -557,7 +557,7 @@ */ void ServerQueueManager::createUniqueQueue(ServiceMessage &message) { - DataQueue *queue = new DataQueue(); // get an anonymous queue + DataQueue *queue = new DataQueue("ServerQueueManager::createUniqueQueue", 0); // get an anonymous queue // the queue pointer makes a good starting point for an anonymous tag uintptr_t tag = (uintptr_t)queue; for (;;) // we need to loop until we get a unique one. @@ -607,7 +607,7 @@ if (queue == NULL) { // this is easy, just create a new queue and add it to the table - queue = new DataQueue(message.nameArg); + queue = new DataQueue(message.nameArg, "ServerQueueManager::createNamedQueue", 0); namedQueues.add(queue); message.setResult(QUEUE_CREATED); return; @@ -634,7 +634,7 @@ if (queue == NULL) { // this is easy, just create a new queue and add it to the table - queue = new DataQueue(message.nameArg); + queue = new DataQueue(message.nameArg, "ServerQueueManager::openNamedQueue", 0); namedQueues.add(queue); message.setResult(QUEUE_CREATED); } @@ -845,7 +845,7 @@ pullFromSessionQueue(message); } else { - Lock managerLock(lock); // we need to synchronize on this instance + Lock managerLock(lock, "ServerQueueManager::dispatch", 0); // we need to synchronize on this instance switch (message.operation) { case NEST_SESSION_QUEUE: Modified: sandbox/jlf/trunk/rexxapi/server/QueueManager.hpp =================================================================== --- sandbox/jlf/trunk/rexxapi/server/QueueManager.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/rexxapi/server/QueueManager.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -91,18 +91,18 @@ { friend class QueueTable; public: - DataQueue() + DataQueue(const char *ds, int di) : waitSem("DataQueue::waitSem"), dbgds(ds), dbgdi(di) { init(); // do common initilization } - DataQueue(SessionID s) + DataQueue(SessionID s, const char *ds, int di) : waitSem("DataQueue::waitSem"), dbgds(ds), dbgdi(di) { init(); // do common initilization session = s; } - DataQueue(const char *name) + DataQueue(const char *name, const char *ds, int di) : waitSem("DataQueue::waitSem"), dbgds(ds), dbgdi(di) { init(); // do common initilization setName(name); @@ -143,7 +143,7 @@ inline void waitForData() { - waitSem.wait(); + waitSem.wait(dbgds, dbgdi); } inline bool hasWaiters() @@ -184,6 +184,8 @@ QueueItem *lastItem; // last queue item const char *queueName; // pointer to queue name SessionID session; // session of queue + const char *dbgds; + int dbgdi; }; // a table of queues @@ -247,7 +249,7 @@ { friend class DataQueue; // needs access to the instance lock public: - ServerQueueManager() : namedQueues(), sessionQueues(), lock() { lock.create(); } + ServerQueueManager() : namedQueues(), sessionQueues(), lock("ServerQueueManager::lock") { lock.create(); } void terminateServer(); void addToSessionQueue(ServiceMessage &message); Modified: sandbox/jlf/trunk/rexxapi/server/RegistrationManager.hpp =================================================================== --- sandbox/jlf/trunk/rexxapi/server/RegistrationManager.hpp 2010-04-24 20:44:49 UTC (rev 5814) +++ sandbox/jlf/trunk/rexxapi/server/RegistrationManager.hpp 2010-04-24 21:33:53 UTC (rev 5815) @@ -137,7 +137,7 @@ class ServerRegistrationManager { public: - ServerRegistrationManager() : functions(), exits(), commandHandlers(), lock() { lock.create(); } + ServerRegistrationManager() : functions(), exits(), commandHandlers(), lock("ServerRegistrationManager::lock") { lock.create(); } void terminateServer(); // It will remove all the registration entries for a specific process void freeProcessRegistrations(SessionID session); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-04-24 22:08:23
|
Revision: 5816 http://oorexx.svn.sourceforge.net/oorexx/?rev=5816&view=rev Author: jfaucher Date: 2010-04-24 22:08:17 +0000 (Sat, 24 Apr 2010) Log Message: ----------- Unlock the "define" method to let it work on predefined classes. Allow behavior's update of objects instantiated before the "define" execution. See samples/functional for an example of use (functionality similar to C# extension methods) Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/interpreter/classes/ClassClass.cpp Added Paths: ----------- sandbox/jlf/samples/ sandbox/jlf/samples/functional/ sandbox/jlf/samples/functional/functional-test.rex sandbox/jlf/samples/functional/functional-v1.rex sandbox/jlf/samples/functional/functional-v2.rex Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-04-24 21:33:53 UTC (rev 5815) +++ sandbox/jlf/_diary.txt 2010-04-24 22:08:17 UTC (rev 5816) @@ -4,6 +4,7 @@ --> added some OutputDebugString (Windows only), now must analyze... Allow extension of the predefined ooRexx classes to get something similar to C# extension methods (but more powerful). +--> done by unlocking the define method : see samples/functional for an example of use. Add the "in" keyword to the DO repetitor : Similar to "over" but calls the method "supplier" instead of "makearray". See if a thread could return more than one result and become a generator when synchronized with : do i in generator ... Added: sandbox/jlf/samples/functional/functional-test.rex =================================================================== --- sandbox/jlf/samples/functional/functional-test.rex (rev 0) +++ sandbox/jlf/samples/functional/functional-test.rex 2010-04-24 22:08:17 UTC (rev 5816) @@ -0,0 +1,141 @@ +/* +This script needs a modified ooRexx interpreter which allows to extend predefined ooRexx classes. +Something similar to C# extension methods : +http://msdn.microsoft.com/en-us/library/bb383977.aspx +http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx +*/ + +.Object~define("dump", .methods~ObjectDump) +.Collection~define("dump", .methods~CollectionDump) + +say "-----------------------------------------------------------------" +say "-- Message sending" +say "-----------------------------------------------------------------" + +-- When the source contains a single word, it's a message name +.Array~of(1,2,3,4)~reduce("+")~dump -- sum = 10 +.Array~of(1,2,3,4)~reduce("*")~dump -- product = 24 + +.List~of(1,2,3,4)~reduce("+")~dump -- sum = 10 +.List~of(1,2,3,4)~reduce("*")~dump -- product = 24 + +.Queue~of(1,2,3,4)~reduce("+")~dump -- sum = 10 +.Queue~of(1,2,3,4)~reduce("*")~dump -- product = 24 + +.CircularQueue~of(1,2,3,4)~reduce("+")~dump -- sum = 10 +.CircularQueue~of(1,2,3,4)~reduce("*")~dump -- product = 24 + +123~reduce("min")~dump -- min digit = 1 +123~reduce("max")~dump -- max digit = 3 + +.Array~of(1,2,3,4)~map("-")~dump -- an Array : -1, -2, -3, -4 +.List~of(1,2,3,4)~map("-")~dump -- a List : -1, -2, -3, -4 +.Queue~of(1,2,3,4)~map("-")~dump -- a Queue : -1, -2, -3, -4 +.CircularQueue~of(1,2,3,4)~map("-")~dump -- -1,-2,-3,-4 : -1, -2, -3, -4 (strange : The dump of a circular queue does not show its class, it shows its contents...) + +-- In place mapping +numbers = .Array~of(-1,2,-3,4) +numbers~dump -- an Array : -1, 2, -3, 4 +numbers~map("sign", .true)~dump -- an Array : -1, 1, -1, 1 +numbers~dump -- an Array : -1, 1, -1, 1 + + +say "-----------------------------------------------------------------" +say "-- Routine calling" +say "-----------------------------------------------------------------" + +-- A source with more than one word is a routine source by default +.Array~of(1,2,3,4)~map("return arg(1) * 2")~dump -- an Array : 2, 4, 6, 8 +.Array~of(1,2,3,4)~map("use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- an Array : 1, 2, 6, 24 + +.List~of(1,2,3,4)~map("return arg(1) * 2")~dump -- a List : 2, 4, 6, 8 +.List~of(1,2,3,4)~map("use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- a List : 1, 2, 6, 24 + +.Queue~of(1,2,3,4)~map("return arg(1) * 2")~dump -- a Queue : 2, 4, 6, 8 +.Queue~of(1,2,3,4)~map("use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- a Queue : 1, 2, 6, 24 + +.CircularQueue~of(1,2,3,4)~map("return arg(1) * 2")~dump -- 2,4,6,8 : 2, 4, 6, 8 (strange : the class is not displayed) +.CircularQueue~of(1,2,3,4)~map("use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- 1,2,6,24 : 1, 2, 6, 24 + +-- A source can be tagged explicitely as a routine (but you don't need that, because it's the default) +.Array~of(1,2,3,4)~map("::routine return arg(1) * 2")~dump -- an Array : 2, 4, 6, 8 +.Array~of(1,2,3,4)~map("::routine use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- an Array : 1, 2, 6, 24 + +-- A routine object can be used directly +.Array~of(1,2,3,4)~map(.context~package~findRoutine("factorial"))~dump -- an Array : 1, 2, 6, 24 + + +say "-----------------------------------------------------------------" +say "-- Method running" +say "-----------------------------------------------------------------" + +colors = .Array~of( , + .Color~new("black", "000000") ,, + .Color~new("blue", "0000FF") ,, + .Color~new("green", "008000") ,, + .Color~new("grey", "BEBEBE") , + ) + +-- A source can be tagged explicitely as a method (you need that, because it's a routine by default) +colors~map('::method return self~rgbInteger "("self~redIntensity", "self~greenIntensity", "self~blueIntensity")"')~dump -- an Array : 0 (0, 0, 0), 255 (0, 0, 255), 32768 (0, 128, 0), 12500670 (190, 190, 190) + +-- A method object can be used directly +-- No need to define the method on the receiver class +colors~map(.methods~entry("decimalColor"))~dump -- an Array : 0 (0, 0, 0), 255 (0, 0, 255), 32768 (0, 128, 0), 12500670 (190, 190, 190) + + +----------------------------------------------------------------- +-- Definitions +----------------------------------------------------------------- + +::method ObjectDump + use strict arg stream = .stdout + stream~lineout(self) + +::method CollectionDump + use strict arg stream = .stdout + stream~charout(self ": ") + previous = .false + do e over self + if previous then stream~charout(", ") + stream~charout(e) + previous = .true + end + stream~lineout("") + + +::routine factorial + use strict arg n + if n == 0 then return 1 + return n * factorial(n - 1) + + +::method factorial + if self == 0 then return 1 + return self * (self - 1)~factorial + + +::method decimalColor + return self~rgbInteger "("self~redIntensity", "self~greenIntensity", "self~blueIntensity")" + + +::class Color +::attribute name +::attribute rgb +::attribute rgbInteger private +::method init + use strict arg name, rgb + self~name = name + self~rgb = rgb + self~rgbInteger = rgb~x2d +::method redIntensity + return self~rgb~substr(1,2)~x2d +::method greenIntensity + return self~rgb~substr(3,2)~x2d +::method blueIntensity + return self~rgb~substr(5,2)~x2d + + +--::requires "functional-v1.rex" +::requires "functional-v2.rex" + Added: sandbox/jlf/samples/functional/functional-v1.rex =================================================================== --- sandbox/jlf/samples/functional/functional-v1.rex (rev 0) +++ sandbox/jlf/samples/functional/functional-v1.rex 2010-04-24 22:08:17 UTC (rev 5816) @@ -0,0 +1,125 @@ +/* +This script needs a modified ooRexx interpreter which allows to extend predefined ooRexx classes. +Something similar to C# extension methods : +http://msdn.microsoft.com/en-us/library/bb383977.aspx +http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx + +Initial version v1 : +Use an intermediate class for Routine and Method : RoutineCaller and MethodRunner +See version v2 where Routine and Method are directly doers : RoutineCaller and MethodRunner no longer needed +*/ + + +----------------------------------------------------------------------------- +-- Extends the behavior of predefined classes + +-- A Doer is an object who knows how to execute itself (understands "do") +-- These methods returns a Doer object. +.Routine~define("doer", "return .RoutineCaller~new(self)") +.Method~define("doer", "return .MethodRunner~new(self)") +.String~define("doer", .methods~StringDoer) + +-- Higher-order action "reduce" +.String~define("reduce", .methods~StringReduce) +.Collection~define("reduce", .methods~CollectionReduce) + +-- Higher-order action "map" +-- Can be defined on any collection which supports "first" and "next" +.Array~define("map", .methods~Map) +.List~define("map", .methods~Map) +.Queue~define("map", .methods~Map) +.CircularQueue~define("map", .methods~Map) + + +----------------------------------------------------------------------------- +-- Doer factories + +::method StringDoer + parse var self word1 rest + -- When the source string contains a single word, it's a message name + if rest == "" then return .MessageNameSender~new(self) + if word1~caselessEquals("::method") then do + method = .Method~new("", rest) + return .MethodRunner~new(method) + end + if word1~caselessEquals("::routine") then do + routine = .Routine~new("", rest) + return .RoutineCaller~new(routine) + end + -- Routine by default + routine = .Routine~new("", self) + return .RoutineCaller~new(routine) + + +----------------------------------------------------------------------------- +-- Higher-order actions + +::method CollectionReduce + use strict arg action + doer = action~doer -- parse only once, before iteration + supplier = self~supplier + if \ supplier~available then return .nil + r = supplier~item + supplier~next + do while supplier~available + r = doer~do(r, supplier~item) + supplier~next + end + return r + + +::method StringReduce + use strict arg action + return self~makearray("")~reduce(action) + + +-- Will work with Array, List, Queue, CircularQueue (any collection which supports "first" and "next") +-- I don't use a supplier because it works on a snapshot of the collection and is not done for updating the collection +-- (when inplace == .true the collection is updated in place) +::method Map + use strict arg action, inplace=.false + doer = action~doer -- parse only once, before iteration + r = self + if \inplace then r = self~copy + current = self~first + do while current <> .nil + r[current] = doer~do(self[current]) + current = self~next(current) + end + return r + + +----------------------------------------------------------------------------- +-- Doer classes + +-- Doer for calling a routine +::class RoutineCaller +::attribute routine +::method init + use strict arg routine + self~routine = routine +::method do + return self~routine~callWith(arg(1,"a")) + + +-- Doer for running a method +::class MethodRunner +::attribute method +::method init + use strict arg method + self~method = method +::method do + use strict arg object, ... + return object~run(self~method, "a", arg(2,"a")) + + +-- Doer for sending a message name +::class MessageNameSender +::attribute messageName +::method init + use strict arg messageName + self~messageName = messageName +::method do + use strict arg object, ... + return object~sendWith(self~messageName, arg(2,"a")) + Added: sandbox/jlf/samples/functional/functional-v2.rex =================================================================== --- sandbox/jlf/samples/functional/functional-v2.rex (rev 0) +++ sandbox/jlf/samples/functional/functional-v2.rex 2010-04-24 22:08:17 UTC (rev 5816) @@ -0,0 +1,100 @@ +/* +This script needs a modified ooRexx interpreter which allows to extend predefined ooRexx classes. +Something similar to C# extension methods : +http://msdn.microsoft.com/en-us/library/bb383977.aspx +http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx + +Second version v2 : +Routine and Method are directly doers : RoutineCaller and MethodRunner no longer needed +*/ + + +----------------------------------------------------------------------------- +-- Extends the behavior of predefined classes + +-- A Doer is an object who knows how to execute itself (understands "do") +.Routine~define("do", 'return self~callWith(arg(1,"a"))') +.Method~define("do", 'use strict arg object, ... ; return object~run(self, "a", arg(2,"a"))') +-- Note : a Message can't be a Doer directly, must use an intermediate class MessageNameSender + +-- These methods returns a Doer object. +.Routine~define("doer", "return self") +.Method~define("doer", "return self") +.String~define("doer", .methods~StringDoer) + +-- Higher-order action "reduce" +.String~define("reduce", .methods~StringReduce) +.Collection~define("reduce", .methods~CollectionReduce) + +-- Higher-order action "map" +-- Can be defined on any collection which supports "first" and "next" +.Array~define("map", .methods~Map) +.List~define("map", .methods~Map) +.Queue~define("map", .methods~Map) +.CircularQueue~define("map", .methods~Map) + + +----------------------------------------------------------------------------- +-- Doer factories + +::method StringDoer + parse var self word1 rest + -- When the source string contains a single word, it's a message name + if rest == "" then return .MessageNameSender~new(self) + if word1~caselessEquals("::method") then return .Method~new("", rest) + if word1~caselessEquals("::routine") then return .Routine~new("", rest) + -- Routine by default + return .Routine~new("", self) + + +----------------------------------------------------------------------------- +-- Higher-order actions + +::method CollectionReduce + use strict arg action + doer = action~doer -- parse only once, before iteration + supplier = self~supplier + if \ supplier~available then return .nil + r = supplier~item + supplier~next + do while supplier~available + r = doer~do(r, supplier~item) + supplier~next + end + return r + + +::method StringReduce + use strict arg action + return self~makearray("")~reduce(action) + + +-- Will work with Array, List, Queue, CircularQueue (any collection which supports "first" and "next") +-- I don't use a supplier because it works on a snapshot of the collection and is not done for updating the collection +-- (when inplace == .true the collection is updated in place) +::method Map + use strict arg action, inplace=.false + doer = action~doer -- parse only once, before iteration + r = self + if \inplace then r = self~copy + current = self~first + do while current <> .nil + r[current] = doer~do(self[current]) + current = self~next(current) + end + return r + + +----------------------------------------------------------------------------- +-- Doer classes + +-- Doer for sending a message name +::class MessageNameSender +::attribute messageName +::method init + use strict arg messageName + self~messageName = messageName +::method do + use strict arg object, ... + return object~sendWith(self~messageName, arg(2,"a")) + Modified: sandbox/jlf/trunk/interpreter/classes/ClassClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/ClassClass.cpp 2010-04-24 21:33:53 UTC (rev 5815) +++ sandbox/jlf/trunk/interpreter/classes/ClassClass.cpp 2010-04-24 22:08:17 UTC (rev 5816) @@ -622,12 +622,14 @@ /* Function: Define an instance method on this class object */ /*****************************************************************************/ { +#if 0 /* check if this is a rexx class */ if ( this->isRexxDefined()) { /* report as a nomethod condition */ reportNomethod(lastMessageName(), this); } +#endif /* make sure there is at least one */ /* parameter */ method_name = stringArgument(method_name, ARG_ONE)->upper(); @@ -663,7 +665,7 @@ /* make a copy of the instance */ /* behaviour so any previous objects */ /* aren't enhanced */ - OrefSet(this, this->instanceBehaviour, (RexxBehaviour *)this->instanceBehaviour->copy()); + //JLF OrefSet(this, this->instanceBehaviour, (RexxBehaviour *)this->instanceBehaviour->copy()); /* add method to the instance mdict */ this->instanceMethodDictionary->stringPut((RexxObject *)method_object, method_name); /* any subclasses that we have need */ @@ -767,7 +769,7 @@ /* make a copy of the instance */ /* behaviour so any previous objects */ /* aren't enhanced */ - OrefSet(this, this->instanceBehaviour, (RexxBehaviour *)this->instanceBehaviour->copy()); + //JLF OrefSet(this, this->instanceBehaviour, (RexxBehaviour *)this->instanceBehaviour->copy()); /* if there is a method to remove */ /* from the instance mdict */ /* remove it */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-04-25 16:17:01
|
Revision: 5819 http://oorexx.svn.sourceforge.net/oorexx/?rev=5819&view=rev Author: jfaucher Date: 2010-04-25 16:16:54 +0000 (Sun, 25 Apr 2010) Log Message: ----------- Unlock the "inherit" method to let it work on predefined classes. Add the ::extension directive. See samples/extension for an example of use (functional rewritten without ~define) Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/Makefile.am sandbox/jlf/trunk/interpreter/behaviour/ClassTypeCodes.h sandbox/jlf/trunk/interpreter/behaviour/PrimitiveBehaviourNames.h sandbox/jlf/trunk/interpreter/behaviour/PrimitiveBehaviours.cpp sandbox/jlf/trunk/interpreter/behaviour/PrimitiveClasses.xml sandbox/jlf/trunk/interpreter/behaviour/VirtualFunctionTable.cpp sandbox/jlf/trunk/interpreter/classes/ClassClass.cpp sandbox/jlf/trunk/interpreter/interpreter.mak sandbox/jlf/trunk/interpreter/parser/KeywordConstants.cpp sandbox/jlf/trunk/interpreter/parser/SourceFile.cpp sandbox/jlf/trunk/interpreter/parser/SourceFile.hpp sandbox/jlf/trunk/interpreter/parser/Token.hpp sandbox/jlf/trunk/interpreter/runtime/RexxConstants.hpp Added Paths: ----------- sandbox/jlf/samples/extension/ sandbox/jlf/samples/extension/extension.rex sandbox/jlf/samples/extension/functional-test.rex sandbox/jlf/samples/extension/functional.rex sandbox/jlf/samples/extension/test_extension_order.rex sandbox/jlf/samples/extension/test_extension_order1.rex sandbox/jlf/samples/extension/test_extension_order2.rex sandbox/jlf/samples/extension/test_extension_order3.rex sandbox/jlf/trunk/interpreter/instructions/ExtensionDirective.cpp sandbox/jlf/trunk/interpreter/instructions/ExtensionDirective.hpp Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/_diary.txt 2010-04-25 16:16:54 UTC (rev 5819) @@ -4,7 +4,11 @@ --> added some OutputDebugString (Windows only), now must analyze... Allow extension of the predefined ooRexx classes to get something similar to C# extension methods (but more powerful). ---> done by unlocking the define method : see samples/functional for an example of use. +--> unlock the define method : see samples/functional for an example of use. + unlock the inherit method + added ::extension directive + >>-::EXTENSION--classname----+-------------------+----------------->< + +-INHERIT--iclasses-+ Add the "in" keyword to the DO repetitor : Similar to "over" but calls the method "supplier" instead of "makearray". See if a thread could return more than one result and become a generator when synchronized with : do i in generator ... @@ -24,8 +28,39 @@ =============================================================================== +2010 april 25 + +Add ::extension directive +todo : Limit the extension to new methods, raise an error if redefining a predefined method +(but keep ~define unlocked for investigation). + +todo : I don't manage dependencies on ExtensionDirective +See RexxSource::resolveDependencies, there is maybe something to do there. +Currently, if the same method is extended several times, then it's the "last" extension who wins... +The definition of "last" depends on the order of resolution of ::requires +See samples\extension\test_extension_order.rex + +Remember : +Unlike ::class, you can have several ::extension in the same source for the same class. +So the current check for duplicate method in an ExtensionDirective is not very useful. +The interpreter will complain for that : +::extension object +::method m +::method m +but not for that : +::extension object +::method m +::extension object +::method m + + +=============================================================================== 2010 april 24 +Unlock ~define + + +Creation of sandbox : cd D:\local\Rexx\ooRexx\svn\sandbox mkdir jlf svn add jlf Added: sandbox/jlf/samples/extension/extension.rex =================================================================== --- sandbox/jlf/samples/extension/extension.rex (rev 0) +++ sandbox/jlf/samples/extension/extension.rex 2010-04-25 16:16:54 UTC (rev 5819) @@ -0,0 +1,116 @@ +/* +This script needs a modified ooRexx interpreter which supports the ::EXTENSION directive +>>-::EXTENSION--classname----+-------------------+----------------->< + +-INHERIT--iclasses-+ + +The idea here is to let add new methods on any class (including predefined classes), but not +let override a method of a predefined class. +Not possible to remove a method with ::extension. +*/ + +say .Object~new -- todo ::extension shouldn't allow to redefine a predefined method + +.Class~define("do_floating", .methods~do_floating) +.Object~define("do_floating", .methods~do_floating) + +--.Object~do_floating +--.Class~do_floating + +.String~userprop_class = 1 +.String~do_class -- runs Object::do_class +--.String~do_instance +--.String~do_floating + +.String~new("test")~userprop_instance = 1 +.String~new("test")~do_instance -- runs Object::do_instance +.String~new("test")~do_floating -- runs ::do_floating + +"test"~userprop_instance = 1 +"test"~do_instance -- runs Object::do_instance +"test"~do_floating -- runs ::do_floating + +.Array~userprop_class = 1 +.Array~do_class -- runs Mixin1::do_class +-- .Array~do_instance +-- .Array~do_floating + +.array~of(1,2)~userprop_instance = 1 +.array~of(1,2)~do_instance -- runs Mixin2::do_instance +.array~of(1,2)~do_floating -- runs ::do_floating + +.C1~new~userprop_instance = 1 +.C1~new~do_instance -- currently, you can redefine several times a method. The 'last' redefinition wins +.C1~new~do_instance_extension -- runs C1::do_instance_extension + +.C2~new~userprop_instance = 1 +.C2~new~do_instance -- runs C2::do_instance +.C2~new~do_instance_extension -- runs C1::do_instance_extension + + +----------------------------------------------------------------------------- +::method do_floating + say "runs ::do_floating" + + +----------------------------------------------------------------------------- +-- No error here, despite the fact that the class is defined after +-- It's because the class is searched when the ExtensionDirective is installed (so after the whole parsing of the source) +::extension nonexistent +::method m + +::class nonexistent + +----------------------------------------------------------------------------- +::extension Class +::attribute userprop_class class +::attribute userprop_instance +::method do_class class + say "runs Class::do_class" +::method do_instance + say "runs Class::do_instance" + + +----------------------------------------------------------------------------- +::extension Object +::attribute userprop_class class +::attribute userprop_instance +::method do_class class + say "runs Object::do_class" +::method do_instance + say "runs Object::do_instance" +::method objectName + return "todo ::extension shouldn't allow to redefine a predefined method" + +----------------------------------------------------------------------------- +::class C1 +::method do_instance + say "runs C1::do_instance" + + +----------------------------------------------------------------------------- +::class Mixin1 mixinclass Object +::method do_class class + say "runs Mixin1::do_class" + +::class Mixin2 mixinclass Object +::method do_instance + say "runs Mixin2::do_instance" + + +----------------------------------------------------------------------------- +::extension Array inherit Mixin1 Mixin2 + + +----------------------------------------------------------------------------- +::class C2 subclass C1 +::method do_instance + say "runs C2::do_instance" + + +----------------------------------------------------------------------------- +::extension C1 +::method do_instance_extension + say "runs C1::do_instance_extension" +::method do_instance + say "currently, you can redefine several times a method. The 'last' redefinition wins" + Added: sandbox/jlf/samples/extension/functional-test.rex =================================================================== --- sandbox/jlf/samples/extension/functional-test.rex (rev 0) +++ sandbox/jlf/samples/extension/functional-test.rex 2010-04-25 16:16:54 UTC (rev 5819) @@ -0,0 +1,183 @@ +/* +This script needs a modified ooRexx interpreter which allows to extend predefined ooRexx classes. +Something similar to C# extension methods : +http://msdn.microsoft.com/en-us/library/bb383977.aspx +http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx + +Here, the extensions are declared with ::extension instead of ~define (see ..\functional for ~define) +*/ + +say "-----------------------------------------------------------------" +say "-- Message sending" +say "-----------------------------------------------------------------" + +-- When the source contains a single word, it's a message name +.Array~of(1,2,3,4)~reduce("+")~dump -- sum = 10 +.Array~of(1,2,3,4)~reduce("*")~dump -- product = 24 + +.List~of(1,2,3,4)~reduce("+")~dump -- sum = 10 +.List~of(1,2,3,4)~reduce("*")~dump -- product = 24 + +.Queue~of(1,2,3,4)~reduce("+")~dump -- sum = 10 +.Queue~of(1,2,3,4)~reduce("*")~dump -- product = 24 + +.CircularQueue~of(1,2,3,4)~reduce("+")~dump -- sum = 10 +.CircularQueue~of(1,2,3,4)~reduce("*")~dump -- product = 24 + +123~reduce("min")~dump -- min digit = 1 +123~reduce("max")~dump -- max digit = 3 + +.Array~of(1,2,3,4)~map("-")~dump -- an Array : -1, -2, -3, -4 +.List~of(1,2,3,4)~map("-")~dump -- a List : -1, -2, -3, -4 +.Queue~of(1,2,3,4)~map("-")~dump -- a Queue : -1, -2, -3, -4 +.CircularQueue~of(1,2,3,4)~map("-")~dump -- -1,-2,-3,-4 : -1, -2, -3, -4 (strange : The dump of a circular queue does not show its class, it shows its contents...) + +"abcdefghijklmnopqrstuvwxyz"~mapchar("1-")~dump -- `abcdefghijklmnopqrstuvwxy +.MutableBuffer~new("abcdefghijklmnopqrstuvwxyz")~mapchar("1+", .false)~dump -- bcdefghijklmnopqrstuvwxyz{ + +"The quick brown fox jumps over the lazy dog"~mapword("length")~dump -- 3 5 5 3 5 4 3 4 3 +.MutableBuffer~new("The quick brown fox jumps over the lazy dog")~mapword("length", .false)~dump -- 3 5 5 3 5 4 3 4 3 + +-- In place mapping +array = .Array~of(-1,2,-3,4) +array~dump -- an Array : -1, 2, -3, 4 +array~map("sign", .true)~dump -- an Array : -1, 1, -1, 1 +array~dump -- an Array : -1, 1, -1, 1 + +-- In place mapping (this is the default for MutableBuffer) +buffer = .MutableBuffer~new("abcdefghijklmnopqrstuvwxyz") +buffer~dump -- abcdefghijklmnopqrstuvwxyz +buffer~mapChar("1+")~dump -- bcdefghijklmnopqrstuvwxyz{ +buffer~dump -- bcdefghijklmnopqrstuvwxyz{ + + +say "-----------------------------------------------------------------" +say "-- Routine calling" +say "-----------------------------------------------------------------" + +-- A source with more than one word is a routine source by default +.Array~of(1,2,3,4)~map("return arg(1) * 2")~dump -- an Array : 2, 4, 6, 8 +.Array~of(1,2,3,4)~map("use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- an Array : 1, 2, 6, 24 + +.List~of(1,2,3,4)~map("return arg(1) * 2")~dump -- a List : 2, 4, 6, 8 +.List~of(1,2,3,4)~map("use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- a List : 1, 2, 6, 24 + +.Queue~of(1,2,3,4)~map("return arg(1) * 2")~dump -- a Queue : 2, 4, 6, 8 +.Queue~of(1,2,3,4)~map("use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- a Queue : 1, 2, 6, 24 + +.CircularQueue~of(1,2,3,4)~map("return arg(1) * 2")~dump -- 2,4,6,8 : 2, 4, 6, 8 (strange : the class is not displayed) +.CircularQueue~of(1,2,3,4)~map("use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- 1,2,6,24 : 1, 2, 6, 24 + +"abcdefghijklmnopqrstuvwxyz"~mapchar("return arg(1)~verify('aeiouy')")~dump +.MutableBuffer~new("abcdefghijklmnopqrstuvwxyz")~mapchar("if arg(1)~verify('aeiouy') == 1 then return arg(1) ; else return ''")~dump + +/* todo : doesn't work because the variable translation has no value when evaluating the doer +translation = .Directory~of("quick", "slow", "lazy", "nervous", "brown", "yellow", "dog", "cat") +translation~setMethod("UNKNOWN", "return arg(1)") +"The quick brown fox jumps over the lazy dog"~mapword("return translation~arg(1)",,.context~package)~dump +.MutableBuffer~new("The quick brown fox jumps over the lazy dog")~mapword("return translation[arg(1)]", .false, .context~package)~dump +*/ + +-- A source can be tagged explicitely as a routine (but you don't need that, because it's the default) +.Array~of(1,2,3,4)~map("::routine return arg(1) * 2")~dump -- an Array : 2, 4, 6, 8 +.Array~of(1,2,3,4)~map("::routine use arg n ; if n == 0 then return 1 ; return n * .context~executable~call(n - 1)")~dump -- an Array : 1, 2, 6, 24 + +-- A routine object can be used directly +.Array~of(1,2,3,4)~map(.context~package~findRoutine("factorial"))~dump -- an Array : 1, 2, 6, 24 + + +say "-----------------------------------------------------------------" +say "-- Method running" +say "-----------------------------------------------------------------" + +colors = .Array~of( , + .Color~new("black", "000000") ,, + .Color~new("blue", "0000FF") ,, + .Color~new("green", "008000") ,, + .Color~new("grey", "BEBEBE") , + ) + +-- A source can be tagged explicitely as a method (you need that, because it's a routine by default) +colors~map('::method return self~rgbInteger "("self~redIntensity", "self~greenIntensity", "self~blueIntensity")"')~dump -- an Array : 0 (0, 0, 0), 255 (0, 0, 255), 32768 (0, 128, 0), 12500670 (190, 190, 190) + +-- A method object can be used directly +-- No need to define the method on the receiver class +colors~map(.methods~entry("decimalColor"))~dump -- an Array : 0 (0, 0, 0), 255 (0, 0, 255), 32768 (0, 128, 0), 12500670 (190, 190, 190) + + +----------------------------------------------------------------- +-- Definitions +----------------------------------------------------------------- + +::routine factorial + use strict arg n + if n == 0 then return 1 + return n * factorial(n - 1) + + +::method factorial + if self == 0 then return 1 + return self * (self - 1)~factorial + + +::method decimalColor + return self~rgbInteger "("self~redIntensity", "self~greenIntensity", "self~blueIntensity")" + + +::class Color +::attribute name +::attribute rgb +::attribute rgbInteger private +::method init + use strict arg name, rgb + self~name = name + self~rgb = rgb + self~rgbInteger = rgb~x2d +::method redIntensity + return self~rgb~substr(1,2)~x2d +::method greenIntensity + return self~rgb~substr(3,2)~x2d +::method blueIntensity + return self~rgb~substr(5,2)~x2d + + +::extension Object +::method dump + use strict arg stream = .stdout + stream~lineout(self) + + +::extension Collection +::method dump + use strict arg stream = .stdout + stream~charout(self ": ") + previous = .false + do e over self + if previous then stream~charout(", ") + stream~charout(e) + previous = .true + end + stream~lineout("") + + +::extension String +::method "1-" + c = self~subchar(1)~c2d - 1 + return c~d2c +::method "1+" + c = self~subchar(1)~c2d + 1 + return c~d2c + + +::extension Directory +::method of class + use strict arg key, value, ... + directory = .Directory~new + do i = 1 to arg() by 2 + directory[arg(i)] = arg(i+1) + end + return directory + + +::requires "functional.rex" + Added: sandbox/jlf/samples/extension/functional.rex =================================================================== --- sandbox/jlf/samples/extension/functional.rex (rev 0) +++ sandbox/jlf/samples/extension/functional.rex 2010-04-25 16:16:54 UTC (rev 5819) @@ -0,0 +1,167 @@ +/* +This script needs a modified ooRexx interpreter which allows to extend predefined ooRexx classes. +Something similar to C# extension methods : +http://msdn.microsoft.com/en-us/library/bb383977.aspx +http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx + +Here, the extensions are declared with ::extension instead of ~define (see ..\functional for ~define) +*/ + + +----------------------------------------------------------------------------- +-- A Doer is an object who knows how to execute itself (understands "do") +-- A Message can't be a Doer directly, must use an intermediate class MessageNameSender + +::extension Routine +::method doer + use strict arg context=.nil + if context <> .nil then raise syntax 93.963 -- Context not supported + return self +::method do + return self~callWith(arg(1,"a")) + + +::extension Method +::method doer + use strict arg context=.nil + if context <> .nil then raise syntax 93.963 -- Context not supported + return self +::method do + use strict arg object, ... + return object~run(self, "a", arg(2,"a")) + + +::extension String -- first part +::method doer + use strict arg context=.nil + parse var self word1 rest + -- When the source string contains a single word, it's a message name + if rest == "" then do + if context <> .nil then raise syntax 93.963 -- Context not supported + return .MessageNameSender~new(self) + end + if word1~caselessEquals("::method") then do + if context == .nil then return .Method~new("", rest) + return .Method~new("", rest, context) + end + if word1~caselessEquals("::routine") then do + if context == .nil then return .Routine~new("", rest) + return .Routine~new("", rest, context) + end + -- Routine by default + if context == .nil then return .Routine~new("", self) + return .Routine~new("", self, context) + + +-- Doer for sending a message name +::class MessageNameSender +::attribute messageName +::method init + use strict arg messageName + self~messageName = messageName +::method do + use strict arg object, ... + return object~sendWith(self~messageName, arg(2,"a")) + + +----------------------------------------------------------------------------- +-- Higher-order actions + +::extension String -- second part +::method reduce + use strict arg action, context=.nil + return self~makearray("")~reduce(action, context) + + +::extension Collection +::method reduce + use strict arg action, context=.nil + doer = action~doer(context) -- parse only once, before iteration + supplier = self~supplier + if \ supplier~available then return .nil + r = supplier~item + supplier~next + do while supplier~available + r = doer~do(r, supplier~item) + supplier~next + end + return r + + +::extension String -- third part +::method mapchar + use strict arg action, inplace=.false, context=.nil + if inplace == .true then raise syntax 93.963 -- in place not applicable to string + return .MutableBuffer~new(self)~mapchar(action, .true, context)~string +::method mapword + use strict arg action, inplace=.false, context=.nil + if inplace == .true then raise syntax 93.963 -- in place not applicable to string + return .MutableBuffer~new(self)~mapword(action, .true, context)~string + + +::extension MutableBuffer -- third part +::method mapchar + use strict arg action, inplace=.true, context=.nil + doer = action~doer(context) -- parse only once, before iteration + r = self + if \inplace then r = self~copy + string = r~string + r~delete(1) + do i = 1 to string~length + self~append(doer~do(string~subchar(i))) + end + return r +::method mapword + use strict arg action, inplace=.true, context=.nil + doer = action~doer(context) -- parse only once, before iteration + r = self + if \inplace then r = self~copy + string = r~string + r~delete(1) + first = .true + -- Don't use the method "word(n)" since it will be very inefficient for long strings + pos = 1 + c = string~subchar(pos) + do forever + do while c == " " + pos += 1 + c = string~subchar(pos) + end + if c == "" then leave + start = pos + do while c <> " " & c <> "" + pos += 1 + c = string~subchar(pos) + end + word = string~substr(start, pos - start) + if \first then self~append(" ") + self~append(doer~do(word)) + first = .false + end + return r + + +-- Will work with Array, List, Queue, CircularQueue (any collection which supports "first" and "next") +-- These 4 classes are subclasses of OrderedCollection, so I could extend OrderedCollection to add the method "Map". +-- For test purpose, I create a mixin and extend the 4 classes individually. +-- I don't use a supplier because it works on a snapshot of the collection and is not done for updating the collection +-- (when inplace == .true the collection is updated in place) +::class MappableCollection mixinclass OrderedCollection +::method map + use strict arg action, inplace=.false, context=.nil + doer = action~doer(context) -- parse only once, before iteration + r = self + if \inplace then r = self~copy + current = self~first + do while current <> .nil + r[current] = doer~do(self[current]) + current = self~next(current) + end + return r + + +::extension Array inherit MappableCollection +::extension List inherit MappableCollection +::extension Queue inherit MappableCollection +--::extension CircularQueue inherit MappableCollection -- mixin already inherited from Queue + Added: sandbox/jlf/samples/extension/test_extension_order.rex =================================================================== --- sandbox/jlf/samples/extension/test_extension_order.rex (rev 0) +++ sandbox/jlf/samples/extension/test_extension_order.rex 2010-04-25 16:16:54 UTC (rev 5819) @@ -0,0 +1,42 @@ +/* +Question1 : Is the order of extension resolution a "natural" order ? +Question2 : The predefined classes are visible from every package (unless overriden by a local definition, I think) + The user classes can be public or private. + Is the current extension behavior compatible with that ? Seems good +*/ + +say +say "========== elaborating test_extension_order ==========" +say + +call routine_test_extension_order +call routine_test_extension_order1 +call routine_test_extension_order2 +call routine_test_extension_order3 +call routine_test_myPublicClass1 +call routine_test_myPublicClass2 +call routine_test_myPublicClass3 + +::routine routine_test_extension_order public +say "----- routine_test_extension_order -----" +.object~new~do +.object~new~do1 +.object~new~do2 +.object~new~do3 +.myPublicClass~new~m1 +.myPublicClass~new~m2 + +::extension object +::method do + say "do from test_extension_order" + +-- The extended class depends on the order of the ::requires (i.e. which "myPublicClass" is visible from here) +::extension myPublicClass +::method m2 + say "m2 from test_extension_order" + +-- Error 98.909: Class "MYPRIVATECLASS" not found +--::extension myPrivateClass + +::requires "test_extension_order1.rex" +::requires "test_extension_order2.rex" Added: sandbox/jlf/samples/extension/test_extension_order1.rex =================================================================== --- sandbox/jlf/samples/extension/test_extension_order1.rex (rev 0) +++ sandbox/jlf/samples/extension/test_extension_order1.rex 2010-04-25 16:16:54 UTC (rev 5819) @@ -0,0 +1,33 @@ +say +say "========== elaborating test_extension_order1 ==========" +say + +call routine_test_extension_order1 +call routine_test_extension_order3 + +::routine routine_test_extension_order1 public +say "----- routine_test_extension_order1 -----" +.object~new~do +.object~new~do1 +.object~new~do3 +.myPublicClass~new~m1 +--.myPublicClass~new~m2 + +::routine routine_test_myPublicClass1 public +say "----- routine_test_myPublicClass1 -----" +.myPublicClass~new~m1 +--.myPublicClass~new~m2 + +::extension object +::method do + say "do from test_extension_order1" +::method do1 + say "do1 from test_extension_order1" + +::class myPublicClass public +::method m1 + say "m1 from test_extension_order1" + +::class myPrivateClass + +::requires "test_extension_order3.rex" Added: sandbox/jlf/samples/extension/test_extension_order2.rex =================================================================== --- sandbox/jlf/samples/extension/test_extension_order2.rex (rev 0) +++ sandbox/jlf/samples/extension/test_extension_order2.rex 2010-04-25 16:16:54 UTC (rev 5819) @@ -0,0 +1,34 @@ +say +say "========== elaborating test_extension_order2 ==========" +say + +call routine_test_extension_order2 +call routine_test_extension_order3 + +::routine routine_test_extension_order2 public +say "----- routine_test_extension_order2 -----" +.object~new~do +.object~new~do2 +.object~new~do3 +.myPublicClass~new~m1 +--.myPublicClass~new~m2 + +::routine routine_test_myPublicClass2 public +say "----- routine_test_myPublicClass2 -----" +.myPublicClass~new~m1 +.myPublicClass~new~m2 + +::extension object +::method do + say "do from test_extension_order2" +::method do2 + say "do2 from test_extension_order2" + +::class myPublicClass public +::method m1 + say "m1 from test_extension_order2" + +::class myPrivateClass + +::requires "test_extension_order3.rex" + Added: sandbox/jlf/samples/extension/test_extension_order3.rex =================================================================== --- sandbox/jlf/samples/extension/test_extension_order3.rex (rev 0) +++ sandbox/jlf/samples/extension/test_extension_order3.rex 2010-04-25 16:16:54 UTC (rev 5819) @@ -0,0 +1,32 @@ +say +say "========== elaborating test_extension_order3 ==========" +say + +call routine_test_extension_order3 + + +::routine routine_test_extension_order3 public +say "----- routine_test_extension_order3 -----" +.object~new~do +.object~new~do3 +.myPublicClass~new~m1 +--.myPublicClass~new~m2 + +::routine routine_test_myPublicClass3 public +say "----- routine_test_myPublicClass3 -----" +.myPublicClass~new~m1 +--.myPublicClass~new~m2 + +::extension object +::method do + say "do from test_extension_order3" +::method do3 + say "do3 from test_extension_order3" + +::class myPublicClass public +::method m1 + say "m1 from test_extension_order3" + +::class myPrivateClass + + Modified: sandbox/jlf/trunk/Makefile.am =================================================================== --- sandbox/jlf/trunk/Makefile.am 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/Makefile.am 2010-04-25 16:16:54 UTC (rev 5819) @@ -602,6 +602,7 @@ $(build_instructions_dir)/EndInstruction.cpp \ $(build_instructions_dir)/ExitInstruction.cpp \ $(build_instructions_dir)/ExposeInstruction.cpp \ + $(build_instructions_dir)/ExtensionDirective.cpp \ $(build_instructions_dir)/ForwardInstruction.cpp \ $(build_instructions_dir)/GuardInstruction.cpp \ $(build_instructions_dir)/IfInstruction.cpp \ Modified: sandbox/jlf/trunk/interpreter/behaviour/ClassTypeCodes.h =================================================================== --- sandbox/jlf/trunk/interpreter/behaviour/ClassTypeCodes.h 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/interpreter/behaviour/ClassTypeCodes.h 2010-04-25 16:16:54 UTC (rev 5819) @@ -173,33 +173,34 @@ T_TraceInstruction = 111, T_UseInstruction = 112, T_ClassDirective = 113, - T_LibraryDirective = 114, - T_RequiresDirective = 115, - T_CompoundElement = 116, - T_ParseTrigger = 117, + T_ExtensionDirective = 114, + T_LibraryDirective = 115, + T_RequiresDirective = 116, + T_CompoundElement = 117, + T_ParseTrigger = 118, - T_Last_Internal_Class = 117, + T_Last_Internal_Class = 118, - T_First_Transient_Class = 118, + T_First_Transient_Class = 119, - T_Memory = 118, - T_InternalStack = 119, - T_Stack = 120, - T_Activity = 121, - T_Activation = 122, - T_NativeActivation = 123, - T_ActivationFrameBuffer = 124, - T_Envelope = 125, - T_Clause = 126, - T_Token = 127, - T_DoBlock = 128, - T_InterpreterInstance = 129, - T_SecurityManager = 130, - T_CommandHandler = 131, + T_Memory = 119, + T_InternalStack = 120, + T_Stack = 121, + T_Activity = 122, + T_Activation = 123, + T_NativeActivation = 124, + T_ActivationFrameBuffer = 125, + T_Envelope = 126, + T_Clause = 127, + T_Token = 128, + T_DoBlock = 129, + T_InterpreterInstance = 130, + T_SecurityManager = 131, + T_CommandHandler = 132, - T_Last_Transient_Class = 131, - T_Last_Primitive_Class = 131, - T_Last_Class_Type = 131, + T_Last_Transient_Class = 132, + T_Last_Primitive_Class = 132, + T_Last_Class_Type = 132, } ClassTypeCode; Modified: sandbox/jlf/trunk/interpreter/behaviour/PrimitiveBehaviourNames.h =================================================================== --- sandbox/jlf/trunk/interpreter/behaviour/PrimitiveBehaviourNames.h 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/interpreter/behaviour/PrimitiveBehaviourNames.h 2010-04-25 16:16:54 UTC (rev 5819) @@ -163,6 +163,7 @@ #define TheTraceInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_TraceInstruction]) #define TheUseInstructionBehaviour (&RexxBehaviour::primitiveBehaviours[T_UseInstruction]) #define TheClassDirectiveBehaviour (&RexxBehaviour::primitiveBehaviours[T_ClassDirective]) +#define TheExtensionDirectiveBehaviour (&RexxBehaviour::primitiveBehaviours[T_ExtensionDirective]) #define TheLibraryDirectiveBehaviour (&RexxBehaviour::primitiveBehaviours[T_LibraryDirective]) #define TheRequiresDirectiveBehaviour (&RexxBehaviour::primitiveBehaviours[T_RequiresDirective]) #define TheCompoundElementBehaviour (&RexxBehaviour::primitiveBehaviours[T_CompoundElement]) Modified: sandbox/jlf/trunk/interpreter/behaviour/PrimitiveBehaviours.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/behaviour/PrimitiveBehaviours.cpp 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/interpreter/behaviour/PrimitiveBehaviours.cpp 2010-04-25 16:16:54 UTC (rev 5819) @@ -173,6 +173,7 @@ RexxBehaviour(T_TraceInstruction, (PCPPM *)RexxObject::operatorMethods), RexxBehaviour(T_UseInstruction, (PCPPM *)RexxObject::operatorMethods), RexxBehaviour(T_ClassDirective, (PCPPM *)RexxObject::operatorMethods), + RexxBehaviour(T_ExtensionDirective, (PCPPM *)RexxObject::operatorMethods), RexxBehaviour(T_LibraryDirective, (PCPPM *)RexxObject::operatorMethods), RexxBehaviour(T_RequiresDirective, (PCPPM *)RexxObject::operatorMethods), RexxBehaviour(T_CompoundElement, (PCPPM *)RexxObject::operatorMethods), Modified: sandbox/jlf/trunk/interpreter/behaviour/PrimitiveClasses.xml =================================================================== --- sandbox/jlf/trunk/interpreter/behaviour/PrimitiveClasses.xml 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/interpreter/behaviour/PrimitiveClasses.xml 2010-04-25 16:16:54 UTC (rev 5819) @@ -130,6 +130,7 @@ <Class id="UseInstruction" class="RexxInstructionUseStrict" include="UseStrictInstruction.hpp"/> <Class id="ClassDirective" class="ClassDirective" include="ClassDirective.hpp"/> +<Class id="ExtensionDirective" class="ExtensionDirective" include="ExtensionDirective.hpp"/> <Class id="LibraryDirective" class="LibraryDirective" include="LibraryDirective.hpp"/> <Class id="RequiresDirective" class="RequiresDirective" include="RequiresDirective.hpp"/> Modified: sandbox/jlf/trunk/interpreter/behaviour/VirtualFunctionTable.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/behaviour/VirtualFunctionTable.cpp 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/interpreter/behaviour/VirtualFunctionTable.cpp 2010-04-25 16:16:54 UTC (rev 5819) @@ -134,6 +134,7 @@ #include "TraceInstruction.hpp" #include "UseStrictInstruction.hpp" #include "ClassDirective.hpp" +#include "ExtensionDirective.hpp" #include "LibraryDirective.hpp" #include "RequiresDirective.hpp" #include "RexxCompoundElement.hpp" @@ -522,6 +523,9 @@ objectPtr = new (objectLoc) ClassDirective(RESTOREIMAGE); virtualFunctionTable[T_ClassDirective] = getVftPointer(objectLoc); + objectPtr = new (objectLoc) ExtensionDirective(RESTOREIMAGE); + virtualFunctionTable[T_ExtensionDirective] = getVftPointer(objectLoc); + objectPtr = new (objectLoc) LibraryDirective(RESTOREIMAGE); virtualFunctionTable[T_LibraryDirective] = getVftPointer(objectLoc); Modified: sandbox/jlf/trunk/interpreter/classes/ClassClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/ClassClass.cpp 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/interpreter/classes/ClassClass.cpp 2010-04-25 16:16:54 UTC (rev 5819) @@ -714,6 +714,7 @@ /** * special method to allow a class method to be added * to a primitive class during image build. + * New JLF : also used for ::EXTENSION * * @param method_name * The name of the new method. @@ -726,10 +727,18 @@ // validate the arguments method_name = stringArgument(method_name, ARG_ONE)->upper(); requiredArgument(newMethod, ARG_TWO); - newMethod->setScope(this); // change the scope to the class + newMethod->newScope(this); // change the scope to the class // JLF newScope instead of setScope /* now add this to the behaviour */ this->behaviour->getMethodDictionary()->stringPut(newMethod, method_name); this->classMethodDictionary->stringAdd(newMethod, method_name); + + // propagate to all subclasses (JLF : don't know why it was not done, maybe not needed during image build ?) + RexxArray *subclass_list = this->getSubClasses(); + for (size_t i = 1; i < subclass_list->size(); i++) + { + ((RexxClass *)subclass_list->get(i))->defineClassMethod(method_name, newMethod); + } + return OREF_NULL; /* returns nothing */ } @@ -1126,12 +1135,14 @@ /* or the specified position (parameter two). */ /*****************************************************************************/ { +#if 0 /* make sure this isn't a rexx */ if (this->isRexxDefined()) /* defined class being changed */ { /* report as a nomethod condition */ reportNomethod(lastMessageName(), this); } +#endif requiredArgument(mixin_class, ARG_ONE); /* make sure it was passed in */ /* check the mixin class is really a */ Added: sandbox/jlf/trunk/interpreter/instructions/ExtensionDirective.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/instructions/ExtensionDirective.cpp (rev 0) +++ sandbox/jlf/trunk/interpreter/instructions/ExtensionDirective.cpp 2010-04-25 16:16:54 UTC (rev 5819) @@ -0,0 +1,297 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2009 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 ExtensionDirective.cpp */ +/* */ +/* Primitive Translator Abstract Directive Code */ +/* */ +/******************************************************************************/ +#include <stdlib.h> +#include "RexxCore.h" +#include "ExtensionDirective.hpp" +#include "Clause.hpp" +#include "DirectoryClass.hpp" +#include "TableClass.hpp" +#include "ListClass.hpp" +#include "RexxActivation.hpp" + + + +/** + * Construct an ExtensionDirective. + * + * @param n The name of the requires target. + * @param p The public name of the requires target. + * @param clause The source file clause containing the directive. + */ +ExtensionDirective::ExtensionDirective(RexxString *n, RexxString *p, RexxClause *clause) : RexxDirective(clause, KEYWORD_CLASS) +{ + idName = n; + publicName = p; +} + +/** + * Normal garbage collecting live mark. + * + * @param liveMark The current live object mark. + */ +void ExtensionDirective::live(size_t liveMark) +{ + memory_mark(this->nextInstruction); // must be first one marked (though normally null) + memory_mark(this->publicName); + memory_mark(this->idName); + memory_mark(this->inheritsClasses); + memory_mark(this->instanceMethods); + memory_mark(this->classMethods); +} + + +/** + * The generalized object marking routine. + * + * @param reason The processing faze we're running the mark on. + */ +void ExtensionDirective::liveGeneral(int reason) +{ + memory_mark_general(this->nextInstruction); // must be first one marked (though normally null) + memory_mark_general(this->publicName); + memory_mark_general(this->idName); + memory_mark_general(this->inheritsClasses); + memory_mark_general(this->instanceMethods); + memory_mark_general(this->classMethods); +} + + +/** + * Flatten the directive instance. + * + * @param envelope The envelope we're flattening into. + */ +void ExtensionDirective::flatten(RexxEnvelope *envelope) +{ + setUpFlatten(ExtensionDirective) + + flatten_reference(newThis->nextInstruction, envelope); + flatten_reference(newThis->publicName, envelope); + flatten_reference(newThis->idName, envelope); + flatten_reference(newThis->inheritsClasses, envelope); + flatten_reference(newThis->instanceMethods, envelope); + flatten_reference(newThis->classMethods, envelope); + // by this time, we should be finished with this, and it should + // already be null. Make sure this is the case. + + cleanUpFlatten +} + + +/** + * Allocate a new requires directive. + * + * @param size The size of the object. + * + * @return The memory for the new object. + */ +void *ExtensionDirective::operator new(size_t size) +{ + return new_object(size, T_ExtensionDirective); /* Get new object */ +} + + +/** + * Do install-time processing of the ::extension directive. + * + * @param activation The activation we're running under for the install. + */ +void ExtensionDirective::install(RexxSource *source, RexxActivation *activation) +{ + // make this the current line for the error context + activation->setCurrent(this); + + RexxClass *classObject; // the class object we're extending + + // retrieve the class object to extend + classObject = source->findClass(idName); + if (classObject == OREF_NULL) /* not found? */ + { + reportException(Error_Execution_noclass, idName); + } + + if (inheritsClasses != OREF_NULL) /* have inherits to process? */ + { + // now handle the multiple inheritance issues + for (size_t i = inheritsClasses->firstIndex(); i != LIST_END; i = inheritsClasses->nextIndex(i)) + { + /* get the next inherits name */ + RexxString *inheritsName = (RexxString *)inheritsClasses->getValue(i); + /* go resolve the entry */ + RexxClass *mixin = source->findClass(inheritsName); + if (mixin == OREF_NULL) /* not found? */ + { + /* not found in environment, error! */ + reportException(Error_Execution_noclass, inheritsName); + } + /* do the actual inheritance */ + classObject->sendMessage(OREF_INHERIT, mixin); + } + } + + RexxString *methodName; + + if (instanceMethods != OREF_NULL) /* have instance methods to add? */ + { + /* define them to the class object */ + for (HashLink i = instanceMethods->first(); (methodName = (RexxString *)instanceMethods->index(i)) != OREF_NULL; i = instanceMethods->next(i)) + { + RexxMethod *method = (RexxMethod *)instanceMethods->value(i); + classObject->defineMethod(methodName, method); + } + } + + if (classMethods != OREF_NULL) /* have class methods to add? */ + { + /* define them to the class object */ + for (HashLink i = classMethods->first(); (methodName = (RexxString *)classMethods->index(i)) != OREF_NULL; i = classMethods->next(i)) + { + RexxMethod *method = (RexxMethod *)classMethods->value(i); + classObject->defineClassMethod(methodName, method); + } + } +} + + +/** + * Add an inherits class to the class definition. + * + * @param name The name of the inherited class. + */ +void ExtensionDirective::addInherits(RexxString *name) +{ + if (inheritsClasses == OREF_NULL) + { + OrefSet(this, this->inheritsClasses, new_list()); + } + inheritsClasses->append(name); +} + + +/** + * Retrieve the class methods directory for this class. + * + * @return The class methods directory. + */ +RexxTable *ExtensionDirective::getClassMethods() +{ + if (classMethods == OREF_NULL) + { + OrefSet(this, this->classMethods, new_table()); + } + return classMethods; +} + + +/** + * Retrieve the instance methods directory for this class. + * + * @return The instance methods directory. + */ +RexxTable *ExtensionDirective::getInstanceMethods() +{ + if (instanceMethods == OREF_NULL) + { + OrefSet(this, this->instanceMethods, new_table()); + } + return instanceMethods; +} + + +/** + * Check for a duplicate method defined om this class. + * + * @param name The method name. + * @param classMethod + * Indicates whether we are checking for a class or instance method. + * + * @return true if this is a duplicate of the method type. + */ +bool ExtensionDirective::checkDuplicateMethod(RexxString *name, bool classMethod) +{ + if (classMethod) + { + return getClassMethods()->get(name) != OREF_NULL; + } + else + { + return getInstanceMethods()->get(name) != OREF_NULL; + } + +} + + +/** + * Add a method to an extension definition. + * + * @param name The name to add. + * @param method The method object that maps to this name. + * @param classMethod + * Indicates whether this is a new class or instance method. + */ +void ExtensionDirective::addMethod(RexxString *name, RexxMethod *method, bool classMethod) +{ + if (classMethod) + { + getClassMethods()->put(method, name); + } + else + { + getInstanceMethods()->put(method, name); + } +} + + +/** + * Add a method to an extension definition. + * + * @param name The name to add. + * @param method The method object that maps to this name. + */ +void ExtensionDirective::addConstantMethod(RexxString *name, RexxMethod *method) +{ + // this gets added as both a class and instance method + addMethod(name, method, false); + addMethod(name, method, true); +} Property changes on: sandbox/jlf/trunk/interpreter/instructions/ExtensionDirective.cpp ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/trunk/interpreter/instructions/ExtensionDirective.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/instructions/ExtensionDirective.hpp (rev 0) +++ sandbox/jlf/trunk/interpreter/instructions/ExtensionDirective.hpp 2010-04-25 16:16:54 UTC (rev 5819) @@ -0,0 +1,90 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2009 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 ExtensionDirective.hpp */ +/* */ +/* Primitive Abstract Directive Extension Definitions */ +/* */ +/******************************************************************************/ +#ifndef Included_ExtensionDirective +#define Included_ExtensionDirective + +#include "RexxDirective.hpp" + +class RexxDirectory; + +class ExtensionDirective : public RexxDirective +{ + friend class RexxSource; + public: + void *operator new(size_t); + inline void *operator new(size_t size, void *objectPtr) { return objectPtr; } + inline void operator delete(void *) { } + inline void operator delete(void *, void *) { } + + ExtensionDirective(RexxString *, RexxString *, RexxClause *); + inline ExtensionDirective(RESTORETYPE restoreType) { ; }; + + void live(size_t); + void liveGeneral(int reason); + void flatten(RexxEnvelope *); + + inline RexxString *getName() { return publicName; } + void install(RexxSource *source, RexxActivation *activation); + + void addInherits(RexxString *name); + void addMethod(RexxString *name, RexxMethod *method, bool classMethod); + void addConstantMethod(RexxString *name, RexxMethod *method); + bool checkDuplicateMethod(RexxString *name, bool classMethod); + + +protected: + + RexxTable *getClassMethods(); + RexxTable *getInstanceMethods(); + + + RexxString *publicName; // the published name of the class + RexxString *idName; // the internal ID name + RexxList *inheritsClasses; // the names of inherited classes + RexxTable *instanceMethods; // the methods attached to this class + RexxTable *classMethods; // the set of class methods +}; + +#endif + Modified: sandbox/jlf/trunk/interpreter/interpreter.mak =================================================================== --- sandbox/jlf/trunk/interpreter/interpreter.mak 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/interpreter/interpreter.mak 2010-04-25 16:16:54 UTC (rev 5819) @@ -89,7 +89,8 @@ $(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) + $(OR_OUTDIR)\RequiresDirective.$(OBJ) $(OR_OUTDIR)\LibraryDirective.$(OBJ) $(OR_OUTDIR)\ClassDirective.$(OBJ) \ + $(OR_OUTDIR)\ExtensionDirective.$(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) \ Modified: sandbox/jlf/trunk/interpreter/parser/KeywordConstants.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/parser/KeywordConstants.cpp 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/interpreter/parser/KeywordConstants.cpp 2010-04-25 16:16:54 UTC (rev 5819) @@ -60,6 +60,7 @@ KeywordEntry(CHAR_ATTRIBUTE, DIRECTIVE_ATTRIBUTE), KeywordEntry(CHAR_CLASS, DIRECTIVE_CLASS), KeywordEntry(CHAR_CONSTANT, DIRECTIVE_CONSTANT), + KeywordEntry(CHAR_EXTENSION, DIRECTIVE_EXTENSION), KeywordEntry(CHAR_METHOD, DIRECTIVE_METHOD), KeywordEntry(CHAR_OPTIONS, DIRECTIVE_OPTIONS), KeywordEntry(CHAR_REQUIRES, DIRECTIVE_REQUIRES), Modified: sandbox/jlf/trunk/interpreter/parser/SourceFile.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/parser/SourceFile.cpp 2010-04-25 15:07:15 UTC (rev 5818) +++ sandbox/jlf/trunk/interpreter/parser/SourceFile.cpp 2010-04-25 16:16:54 UTC (rev 5819) @@ -81,6 +81,7 @@ #include "PackageClass.hpp" #include "InterpreterInstance.hpp" #include "ClassDirective.hpp" +#include "ExtensionDirective.hpp" #include "LibraryDirective.hpp" #include "RequiresDirective.hpp" #include "PackageManager.hpp" @@ -621,12 +622,14 @@ memory_mark(this->loadedPackages); memory_mark(this->package); memory_mark(this->classes); + memory_mark(this->extensions); memory_mark(this->installed_public_classes); memory_mark(this->installed_classes); memory_mark(this->merged_public_classes); memory_mark(this->merged_public_routines); memory_mark(this->methods); memory_mark(this->active_class); + memory_mark(this->active_extension); memory_mark(this->initCode); } @@ -646,6 +649,7 @@ OrefSet(this, this->methods, OREF_NULL); OrefSet(this, this->requires, OREF_NULL); OrefSet(this, this->classes, OREF_NULL); + OrefSet(this, this->extensions, OREF_NULL); OrefSet(this, this->routines, OREF_NULL); OrefSet(this, this->libraries, OREF_NULL); OrefSet(this, this->installed_classes, OREF_NULL); @@ -689,12 +693,14 @@ memory_mark_general(this->loadedPackages); memory_mark_general(this->package); memory_mark_general(this->classes); + memory_mark_general(this->extensions); memory_mark_general(this->installed_public_classes); memory_mark_general(this->installed_classes); memory_mark_general(this->merged_public_classes); memory_mark_general(this->merged_public_routines); memory_mark_general(this->methods); memory_mark_general(this->active_class); + memory_mark_general(this->active_extension); memory_mark_general(this->initCode); } @@ -747,12 +753,14 @@ flatten_reference(newThis->loadedPackages, envelope); flatten_reference(newThis->package, envelope); flatten_reference(newThis->classes, envelope); + flatten_reference(newThis->extensions, envelope); flatten_reference(newThis->installed_public_classes, envelope); flatten_reference(newThis->installed_classes, envelope); flatten_reference(newThis->merged_public_classes, envelope); flatten_reference(newThis->merged_public_routines, envelope); flatten_reference(newThis->methods, envelope); flatten_reference(newThis->active_class, envelope); + flatten_reference(newThis->active_extension, envelope); flatten_reference(newThis->initCode, envelope); cleanUpFlatten @@ -1299,6 +1307,7 @@ OrefSet(this, this->operators, OREF_NULL); OrefSet(this, this->class_dependencies, OREF_NULL); OrefSet(this, this->active_class, OREF_NULL); + OrefSet(this, this->active_extension, OREF_NULL); /* now method parsing areas */ OrefSet(this, this->calls, OREF_NULL); OrefSet(this, this->variables, OREF_NULL); @@ -1698,6 +1707,17 @@ current_class->install(this, activation); } } + + // process extensions + if (this->extensions != OREF_NULL) + { + for (size_t i = extensions->firstIndex(); i != LIST_END; i = extensions->nextIndex(i)) + { + /* get the extension info */ + ExtensionDirective *current_extension = (ExtensionDirective *)this->extensions->getValue(i); + current_extension->install(this, activation); + } + } } RexxCode *RexxSource::translate( @@ -1733,8 +1753,10 @@ OrefSet(this, this->libraries, new_list()); /* create the classes list */ OrefSet(this, this->classes, new_list()); + OrefSet(this, this->extensions, new_list()); /* no active class definition */ OrefSet(this, this->active_class, OREF_NULL); + OrefSet(this, this->active_extension, OREF_NULL); /* translation stopped by a directive*/ if (this->flags&_interpret) /* is this an interpret? */ { @@ -1897,6 +1919,7 @@ /* create a dependencies list */ this->flags |= _install; /* have information to install */ + OrefSet(this, this->active_extension, OREF_NULL); // create a class directive and add this to the dependency list OrefSet(this, this->active_class, new ClassDirective(name, public_name, this->clause)); this->class_dependencies->put((RexxObject *)active_class, public_name); @@ -2033,6 +2056,83 @@ /** + * Process a ::EXTENSION directive for a source file. + */ +void RexxSource::extensionDirective() +{ + RexxToken *token = nextReal(); /* get the next token */ + /* not a symbol or a string */ + if (!token->isSymbolOrLiteral()) + { + /* report an error */ + syntaxError(Error_Symbol_or_string_class); + } + RexxString *name = token->value; /* get the class name */ + /* get the exposed name version */ + RexxString *public_name = this->commonString(name->upper()); + /* create a dependencies list */ + this->flags |= _install; /* have information to install */ + + OrefSet(this, this->active_class, OREF_NULL); + // create an extension directive + OrefSet(this, this->active_extension, new ExtensionDirective(name, public_name, this->clause)); + // add to the extensions list + this->extensions->append((RexxObject *)this->active_extension); + + for (;;) + { /* now loop on the option keywords */ + token = nextReal(); /* get the next token */ + /* reached the end? */ + if (token->isEndOfClause()) + { + break; /* get out of here */ + } + /* not a symbol token? */ + else if (!token->isSymbol()) + { + /* report an error */ + syntaxError(Error_Inv... [truncated message content] |
From: <jfa...@us...> - 2010-04-28 07:20:22
|
Revision: 5848 http://oorexx.svn.sourceforge.net/oorexx/?rev=5848&view=rev Author: jfaucher Date: 2010-04-28 07:20:15 +0000 (Wed, 28 Apr 2010) Log Message: ----------- rgf_util2 wrappers Modified Paths: -------------- sandbox/jlf/_diary.txt Added Paths: ----------- sandbox/jlf/samples/rgf_util2/ sandbox/jlf/samples/rgf_util2/rgf_util2.rex sandbox/jlf/samples/rgf_util2/test.rex sandbox/jlf/samples/rgf_util2/test_output.txt sandbox/jlf/samples/rgf_util2/wrappers.rex Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-04-27 23:03:36 UTC (rev 5847) +++ sandbox/jlf/_diary.txt 2010-04-28 07:20:15 UTC (rev 5848) @@ -28,6 +28,15 @@ =============================================================================== +2010 april 28 + +rgf_util2 wrappers to make the services of Rony available as methods on predefined classes. +For proof of concept... For a real library of methods, rgf_util2 should be rewritten to use +the variable "self" where appropriate, instead of passing the object as first parameter. + + + +=============================================================================== 2010 april 25 Add ::extension directive @@ -69,3 +78,4 @@ svn update jlf rev 5812 +merge 5812-5835 from main/trunk Added: sandbox/jlf/samples/rgf_util2/rgf_util2.rex =================================================================== --- sandbox/jlf/samples/rgf_util2/rgf_util2.rex (rev 0) +++ sandbox/jlf/samples/rgf_util2/rgf_util2.rex 2010-04-28 07:20:15 UTC (rev 5848) @@ -0,0 +1,3212 @@ +/* author: Rony G. Flatscher, copyright 2008, all rights reserved + date: 2007-06-01 - 2007-06-02; 2007-07-30; 2007-08-02, 2007-08-07, 2007-08-15, + 2007-10-20, 2007-10-23 + 2007-12-30 - made NumberComparator more flexible, allows to use + intermixed non-numbers, if programmer wishes to do so + - MessageComparator: now allows collection of message-names + and/or message objects to use for comparisons + 2008-01-08 - added "/numeric" hint for message names + 2008-02-15 - changed StringComparator to be more flexible with its + argument + 2008-02-16 - changed StringComparator to be simpler & more flexible, + as well as sort2, stableSort2; created samples (f:\test\orx\rgf_util2) + 2008-02-17 - changed/improved StringColumnComparator, created samples for it + 2008-02-19 - removed usage of built-in comparators in sort2() and + stableSort2(), so none of the 3.2.0 specialized + Comparators are needed + - added "-length" to ABBREV2(), + 2008-02-20 - added "-count" to CHANGESTR2() ("change last 'count' needle occurrences) + - added negative starting position to lastPos2() + - added left2()-BIF, handling with negative start position + - added right2()-BIF, handling with negative start position + - added/enhanced pos2()-BIF with negative start position + 2008-02-21 - added DELSTR2(), LOWER2(), SUBSTR2(), UPPER2() + which now all accept negative numbers + 2008-02-22 - added OVERLAY2(), which now accepts negative numbers + 2008-02-25 - added PARSEWORDS2() + 2008-03-13 - changed DUMP2 to cater for the different kind of collections, + ones), will not sort OrderedCollections, but honor their order + [will show exact array-index values (including multi-dimensional], + will sort by index-value otherwise, in the case of "allAt"-collections + (e.g. Relation) will give a list of the items associated with the + same index + 2008-03-14 - changed DUMP2() to display item, if allAt() returns a collection + containing only one item; added SUBCHAR2() allowing negative + positions as well + added negative position to WORDPOS2() + added DELWORD2, SUBWORD2(), WORD2(), WORDINDEX2(), WORDLENGTH2() + 2008-03-16 - tested and fixed StringOfWords class + 2008-03-19 - recoded sort2() and stableSort2() to take advantage of .StringComparator + and .StringColumnComparator + 2008-03-27 - allow in list of messages array-elements with two entries, where + - arr[1]=messageString|messageObject + - arr[2]=flagString + - added option "M" (message sort) to sort2() and stableSort2() + 2008-03-29, - sort2() and stableSort2() now accept as their first argument + an object with a "makeArray" method in addition to instances + of array + - .MessageComparator: if an array-element is given, then index 3 in + addition to index 2 are regarded to be flag (parts) + 2008-03-16: - dump2 now gracefully deals with non-collection and non-supplier + objects: an appropriate hint is given, as well as the type and + (string) value of the argument + 2009-03-15: - changed default of string-routines to use the "caseless" + version + 2009-03-20: - changed NumericComparator to use caseless comparison in case + relaxed comparisons are carried out + - change default sort2() and stableSort2() to use "N", i.e. + ascending sort with numeric comparisons, and caseless comparisons + - added MakeArray to class StringOfWords + + 2009-12-14: - make sure all public routines have a trailing "2" to indicate that + they come from this package and to avoid name clashes with earlier + implementations + 2009-12-19: - changed default for sort2() and stableSort2() to "ignore case", if + string objects are to be sorted + 2009-12-22: - When creating a NumberComparator one can now determine the order (A|D) + and kind of comparison (I | C) + 2009-12-26: - default to "I"gnore case in .StringColumnComparator + - parseWords2: if returning position array, supply third array element + 2009-12-27: - .StringOfWords: + - delWord(): make sure dirty flags are set + - subWord(): don't change string itself, if returning subwords + - wordPos(): default for compare now "I[gnore]" case + 2009-12-28: - .StringOfWords: + - delWord(): do not edit string in place, return an edited copy + 2010-01-16, change "rgf.numbers" to "rgf.digits" (thanks to Walter Pachl!) + + + + purpose: set of 3.2 utilities to ease programming of 3.2.0, e.g. offer sort2()- and + stableSort2()-BIFs that handle all kind of standard sorting needs, thereby + removing the need for "low level" coding in ooRexx itself + + TODO: - ? create a DateTime2 class with renaming existing conversion + methods to start with "to"; also supply epoch-related + conversions (from/to); also allow to define the date + when Julian calendar took effect; supply method to determine + Easter Sunday (depending on the calendar in use) + + - create routines "leftWord([-]n)", "rightWord([-]n)" + + license: Choice of + ASF 2.0, <http://www.apache.org/licenses/LICENSE-2.0>: + --------------- cut here ---------------- + Copyright 2009 Rony G. Flatscher + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --------------- cut here ---------------- + + or + + LGPL 3.0, <http://www.fsf.org/licensing/licenses/lgpl.html> (as of: 2008-02-17) + + version: 1.0.4 +*/ + +.local~rgf.non.printable=xrange("00"x,"1F"x)||"FF"x +.local~rgf.alpha.low="abcdefghijklmnopqrstuvwxyz" +.local~rgf.alpha.upper =.rgf.alpha.low~upper +.local~rgf.alpha =.rgf.alpha.low || .rgf.alpha.upper +.local~rgf.digits ="0123456789" +.local~rgf.alphanumeric=.rgf.alpha || .rgf.digits + +.local~rgf.symbol.chars=".!_?" + + +parse version "_" v "(" + +if v<4 then -- ooRexx smaller than 4.0.0, then use ".public_routines" +do + -- make version"2" BIFs globally available + do idx over .methods + .public_routines~put(.methods[idx], idx) + end + + -- make the classes seen globally via .local directory + .local~messageComparator =.messageComparator + .local~NumberComparator =.NumberComparator + .local~StringComparator =.StringComparator + .local~StringColumnComparator=.StringColumnComparator + .local~StringOfWords =.StringOfWords +end +else -- running under ooRexx 4.0.0 or higher +do + thisPackage=.context~package + do idx over .methods + -- routine=.routine~new(idx, .methods[idx]~source) + routine=.routine~new("DYNAMICALLY_CREATED_"idx, .methods[idx]~source) + thisPackage~addPublicRoutine(idx, routine) + end + + -- make the classes seen globally via the package's public classes + thisPackage~addPublicClass("MessageComparator" , .messageComparator ) + thisPackage~addPublicClass("NumberComparator" , .NumberComparator ) + thisPackage~addPublicClass("StringComparator" , .StringComparator ) + thisPackage~addPublicClass("StringColumnComparator", .StringColumnComparator) + thisPackage~addPublicClass("StringOfWords" , .StringOfWords ) +end + +/* ======================================================================= */ +/* === methods to be used for new BIFs === */ +/* ======================================================================= */ + + -- 2008-02-19, rgf: abbrev info, string [, n-length] + /* if length is negative, then */ +/* ======================================================================= */ +::method "abbrev2" + use strict arg arg1, arg2, ... + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArgs=4 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="abbrev" -- base name for the message to send + + bCaseDependent =.false -- default to caseless version + if argNr>=BIFpos, \datatype(arg(argNr),"N") then + do + letter=arg(argNr)~strip~left(1)~upper + if pos(letter,"CI")=0 then -- illegal argument! + raise syntax 93.914 array (argNr, "C, I", arg(argNr)) + bCaseDependent=(letter="C") + argNr-=1 -- decrease one from total number of arguments + end + + newArr=.array~new -- create new array for the arguments + newArr[1]=arg2 -- save info + if arg(3,"Exists"), datatype(arg(3),"N") then + do + arg3=arg(3) -- negative? + if arg3<0 then -- length, i.e. extract from right + do + newArr[1]=arg2~right(-arg3) -- get the chars from the right + end + else + do + newArr[2]=arg3 + end + end + + -- now invoke the operation + if bCaseDependent then + return .message~new(arg(1), methName, "A", newArr)~send + else + return .message~new(arg(1), "caseless"methName, "A", newArr)~send + +syntax: + raise propagate + +/* ======================================================================= */ +/* if count is negative, then the number of changes occur from the right side + ("change the last 'count' of 'needle' occurrences in string") +*/ +::method "changeStr2" -- (needle,haystack,newNeedle[,[-]count][,CI]) + use strict arg arg1needle, arg2haystack, arg3newNeedle, ... -- make sure at least three args are supplied + parse arg arg1needle, arg2haystack, arg3newNeedle, arg4count + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last mandatory BIF argument position + maxArgs=5 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="changeStr" -- base name for the message to send + + bCaseDependent =.false -- default to caseless version + + newArr=.array~new -- create new array for the arguments + newArr[1]=arg1needle + newArr[2]=arg3newNeedle + + signal on syntax + if argNr>(BIFpos) then -- either count or "CI" + do + count=.nil + if \datatype(arg(argNr),"W") then -- "C" or "I" + do + letter=arg(argNr)~strip~left(1)~upper + if pos(letter,"CI")=0 then -- illegal argument! + raise syntax 93.914 array (argNr, "C, I", arg(argNr)) + bCaseDependent=(letter="C") + + if argNr>4, arg(4,"E") then -- check for "count" argument + count=arg4count -- save count-value + end + else + count=arg4count -- save count-value + end + + if datatype(count,"N") then -- count is numeric, check it out + do + if count<0 then -- change the "count" last occurrences in string! + do + -- search starting position for changes + len=length(arg2haystack) -- remember length of string + pos=len -- start out with last position of string + + -- find starting position + do i=1 to -count until pos=0 + oldPos=pos + + if oldPos<=1 then leave -- already at beginning! + if bCaseDependent then + do + pos= lastPos(arg1needle, arg2haystack, oldPos-(1-(len=oldPos))) + end + else -- ignore case + do + pos=lastPos2(arg1needle, arg2haystack, oldPos-(1-(len=oldPos)), "I") + end + end + + -- carry out the changes + if oldPos>1, pos>0 then -- o.k., not all "needle"s to change: split, change and return + do + -- extract part that does not get changed + mb=.MutableBuffer~new~~append( arg2haystack~substr(1,Pos-1) ) + + -- change needle in remainder, add changed string to MutableBuffer + if bCaseDependent then + mb~append( .message~new(arg2haystack~substr(Pos), methName, "A", newArr)~send) + else + mb~append( .message~new(arg2haystack~substr(Pos), "caseless"methName, "A", newArr)~send) + return mb~string -- return changed string + end + end + else + do + newArr[3]=arg4count -- save "count" argument + end + end + + -- now invoke the operation + if bCaseDependent then + return .message~new(arg2haystack, methName, "A", newArr)~send + else + return .message~new(arg2haystack, "caseless"methName, "A", newArr)~send + +syntax: + raise propagate + +/* ======================================================================= */ +-- string1, string2[, [padChar] [,{C|I}]] +::method "compare2" + use strict arg arg1string1, arg2string2, arg3padChar=" ", ... + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArg=4 + + signal on syntax + if argNr>maxArg then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArg) + + methName="compare" -- base name for the message to send + + bCaseDependent =.false -- default to caseless version + if argNr>BIFpos then + do + letter=arg(maxArg)~strip~left(1)~upper + if pos(letter,"CI")=0 then -- illegal argument! + raise syntax 93.914 array (argNr, "C, I", arg(maxArg)) + bCaseDependent=(letter="C") + argNr-=1 -- decrease one from total number of arguments + end + + newArr=.array~new -- create new array for the arguments + newArr[1]=arg2string2 -- other string + newArr[2]=arg3padChar -- pad character + + -- now invoke the operation + if bCaseDependent then + return .message~new(arg1string1, methName, "A", newArr)~send + else + return .message~new(arg1string1, "caseless"methName, "A", newArr)~send + +syntax: + raise propagate + + +/* ======================================================================= */ +-- not a BIF ::method "compareTo2" + +/* ======================================================================= */ +-- needle, haystack[,{C|I}] +::method "countStr2" + use strict arg arg1needle, arg2haystack, ... + + argNr=arg() -- get maximum number of arguments + BIFpos=2 -- last classic BIF argument position + maxArg=3 + + signal on syntax + if argNr>maxArg then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArg) + + methName="countStr" -- base name for the message to send + + bCaseDependent =.false -- default to caseless version + if argNr>BIFpos then + do + letter=arg(maxArg)~strip~left(1)~upper + if pos(letter,"CI")=0 then -- illegal argument! + raise syntax 93.914 array (maxArg, "C, I", arg(maxArg)) + bCaseDependent=(letter="C") + end + + -- now invoke the operation + if bCaseDependent then + return .message~new(arg2haystack, methName, "I", arg1needle )~send + else + return .message~new(arg2haystack, "caseless"methName, "I", arg1needle )~send + +syntax: + raise propagate + + + -- 2008-02-21, rgf: delStr2(string ,n-start [, n-length]) + /* if length is negative, then */ +/* ======================================================================= */ +::method "delStr2" + use strict arg arg1, ... -- make sure we have at least one arg + parse arg ., arg2, arg3 + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArgs=3 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="delStr" -- base name for the message to send + + len1=length(arg1) -- get length of string + newArr=.array~new -- create new array for the arguments + + if datatype(arg2,"W") then -- start + do + if arg2<0 then -- negative, start from right + do + tmp=len1+arg2+1 -- get starting position + if tmp<2 then -- start at first char + arg2=1 + else + arg2=tmp + end + newArr[1]=arg2 -- start position + end + else + do + raise syntax 93.905 array('2 ("start position")', arg2) + end + + if arg(3,"Exists") then -- length + do + if datatype(arg2, "W") then + do + if arg3<0 then -- we need to move the starting point to the left! + do + arg2=arg2+arg3+1 -- subtract arg3 + if arg2<1 then -- reset start to 1 + newArr[1]=1 + else -- new start pos + newArr[1]=arg2 + + arg3=-arg3 -- turn it into a positive number + end + end + else + do + raise syntax 93.905 array('3 ("length")', arg3) + end + + newArr[2]=arg3 -- length + end + + -- now invoke the operation + return .message~new(arg(1), methName, "A", newArr)~send + +syntax: + raise propagate + + + -- 2008-03-14, rgf: +/* ======================================================================= */ +/* delWord2(string, start[, length]) + ... if no words, returns received string + +*/ +::method "delWord2" -- allows negative start and length + use strict arg string, arg2, ... -- make sure we have at least one arg + + parse arg string, arg2, arg3 + + argNr=arg() -- get maximum number of arguments + maxArgs=3 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="delWord" -- base name for the message to send + newArr=.array~new -- create new array for the arguments + + nrWords=words(string) -- calc # of words + + if \datatype(arg2, "W") then + raise syntax 93.905 array('2 ("starting word position")', arg3) + + newArr[1]=arg2 -- save starting pos + if arg2<0 then + do + tmp=nrWords+arg2+1 -- calc starting position from right + if tmp<1 then -- if before first word, start at first word + tmp=1 + newArr[1]=tmp -- save new starting position + end + + if arg(3,"Exists") then -- if given, process length argument + do + if \datatype(arg3, "W") then + raise syntax 93.905 array('3 ("number of words")', arg3) + + if arg3<0 then -- determine new starting position and number of words to delete + do + oldStart=newArr[1] -- save old starting position + tmp=oldStart+arg3+1 + if tmp<1 then -- oops, make sure we start at first word + tmp=1 + + newArr[1]=tmp -- new start position + newArr[2]=oldStart-tmp+1 -- length argument (nr of words to delete) + end + else + do + newArr[2]=arg3 -- length argument + end + end + + if nrWords=0 then -- nothing to do, return empty/spacy string + return string + + -- now invoke the operation + return .message~new(string, methName, "A", newArr)~send + +syntax: + raise propagate + + + + + +/* ======================================================================= */ +-- not a BIF ::method "Equals2" + + + +/* ======================================================================= */ +/* lastPos needle, haystack [,[n-start] [,{C|I}]] */ +::method "lastPos2" + use strict arg arg1needle, arg2haystack, ... + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArgs=4 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + StringPos=1 -- position of string object to work with + methName="lastPos" -- base name for the message to send + + bCaseDependent =.false -- default to caseless version + if argNr>=BIFpos, \datatype(arg(argNr),"N") then + do + letter=arg(argNr)~strip~left(1)~upper + if pos(letter,"CI")=0 then -- illegal argument! + raise syntax 93.914 array (argNr, "C, I", arg(argNr)) + bCaseDependent=(letter="C") + argNr-=1 -- decrease one from total number of arguments + end + + newArr=.array~new -- create new array for the arguments + newArr[1]=arg1needle -- needle + arg3=arg(3) + if arg(3,"Exists"), datatype(arg3,"N") then + do + if arg3<0 then -- negative start column: count from right + do + len2=length(arg2haystack) -- get length of string to scan + if -arg3 >= len2 then -- beyond starting position, scan string normally + return 0 -- beyond start, needle cannot be found! + else + newArr[2]=len2+arg3+1 -- determine starting position + end + else -- positive start column + do + newArr[2]=arg3 -- save starting position + end + end + + -- now invoke the operation + if bCaseDependent then + return .message~new(arg2haystack, methName, "A", newArr)~send + else + return .message~new(arg2haystack, "caseless"methName, "A", newArr)~send + +syntax: + raise propagate + + +/* ======================================================================= */ +-- not a BIF ::method "match2" + +/* ======================================================================= */ +/* left2 string, length [,pad] */ +::method "left2" + use strict arg arg1string, arg2length, ... + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArgs=3 + + --signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + if \datatype(arg2length,"W") then + do + raise syntax 93.905 array('"length"', arg2) + end + + + bLeftBIF=(arg2length>0) -- use left() or right() BIF ? + newArr=.array~new -- create new array for the arguments + + if bLeftBIF then + newArr[1]=arg2length + else + newArr[1]=-arg2length + + if arg(3,"Exists") then -- padChar supplied ? + newArr[2]=arg(3) + + -- now invoke the operation + if bLeftBIF then + return .message~new(arg1string, "left", "A", newArr)~send + else + return .message~new(arg1string, "right", "A", newArr)~send + +syntax: + raise propagate + + + + -- 2008-02-21, rgf: lower2(string [,[n-start] [, n-length]]) + /* if length is negative, then */ +/* ======================================================================= */ +::method "lower2" + use strict arg arg1, ... -- make sure we have at least one arg + parse arg ., arg2, arg3 + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArgs=3 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="lower" -- base name for the message to send + + len1=length(arg1) -- get length of string + newArr=.array~new -- create new array for the arguments + + if arg(2,"Exists") then -- start + do + if datatype(arg2, "W") then + do + if arg2<0 then -- negative, start from right + do + tmp=len1+arg2+1 -- get starting position + if tmp<2 then -- start at first char + arg2=1 + else + arg2=tmp + end + end + else + do + raise syntax 93.905 array('2 ("start position")', arg2) + end + + newArr[1]=arg2 -- start position + end + + if arg(3,"Exists") then -- length + do + if datatype(arg3,"W") then + do + if arg3<0 then -- we need to move the starting point to the left! + do + arg2=arg2+arg3+1 -- subtract arg3 + if arg2<1 then -- reset start to 1 + newArr[1]=1 + else -- new start pos + newArr[1]=arg2 + + arg3=-arg3 -- turn it into a positive number + end + end + else + do + raise syntax 93.905 array('3 ("length")', arg3) + end + + newArr[2]=arg3 -- length + end + + -- now invoke the operation + return .message~new(arg(1), methName, "A", newArr)~send + +syntax: + raise propagate + + + +/* ======================================================================= */ +-- not a BIF ::method "match2" +/* ======================================================================= */ +-- not a BIF ::method "matchChar2" + + + -- 2008-02-22, rgf: overlay2(new, target [,[n-target-start] [, n-new-length]] [,pad]) + --> ATTENTION: if beyond start, prepend appropriate length pad-filled ! +/* ======================================================================= */ +::method "overlay2" + use strict arg new1string, arg1string, ... -- make sure we have at least two arg + parse arg ., ., arg2start, arg3NewLength, arg4pad + + argNr=arg() -- get maximum number of arguments + BIFpos=5 -- last classic BIF argument position + maxArgs=5 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="overlay" -- base name for the message to send + + len1=length(arg1string) -- get length of string + newArr=.array~new -- create new array for the arguments + newArr[1]=new1string -- "new"-string + + prepend="" -- optional prepend string (if positioning before start!) + + arg2startori=arg2start -- save passed-in value, if any + if arg4pad=="" then arg4pad=" "-- define blank as the default pad char + + if arg(3,"Exists") then -- start in "target"-string + do + if datatype(arg2start,"W") then + do + if arg2start<0 then -- negative, start from right + do + tmp=len1+arg2start+1 -- get starting position + if tmp<2 then -- start at first char + do + if tmp<0 then + prepend=copies(arg4pad, -tmp+1) -- create prepend-string + else if tmp=0 then -- fencepost + prepend=arg4pad + + arg2start=1 + end + else + arg2start=tmp + end + end + else + do + raise syntax 93.905 array('3 ("start position in ''target'' string")', arg2start) + end + + newArr[2]=arg2start -- start position + end + + if arg(4,"Exists") then -- "new"-length + do + if datatype(arg3NewLength,"W") then + do + if arg3NewLength<0 then -- we need to move the starting point to the left! + do + arg3NewLength=-arg3NewLength -- turn into a positive number + newArr[1]=right(new1string, arg3NewLength, arg4pad) -- "new"-string + end + else + newArr[1]=left(new1string, arg3NewLength, arg4pad) -- "new"-string + end + else + do + raise syntax 93.905 array('3 ("length of ''new''-string")', arg3NewLength) + end + + newArr[3]=arg3NewLength -- length + end + + if arg4pad<>"" then -- pad-char + newArr[4]=arg4pad + + -- now invoke the operation + return .message~new(prepend||arg1string, methName, "A", newArr)~send + +syntax: + raise propagate + + + + +/* ======================================================================= */ +/* Pos needle, haystack [,[n-start] [,{C|I}]] */ +::method "Pos2" + use strict arg arg1needle, arg2haystack, ... + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArgs=4 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="Pos" -- base name for the message to send + + bCaseDependent =.false -- default to caseless version + if argNr>=BIFpos, \datatype(arg(argNr),"W") then + do + letter=arg(argNr)~strip~left(1)~upper + if pos(letter,"CI")=0 then -- illegal argument! + raise syntax 93.914 array (argNr, "C, I", arg(argNr)) + bCaseDependent=(letter="C") + argNr-=1 -- decrease one from total number of arguments + end + + newArr=.array~new -- create new array for the arguments + newArr[1]=arg1needle -- needle + arg3=arg(3) + if arg(3,"Exists"), datatype(arg3,"N") then + do + if arg3<0 then -- negative start column: count from right + do + len2=length(arg2haystack) -- get length of string to scan + if -arg3 >= len2 then -- beyond starting position, scan string normally + return 0 -- beyond start, needle cannot be found! + else + newArr[2]=len2+arg3+1 -- determine starting position + end + else -- positive start column + do + newArr[2]=arg3 -- save starting position + end + end + + -- now invoke the operation + if bCaseDependent then + return .message~new(arg2haystack, methName, "A", newArr)~send + else + return .message~new(arg2haystack, "caseless"methName, "A", newArr)~send + +syntax: + raise propagate + + + + +/* ======================================================================= */ +/* right2 string, length [,pad] */ +::method "right2" + use strict arg arg1string, arg2length, ... + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArgs=3 + + --signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + if \datatype(arg2length,"W") then + do + raise syntax 93.905 array('"length"', arg2) + end + bLeftBIF=(arg2length>0) -- use left() or right() BIF ? + + newArr=.array~new -- create new array for the arguments + + if bLeftBIF then + newArr[1]=arg2length + else + newArr[1]=-arg2length + + if arg(3,"Exists") then -- padChar supplied ? + newArr[2]=arg(3) + + -- now invoke the operation + if bLeftBIF then + return .message~new(arg1string, "right", "A", newArr)~send + else + return .message~new(arg1string, "left", "A", newArr)~send + + +syntax: + raise propagate + + + + + +/* ======================================================================= */ +/* "Front end" to .Arrays two sort methods "sort" and "sortWith" to simplify usage. + Sorts array in place, but also returns it. +*/ + +/* + usage: sort2(array [,A|D][,][C|I][N]) + sort2(array, comparator [,A|D]) + + A|D ... Ascending (default) | Descending + C|I|N ... respect Case | Ignore case (default) | Numeric (Rexx-style numbers, default) + +------------ + sort2(array) ... sort() + + sort2(array, comparator[,"A|D"]) ... sortWith(comparator) + + sort2(array, collection) ... sortWith(.StringColumnComparator(...)) + sort2(array, n, ...) + + sort2(array, ["A|D"][,"C|I|N"]) ... sortWith(.StringComparator) + sort2(array, "[A[scending]|D[escending]][",C[aseDependent]|I[gnoreCase]|N[umeric]"]) + sort2(array, "A[C|I|N] | D[C|I|N]"...) + + Sort2(array, "M[essages]", message...) ... sortWith(.MessageComparator(...)) + Sort2(array, "M[essages]", arrayOfMessages...) + +*/ +::method "sort2" + use strict arg arg1, arg2="A", arg3="IN", ... + + signal on syntax + + if \arg1~isA(.array) then + do + if \arg1~hasMethod("makeArray") then + raise syntax 93.948 array (1, "Array (or a class with a method 'MAKEARRAY')") + arg1=arg1~makeArray -- get the array that represents the collection + end + + argNr=arg() -- get number of args + if argNr=1 then -- default sort as only array collection is given + do + if arg1[1]~isA(.string) then -- string objects to sort? + return sort2(arg1, "A", "IN") -- sort decimal numerically and caselessly + + return arg1~sort -- sort without any assumptions + end + + -- two arguments only, if strings to sort default to "IN" (case-independent, numeric) + if argNr=2, arg2~isA(.string) then -- if a descending sort + do + order=arg2~strip~left(1)~upper -- extract first letter in capital + if order="A" then -- sort ascendingly + do + if arg1[1]~isA(.string) then -- string objects to sort? + return sort2(arg1, "A", "IN") -- sort ignoring case, compare numbers as numbers + + return arg1~sort + end + else if order="D" then -- sort descendingly + do + if arg1[1]~isA(.string) then -- string objects to sort? + return sort2(arg1, "D", "IN") -- sort ignoring case, compare numbers as numbers + + return arg1~sortWith(.DescendingComparator~new) + end + end + + + if arg2~isA(.Comparator) then -- o.k. a comparator given, use it + do + if argNr>3 then -- in this case a maximum of three args allowed + raise syntax 93.902 array (3) + + kind="A" -- default to ascending sort + if argNr=3 then -- a third argument given + do + kind=arg3~strip~left(1)~upper -- get first char in uppercase + if pos(kind, "AD")=0 then -- not a valid argument given! + raise syntax 93.914 array (3, "A, D", arg3) + end + + if kind="A" then -- sort ascendingly + return arg1~sortWith(arg2) + else + return arg1~sortWith(.InvertingComparator~new(arg2)) + end + + if datatype(arg2,"W") | arg2~isA(.OrderedCollection) | arg2~isA(.Supplier) then + do + if arg2~isA(.Collection) | arg2~isA(.Supplier) then -- a collection indicating positions, lengths, type of sort + do + if argNr>2 then -- in this case only two arguments allowed! + raise syntax 93.902 array (2) + end + else -- argument is a number, hence interpreted as a starting column + do + arg2=arg(2,"Array") -- turn all args into an array collection + end + + -- use a StringColumnComparator for sorting + return arg1~sortWith(.StringColumnComparator~new(arg2)) + end + + -- ---rgf, 2008-03-27: allow message(s) as arguments + if arg2~isA(.string) then -- check whether "M"essage argument given + do + if arg2~strip~left(1)~upper="M" then + do + if argNr=3 then -- single argument follows + comparator=.MessageComparator~new(arg3) + else -- turn remaining args into an array object + comparator=.MessageComparator~new(arg(3,"Array")) + + return arg1~sortWith(comparator) + end + end + + -- o.k. now use ".StringComparator" for sorting ("CIN") + if argNr>3 then -- in this case only three args allowed at most + raise syntax 93.902 array (3) + + if argNr=2 then -- let .StringComparator deal with the args + return arg1~sortWith(.StringComparator~new(arg2)) + else + return arg1~sortWith(.StringComparator~new(arg2, arg3)) + +syntax: raise propagate + + + + + +/* + usage: stableSort2(array [,A|D][,][C|I|N]) + stableSort2(array, comparator [,A|D]) + + A|D ... Ascending (default) | Descending + C|I|N ... respect Case | Ignore case (default) | Numeric (Rexx-style numbers) + +------------ + stableSort2(array) ... sort() + + stableSort2(array, comparator[,"A|D"]) ... sortWith(comparator) + + stableSort2(array, collection) ... sortWith(.StringColumnComparator(...)) + stableSort2(array, n, ...) + + stableSort2(array, ["A|D"][,"C|I|N"]) ... sortWith(.StringComparator) + stableSort2(array, "[A[scending]|D[escending]][",C[aseDependent]|I[gnoreCase]|N[umeric]"]) + stableSort2(array, "A[C|I|N] | D[C|I|N]"...) + + stableSort2(array, "M[essages]", message...) ... sortWith(.MessageComparator(...)) + stableSort2(array, "M[essages]", arrayOfMessages...) + +*/ +::method "stableSort2" + use strict arg arg1, arg2="A", arg3="I", ... + + signal on syntax + + if \arg1~isA(.array) then + do + if \arg1~hasMethod("makeArray") then + raise syntax 93.948 array (1, "Array (or a class with a method 'MAKEARRAY')") + arg1=arg1~makeArray -- get the array that represents the collection + end + + argNr=arg() -- get number of args + if argNr=1 then -- default sort as only array collection is given + do + if arg1[1]~isA(.string) then -- string objects to sort? + return stableSort2(arg1, "A", "N") -- sort decimal numerically and caselessly + + return arg1~stableSort -- sort without any assumptions + end + + -- two arguments only, if strings to sort default to "IN" (case-independent, numeric) + if argNr=2, arg2~isA(.string) then -- if a descending sort + do + order=arg2~strip~left(1)~upper -- extract first letter in capital + if order="A" then -- sort ascendingly + do + if arg1[1]~isA(.string) then -- string objects to sort? + return stableSort2(arg1, "A", "IN") -- sort ignoring case, compare numbers as numbers + + return arg1~stableSort + end + else if order="D" then -- sort descendingly + do + if arg1[1]~isA(.string) then -- string objects to sort? + return stableSort2(arg1, "D", "IN") -- sort ignoring case, compare numbers as numbers + + return arg1~stableSortWith(.DescendingComparator~new) + end + end + + + if arg2~isA(.Comparator) then -- o.k. a comparator given, use it + do + if argNr>3 then -- in this case a maximum of three args allowed + raise syntax 93.902 array (3) + + kind="A" -- default to ascending sort + if argNr=3 then -- a third argument given + do + kind=arg3~strip~left(1)~upper -- get first char in uppercase + if pos(kind, "AD")=0 then -- not a valid argument given! + raise syntax 93.914 array (3, "A, D", arg3) + end + + if kind="A" then -- sort ascendingly + return arg1~stableSortWith(arg2) + else + return arg1~stableSortWith(.InvertingComparator~new(arg2)) + end + + if datatype(arg2,"W") | arg2~isA(.OrderedCollection) | arg2~isA(.Supplier) then + do + if arg2~isA(.Collection) | arg2~isA(.Supplier) then -- a collection indicating positions, lengths, type of sort + do + if argNr>2 then -- in this case only two arguments allowed! + raise syntax 93.902 array (2) + end + else -- argument is a number, hence interpreted as a starting column + do + arg2=arg(2,"Array") -- turn all args into an array collection + end + + -- use a StringColumnComparator for sorting + return arg1~stableSortWith(.StringColumnComparator~new(arg2)) + end + + -- ---rgf, 2008-03-27: allow message(s) as arguments + if arg2~isA(.string) then -- check whether "M"essage argument given + do + if arg2~strip~left(1)~upper="M" then + do + if argNr=3 then -- single argument follows + comparator=.MessageComparator~new(arg3) + else -- turn remaining args into an array object + comparator=.MessageComparator~new(arg(3,"Array")) + + return arg1~stableSortWith(comparator) + end + end + + -- o.k. now use ".StringComparator" for sorting ("CIN") + if argNr>3 then -- in this case only three args allowed at most + raise syntax 93.902 array (3) + + if argNr=2 then -- let .StringComparator deal with the args + return arg1~stableSortWith(.StringComparator~new(arg2)) + else + return arg1~stableSortWith(.StringComparator~new(arg2, arg3)) + +syntax: raise propagate + + + + + + + -- 2008-03-14, rgf: subChar2(string,n-pos) + /* if length is negative, then position from right (end of string) */ + --> ATTENTION: if beyond start, prepend appropriate length pad-filled ! +/* ======================================================================= */ +::method "subchar2" + use strict arg arg1, arg2 -- make sure we have at least one arg + parse arg arg1, arg2 + + argNr=arg() -- get maximum number of arguments + maxArgs=2 + + signal on syntax + if argNr<>maxArgs then -- not correct amount of arguments ? + do + if argNr<maxArgs then + raise syntax 93.901 array (2) + else + raise syntax 93.902 array (2) + end + + + len1=length(arg1) -- get length of string + + if datatype(arg2,"W") then + do + if arg2<0 then -- negative, start from right + do + arg2=len1+arg2+1 -- calc starting position + if arg2<1 then -- beyond string, return empty string (i.e. no char) + return "" + end + + if arg2=0 then + raise syntax 93.924 array (arg2) + else if arg2>len1 then-- beyond string, return empty string (i.e. no char) + return "" + end + else + do + raise syntax 93.905 array('2 ("start position")', arg2) + end + + -- now invoke the operation + return arg1~substr(arg2,1) -- return extracted char + +syntax: + raise propagate + + + + -- 2008-02-21, rgf: substr2(string [,[n-start] [, n-length]] [,pad]) + /* if length is negative, then */ + --> ATTENTION: if beyond start, prepend appropriate length pad-filled ! +/* ======================================================================= */ +::method "substr2" + use strict arg arg1, ... -- make sure we have at least one arg + parse arg ., arg2, arg3, arg4 + + argNr=arg() -- get maximum number of arguments + BIFpos=4 -- last classic BIF argument position + maxArgs=4 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="substr" -- base name for the message to send + + len1=length(arg1) -- get length of string + newArr=.array~new -- create new array for the arguments + + prepend="" -- optional prepend string (if positioning before start!) + + arg2ori=arg2 -- save passed-in value, if any + if arg4=="" then arg4=" "-- define blank as the default pad char + + if arg(2,"Exists") then -- start + do + if datatype(arg2,"W") then + do + if arg2<0 then -- negative, start from right + do + tmp=len1+arg2+1 -- get starting position + if tmp<2 then -- start at first char + do + if tmp<0 then + prepend=copies(arg4, -tmp+1) -- create prepend-string + else if tmp=0 then -- fencepost + prepend=arg4 + + arg2=1 + end + else + arg2=tmp + end + end + else + do + raise syntax 93.905 array('2 ("start position")', arg2) + end + + newArr[1]=arg2 -- start position + end + + if arg(3,"Exists") then -- length + do + if datatype(arg3,"W") then + do + if arg3<0 then -- we need to move the starting point to the left! + do + tmp =arg2+arg3 -- subtract arg3 + + if tmp <1 then -- reset start to 1 + do + newArr[1]=1 -- substring from new pos "1" + if tmp <0 then -- create (new?) prepend string + prepend=prepend||copies(arg4, -tmp) -- create prepend-string + end + else -- new start pos + newArr[1]=tmp+1 + arg3=-arg3 -- turn it into a positive number + end + end + else + do + raise syntax 93.905 array('3 ("length")', arg3) + end + + newArr[2]=arg3 -- length + end + + if arg4<>"" then -- pad-char + newArr[3]=arg4 + + -- now invoke the operation + return .message~new(prepend||arg1, methName, "A", newArr)~send + +syntax: + raise propagate + +pp: + if arg(1)=.nil then return "" + else return "," arg(1) + + + + + -- 2008-03-14, rgf: +/* ======================================================================= */ +/* subWord2(string, start[, length]) + ... if no words, returns received string +*/ +::method "subWord2" -- allows negative start and length + use strict arg string, arg2, ... -- make sure we have at least two args + + parse arg string, arg2, arg3 + + argNr=arg() -- get maximum number of arguments + maxArgs=3 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="subWord" -- base name for the message to send + newArr=.array~new -- create new array for the arguments + + nrWords=words(string) -- calc # of words + + if \datatype(arg2, "W") then + raise syntax 93.905 array('2 ("starting word position")', arg3) + + newArr[1]=arg2 -- save starting pos + if arg2<0 then + do + tmp=nrWords+arg2+1 -- calc starting position from right + if tmp<1 then -- if before first word, start at first word + tmp=1 + newArr[1]=tmp -- save new starting position + end + + if arg(3,"Exists") then -- if given, process length argument + do + if \datatype(arg3, "W") then + raise syntax 93.905 array('3 ("number of words")', arg3) + + if arg3<0 then -- determine new starting position and number of words to delete + do + oldStart=newArr[1] -- save old starting position + tmp=oldStart+arg3+1 + if tmp<1 then -- oops, make sure we start at first word + tmp=1 + + newArr[1]=tmp -- new start position + newArr[2]=oldStart-tmp+1 -- length argument (nr of words to delete) + end + else + do + newArr[2]=arg3 -- length argument + end + end + + if nrWords=0 then -- nothing to do, return empty/spacy string + return string + + -- now invoke the operation + return .message~new(string, methName, "A", newArr)~send + +syntax: + raise propagate + + + -- 2008-02-21, rgf: upper2(string [,[n-start] [, n-length]]) + /* if length is negative, then */ +/* ======================================================================= */ +::method "upper2" + use strict arg arg1, ... -- make sure we have at least one arg + parse arg ., arg2, arg3 + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArgs=3 + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="upper" -- base name for the message to send + + len1=length(arg1) -- get length of string + newArr=.array~new -- create new array for the arguments + + if arg(2,"Exists") then -- start + do + if datatype(arg2,"W") then + do + if arg2<0 then -- negative, start from right + do + tmp=len1+arg2+1 -- get starting position + if tmp<2 then -- start at first char + arg2=1 + else + arg2=tmp + end + end + else + do + raise syntax 93.905 array('2 ("start position")', arg2) + end + + newArr[1]=arg2 -- start position + end + + if arg(3,"Exists") then -- length + do + if datatype(arg3,"W") then + do + if arg3<0 then -- we need to move the starting point to the left! + do + arg2=arg2+arg3+1 -- subtract arg3 + if arg2<1 then -- reset start to 1 + newArr[1]=1 + else -- new start pos + newArr[1]=arg2 + + arg3=-arg3 -- turn it into a positive number + end + end + else + do + raise syntax 93.905 array('3 ("length")', arg3) + end + + newArr[2]=arg3 -- length + end + + -- now invoke the operation + return .message~new(arg(1), methName, "A", newArr)~send + +syntax: + raise propagate + + + + -- 2008-03-14, rgf: +/* ======================================================================= */ +/* WORD2(string, pos) + ... if beyond string, then return empty string +*/ +::method "word2" -- extract and return word + use strict arg string, arg2 -- make sure we have at least one arg + + parse arg string, arg2 + + argNr=arg() -- get maximum number of arguments + maxArgs=2 + + methName="word" -- base name for the message to send + newArr=.array~new -- create new array for the arguments + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + if \datatype(arg2, "W") then + raise syntax 93.905 array("2 (position)", arg2) -- must be a number + + nrWords=words(string) -- get total number of words + newArr[1]=arg2 -- save position + + if arg2<0 then -- negative, position from right + do + tmp=nrWords+arg2+1 -- calc new position + if tmp<1 then -- beyond string, return empty string + return "" + newArr[1]=tmp -- save new position + end + -- now invoke the operation + return .message~new(string, methName, "A", newArr)~send + +syntax: + raise propagate + + + + + -- 2008-03-14, rgf: +/* ======================================================================= */ +/* WORDINDEX2(string, pos) + ... if beyond string, then return 0 +*/ +::method "wordIndex2" + use strict arg string, arg2 -- make sure we have at least one arg + + parse arg string, arg2 + + argNr=arg() -- get maximum number of arguments + maxArgs=2 + + methName="wordIndex" -- base name for the message to send + newArr=.array~new -- create new array for the arguments + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + if \datatype(arg2, "W") then + raise syntax 93.905 array("2 (position)", arg2) -- must be a number + + nrWords=words(string) -- get total number of words + newArr[1]=arg2 -- save position + + if arg2<0 then -- negative, position from right + do + tmp=nrWords+arg2+1 -- calc new position + if tmp<1 then -- beyond string, return empty string + return 0 + newArr[1]=tmp -- save new position + end + + -- now invoke the operation + return .message~new(string, methName, "A", newArr)~send + +syntax: + raise propagate + + + -- 2008-03-14, rgf: +/* ======================================================================= */ +/* WORDLENGTH2(string, position) + ... if beyond string, then return 0 +*/ +::method "wordLength2" + use strict arg string, arg2 -- make sure we have at least one arg + + parse arg string, arg2 + + argNr=arg() -- get maximum number of arguments + maxArgs=2 + + methName="wordLength" -- base name for the message to send + newArr=.array~new -- create new array for the arguments + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + if \datatype(arg2, "W") then + raise syntax 93.905 array("2 (position)", arg2) -- must be a number + + nrWords=words(string) -- get total number of words + newArr[1]=arg2 -- save position + + if arg2<0 then -- negative, position from right + do + tmp=nrWords+arg2+1 -- calc new position + if tmp<1 then -- beyond string, return empty string + return 0 + newArr[1]=tmp -- save new position + end + + -- now invoke the operation + return .message~new(string, methName, "A", newArr)~send + +syntax: + raise propagate + + + + + +/* ======================================================================= */ +/* + WORDPOS2(phrase,string[,start][,{C|I}]) +*/ +::method "wordPos2" + use strict arg arg1, arg2, arg3=1, ... + + argNr=arg() -- get maximum number of arguments + BIFpos=3 -- last classic BIF argument position + maxArgs=4 + newArr=.array~new -- create new array for the arguments + newArr[1]=arg1 -- save phrase (single or multiple word/s) to search + + signal on syntax + if argNr>maxArgs then -- too many arguments ? + raise syntax 93.902 array ("at most" maxArgs) + + methName="wordPos" -- base name for the message to send + + bCaseDependent =.false -- default to caseless version + if argNr>=BIFpos, \datatype(arg(argNr),"W") then + do + letter=arg(argNr)~strip~left(1)~upper + if pos(letter,"CI")=0 then -- illegal argument! + raise syntax 93.914 array (argNr, "C, I", arg(argNr)) + bCaseDependent=(letter="C") + argNr-=1 -- decrease one from total number of arguments + end + + if arg(3,"Exists"), datatype(arg3,"W") then + do + if arg3<0 then + do + tmp=words(arg2)+arg3+1 -- calc starting position from the right + if tmp<1 then -- beyond string, then start with first word! + tmp=1 + newArr[2]=tmp + end + else + do + newArr[2]=arg3 + end + end + + -- now invoke the operation + if bCaseDependent then + return .message~new(arg2, methName, "A", newArr)~send + else + return .message~new(arg2, "caseless"methName, "A", newArr)~send + +syntax: + raise propagate + + + +/* ---rgf, 2008-02-26 + + parseWords2(string[, reference=char-string[, kind="D"|"W"]] [, returnType="W"ords|"P"os) + + ... returns a one-dimensional array of words parsed from "string" or + a two-dimensional array of starting position and length of word + + string ... string from which words should be parsed + reference ... string of characters that delimit words or constitute words; + default value: " " ||2"09"x + + "d"elimiterChars|"W"ordChars ... "char-string" consists of all those characters + that either "D"elimit (default) or constitute "W"ords + + "W"ords|"P"os "W"ords (default) returns a single dimensional array of + the parsed words; "P"os returns a two-dimensional array of + positions of start-position (index "1") and length of parsed + word (index "2") +*/ + +::method "parseWords2" + use strict arg string, reference=(" "||"09"x), kind="D", returnType="W" + + signal on syntax + + .ArgUtil~validateClass("string", string, .string) -- check for correct type + .ArgUtil~validateClass("reference", reference, .string) -- check for correct type + .ArgUtil~validateClass("kind", kind , .string) -- check for correct type + + if kind<>"D" then -- not a default value + do + tmp=kind~strip~left(1)~upper + if pos(tmp, "DW")=0 then + raise syntax 93.914 array("'kind'", "D[elimiter] | W[ord-characters]", kind) + kind=tmp + end + + .ArgUtil~validateClass("returnType", returnType, .string) -- check for correct type + if returnType<>"W" then -- not a default value + do + tmp=returnType~strip~left(1)~upper + if pos(tmp, "WP")=0 then + raise syntax 93.914 array("'returnType'", "W[ords] | P[ositions]", returnType) + returnType=tmp + end + + if returnType="W" then -- single-dimensioned array of words + res=.array~new + else -- two-dimensional array of position and length + res=.array~new(0,0) + + maxLen=length(string) + pos=1 + endPos=0 + do i=1 while endpos<maxLen -- for 30 + + if kind="D" then -- words are space-delimited according to "reference" + do + if i=1 then -- first iteration? + pos =verify(string, reference, "Nomatch") -- find beginning of word + else + pos =verify(string, reference, "Nomatch", endPos) -- find beginning of word + + if pos=0 then -- no more words to find + leave + + endPos=verify(string, reference, "Match", pos) -- find next space (end of word) + if endPos=0 then -- last word, string ends with it + endPos=maxLen+1 + end + else -- "reference" defines the c... [truncated message content] |
From: <jfa...@us...> - 2010-05-02 23:45:40
|
Revision: 5870 http://oorexx.svn.sourceforge.net/oorexx/?rev=5870&view=rev Author: jfaucher Date: 2010-05-02 23:45:32 +0000 (Sun, 02 May 2010) Log Message: ----------- Starts thinking about Unicode support. Nothing concrete for the moment, just some reading material for possible discussions. Modified Paths: -------------- sandbox/jlf/_diary.txt Added Paths: ----------- sandbox/jlf/unicode/ sandbox/jlf/unicode/Encodings - Unicode - i18n.odt sandbox/jlf/unicode/_readme.odt sandbox/jlf/unicode/example of migration/ sandbox/jlf/unicode/example of migration/api/ sandbox/jlf/unicode/example of migration/api/conf_unix.h sandbox/jlf/unicode/example of migration/api/conf_win32.h sandbox/jlf/unicode/example of migration/api/conf_win32_unicode.h sandbox/jlf/unicode/example of migration/api/optio.h sandbox/jlf/unicode/example of migration/api/proce.h sandbox/jlf/unicode/example of migration/api/types.h sandbox/jlf/unicode/example of migration/api_impl/ sandbox/jlf/unicode/example of migration/api_impl/misc.cxx sandbox/jlf/unicode/example of migration/api_impl/optio.cxx sandbox/jlf/unicode/example of migration/api_impl/proce.cxx sandbox/jlf/unicode/example of migration/callbacks/ sandbox/jlf/unicode/example of migration/callbacks/demons.cxx sandbox/jlf/unicode/example of migration/migration notes.txt sandbox/jlf/unicode/example of migration/release notes.html sandbox/jlf/unicode/example of migration/stream/ sandbox/jlf/unicode/example of migration/stream/stream.cxx sandbox/jlf/unicode/example of migration/stream/stream.h sandbox/jlf/unicode/example of migration/win32/ sandbox/jlf/unicode/example of migration/win32/util.cxx sandbox/jlf/unicode/example of migration/win32/util.h sandbox/jlf/unicode/ooRexx/ sandbox/jlf/unicode/ooRexx/test unicode output.txt sandbox/jlf/unicode/ooRexx/test unicode.rex Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-05-02 23:08:57 UTC (rev 5869) +++ sandbox/jlf/_diary.txt 2010-05-02 23:45:32 UTC (rev 5870) @@ -26,7 +26,9 @@ Investigate the Activation stack (reify ? closure ? continuation ?) +Unicode ? + =============================================================================== 2010 april 28 Added: sandbox/jlf/unicode/Encodings - Unicode - i18n.odt =================================================================== (Binary files differ) Property changes on: sandbox/jlf/unicode/Encodings - Unicode - i18n.odt ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: sandbox/jlf/unicode/_readme.odt =================================================================== (Binary files differ) Property changes on: sandbox/jlf/unicode/_readme.odt ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: sandbox/jlf/unicode/example of migration/api/conf_unix.h =================================================================== --- sandbox/jlf/unicode/example of migration/api/conf_unix.h (rev 0) +++ sandbox/jlf/unicode/example of migration/api/conf_unix.h 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,8 @@ +/************************************************************************/ +/* Section: Unicode */ +/************************************************************************/ + +// Unicode not supported +// #define TOOL_UNICODE +// #define TOOL_WIDE_API + Property changes on: sandbox/jlf/unicode/example of migration/api/conf_unix.h ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/unicode/example of migration/api/conf_win32.h =================================================================== --- sandbox/jlf/unicode/example of migration/api/conf_win32.h (rev 0) +++ sandbox/jlf/unicode/example of migration/api/conf_win32.h 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,14 @@ +/************************************************************************/ +/* Section: Unicode */ +/************************************************************************/ + +// Unicode not supported +#ifdef TOOL_UNICODE +#error Byte char TOOL : The TOOL_UNICODE macro must not be defined +#endif + +// Wide API not supported +#ifdef TOOL_WIDE_API +#error Byte char TOOL : The TOOL_WIDE_API macro must not be defined +#endif + Property changes on: sandbox/jlf/unicode/example of migration/api/conf_win32.h ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/unicode/example of migration/api/conf_win32_unicode.h =================================================================== --- sandbox/jlf/unicode/example of migration/api/conf_win32_unicode.h (rev 0) +++ sandbox/jlf/unicode/example of migration/api/conf_win32_unicode.h 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,17 @@ +/************************************************************************/ +/* Section: Unicode */ +/************************************************************************/ + +#ifdef TOOL_NOT_UNICODE +#error Wide char tool : The TOOL_NOT_UNICODE macro must not be defined +#endif + +// The strings handled internally are UTF16 strings +#ifndef TOOL_UNICODE +#define TOOL_UNICODE +#endif + +// It's up to you to decide which API you want to use : +// - If you don't define TOOL_WIDE_API, the byte char API is used. +// - If you define TOOL_WIDE_API, the wide char API is used. + Property changes on: sandbox/jlf/unicode/example of migration/api/conf_win32_unicode.h ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/unicode/example of migration/api/optio.h =================================================================== --- sandbox/jlf/unicode/example of migration/api/optio.h (rev 0) +++ sandbox/jlf/unicode/example of migration/api/optio.h 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,67 @@ +TOOL_START_EXTERN_C + +/****************************************************************************/ +/* Section: Getting/Setting Fonts option Info */ +/****************************************************************************/ +extern GtCStringA TOOL_PUBLIC API_GetDefaultFontFaceA(); +extern GtCStringW TOOL_PUBLIC API_GetDefaultFontFaceW(); +#ifdef TOOL_WIDE_API +#define API_GetDefaultFontFace API_GetDefaultFontFaceW +#else +#define API_GetDefaultFontFace API_GetDefaultFontFaceA +#endif + +extern gtint32 TOOL_PUBLIC API_GetDefaultFontSize(); + +extern void TOOL_PUBLIC API_SetDefaultFontFaceA(GtCStringA face_nameA); +extern void TOOL_PUBLIC API_SetDefaultFontFaceW(GtCStringW face_nameW); +#ifdef TOOL_WIDE_API +#define API_SetDefaultFontFace API_SetDefaultFontFaceW +#else +#define API_SetDefaultFontFace API_SetDefaultFontFaceA +#endif + +extern void TOOL_PUBLIC API_SetDefaultFontSize(gtint32 size); + +extern GtCStringA TOOL_PUBLIC API_GetDefaultReportFontFaceA(); +extern GtCStringW TOOL_PUBLIC API_GetDefaultReportFontFaceW(); +#ifdef TOOL_WIDE_API +#define API_GetDefaultReportFontFace API_GetDefaultReportFontFaceW +#else +#define API_GetDefaultReportFontFace API_GetDefaultReportFontFaceA +#endif + +extern gtint32 TOOL_PUBLIC API_GetDefaultReportFontSize(); + +extern void TOOL_PUBLIC API_SetDefaultReportFontFaceA(GtCStringA face_nameA); +extern void TOOL_PUBLIC API_SetDefaultReportFontFaceW(GtCStringW face_nameW); +#ifdef TOOL_WIDE_API +#define API_SetDefaultReportFontFace API_SetDefaultReportFontFaceW +#else +#define API_SetDefaultReportFontFace API_SetDefaultReportFontFaceA +#endif + +extern void TOOL_PUBLIC API_SetDefaultReportFontSize(gtint32 size); + +extern GtCStringA TOOL_PUBLIC API_GetDefaultReportTitleFontFaceA(); +extern GtCStringW TOOL_PUBLIC API_GetDefaultReportTitleFontFaceW(); +#ifdef TOOL_WIDE_API +#define API_GetDefaultReportTitleFontFace API_GetDefaultReportTitleFontFace +#else +#define API_GetDefaultReportTitleFontFace API_GetDefaultReportTitleFontFace +#endif + +extern gtint32 TOOL_PUBLIC API_GetDefaultReportTitleFontSize(); + +extern void TOOL_PUBLIC API_SetDefaultReportTitleFontFaceA(GtCStringA face_nameA); +extern void TOOL_PUBLIC API_SetDefaultReportTitleFontFaceW(GtCStringW face_nameW); +#ifdef TOOL_WIDE_API +#define API_SetDefaultReportTitleFontFace API_SetDefaultReportTitleFontFaceW +#else +#define API_SetDefaultReportTitleFontFace API_SetDefaultReportTitleFontFaceA +#endif + +extern void TOOL_PUBLIC API_SetDefaultReportTitleFontSize(gtint32 size); + +TOOL_END_EXTERN_C + Property changes on: sandbox/jlf/unicode/example of migration/api/optio.h ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/unicode/example of migration/api/proce.h =================================================================== --- sandbox/jlf/unicode/example of migration/api/proce.h (rev 0) +++ sandbox/jlf/unicode/example of migration/api/proce.h 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,114 @@ +TOOL_START_EXTERN_C + +GtBool TOOL_PUBLIC API_InitA(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, int argc, gtcharA **argvA); +GtBool TOOL_PUBLIC API_InitW(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, int argc, gtcharW **argvW); +#ifdef TOOL_WIDE_API +#define API_Init API_InitW +#else +#define API_Init API_InitA +#endif + +GtBool TOOL_PUBLIC API_Init2A(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, GtBool light_exit, int argc, gtcharA **argvA); +GtBool TOOL_PUBLIC API_Init2W(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, GtBool light_exit, int argc, gtcharW **argvW); +#ifdef TOOL_WIDE_API +#define API_Init2 API_Init2W +#else +#define API_Init2 API_Init2A +#endif + + +GtBool TOOL_PUBLIC API_IsTOOLInitialized(); +GtBool TOOL_PUBLIC API_UseExceptionCatching(); + + +void TOOL_PUBLIC API_Exit(); +void TOOL_PUBLIC API_LightExit(); + +void TOOL_PUBLIC API_MainLoop(void); + +GtBool TOOL_PUBLIC API_SetFnMapA(GtCStringA moduleA, GtFunTableEntry *map); +GtBool TOOL_PUBLIC API_SetFnMapW(GtCStringW moduleW, GtFunTableEntry *map); +#ifdef TOOL_WIDE_API +#define API_SetFnMap API_SetFnMapW +#else +#define API_SetFnMap API_SetFnMapA +#endif + +void TOOL_PUBLIC API_SetErrorFnA(GtErrorFnA errorFnA); +void TOOL_PUBLIC API_SetErrorFnW(GtErrorFnW errorFnW); +#ifdef TOOL_WIDE_API +#define API_SetErrorFn API_SetErrorFnW +#else +#define API_SetErrorFn API_SetErrorFnA +#endif + +void TOOL_PUBLIC API_SetRWStatusFn(GtRWStatusFn rwStatusFn); +void TOOL_PUBLIC API_SetPopupStatusFn( GtPopupStatusFn popupStatusFn); +void TOOL_PUBLIC API_SetResizeableNodeCheckFn( GtResizeableNodeCheckFn ResizeableNodeCheckFn); + +GtBool TOOL_PUBLIC API_ExecProgramA(gtcharA **argvA); +GtBool TOOL_PUBLIC API_ExecProgramW(gtcharW **argvW); +#ifdef TOOL_WIDE_API +#define API_ExecProgram API_ExecProgramW +#else +#define API_ExecProgram API_ExecProgramA +#endif + +gtint32 TOOL_PUBLIC API_GetProfileStringA ( GtCStringA pszFileA , GtCStringA pszSectionA, GtCStringA pszEntryA, GtCStringA pszDefaultA, /* out */ GtStringA pszValueA, gtint16 cBufSize); +gtint32 TOOL_PUBLIC API_GetProfileStringW ( GtCStringW pszFileW , GtCStringW pszSectionW, GtCStringW pszEntryW, GtCStringW pszDefaultW, /* out */ GtStringW pszValueW, gtint16 cBufSize); +#ifdef TOOL_WIDE_API +#define API_GetProfileString API_GetProfileStringW +#else +#define API_GetProfileString API_GetProfileStringA +#endif + +void TOOL_PUBLIC API_WriteProfileStringA ( GtCStringA pszFileA , GtCStringA pszSectionA, GtCStringA pszEntryA, GtCStringA pszValueA); +void TOOL_PUBLIC API_WriteProfileStringW ( GtCStringW pszFileW , GtCStringW pszSectionW, GtCStringW pszEntryW, GtCStringW pszValueW); +#ifdef TOOL_WIDE_API +#define API_WriteProfileString API_WriteProfileStringW +#else +#define API_WriteProfileString API_WriteProfileStringA +#endif + +void API_PreInit(GtHwnd topLevelHwnd, GtHwnd wnd) ; + + +/*HWND*/ GtHwnd TOOL_PUBLIC API_GetGlobalHwnd(void) ; + +GtBool TOOL_PUBLIC API_IsSilentMode(); +GtBool TOOL_PUBLIC API_SetSilentMode(GtBool mode); // Returns the previous value + +GtCStringW TOOL_PUBLIC API_GetGt40PathW(void); +GtCStringA TOOL_PUBLIC API_GetGt40PathA(void); +#ifdef TOOL_WIDE_API +#define API_GetGt40Path API_GetGt40PathW +#else +#define API_GetGt40Path API_GetGt40PathA +#endif + + +// For CJK. +// The functions here work on system fonts, whereas the functions in optio.h work on logical fonts. +// Typically, the system font you select with API_SetDefaultSystemFont is assigned to the logical font "Helvetica". +// When you open the dialog box "Property Style" and select "Helvetica", you select the system font specified with API_SetDefaultSystemFont. +// If you select a font like "Arial Unicode MS" then you will see the CJK characters in TOOL... + +GtCStringW TOOL_PUBLIC API_GetDefaultSystemFontW(); +GtCStringA TOOL_PUBLIC API_GetDefaultSystemFontA(); +#ifdef TOOL_WIDE_API +#define API_GetDefaultSystemFont API_GetDefaultSystemFontW +#else +#define API_GetDefaultSystemFont API_GetDefaultSystemFontA +#endif + +GtCStringW TOOL_PUBLIC API_SetDefaultSystemFontW(GtCStringW fontnameW); +GtCStringA TOOL_PUBLIC API_SetDefaultSystemFontA(GtCStringA fontnameA); +#ifdef TOOL_WIDE_API +#define API_SetDefaultSystemFont API_SetDefaultSystemFontW +#else +#define API_SetDefaultSystemFont API_SetDefaultSystemFontA +#endif + + +TOOL_END_EXTERN_C + Property changes on: sandbox/jlf/unicode/example of migration/api/proce.h ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/unicode/example of migration/api/types.h =================================================================== --- sandbox/jlf/unicode/example of migration/api/types.h (rev 0) +++ sandbox/jlf/unicode/example of migration/api/types.h 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,82 @@ +#include <conf.h> + +/************************************************************************/ +/* Section: Atomic datatypes */ +/************************************************************************/ +#if defined(_TOOL_OS_WIN32) + +#define _TOOL_OS_WIN + +typedef char gtcharA; +typedef unsigned short gtcharW; + +#else /* Unix */ + +typedef char gtcharA; +typedef unsigned short gtcharW; + +#endif /* Unix */ + + +#ifdef TOOL_WIDE_API +#define gtchar gtcharW +#else +#define gtchar gtcharA +#endif + +// Can be either [multi-]byte (if UNICODE *NOT* defined) or Unicode (if UNICODE defined) +typedef gtchar * GtString; +typedef const gtchar * GtCString; + +// Always [multi-]byte +typedef gtcharA *GtStringA; +typedef const gtcharA *GtCStringA; + +// Always Unicode +typedef gtcharW *GtStringW; +typedef const gtcharW *GtCStringW; + +// Conversion [multi-]byte <--> Unicode +// The following functions depend on the code page selected using API_SetCodePage +extern GtBool TOOL_PUBLIC API_StringA2W(GtCStringA pszA, GtStringW *ppszW); +extern GtBool TOOL_PUBLIC API_StringW2A(GtCStringW pszW, GtStringA *ppszA); + +// Code page selection to indicate how to interpret the [multi-]byte strings +// You must use values that can be passed to system functions like WideCharToMultiByte, MultiByteToWideChar AND setlocale +// Code page examples : +// Symbol Value Meaning +// -------------------------------- +// CP_ACP 0 ANSI code page +// 1252 ANSI Latin 1 +// 28591 ISO 8859-1 Latin 1 +// CP_UTF7 65000 Unicode UTF-7 +// CP_UTF8 65001 Unicode UTF-8 +extern GtBool TOOL_PUBLIC API_SetCodePage(gtuint16 codepage); +extern gtuint16 TOOL_PUBLIC API_GetCodePage(); + +#define GTCHARCOUNT(X) (sizeof(X) / sizeof(gtchar)) + +// Returns GtTrue if wide char are used internally +extern GtBool TOOL_PUBLIC API_UseWideChar(); + +// Controls how the strings (the C strings, not the OBJ strings) are passed +// to/from the user functions that are called by name : +// - When the name of the function ends with 'A', strings are passed as byte chars +// - When the name of the function ends with 'W', strings are passed as wide chars +// - Otherwise, the type of the strings is indicated by API_UserFnIsWide(). +extern GtBool TOOL_PUBLIC API_UserFnIsWide(); // GtTrue ==> wide chars supported +extern GtBool TOOL_PUBLIC API_UserFnSetWide(GtBool b); // Returns the old value + + +/************************************************************************/ +/* Section: Complex datatypes */ +/************************************************************************/ + +typedef void (*GtErrorFnA)(GtCStringA); +typedef void (*GtErrorFnW)(GtCStringW); +#ifdef TOOL_WIDE_API +#define GtErrorFn GtErrorFnW +#else +#define GtErrorFn GtErrorFnA +#endif + Property changes on: sandbox/jlf/unicode/example of migration/api/types.h ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/unicode/example of migration/api_impl/misc.cxx =================================================================== --- sandbox/jlf/unicode/example of migration/api_impl/misc.cxx (rev 0) +++ sandbox/jlf/unicode/example of migration/api_impl/misc.cxx 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,62 @@ +/*****************************************************************************/ +/* Section: Conversion Functions */ +/*****************************************************************************/ + +static OBJ API_String_(GtCString psz) +{ + return String(psz); +} + +OBJ TOOL_PUBLIC API_StringA(GtCStringA pszA) +{ +#ifdef TOOL_UNICODE + GtString pszW; + GtBool done = GTA2W(pszA, &pszW); + + OBJ result = NIL; + if (done == GtTrue) result = API_String_(pszW); + + FreeMem(pszW, 0); + return result; +#else + return API_String_(pszA); +#endif +} + +#ifdef TOOL_UNICODE +OBJ TOOL_PUBLIC API_StringW(GtCStringW pszW) +{ + return API_String_(pszW); +} +#endif + +GtBool TOOL_PUBLIC API_StringA2W(GtCStringA pszA, GtStringW *ppszW) +{ + return GTA2W(pszA, ppszW); +} + +GtBool TOOL_PUBLIC API_StringW2A(GtCStringW pszW, GtStringA *ppszA) +{ + return GTW2A(pszW, ppszA); +} + +GtBool TOOL_PUBLIC API_UseWideChar() +{ +#ifdef TOOL_UNICODE + return GtTrue; +#else + return GtFalse; +#endif +} + +// With the byte version of tool, this value is stored but ignored when the user functions are called. +GtBool TOOL_PUBLIC API_UserFnSetWide(GtBool b) +{ + return UserFnSetWide(b); +} + +GtBool TOOL_PUBLIC API_UserFnIsWide() +{ + return UserFnIsWide(); +} + Added: sandbox/jlf/unicode/example of migration/api_impl/optio.cxx =================================================================== --- sandbox/jlf/unicode/example of migration/api_impl/optio.cxx (rev 0) +++ sandbox/jlf/unicode/example of migration/api_impl/optio.cxx 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,203 @@ +/****************************************************************************/ +/* Section: Getting/Setting Fonts option Info */ +/****************************************************************************/ +/* Default font Name and Size */ +static GtString API_GetDefaultFontFace_() +{ + return DefDefaultFontFace(); +} + +GtCStringA TOOL_PUBLIC API_GetDefaultFontFaceA() +{ +#ifdef TOOL_UNICODE + GtCStringW resultW = API_GetDefaultFontFace_(); + + GtCStringA resultA; + GtBool done = HGTW2A(resultW, &resultA); + if (done == GtTrue) + { + return resultA; + } + + return NULL; +#else + return API_GetDefaultFontFace_(); +#endif +} + +#ifdef TOOL_UNICODE +GtCStringW TOOL_PUBLIC API_GetDefaultFontFaceW() +{ + return API_GetDefaultFontFace_(); +} +#endif + +gtint32 TOOL_PUBLIC API_GetDefaultFontSize() +{ + return DefDefaultFontSize(); +} + +static void API_SetDefaultFontFace_(GtCString face_name) +{ + SetDefDefaultFontFace((UNJUSTIFIED GtString)face_name); +} + +void TOOL_PUBLIC API_SetDefaultFontFaceA(GtCStringA face_nameA) +{ +#ifdef TOOL_UNICODE + GtStringW face_nameW; + GtBool done = GTA2W(face_nameA, &face_nameW); + + if (done == GtTrue) API_SetDefaultFontFace_(face_nameW); + + FreeMem(face_nameW, 0); +#else + API_SetDefaultFontFace_(face_nameA); +#endif +} + +#ifdef TOOL_UNICODE +void TOOL_PUBLIC API_SetDefaultFontFaceW(GtCStringW face_nameW) +{ + API_SetDefaultFontFace_(face_nameW); +} +#endif + +void TOOL_PUBLIC API_SetDefaultFontSize(gtint32 size) +{ + SetDefDefaultFontSize(size); +} + +/* Reporter font Name and Size */ +static GtString API_GetDefaultReportFontFace_() +{ + return DefReportFontFace(); +} + +GtCStringA TOOL_PUBLIC API_GetDefaultReportFontFaceA() +{ +#ifdef TOOL_UNICODE + GtStringW resultW = API_GetDefaultReportFontFace_(); + + GtCStringA resultA; + GtBool done = HGTW2A(resultW, &resultA); + if (done == GtTrue) + { + return resultA; + } + + return NULL; +#else + return API_GetDefaultReportFontFace_(); +#endif +} + +#ifdef TOOL_UNICODE +GtCStringW TOOL_PUBLIC API_GetDefaultReportFontFaceW() +{ + return API_GetDefaultReportFontFace_(); +} +#endif + +gtint32 TOOL_PUBLIC API_GetDefaultReportFontSize() +{ + return DefReportFontSize(); +} + +static void API_SetDefaultReportFontFace_(GtCString face_name) +{ + SetDefReportFontFace((UNJUSTIFIED GtString)face_name); +} + +void TOOL_PUBLIC API_SetDefaultReportFontFaceA(GtCStringA face_nameA) +{ +#ifdef TOOL_UNICODE + GtStringW face_nameW; + GtBool done = GTA2W(face_nameA, &face_nameW); + + if (done == GtTrue) API_SetDefaultReportFontFace_(face_nameW); + + FreeMem(face_nameW, 0); +#else + API_SetDefaultReportFontFace_(face_nameA); +#endif +} + +#ifdef TOOL_UNICODE +void TOOL_PUBLIC API_SetDefaultReportFontFaceW(GtCStringW face_nameW) +{ + API_SetDefaultReportFontFace_(face_nameW); +} +#endif + +void TOOL_PUBLIC API_SetDefaultReportFontSize(gtint32 size) +{ + SetDefReportFontSize(size); +} + +/* Reporter Title font Name and Size */ +static GtString API_GetDefaultReportTitleFontFace_() +{ + return DefReportTitleFontFace(); +} + +GtCStringA TOOL_PUBLIC API_GetDefaultReportTitleFontFaceA() +{ +#ifdef TOOL_UNICODE + GtCStringW resultW = API_GetDefaultReportTitleFontFace_(); + + GtCStringA resultA; + GtBool done = HGTW2A(resultW, &resultA); + if (done == GtTrue) + { + return resultA; + } + return NULL; +#else + return API_GetDefaultReportTitleFontFace_(); +#endif +} + +#ifdef TOOL_UNICODE +GtCStringW TOOL_PUBLIC API_GetDefaultReportTitleFontFaceW() +{ + return API_GetDefaultReportTitleFontFace_(); +} +#endif + +gtint32 TOOL_PUBLIC API_GetDefaultReportTitleFontSize() +{ + return DefReportTitleFontSize(); +} + +static void API_SetDefaultReportTitleFontFace_(GtCString face_name) +{ + SetDefReportTitleFontFace((UNJUSTIFIED GtString)face_name); +} + +void TOOL_PUBLIC API_SetDefaultReportTitleFontFaceA(GtCStringA face_nameA) +{ +#ifdef TOOL_UNICODE + GtStringW face_nameW; + GtBool done = GTA2W(face_nameA, &face_nameW); + + if (done == GtTrue) API_SetDefaultReportTitleFontFace_(face_nameW); + + FreeMem(face_nameW, 0); +#else + API_SetDefaultReportTitleFontFace_(face_nameA); +#endif +} + +#ifdef TOOL_UNICODE +void TOOL_PUBLIC API_SetDefaultReportTitleFontFaceW(GtCStringW face_nameW) +{ + API_SetDefaultReportTitleFontFace_(face_nameW); +} +#endif + +void TOOL_PUBLIC API_SetDefaultReportTitleFontSize(gtint32 size) +{ + SetDefReportTitleFontSize(size); +} + Added: sandbox/jlf/unicode/example of migration/api_impl/proce.cxx =================================================================== --- sandbox/jlf/unicode/example of migration/api_impl/proce.cxx (rev 0) +++ sandbox/jlf/unicode/example of migration/api_impl/proce.cxx 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,534 @@ +/****************************************************************************/ +/* Section: Functions */ +/****************************************************************************/ +static GtBool API_Init_(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, int argc, gtchar ** argv) +{ + if (!ZSetInstanceContext(hInstance, hPrevInst, ctrlMainLoop)) + return GtFalse; + + gtint16 ret; + if (GtInitialize(&ret, argc, argv)) + return GtTrue; + else + return GtFalse; +} + +GtBool TOOL_PUBLIC API_InitA(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, int argc, gtcharA **argvA) +{ + UserFnSetWide(GtFalse); // By default, consider that the client functions don't support wide char strings. + +#ifdef TOOL_UNICODE + gtcharW **argvW = NULL; + if (argvA != NULL) + { + argvW = (gtcharW **)AllocMem(sizeof(gtcharW*) * argc); + if (argvW != NULL) + { + for (int i=0; i<argc; i++) + { + argvW[i] = NULL; + gtcharA *pszA = argvA[i]; + if (pszA != NULL) + { + gtcharW *pszW; + GtBool done = GTA2W(pszA, &pszW); + if (done == GtTrue) argvW[i] = pszW; + } + } + } + } + + GtBool result = API_Init_(hInstance, hPrevInst, ctrlMainLoop, argc, argvW); + + if (argvW != NULL) + { + for (int i=0; i<argc; i++) FreeMem(argvW[i], 0); + FreeMem(argvW, 0); + } + + return result; +#else + return API_Init_(hInstance, hPrevInst, ctrlMainLoop, argc, argvA); +#endif +} + +#ifdef TOOL_UNICODE +GtBool TOOL_PUBLIC API_InitW(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, int argc, gtcharW **argvW) +{ + UserFnSetWide(GtTrue); // By default, consider that the client functions support wide char strings. + return API_Init_(hInstance, hPrevInst, ctrlMainLoop, argc, argvW); +} +#endif + +static GtBool API_Init2_(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, GtBool light_exit, + int argc, gtchar ** argv) +{ + if (!ZSetInstanceContext(hInstance, hPrevInst, ctrlMainLoop)) + return GtFalse; + + GtSetLightExitFlag(light_exit); + + gtint16 ret; + if (GtInitialize(&ret, argc, argv)) + return GtTrue; + else + return GtFalse; +} + +GtBool TOOL_PUBLIC API_Init2A(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, GtBool light_exit, int argc, gtcharA **argvA) +{ + UserFnSetWide(GtFalse); // By default, consider that the client functions don't support wide char strings. + +#ifdef TOOL_UNICODE + gtcharW **argvW = NULL; + if (argvA != NULL) + { + argvW = (gtcharW **)AllocMem(sizeof(gtcharA*) * argc); + if (argvW != NULL) + { + for (int i=0; i<argc; i++) + { + argvW[i] = NULL; + gtcharA *pszA = argvA[i]; + if (pszA != NULL) + { + gtcharW *pszW; + GtBool done = GTA2W(pszA, &pszW); + if (done == GtTrue) argvW[i] = pszW; + } + } + } + } + + GtBool result = API_Init2_(hInstance, hPrevInst, ctrlMainLoop, light_exit, argc, argvW); + + if (argvW != NULL) + { + for (int i=0; i<argc; i++) FreeMem(argvW[i], 0); + FreeMem(argvW, 0); + } + + return result; +#else + return API_Init2_(hInstance, hPrevInst, ctrlMainLoop, light_exit, argc, argvA); +#endif +} + +#ifdef TOOL_UNICODE +GtBool TOOL_PUBLIC API_Init2W(gtuint32 hInstance, gtuint32 hPrevInst, GtBool ctrlMainLoop, GtBool light_exit, int argc, gtcharW **argvW) +{ + UserFnSetWide(GtTrue); // By default, consider that the client functions support wide char strings. + return API_Init2_(hInstance, hPrevInst, ctrlMainLoop, light_exit, argc, argvW); +} +#endif + + +void TOOL_PUBLIC API_PreInit(GtHwnd topLevelHwnd, GtHwnd wnd) +{ + GtSetTopLevelParentWindow(topLevelHwnd) ; + GtSetMDIWindow(wnd) ; +} + + +GtBool TOOL_PUBLIC API_UseExceptionCatching() +{ + return GtUseExceptionCatching(); +} + + +GtBool TOOL_PUBLIC API_IsTOOLInitialized() +{ + return GtIsTOOLInitialized(); +} + +void TOOL_PUBLIC API_Exit() +{ + GtExit(); +} + +void TOOL_PUBLIC API_LightExit() +{ + GtLightQuit(); +} + + +void TOOL_PUBLIC API_MainLoop(void) +{ + GtMainLoop(); +} + +static GtBool API_ExecProgram_(GtString *argv) +{ + return ExecProgram2(argv); // ??? This function does nothing... +} + +GtBool TOOL_PUBLIC API_ExecProgramA(gtcharA **argvA) +{ +#ifdef TOOL_UNICODE + // Don't know how to calculate the number of entries in argvA. + // I suppose that the first NULL pointer is the end marker... + gtcharW **argvW = NULL; + int argc = 0; + if (argvA != NULL) + { + while (argvA[argc] != NULL) argc++; + argvW = (gtcharW **)AllocMem(sizeof(gtcharA*) * (argc+1)); + if (argvW != NULL) + { + for (int i=0; i<argc; i++) + { + argvW[i] = NULL; + gtcharA *pszA = argvA[i]; + if (pszA != NULL) + { + gtcharW *pszW; + GtBool done = GTA2W(pszA, &pszW); + if (done == GtTrue) argvW[i] = pszW; + } + } + argvW[argc] = NULL; // The end marker + } + } + + GtBool result = API_ExecProgram_(argvW); + + if (argvW != NULL) + { + for (int i=0; i<argc; i++) FreeMem(argvW[i], 0); + FreeMem(argvW, 0); + } + + return result; +#else + return API_ExecProgram_(argvA); +#endif +} + +#ifdef TOOL_UNICODE +GtBool TOOL_PUBLIC API_ExecProgramW(gtcharW **argvW) +{ + return API_ExecProgram_(argvW); +} +#endif + +static GtBool API_SetFnMap_(GtCString module, GtFunTableEntry *map) +{ + return SetFnMap((UNJUSTIFIED GtString)module, (gtchar *)map); +} + +GtBool TOOL_PUBLIC API_SetFnMapA(GtCStringA moduleA, GtFunTableEntry *map) +{ +#ifdef TOOL_UNICODE + GtString moduleW; + GtBool done = GTA2W(moduleA, &moduleW); + + if (done == GtTrue) done = API_SetFnMap_(moduleW, map); + + FreeMem(moduleW, 0); + return done; +#else + return API_SetFnMap_(moduleA, map); +#endif +} + +#ifdef TOOL_UNICODE +GtBool TOOL_PUBLIC API_SetFnMapW(GtCStringW moduleW, GtFunTableEntry *map) +{ + return API_SetFnMap_(moduleW, map); +} +#endif + + +void TOOL_PUBLIC API_SetErrorFnA(GtErrorFnA errorFnA) +{ + GtSetErrorFnA(errorFnA); +} + + +#ifdef TOOL_UNICODE +void TOOL_PUBLIC API_SetErrorFnW(GtErrorFnW errorFnW) +{ + GtSetErrorFnW(errorFnW); +} +#endif + + +void TOOL_PUBLIC API_SetRWStatusFn(GtRWStatusFn rwStatusFn) +{ + GtSetRWStatusFn(rwStatusFn); +} + + +void API_SetPopupStatusFn( GtPopupStatusFn popupStatusFn) +{ + GtSetPopupStatusFn( popupStatusFn) ; +} + +extern "C" void API_SetResizeableNodeCheckFn( GtResizeableNodeCheckFn ResizeableNodeCheckFn) +{ + GtSetResizeableNodeCheckFn( ResizeableNodeCheckFn) ; +} + +GtTranslationFnA TOOL_PUBLIC API_SetTranslationFnA(GtTranslationFnA translationFnA) +{ + GtTranslationFnA currentFnA = GtGetTranslationFnA(); + GtSetTranslationFnA(translationFnA); + return currentFnA; +} + + +#ifdef TOOL_UNICODE +GtTranslationFnW TOOL_PUBLIC API_SetTranslationFnW(GtTranslationFnW translationFnW) +{ + GtTranslationFnW currentFnW = GtGetTranslationFnW(); + GtSetTranslationFnW(translationFnW); + return currentFnW; +} +#endif + + +static gtint32 TOOL_PUBLIC API_GetProfileString_ (const gtchar * pszFile , const gtchar * pszSection, const gtchar * pszEntry, const gtchar * pszDefault, gtchar * pszValue , gtint16 cBufSize) +{ +return GtGetProfileString ( (UNJUSTIFIED GtString)pszFile , (UNJUSTIFIED GtString)pszSection, (UNJUSTIFIED GtString)pszEntry, (UNJUSTIFIED GtString)pszDefault, pszValue , cBufSize); +} + +gtint32 TOOL_PUBLIC API_GetProfileStringA ( GtCStringA pszFileA , GtCStringA pszSectionA, GtCStringA pszEntryA, GtCStringA pszDefaultA, /* out */ GtStringA pszValueA, gtint16 cBufSize) +{ +#ifdef TOOL_UNICODE + GtStringW pszFileW; + GtBool done1 = GTA2W(pszFileA, &pszFileW); + + GtStringW pszSectionW; + GtBool done2 = GTA2W(pszSectionA, &pszSectionW); + + GtStringW pszEntryW; + GtBool done3 = GTA2W(pszEntryA, &pszEntryW); + + GtStringW pszDefaultW; + GtBool done4 = GTA2W(pszDefaultA, &pszDefaultW); + + // Must allocate a wide char buffer to ensure that we have enough room... + GtStringW pszValueW = NULL; + GtBool done5 = GtTrue; + if (pszValueA != NULL) + { + *pszValueA = '\0'; + pszValueW = (GtStringW) AllocMem(sizeof(gtcharW) * (cBufSize+1)); + if (pszValueW == NULL) done5 = GtFalse; + } + + gtint32 result = 0; + if (done1 == GtTrue && done2 == GtTrue && done3 == GtTrue && done4 == GtTrue && done5 == GtTrue) + { + result = API_GetProfileString_ ( pszFileW , pszSectionW, pszEntryW, pszDefaultW, pszValueW, cBufSize); + } + + if (result != 0 && pszValueA != NULL) + { + // The following post-conditions must be ensured : + // - The return value is the number of characters copied to the buffer, + // not including the terminating null character. + // - If neither lpAppName nor lpKeyName is NULL and the supplied destination buffer + // is too small to hold the requested string, the string is truncated and followed + // by a null character, and the return value is equal to nSize minus one. + // - If either lpAppName or lpKeyName is NULL and the supplied destination buffer is + // too small to hold all the strings, the last string is truncated and followed by + // two null characters. In this case, the return value is equal to nSize minus two. + + GtStringA tmpA; + // Note : pszValueW may contain one or two null characters at the end. + // They are not taken into account by GTW2A + GtBool done = GTW2A(pszValueW, &tmpA); + // The 8 bits buffer should be always big enough, but... + if (done == GtTrue && strlen(tmpA) < cBufSize) + { + memset(pszValueA, '\0', cBufSize); // Fill the buffer with null characters because this could be useful to fulfil the postconditions. + strcpy(pszValueA, tmpA); + // Normally, result should be always equal to strlen(tmpA), because result + // contains the number of chars, not the number of bytes... + result = strlen(tmpA); + } + else + { + result = 0; + } + FreeMem(tmpA, 0); + } + + FreeMem(pszValueW, 0); + FreeMem(pszDefaultW, 0); + FreeMem(pszEntryW, 0); + FreeMem(pszSectionW, 0); + FreeMem(pszFileW, 0); + + return result; +#else + return API_GetProfileString_ ( pszFileA , pszSectionA, pszEntryA, pszDefaultA, pszValueA, cBufSize); +#endif +} + +#ifdef TOOL_UNICODE +gtint32 TOOL_PUBLIC API_GetProfileStringW ( GtCStringW pszFileW , GtCStringW pszSectionW, GtCStringW pszEntryW, GtCStringW pszDefaultW, /* out */ GtStringW pszValueW, gtint16 cBufSize) +{ + return API_GetProfileString_ ( pszFileW , pszSectionW, pszEntryW, pszDefaultW, pszValueW, cBufSize); +} +#endif + +static void API_WriteProfileString_ ( const gtchar * pszFile , const gtchar * pszSection, const gtchar * pszEntry, const gtchar * pszValue) +{ +GtWriteProfileString ( (UNJUSTIFIED GtString)pszFile , (UNJUSTIFIED GtString)pszSection, (UNJUSTIFIED GtString)pszEntry, (UNJUSTIFIED GtString)pszValue); +} + +void TOOL_PUBLIC API_WriteProfileStringA ( GtCStringA pszFileA , GtCStringA pszSectionA, GtCStringA pszEntryA, GtCStringA pszValueA) +{ +#ifdef TOOL_UNICODE + GtStringW pszFileW; + GtBool done1 = GTA2W(pszFileA, &pszFileW); + + GtStringW pszSectionW; + GtBool done2 = GTA2W(pszSectionA, &pszSectionW); + + GtStringW pszEntryW; + GtBool done3 = GTA2W(pszEntryA, &pszEntryW); + + GtStringW pszValueW; + GtBool done4 = GTA2W(pszValueA, &pszValueW); + + if (done1 == GtTrue && done2 == GtTrue && done3 == GtTrue && done4 == GtTrue) + { + API_WriteProfileString_ ( pszFileW , pszSectionW, pszEntryW, pszValueW); + } + + FreeMem(pszValueW, 0); + FreeMem(pszEntryW, 0); + FreeMem(pszSectionW, 0); + FreeMem(pszFileW, 0); +#else + API_WriteProfileString_ ( pszFileA , pszSectionA, pszEntryA, pszValueA); +#endif +} + +#ifdef TOOL_UNICODE +void TOOL_PUBLIC API_WriteProfileStringW ( GtCStringW pszFileW , GtCStringW pszSectionW, GtCStringW pszEntryW, GtCStringW pszValueW) +{ + API_WriteProfileString_ ( pszFileW , pszSectionW, pszEntryW, pszValueW); +} +#endif + +GtHwnd TOOL_PUBLIC API_GetGlobalHwnd(void) +{ + return GtGetGlobalHwnd() ; +} + + +GtBool TOOL_PUBLIC API_IsSilentMode() +{ + return GtIsSilentMode(); +} + + +GtBool TOOL_PUBLIC API_SetSilentMode(GtBool mode) +{ + return GtSetSilentMode(mode); +} + + +static GtCString API_GetGt40Path_() +{ + return GetGt40Path(); +} + +GtCStringA TOOL_PUBLIC API_GetGt40PathA(void) +{ +#ifdef TOOL_UNICODE + GtCStringW resultW = API_GetGt40Path_(); + + GtCStringA resultA; + GtBool done = HGTW2A(resultW, &resultA); + if (done == GtTrue) + { + // Yes, returned as a GtCString, even if should be deleted... + // It's because of the signature of GetGt40Path which is const. + return resultA; + } + + return NULL; +#else + return API_GetGt40Path_(); +#endif +} + +#ifdef TOOL_UNICODE +GtCStringW TOOL_PUBLIC API_GetGt40PathW (void) +{ + return API_GetGt40Path_(); +} +#endif + + +static GtCString API_GetDefaultSystemFont_() +{ + return ZGetDefaultSystemFont(); +} + +GtCStringA TOOL_PUBLIC API_GetDefaultSystemFontA() +{ +#ifdef TOOL_UNICODE + GtCStringW resultW = API_GetDefaultSystemFont_(); + + GtCStringA resultA; + GtBool done = HGTW2A(resultW, &resultA); + if (done == GtTrue) + { + return resultA; + } + + return NULL; +#else + return API_GetDefaultSystemFont_(); +#endif +} + +#ifdef TOOL_UNICODE +GtCStringW TOOL_PUBLIC API_GetDefaultSystemFontW () +{ + return API_GetDefaultSystemFont_(); +} +#endif + + +static GtCString API_SetDefaultSystemFont_(GtCString fontname) +{ + return ZSetDefaultSystemFont(fontname); +} + +GtCStringA API_SetDefaultSystemFontA(GtCStringA fontnameA) +{ +#ifdef TOOL_UNICODE + GtStringW fontnameW; + GtBool done = GTA2W(fontnameA, &fontnameW); + + GtCStringW resultW = NULL; + if (done == GtTrue) resultW = API_SetDefaultSystemFont_(fontnameW); + + FreeMem(fontnameW, 0); + + GtCStringA resultA; + done = HGTW2A(resultW, &resultA); + if (done == GtTrue) + { + return resultA; + } + + return NULL; +#else + return API_SetDefaultSystemFont_(fontnameA); +#endif +} + +#ifdef TOOL_UNICODE +GtCStringW API_SetDefaultSystemFontW(GtCStringW fontnameW) +{ + return API_SetDefaultSystemFont_(fontnameW); +} +#endif Added: sandbox/jlf/unicode/example of migration/callbacks/demons.cxx =================================================================== --- sandbox/jlf/unicode/example of migration/callbacks/demons.cxx (rev 0) +++ sandbox/jlf/unicode/example of migration/callbacks/demons.cxx 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,89 @@ +/*****************************************************************************/ +/* Section: GtCase Default Callbacks */ +/*****************************************************************************/ + +/* Example, see below +#define BUFLEN 40 +static gtchar pszTitle [BUFLEN]; +static gtchar pszVersion [BUFLEN]; +static gtchar pszComments[BUFLEN]; +*/ + +/* CopyRight Info Callback */ +#ifdef TOOL_UNICODE +void GtdCpyWrtInfoW(GtStringW * title, GtStringW * version, GtStringW * comments) +#else +void GtdCpyWrtInfoA(GtStringA * title, GtStringA * version, GtStringA * comments) +#endif +{ +/* Example of customizing the banner + _tcscpy(pszTitle, _T("My CASE Tool")); + _tcscpy(pszVersion, _T("Version 1.0")); + _tcscpy(pszComments, _T("(c) 1996 Foo Bar Company")); + *title = pszTitle; + *version = pszVersion; + *comments = pszComments; +*/ + +/* set pointers to NULL when original TOOL banner is wanted. +*/ + *title = (GtString) 0; + *version = (GtString) 0; + *comments = (GtString) 0; +} + + +/* Installing Document Drivers */ +#ifdef TOOL_UNICODE +void TOOL_PUBLIC GtdDocInitW(gtint16 argc, GtStringW *argv) +{ + /* Register automatic documentation drivers */ +#ifdef _TOOL_OS_WIN + + GtDocRegisterW(_T("RTF"), _T("RTF"), _T("winword.exe"), RTFMethodsW()); + GtDocRegisterW(_T("HTML"), _T("HTML"), _T("mosaic.exe"), HTMLMethodsW()); + GtDocRegisterW(_T("ASCII"), _T("ASCII"), _T("notepad.exe"), ASCMethodsW()); + +#else + + GtDocRegister(_T("ASCII"), _T("ASCII"), _T("vi"), ASCMethods()); +// GtDocRegister("MIF", "MIF", "framemaker", MIFMethods()); + +#endif /* _TOOL_OS_WIN */ +} + +#else // Not TOOL_UNICODE + +void TOOL_PUBLIC GtdDocInitA(gtint16 argc, GtStringA *argv) +{ + /* Register automatic documentation drivers */ +#ifdef _TOOL_OS_WIN + + GtDocRegisterA(_T("RTF"), _T("RTF"), _T("winword.exe"), RTFMethodsA()); + GtDocRegisterA(_T("HTML"), _T("HTML"), _T("mosaic.exe"), HTMLMethodsA()); + GtDocRegisterA(_T("ASCII"), _T("ASCII"), _T("notepad.exe"), ASCMethodsA()); + +#else + + GtDocRegister(_T("ASCII"), _T("ASCII"), _T("vi"), ASCMethods()); +// GtDocRegister("MIF", "MIF", "framemaker", MIFMethods()); + +#endif /* _TOOL_OS_WIN */ +} +#endif // Not Unicode + + +/* General Initialization Function */ +#ifdef TOOL_UNICODE +void TOOL_PUBLIC GtdInitW(gtint16 argc, GtStringW *argv) +#else +void TOOL_PUBLIC GtdInitA(gtint16 argc, GtStringA *argv) +#endif +{ + gtchar buffer[6]; // true or false + ToolApi_GetProfileString(_T("tool.ini"), _T("Environment"), _T("TOOL_USERFN_WIDE"), _T(""), buffer, GTCHARCOUNT(buffer)); + if (_tcsicmp(buffer, _T("true")) == 0) ToolApi_UserFnSetWide(GtTrue); + if (_tcsicmp(buffer, _T("false")) == 0) ToolApi_UserFnSetWide(GtFalse); + + /* Put your initializations hereafter... */ +} Added: sandbox/jlf/unicode/example of migration/migration notes.txt =================================================================== --- sandbox/jlf/unicode/example of migration/migration notes.txt (rev 0) +++ sandbox/jlf/unicode/example of migration/migration notes.txt 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,178 @@ +================================================ +Unicode +================================================ + +New project : + Release & debug : General/Character Set : not set (don't select Unicode) + Release & debug : C/C++/Command Line : Add $(TOOL_UNICODE_FLAGS) dans additional options + Release & debug : Options = WIN32, _WINDOWS, _WIN32_WINNT=0x0400 + Release : D\xE9sactiver les optimisations + + +Beware when calling the function AllocMem ! It takes a byte's number as argument +so you must ALWAYS write : AllocMem(sizeof(_TCHAR) * (theSize)) + + +Beware when using sizeof ! The arguments passed to the string functions must be character's number, +not byte's number ! So write a code similar to that, which uses the macro GTCHARCOUNT : +_TCHAR buf[80]; +_tcsncpy(buf, string, GTCHARCOUNT(buf)); + + +Beware to printf and derived functions ! +The compiler does not generate warnings for the string arguments that are not declared with _T. +Consequence : you don't get the expected result because the 'format specification string' is not +interpreted correctly. + + +The API conversion functions in types.h : +extern GtBool TOOL_PUBLIC API_StringA2W(GtCStringA pszA, GtStringW *ppszW); +extern GtBool TOOL_PUBLIC API_StringW2A(GtCStringW pszW, GtStringA *ppszA); + + +The internal concersion functions : +#include "util.h" // GTA2W, GTW2A + GtStringA stringA; + GtBool done = GTW2A(string, &stringA); + ... + FreeMem(stringA, 0); + + GtStringW stringW; + GtBool done = GTA2W(string, &stringW); + ... + FreeMem(stringW, 0); + + +---------------------------------------------------------------------- +Old New Ansi Unicode +---------------------------------------------------------------------- +char gtchar char wchar_t +LPCSTR LPCTSTR LPCSTR LPCWSTR +LPSTR LPTSTR PSTR (LPSTR) PWSTR (LPWSTR) + +isalnum _istalnum isalnum iswalnum +isalpha _istalpha isalpha iswalpha +isascii _istascii isascii iswascii +iscntrl _istcntrl iscntrl iswcntrl +isdigit _istdigit isdigit iswdigit +isgraph _istgraph isgraph iswgraph +islower _istlower islower iswlower +isprint _istprint isprint iswprint +ispunct _istpunct ispunct iswpunct +isspace _istspace isspace iswspace +isupper _istupper isupper iswupper +isxdigit _istxdigit isxdigit iswxdigit + +atof _tstof atof _wtof +atoi _tstoi atoi _wtoi +atol _tstol _atol _wtol +_itoa _itot _itoa _itow + +_strdup _tcsdup _strdup _wcsdup +lstrcmp <auto> +lstrlen <auto> +strcat _tcscat strcat wcscat +strchr _tcschr strchr wcschr +strcmp _tcscmp strcmp wcscmp +strcmpi _tcsicmp _stricmp _wcsicmp +strcpy _tcscpy strcpy wcscpy +strcspn _tcscspn strcspn wcscspn +stricmp _tcsicmp _stricmp _wcsicmp +strlen _tcslen strlen wcslen +strlwr _tcslwr _strlwr _wcslwr +strncat _tcsncat strncat wcsncat +strncmp _tcsncmp strncmp wcsncmp +strncpy _tcsncpy strncpy wcsncpy +strnicmp _tcsnicmp _strnicmp _wcsnicmp +strpbrk ** _tcspbrk ** strpbrk wcspbrk BEWARE ! Replaced by gtstrpbrk +strrchr _tcsrchr strrchr wcsrchr +strspn _tcsspn strspn wcsspn +strstr _tcsstr strstr wcsstr +strtok _tcstok strtok wcstok +strupr _tcsupr _strupr _wcsupr + +fopen _tfopen fopen _wfopen +freopen _tfreopen freopen _wfreopen + +_snprintf _sntprintf _snprintf _snwprintf +fprintf _ftprintf fprintf fwprintf +fputc _fputtc fputc fputwc +fputchar _fputtchar _fputchar _fputwchar +fputs _fputts fputs fputws +printf _tprintf printf wprintf +putc _puttc putc putwc +putchar _puttchar putchar putwchar +puts _putts puts _putws +sprintf _stprintf sprintf swprintf -->wsprintf +vfprintf _vftprintf vfprintf vfwprintf +vsprintf _vstprintf vsprintf vswprintf -->wvsprintf +wsprintf <auto> +wvsprintf <auto> + +EOF _TEOF EOF WEOF + +fgetc _fgettc fgetc fgetwc +fgets _fgetts fgets fgetws +getc _gettc getc getwc +gets _getts gets _getws +ungetc _ungettc ungetc ungetwc + +_access _taccess _access _waccess +_chdir _tchdir _chdir _wchdir +_chmod _tchmod _chmod _wchmode +_finddata_t _tfinddata_t _finddata_t _wfinddata_t +_findfirst _tfindfirst _findfirst _wfindfirst +_findnext _tfindnext _findnext _wfindnext +_fullpath _tfullpath _fullpath _wfullpath +_getcwd _tgetcwd _getcwd _wgetcwd +_makepath _tmakepath _makepath _wmakepath +_mkdir _tmkdir _mkdir _wmkdir +_splitpath _tsplitpath _splitpath _wsplitpath +_stat _tstat _stat _wstat +_tempname _ttempnam _tempname _wtempnam +_unlink _tunlink _unlink _wunlink +mktemp _tmktemp _mktemp _wmktemp +remove _tremove remove _wremove +rename _trename rename _wrename + +getenv _tgetenv _tgetenv _wgetenv +setlocale _tsetlocale setlocale _wsetlocale + + +================================================ +Unicode : not supported +================================================ + +GetProcAddress : only ANSI... + + +================================================ +Windows Types +================================================ + +Ansi strings +CHAR 8-bit Windows (ANSI) character. +UCHAR Unsigned CHAR. +PCHAR Pointer to a CHAR. +PUCHAR Pointer to a UCHAR. +PSTR, LPSTR Pointer to a null-terminated string of 8-bit Windows (ANSI) characters. +PCSTR, LPCSTR Pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters. + +Unicode strings +WCHAR 16-bit Unicode character. +PWCHAR Pointer to a WCHAR. +PCWCH Pointer to a constant WCHAR. +PWSTR, LPWSTR Pointer to a null-terminated string of 16-bit Unicode characters. +PCWSTR, LPCWSTR Pointer to a constant null-terminated string of 16-bit Unicode characters. + +Ansi or Unicode strings +TCHAR, TBYTE A WCHAR if UNICODE is defined, a CHAR otherwise. +PTCHAR Pointer to a TCHAR. +PTSTR, LPTSTR PWSTR (LPWSTR) if UNICODE is defined, a PSTR (LPSTR) otherwise. +PCTSTR, LPCTSTR A PCWSTR (LPCTSTR) if UNICODE is defined, a PCSTR (LPCTSTR) otherwise. + +Other +VOID Any type. +PVOID Pointer to any type. +LPVOID Pointer to any type. +LPCVOID Pointer to a constant of any type. Property changes on: sandbox/jlf/unicode/example of migration/migration notes.txt ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/unicode/example of migration/release notes.html =================================================================== --- sandbox/jlf/unicode/example of migration/release notes.html (rev 0) +++ sandbox/jlf/unicode/example of migration/release notes.html 2010-05-02 23:45:32 UTC (rev 5870) @@ -0,0 +1,359 @@ +<html> + <head> + <style>.Comment { COLOR: green } + BODY { FONT-FAMILY: 'Times New Roman' } + .CodeArea { FONT-SIZE: x-small; FONT-FAMILY: 'Courier New'; BACKGROUND-COLOR: silver } + .Highlight { BACKGROUND-COLOR: yellow } + </style> + </head> + <body BGCOLOR="#ffffff"> + <p CLASS="Highlight">This is an example of migration to Unicode, using wide chars internally (UTF-16).</p> + <h3>Two versions of TOOL are available :</h3> + <h4>Version using byte characters internally (not Unicode) : + </h4> + <ul> + <li> + The A functions are used. + <li> + The user functions called by name (like demons, actions) receive byte + char strings. + <li> + The function <font FACE="Courier New" SIZE="2">API_UseWideChar</font> + returns GtFalse. + <li> + The macro <font FACE="Courier New" SIZE="2">TOOL_UNICODE</font> is not defined.</li> + </ul> + <h4>Version using wide characters internally (Unicode UTF-16) : + </h4> + <ul> + <li> + At compile-time, the API of the Unicode version is available in two modes : + <ul> + <li> + Mode byte char (when the macro <font FACE="Courier New" SIZE="2">TOOL_WIDE_API</font> + is not defined) : The A functions are used. + <li> + Mode wide char (when the macro <font FACE="Courier New" SIZE="2">TOOL_WIDE_API</font> + is defined) : The W functions are used.</li> + </ul> + <li> + The user functions called by name (like demons, actions) receive : + <ul> + <li> + Byte char strings if their name ends with 'A'. + <li> + Wide char strings if their name ends with 'W'. + <li> + If their name doesn't end with 'A' or 'W' then the function <font FACE="Courier New" SIZE="2"> + API_UserFnIsWide</font> indicates which kind of string is passed : Byte + char if <font FACE="Courier New" SIZE="2">API_UserFnIsWide</font> returns + GtFalse, or wide char if <font FACE="Courier New" SIZE="2">API_UserFnIsWide</font> + returns GtTrue. + <li> + By default, <font FACE="Courier New" SIZE="2">API_UserFnIsWide</font> returns : + <ul> + <li> + GtFalse if TOOL has been initialized using <font FACE="Courier New" SIZE="2">API_InitA</font> + or <font FACE="Courier New" SIZE="2">API_Init2A.</font> + <li> + GtTrue if TOOL has been initialized using <font FACE="Courier New" SIZE="2">API_InitW</font> + or <font FACE="Courier New" SIZE="2">API_Init2W.</font></li> + </ul> + <li> + You can change the value returned by <font FACE="Courier New" SIZE="2">API_UserFnIsWide</font> + by calling <font FACE="Courier New" SIZE="2">API_UserFnSetWide</font>. + <li> + In all cases, when a user function called by name receives + a size value which indicates the maximum size of a string buffer, this + size is expressed in characters count, *NOT* in byte count.</li> + </ul> + <li> + The function <font FACE="Courier New" SIZE="2">API_UseWideChar</font> + returns GtTrue. + <li> + The macro <font FACE="Courier New" SIZE="2">TOOL_UNICODE</font> is defined.</li> + </ul> + <h3>New API types :<font FACE="Courier New" SIZE="2"></h3> + <table CLASS="CodeArea" ID="Table3" CELLSPACING="1" CELLPADDING="1" WIDTH="100%" BORDER="0"> + <tr> + <td><p DIR="ltr" STYLE="MARGIN-RIGHT: 0px"><font FACE="Courier New" SIZE="2">typedef char <strong> + gtcharA</strong>; + <br> + typedef wchar_t <strong>gtcharW</strong>; + <br> + #ifdef TOOL_WIDE_API + <br> + #define <strong>gtchar</strong> gtcharW + <br> + #else + <br> + #define <strong>gtchar</strong> gtcharA + <br> + #endif + <br> + <br> + <span CLASS="Comment">// Can be either [multi-]byte (if TOOL_WIDE_API *NOT* + defined) or Unicode (if TOOL_WIDE_API defined)</span> + <br> + typedef gtchar * <strong>GtString</strong>; + <br> + typedef const gtchar * <strong>GtCString</strong>; + <br> + <br> + <span CLASS="Comment">// Always [multi-]byte</span> + <br> + typedef gtcharA *<strong>GtStringA</strong>; + <br> + typedef const gtcharA *<strong>GtCStringA</strong>; + <br> + <br> + <span CLASS="Comment">// Always Unicode</span> + <br> + typedef gtcharW *<strong>GtStringW</strong>; + <br> + typedef const gtcharW *<strong>GtCStringW</strong>; </font> + </p> + </td> + </tr> + </table> + </FONT> + <h3>New API functions + </h3> + <table CLASS="CodeArea" ID="Table4" CELLSPACING="1" CELLPADDING="1" WIDTH="100%" BORDER="0"> + <tr> + <td><ul> + <li> + <font FACE="Courier New" SIZE="2">GtBool API_StringA2W(GtCStringA pszA, + GtStringW *ppszW);</font> + <li> + <font FACE="Courier New" SIZE="2">GtBool API_StringW2A(GtCStringW pszW, + GtStringA *ppszA);</font> + <li> + <font FACE="Courier New" SIZE="2">GtBool API_SetCodePage(gtuint16 codepage); </font> + <li> + <font FACE="Courier New" SIZE="2">gtuint16 API_GetCodePage(); </font> + <li> + <font FACE="Courier New" SIZE="2">GtBool API_UseWideChar(); <span CLASS="Comment">// + Returns GtTrue if wide chars are used internally</span> </font> + <li> + <font FACE="Courier New" SIZE="2">GtBool API_UserFnIsWide(); <span CLASS="Comment">// + Returns GtTrue if the user functions called by name (like demons, + actions) receive wide chars</span> </font> + <li> + <font FACE="Courier New" SIZE="2">GtBool API_UserFnSetWide(GtBool b);</font></li> + </ul> + </td> + </tr> + </table> + <h3>New API macros :</h3> + <table CLASS="CodeArea" ID="Table5" CELLSPACING="1" CELLPADDING="1" WIDTH="100%" BORDER="0"> + <tr> + <td> <font FACE="Courier New" SIZE="2">#define GTCHARCOUNT(X) (sizeof(X) / + sizeof(gtchar))</font></td> + </tr> + </table> + <h3>API changes :</h3> + <ul> + <li> + The <font FACE="Courier New" SIZE="2">API_xxx</font> functions that take char* + arguments are now correctly declared with the const keyword when applicable. As + a consequence, you may have 'conversion loses qualifier' errors when + compiling legacy code.</li> + </ul> + <h3>Conversion [multi-]byte <--> wide characters + </h3> + <p>Two conversion strategies are used in the implementation : + <ul> + <li> + 1st case : Conversion of strings passed through the byte char API.<br> + The conversion is made using the TOOL functions <font FACE="Courier New" SIZE="2">API_StringA2W</font> + and <font FACE="Courier New" SIZE="2">API_StringW2A</font>. These functions call + respectively the system functions <font FACE="Courier New" SIZE="2">MultiByteToWideChar</font> and + <font FACE="Courier New" SIZE="2">WideCharToMultiByte</font> + whic... [truncated message content] |
From: <jfa...@us...> - 2010-05-09 22:46:26
|
Revision: 5929 http://oorexx.svn.sourceforge.net/oorexx/?rev=5929&view=rev Author: jfaucher Date: 2010-05-09 22:46:19 +0000 (Sun, 09 May 2010) Log Message: ----------- Added support for wide-chars in oodialog. Can build both char and wide-char DLL. Now must test and fix crashes... Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodResources.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodRoutines.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUser.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodialog.mak sandbox/jlf/trunk/makeorx.bat sandbox/jlf/trunk/orxdb.bat sandbox/jlf/trunk/platform/windows/buildorx.bat sandbox/jlf/unicode/_readme.odt sandbox/jlf/unicode/example of migration/migration notes.txt Added Paths: ----------- sandbox/jlf/trunk/extensions/platform/windows/oodialog/rxwchar.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/rxwchar.hpp Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/_diary.txt 2010-05-09 22:46:19 UTC (rev 5929) @@ -27,9 +27,46 @@ Investigate the Activation stack (reify ? closure ? continuation ?) Unicode ? +--> added support for wide-chars in oodialog. =============================================================================== +2010 may 9 + +Added support for wide-chars in oodialog. +Currently, the "A" Windows API is called, and the conversion occurs there, inside Windows, based on the current locale. +When compiling ooDialog with wide chars UTF-16, the "W" API is called directly, making the dialogs Unicode-enabled. +GTK+ uses UTF-8 internally. Most of the Unix-style operating systems use UTF-8 internally. +So it's natural to use multi-byte chars in ooRexx instead of wide chars, and to provide string services which supports UTF-8. +But the case of ooDialog is different : +This is a Windows-only sub-system, and for better integration with Windows, it must use UTF-16 chars internally. +The conversion to UTF-16 is under the responsability of ooDialog, which lets support code pages that are different +from the system's default code page. Typically, we can pass UTF-8 string to ooDialog which convert them to UTF-16 strings +before calling the Windows "W" API. + +By default, the byte-char configuration is built when buildling the whole interpreter : +makeorx DEBUG + +To build the byte-char configuration only, enter : +makeorx DEBUG oodialog +or +makeorx DEBUG oodialog "WCHAR=0" + + +To clean the byte-char configuration, enter : +makeorx DEBUG oodialog clean +or +makeorx DEBUG oodialog clean "WCHAR=0" + +To build the wide-char configuration, enter : +makeorx DEBUG oodialog "WCHAR=1" +The output files are generated in the subdirectory win32dbg\wchar + +To clean the wide-char configuration, enter : +makeorx DEBUG oodialog clean "WCHAR=1" + + +=============================================================================== 2010 april 28 rgf_util2 wrappers to make the services of Rony available as methods on predefined classes. Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-05-09 22:46:19 UTC (rev 5929) @@ -74,7 +74,7 @@ { if ( sub != NULL ) { - TCHAR buffer[128]; + char buffer[128]; _snprintf(buffer, sizeof(buffer), msg, sub); systemServiceException(context, buffer); } @@ -86,7 +86,7 @@ void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1, DWORD rc) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), msg, arg1, rc); systemServiceException(context, buffer); } @@ -98,7 +98,7 @@ void systemServiceExceptionComCode(RexxThreadContext *context, const char *msg, const char *arg1, HRESULT hr) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), msg, arg1, hr); systemServiceException(context, buffer); } @@ -133,7 +133,7 @@ */ void userDefinedMsgException(RexxThreadContext *c, int pos, CSTRING msg) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Argument %d %s", pos, msg); userDefinedMsgException(c, buffer); } @@ -174,7 +174,7 @@ */ RexxObjectPtr invalidTypeException(RexxThreadContext *c, size_t pos, const char *type) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Argument %d is not a valid%s", pos, type); userDefinedMsgException(c, buffer); return NULLOBJECT; @@ -182,7 +182,7 @@ void invalidImageException(RexxThreadContext *c, int pos, CSTRING type, CSTRING actual) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Argument %d must be a %s image; found %s", pos, type, actual); userDefinedMsgException(c, buffer); } @@ -202,7 +202,7 @@ */ void stringTooLongException(RexxThreadContext *c, int pos, size_t len, size_t realLen) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Argument %d must be less than %d characters in length; length is %d", pos, len, realLen); userDefinedMsgException(c, buffer); @@ -222,7 +222,7 @@ */ void numberTooSmallException(RexxThreadContext *c, int pos, int min, RexxObjectPtr actual) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Argument %d must be a whole number greater than %d; actual %s", pos, min, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); @@ -246,7 +246,7 @@ */ RexxObjectPtr notBooleanException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Argument %d must be true or false; found \"%s\"", pos, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); @@ -255,14 +255,14 @@ void wrongObjInArrayException(RexxThreadContext *c, size_t argPos, size_t index, CSTRING obj) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Argument %d is an array and index %d is not a %s", argPos, index, obj); userDefinedMsgException(c, buffer); } void wrongObjInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index, CSTRING needed, RexxObjectPtr actual) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Index, %s, of argument %d, must be %s; found \"%s\"", index, argPos, needed, c->ObjectToStringValue(actual)); @@ -271,7 +271,7 @@ void missingIndexInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Index, %s, of argument %d, is required", index, argPos); @@ -294,7 +294,7 @@ */ void wrongValueAtDirectoryIndexException(RexxThreadContext *c, size_t pos, CSTRING index, CSTRING list, RexxObjectPtr actual) { - TCHAR buffer[512]; + char buffer[512]; _snprintf(buffer, sizeof(buffer), "Index, %s, of argument %d, must be one of %s; found \"%s\"", index, pos, list, c->ObjectToStringValue(actual)); @@ -317,7 +317,7 @@ */ void directoryIndexException(RexxThreadContext *c, size_t pos, CSTRING index, CSTRING msg, RexxObjectPtr actual) { - TCHAR buffer[512]; + char buffer[512]; _snprintf(buffer, sizeof(buffer), "Index, %s, of argument %d, must be one of %s; found \"%s\"", index, pos, msg, c->ObjectToStringValue(actual)); @@ -326,14 +326,14 @@ void emptyArrayException(RexxThreadContext *c, int argPos) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Argument %d must be a non-empty array", argPos); userDefinedMsgException(c, buffer); } void sparseArrayException(RexxThreadContext *c, size_t argPos, size_t index) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "Argument %d must be a non-sparse array, index %d is missing", argPos, index); userDefinedMsgException(c, buffer); } @@ -391,7 +391,7 @@ */ void failedToRetrieveException(RexxThreadContext *c, CSTRING item, RexxObjectPtr source) { - TCHAR buf[128]; + char buf[128]; RexxObjectPtr name = c->SendMessage0(source, "OBJECTNAME"); _snprintf(buf, sizeof(buf), "Could not retrieve the %s information for %s", @@ -402,7 +402,7 @@ void nullObjectException(RexxThreadContext *c, CSTRING name, int pos) { - TCHAR buffer[256]; + char buffer[256]; if ( pos == 0 ) { _snprintf(buffer, sizeof(buffer), "The %s object must not be null", name); @@ -470,7 +470,7 @@ RexxObjectPtr wrongArgOptionException(RexxThreadContext *c, size_t pos, CSTRING list, CSTRING actual) { - TCHAR buffer[512]; + char buffer[512]; _snprintf(buffer, sizeof(buffer), "Method argument %d, option must be one of %s; found \"%s\"", pos, list, actual); userDefinedMsgException(c, buffer); return NULLOBJECT; Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls 2010-05-09 22:46:19 UTC (rev 5929) @@ -731,6 +731,8 @@ ::routine msSleep public external "LIBRARY oodialog msSleep_rtn" ::routine findWindow public external "LIBRARY oodialog findWindow_rtn" ::routine play public external "LIBRARY oodialog playSound_rtn" +::routine getCodePage public external "LIBRARY oodialog getCodePage_rtn" +::routine setCodePage public external "LIBRARY oodialog setCodePage_rtn" ::routine messageDialog public external "LIBRARY oodialog messageDialog_rtn" ::routine infoDialog public Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-05-09 22:46:19 UTC (rev 5929) @@ -140,7 +140,7 @@ goto err_out; } - adm->pMessageQueue = (char *)LocalAlloc(LPTR, MAXLENQUEUE); + adm->pMessageQueue = (rxcharT *)LocalAlloc(LPTR, MAXLENQUEUE); if ( adm->pMessageQueue == NULL ) { goto err_out; @@ -155,7 +155,7 @@ err_out: safeLocalFree(adm); adm = NULL; - MessageBox(0, "Out of system resources, memory allocation failed.", "ooDialog Error", + MessageBox(0, _T("Out of system resources, memory allocation failed."), _T("ooDialog Error"), MB_OK | MB_ICONHAND | MB_SYSTEMMODAL); outOfMemoryException(c->threadContext); @@ -247,15 +247,16 @@ if ( library != NULL ) { - dlgAdm->TheInstance = LoadLibrary(library); + RXCA2T(library); + dlgAdm->TheInstance = LoadLibrary(libraryT); if ( ! dlgAdm->TheInstance ) { - CHAR msg[256]; - sprintf(msg, - "Failed to load Dynamic Link Library (resource DLL.)\n" - " File name:\t\t\t%s\n" - " Windows System Error Code:\t%d\n", library, GetLastError()); - MessageBox(0, msg, "ooDialog DLL Load Error", MB_OK | MB_ICONHAND | MB_SYSTEMMODAL); + CHART msg[256]; + _stprintf(msg, + _T("Failed to load Dynamic Link Library (resource DLL.)\n") + _T(" File name:\t\t\t%s\n") + _T(" Windows System Error Code:\t%d\n"), library, GetLastError()); + MessageBox(0, msg, _T("ooDialog DLL Load Error"), MB_OK | MB_ICONHAND | MB_SYSTEMMODAL); return false; } } @@ -296,7 +297,7 @@ // Add this message, so PlainBaseDialog::handleMessages() knows that // PlainBaseDialog::finished() should be set. - addDialogMessage(MSG_TERMINATE, aDlg->pMessageQueue); + addDialogMessage(_T(MSG_TERMINATE), aDlg->pMessageQueue); if ( aDlg->LeaveDialog == 0 ) { @@ -1217,16 +1218,16 @@ bool doFast = false; HWND hwnd = getWBWindow(pCSelf); - if ( opts != NULL && StrStrI(opts, "FAST") != NULL ) + if ( opts != NULL && StrStrIA(opts, "FAST") != NULL ) { doFast = true; } if ( opts == NULL ) {type = 'N';} - else if ( StrStrI(opts, "NORMAL" ) != NULL ) {type = 'N';} - else if ( StrStrI(opts, "DEFAULT" ) != NULL ) {type = 'N';} - else if ( StrStrI(opts, "HIDE" ) != NULL ) {type = 'H';} - else if ( StrStrI(opts, "INACTIVE") != NULL ) + else if ( StrStrIA(opts, "NORMAL" ) != NULL ) {type = 'N';} + else if ( StrStrIA(opts, "DEFAULT" ) != NULL ) {type = 'N';} + else if ( StrStrIA(opts, "HIDE" ) != NULL ) {type = 'H';} + else if ( StrStrIA(opts, "INACTIVE") != NULL ) { if ( doFast ) { @@ -1376,7 +1377,8 @@ RexxMethod2(wholenumber_t, wb_setText, CSTRING, text, CSELF, pCSelf) { oodResetSysErrCode(context->threadContext); - if ( SetWindowText(getWBWindow(pCSelf), text) == 0 ) + RXCA2T(text); + if ( SetWindowText(getWBWindow(pCSelf), textT) == 0 ) { oodSetSysErrCode(context->threadContext); return 1; @@ -1396,6 +1398,7 @@ */ RexxMethod2(RexxObjectPtr, wb_getTextSizePx, CSTRING, text, CSELF, pCSelf) { + RXCA2T(text); SIZE size = {0}; HWND hwnd = wbSetUp(context, pCSelf); @@ -1404,7 +1407,7 @@ goto error_out; } - if ( ! textSizeFromWindow(context, text, &size, hwnd) ) + if ( ! textSizeFromWindow(context, textT, &size, hwnd) ) { goto error_out; } @@ -1462,6 +1465,8 @@ RexxMethod5(RexxObjectPtr, wb_getTextSizeScreen, CSTRING, text, OPTIONAL_CSTRING, type, OPTIONAL_CSTRING, fontSrc, OPTIONAL_uint32_t, fontSize, CSELF, pCSelf) { + RXCA2T(text); + RXCA2T(fontSrc); SIZE size = {0}; HWND hwnd = wbSetUp(context, pCSelf); @@ -1472,7 +1477,7 @@ if ( rxArgCount(context) == 1 ) { - if ( ! textSizeFromWindow(context, text, &size, hwnd) ) + if ( ! textSizeFromWindow(context, textT, &size, hwnd) ) { goto error_out; } @@ -1497,7 +1502,7 @@ { fontSize = DEFAULT_FONTSIZE; } - if ( ! textSizeIndirect(context, text, fontSrc, fontSize, &size, hwnd) ) + if ( ! textSizeIndirect(context, textT, fontSrcT, fontSize, &size, hwnd) ) { goto error_out; } @@ -1510,7 +1515,7 @@ invalidTypeException(context->threadContext, 3, " handle to a device context"); goto error_out; } - GetTextExtentPoint32(hdc, text, (int)strlen(text), &size); + GetTextExtentPoint32(hdc, textT, (int)_tcslen(textT), &size); } else if ( m == 'F' ) { @@ -1529,7 +1534,7 @@ } bool success = true; - if ( ! getTextExtent(hFont, hdc, text, &size) ) + if ( ! getTextExtent(hFont, hdc, textT, &size) ) { systemServiceExceptionCode(context->threadContext, API_FAILED_MSG, "GetTextExtentPoint32"); success = false; @@ -2154,7 +2159,7 @@ { pCPlainBaseDialogClass pcpbdc = (pCPlainBaseDialogClass)context->BufferData(buf); - strcpy(pcpbdc->fontName, DEFAULT_FONTNAME); + _tcscpy(pcpbdc->fontName, DEFAULT_FONTNAME); pcpbdc->fontSize = DEFAULT_FONTSIZE; context->SetObjectVariable("CSELF", buf); } @@ -2172,7 +2177,8 @@ } else { - strcpy(pcpbdc->fontName, fontName); + RXCA2T(fontName); + _tcscpy(pcpbdc->fontName, fontNameT); pcpbdc->fontSize = fontSize; } return NULLOBJECT; @@ -2181,7 +2187,9 @@ RexxMethod1(CSTRING, pbdlg_getFontName_cls, CSELF, pCSelf) { pCPlainBaseDialogClass pcpbdc = getPBDClass_CSelf(context); - return pcpbdc->fontName; + rxcharT *fontName = pcpbdc->fontName; + RXCT2A(fontName); + return fontNameT; } RexxMethod1(uint32_t, pbdlg_getFontSize_cls, CSELF, pCSelf) { @@ -2215,12 +2223,12 @@ if ( StoredDialogs >= MAXDIALOGS ) { - char buf[128]; - _snprintf(buf, sizeof(buf), - "The number of active dialogs has\n" - "reached the maximum (%d) allowed\n\n" - "No more dialogs can be instantiated", MAXDIALOGS); - MessageBox(NULL, buf, "ooDialog Error", MB_OK | MB_ICONHAND | MB_SYSTEMMODAL); + rxcharT buf[128]; + _sntprintf(buf, sizeof(buf), + _T("The number of active dialogs has\n") + _T("reached the maximum (%d) allowed\n\n") + _T("No more dialogs can be instantiated"), MAXDIALOGS); + MessageBox(NULL, buf, _T("ooDialog Error"), MB_OK | MB_ICONHAND | MB_SYSTEMMODAL); RexxClassObject proxyClass = rxGetContextClass(context, "DIALOGPROXY"); if ( proxyClass != NULLOBJECT ) @@ -2345,7 +2353,7 @@ // Set our default font to the PlainBaseDialog class default font. pCPlainBaseDialogClass pcpbdc = getPBDClass_CSelf(context); - strcpy(pcpbd->fontName, pcpbdc->fontName); + _tcscpy(pcpbd->fontName, pcpbdc->fontName); pcpbd->fontSize = pcpbdc->fontSize; // TODO at this point calculate the true dialog base units and set them into CPlainBaseDialog. @@ -2455,7 +2463,9 @@ RexxObjectPtr result; if ( *(method + 4) == 'N' ) { - result = context->String(((pCPlainBaseDialog)pCSelf)->fontName); + CSTRINGT fontName = ((pCPlainBaseDialog)pCSelf)->fontName; + RXCT2A(fontName); + result = context->String(fontNameT); } else { @@ -2474,7 +2484,8 @@ } else { - strcpy(((pCPlainBaseDialog)pCSelf)->fontName, name); + RXCA2T(name); + _tcscpy(((pCPlainBaseDialog)pCSelf)->fontName, nameT); } return NULLOBJECT; } @@ -2532,7 +2543,8 @@ { fontSize = DEFAULT_FONTSIZE; } - strcpy(pcpbd->fontName, fontName); + RXCA2T(fontName); + _tcscpy(pcpbd->fontName, fontNameT); pcpbd->fontSize = fontSize; // TODO at this point calculate the true dialog base units from the font @@ -2678,6 +2690,7 @@ */ RexxMethod2(RexxObjectPtr, pbdlg_getTextSizeDu, CSTRING, text, CSELF, pCSelf) { + RXCA2T(text); pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; HWND hDlg = pcpbd->hDlg; @@ -2719,7 +2732,7 @@ HFONT hOldFont = (HFONT)SelectObject(hdc, dlgFont); - GetTextExtentPoint32(hdc, text, (int)strlen(text), &textSize); + GetTextExtentPoint32(hdc, textT, (int)strlen(text), &textSize); screenToDlgUnit(hdc, (POINT *)&textSize, 1); SelectObject(hdc, hOldFont); @@ -2796,7 +2809,9 @@ } SIZE textSize = {0}; - if ( getTextSize(context, text, fontName, fontSize, hwndSrc, self, &textSize) ) + RXCA2T(text); + RXCA2T(fontName); + if ( getTextSize(context, textT, fontNameT, fontSize, hwndSrc, self, &textSize) ) { return rxNewSize(context, textSize.cx, textSize.cy); } @@ -2860,7 +2875,7 @@ break; case 'M' : - flag = (StrCmpNI("MIN", options, 3) == 0 ? 'M' : 'X'); + flag = (StrCmpNIA("MIN", options, 3) == 0 ? 'M' : 'X'); break; case 'H' : @@ -3043,7 +3058,8 @@ RexxMethod2(wholenumber_t, pbdlg_setWindowText, POINTERSTRING, hwnd, CSTRING, text) { oodResetSysErrCode(context->threadContext); - if ( SetWindowText((HWND)hwnd, text) == 0 ) + RXCA2T(text); + if ( SetWindowText((HWND)hwnd, textT) == 0 ) { oodSetSysErrCode(context->threadContext); return 1; @@ -3468,7 +3484,8 @@ HWND hCtrl = getPBDControlWindow(context, (pCPlainBaseDialog)pCSelf, rxID); if ( hCtrl != NULL ) { - if ( SetWindowText(hCtrl, text) == 0 ) + RXCA2T(text); + if ( SetWindowText(hCtrl, textT) == 0 ) { oodSetSysErrCode(context->threadContext); } @@ -3714,7 +3731,7 @@ { DIALOGADMIN *dlgAdm = getPBDDlgAdm(pCSelf); - char msg[256]; + rxcharT msg[256]; RexxStringObject result; bool peek = doPeek != 0 ? true : false; @@ -3726,7 +3743,8 @@ if ( dialogInAdminTable(dlgAdm) ) { getDlgMessage(dlgAdm, msg, peek); - result = context->String(msg); + RXCT2A(msg); + result = context->String(msgT); } else { @@ -3902,6 +3920,7 @@ */ RexxMethod4(int32_t, pbdlg_setControlData, RexxObjectPtr, rxID, CSTRING, data, NAME, msgName, CSELF, pCSelf) { + RXCA2T(data); pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; if ( pcpbd->hDlg == NULL ) { @@ -3917,7 +3936,7 @@ oodControl_t ctrlType = oodName2controlType(msgName + 3); - return setControlData(context, pcpbd, id, data, pcpbd->hDlg, ctrlType); + return setControlData(context, pcpbd, id, dataT, pcpbd->hDlg, ctrlType); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2010-05-09 22:46:19 UTC (rev 5929) @@ -48,6 +48,7 @@ #include <windows.h> #include "oorexxapi.h" +#include "rxwchar.hpp" #define MAXLENQUEUE 2056 #define NR_BUFFER 15 @@ -245,7 +246,7 @@ /* structures to manage the dialogs */ typedef struct { - PCHAR rexxMethod; + PCHART rexxMethod; WPARAM wParam; ULONG_PTR wpFilter; LPARAM lParam; @@ -283,7 +284,7 @@ typedef struct { ULONG iconID; - PCHAR fileName; + PCHART fileName; } ICONTABLEENTRY; typedef struct { @@ -366,11 +367,11 @@ } KEYFILTER, *PKEYFILTER; typedef struct { - PCHAR pMessageQueue; /* Message queue for method invocation */ + PCHART pMessageQueue; /* Message queue for method invocation */ BYTE key[COUNT_KEYPRESS_KEYS]; /* Value of key[x] is index to pMethods[] */ UINT usedMethods; /* Count of used slots in pMethods[] */ UINT topOfQ; /* Top of next free queue, 0 if empty */ - PCHAR pMethods[MAX_KEYPRESS_METHODS + 1]; /* Index 0 intentionally left empty */ + PCHART pMethods[MAX_KEYPRESS_METHODS + 1]; /* Index 0 intentionally left empty */ KEYFILTER *pFilters[MAX_KEYPRESS_METHODS + 1]; /* If null, no filter */ UINT nextFreeQ[MAX_KEYPRESS_METHODS]; /* Used only if existing connection removed */ } KEYPRESSDATA; @@ -404,7 +405,7 @@ KEYPRESSDATA *pKeyPressData; DWORD threadID; WPARAM StopScroll; - CHAR *pMessageQueue; + CHART *pMessageQueue; } DIALOGADMIN; Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp 2010-05-09 22:46:19 UTC (rev 5929) @@ -168,7 +168,7 @@ { HFONT oldFont = (HFONT)SelectObject(hdc, font); - char fontName[64]; + rxcharT fontName[64]; TEXTMETRIC tm; GetTextMetrics(hdc, &tm); @@ -176,7 +176,7 @@ long fontSize = MulDiv((tm.tmHeight - tm.tmInternalLeading), 72, GetDeviceCaps(hdc, LOGPIXELSY)); - strcpy(pcpbd->fontName, fontName); + _tcscpy(pcpbd->fontName, fontName); pcpbd->fontSize = fontSize; SelectObject(hdc, oldFont); @@ -486,15 +486,17 @@ if ( argumentExists(3) ) { - italic = StrStrI(fontStyle, "ITALIC" ) != NULL; - underline = StrStrI(fontStyle, "UNDERLINE") != NULL; - strikeout = StrStrI(fontStyle, "STRIKEOUT") != NULL; - weight = getWeight(fontStyle); + RXCA2T(fontStyle); + italic = StrStrI(fontStyleT, _T("ITALIC" )) != NULL; + underline = StrStrI(fontStyleT, _T("UNDERLINE")) != NULL; + strikeout = StrStrI(fontStyleT, _T("STRIKEOUT")) != NULL; + weight = getWeight(fontStyleT); } + RXCA2T(fontName); HFONT hFont = CreateFont(fontSize, fontWidth, 0, 0, weight, italic, underline, strikeout, DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, FF_DONTCARE, fontName); + DEFAULT_QUALITY, FF_DONTCARE, fontNameT); return hFont; } @@ -605,14 +607,16 @@ } } + { + RXCA2T(fontName); HFONT font = CreateFont(height, width, escapement, orientation, weight, italic, underline, strikeOut, - charSet, outputPrecision, clipPrecision, quality, pitchAndFamily, fontName); - + charSet, outputPrecision, clipPrecision, quality, pitchAndFamily, fontNameT); if ( font == NULL ) { oodSetSysErrCode(context->threadContext); } return font; + } error_out: return NULLOBJECT; @@ -932,7 +936,8 @@ { if ( hDC != NULL ) { - TextOut((HDC)hDC, xPos, yPos, text, (int)strlen(text)); + RXCA2T(text); + TextOut((HDC)hDC, xPos, yPos, textT, (int)_tcslen(textT)); return 0; } return 1; @@ -1315,7 +1320,11 @@ { return 1; } - return oodWriteToWindow(context, (HWND)hwnd, xPos, yPos, text, fontName, fontSize, fontStyle, fgColor, bkColor); + RXCA2T(text); + RXCA2T(fontName); + RXCA2T(fontStyle); + logical_t result = oodWriteToWindow(context, (HWND)hwnd, xPos, yPos, textT, fontNameT, fontSize, fontStyleT, fgColor, bkColor); + return result; } @@ -1811,7 +1820,7 @@ else { direction = AD_COUNTERCLOCKWISE; - if ( _direction != NULLOBJECT && StrStrI(_direction, "CLOCKWISE") != NULL ) + if ( _direction != NULLOBJECT && StrStrIA(_direction, "CLOCKWISE") != NULL ) { direction = AD_CLOCKWISE; } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp 2010-05-09 22:46:19 UTC (rev 5929) @@ -321,10 +321,10 @@ BUTTONTYPE getButtonInfo(HWND hwnd, PBUTTONSUBTYPE sub, DWORD *style) { - TCHAR buf[64]; + rxcharT buf[64]; BUTTONTYPE type = notButton; - if ( ! RealGetWindowClass(hwnd, buf, sizeof(buf)) || strcmp(buf, WC_BUTTON) ) + if ( ! RealGetWindowClass(hwnd, buf, sizeof(buf)) || _tcscmp(buf, WC_BUTTON) ) { if ( sub != NULL ) { @@ -468,6 +468,7 @@ RexxMethod2(RexxObjectPtr, bc_setState, CSTRING, opts, CSELF, pCSelf) { + RXCA2T(opts); HWND hwnd = ((pCDialogControl)pCSelf)->hCtrl; HWND hDlg = ((pCDialogControl)pCSelf)->hDlg; @@ -475,18 +476,18 @@ UINT msg = 0; WPARAM wp = 0; - char *token; - char *str = strdupupr(opts); + rxcharT *token; + rxcharT *str = strdupupr(optsT); if ( ! str ) { outOfMemoryException(context->threadContext); return NULLOBJECT; } - token = strtok(str, " "); + token = _tcstok(str, _T(" ")); while ( token != NULL ) { - if ( strcmp(token, "CHECKED") == 0 ) + if ( _tcscmp(token, _T("CHECKED")) == 0 ) { if ( (type == check || type == radio) ) { @@ -494,7 +495,7 @@ wp = (WPARAM)BST_CHECKED; } } - else if ( strcmp(token, "UNCHECKED") == 0 ) + else if ( _tcscmp(token, _T("UNCHECKED")) == 0 ) { if ( (type == check || type == radio) ) { @@ -502,7 +503,7 @@ wp = (WPARAM)BST_UNCHECKED; } } - else if ( strcmp(token, "INDETERMINATE") == 0 ) + else if ( _tcscmp(token, _T("INDETERMINATE")) == 0 ) { if ( type == check ) { @@ -510,24 +511,25 @@ wp = (WPARAM)BST_INDETERMINATE; } } - else if ( strcmp(token, "FOCUS") == 0 ) + else if ( _tcscmp(token, _T("FOCUS")) == 0 ) { msg = 0; SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)hwnd, TRUE); } - else if ( strcmp(token, "PUSHED") == 0 ) + else if ( _tcscmp(token, _T("PUSHED")) == 0 ) { msg = BM_SETSTATE; wp = (WPARAM)TRUE; } - else if ( strcmp(token, "NOTPUSHED") == 0 ) + else if ( _tcscmp(token, _T("NOTPUSHED")) == 0 ) { msg = BM_SETSTATE; wp = (WPARAM)FALSE; } else { - wrongArgValueException(context->threadContext, 1, BC_SETSTATE_OPTS, token); + RXCT2A(token); + wrongArgValueException(context->threadContext, 1, BC_SETSTATE_OPTS, tokenT); free(str); return NULLOBJECT; } @@ -537,7 +539,7 @@ SendMessage(hwnd, msg, wp, 0); msg = 0; } - token = strtok(NULL, " "); + token = _tcstok(NULL, _T(" ")); } safeFree(str); @@ -549,7 +551,7 @@ HWND hwnd = getDChCtrl(pCSelf); BUTTONTYPE type = getButtonInfo(hwnd, NULL, NULL); - TCHAR buf[64] = {'\0'}; + char buf[64] = {'\0'}; LRESULT l; if ( type == radio || type == check ) @@ -585,6 +587,7 @@ RexxMethod2(RexxObjectPtr, bc_setStyle, CSTRING, opts, CSELF, pCSelf) { + RXCA2T(opts); HWND hwnd = getDChCtrl(pCSelf); BUTTONSUBTYPE sub; @@ -604,25 +607,25 @@ oldTypeStyle = ((DWORD)GetWindowLong(hwnd, GWL_STYLE) & BS_TYPEMASK); typeStyle = oldTypeStyle; - char *token; - char *str = strdupupr(opts); + rxcharT *token; + rxcharT *str = strdupupr(optsT); if ( ! str ) { outOfMemoryException(context->threadContext); return NULLOBJECT; } - token = strtok(str, " "); + token = _tcstok(str, _T(" ")); while ( token != NULL ) { - if ( strcmp(token, "PUSHBOX") == 0 ) + if ( _tcscmp(token, _T("PUSHBOX")) == 0 ) { if ( type == push ) { typeStyle = BS_PUSHBOX; } } - else if ( strcmp(token, "DEFPUSHBUTTON") == 0 ) + else if ( _tcscmp(token, _T("DEFPUSHBUTTON")) == 0 ) { if ( type == push && sub != def ) { @@ -630,142 +633,143 @@ changeDefButton = true; } } - else if ( strcmp(token, "CHECKBOX") == 0 ) + else if ( _tcscmp(token, _T("CHECKBOX")) == 0 ) { if ( type == check ) { typeStyle = BS_CHECKBOX; } } - else if ( strcmp(token, "AUTOCHECKBOX") == 0 ) + else if ( _tcscmp(token, _T("AUTOCHECKBOX")) == 0 ) { if ( type == check ) { typeStyle = BS_AUTOCHECKBOX; } } - else if ( strcmp(token, "3STATE") == 0 ) + else if ( _tcscmp(token, _T("3STATE")) == 0 ) { if ( type == check ) { typeStyle = BS_3STATE; } } - else if ( strcmp(token, "AUTO3STATE") == 0 ) + else if ( _tcscmp(token, _T("AUTO3STATE")) == 0 ) { if ( type == check ) { typeStyle = BS_AUTO3STATE; } } - else if ( strcmp(token, "RADIO") == 0 ) + else if ( _tcscmp(token, _T("RADIO")) == 0 ) { if ( type == radio ) { typeStyle = BS_RADIOBUTTON; } } - else if ( strcmp(token, "AUTORADIO") == 0 ) + else if ( _tcscmp(token, _T("AUTORADIO")) == 0 ) { if ( type == radio ) { typeStyle = BS_AUTORADIOBUTTON; } } - else if ( strcmp(token, "GROUPBOX") == 0 || strcmp(token, "OWNERDRAW") == 0 ) + else if ( _tcscmp(token, _T("GROUPBOX")) == 0 || _tcscmp(token, _T("OWNERDRAW")) == 0 ) { ; // Ignored. } - else if ( strcmp(token, "LEFTTEXT") == 0 || strcmp(token, "RIGHTBUTTON") == 0 ) + else if ( _tcscmp(token, _T("LEFTTEXT")) == 0 || _tcscmp(token, _T("RIGHTBUTTON")) == 0 ) { style |= BS_LEFTTEXT; } - else if ( strcmp(token, "NOTLEFTTEXT") == 0 ) + else if ( _tcscmp(token, _T("NOTLEFTTEXT")) == 0 ) { style &= ~BS_LEFTTEXT; } - else if ( strcmp(token, "TEXT") == 0 ) + else if ( _tcscmp(token, _T("TEXT")) == 0 ) { style &= ~(BS_ICON | BS_BITMAP); } - else if ( strcmp(token, "ICON") == 0 ) + else if ( _tcscmp(token, _T("ICON")) == 0 ) { style = (style & ~BS_BITMAP) | BS_ICON; } - else if ( strcmp(token, "BITMAP") == 0 ) + else if ( _tcscmp(token, _T("BITMAP")) == 0 ) { style = (style & ~BS_ICON) | BS_BITMAP; } - else if ( strcmp(token, "LEFT") == 0 ) + else if ( _tcscmp(token, _T("LEFT")) == 0 ) { style = (style & ~BS_CENTER) | BS_LEFT; } - else if ( strcmp(token, "RIGHT") == 0 ) + else if ( _tcscmp(token, _T("RIGHT")) == 0 ) { style = (style & ~BS_CENTER) | BS_RIGHT; } - else if ( strcmp(token, "HCENTER") == 0 ) + else if ( _tcscmp(token, _T("HCENTER")) == 0 ) { style |= BS_CENTER; } - else if ( strcmp(token, "TOP") == 0 ) + else if ( _tcscmp(token, _T("TOP")) == 0 ) { style = (style & ~BS_VCENTER) | BS_TOP; } - else if ( strcmp(token, "BOTTOM") == 0 ) + else if ( _tcscmp(token, _T("BOTTOM")) == 0 ) { style = (style & ~BS_VCENTER) | BS_BOTTOM; } - else if ( strcmp(token, "VCENTER") == 0 ) + else if ( _tcscmp(token, _T("VCENTER")) == 0 ) { style |= BS_VCENTER; } - else if ( strcmp(token, "PUSHLIKE") == 0 ) + else if ( _tcscmp(token, _T("PUSHLIKE")) == 0 ) { if ( type == check || type == radio ) { style |= BS_PUSHLIKE; } } - else if ( strcmp(token, "MULTILINE") == 0 ) + else if ( _tcscmp(token, _T("MULTILINE")) == 0 ) { style |= BS_MULTILINE; } - else if ( strcmp(token, "NOTIFY") == 0 ) + else if ( _tcscmp(token, _T("NOTIFY")) == 0 ) { style |= BS_NOTIFY; } - else if ( strcmp(token, "FLAT") == 0 ) + else if ( _tcscmp(token, _T("FLAT")) == 0 ) { style |= BS_FLAT; } - else if ( strcmp(token, "NOTPUSHLIKE") == 0 ) + else if ( _tcscmp(token, _T("NOTPUSHLIKE")) == 0 ) { if ( type == check || type == radio ) { style &= ~BS_PUSHLIKE; } } - else if ( strcmp(token, "NOTMULTILINE") == 0 ) + else if ( _tcscmp(token, _T("NOTMULTILINE")) == 0 ) { style &= ~BS_MULTILINE; } - else if ( strcmp(token, "NOTNOTIFY") == 0 ) + else if ( _tcscmp(token, _T("NOTNOTIFY")) == 0 ) { style &= ~BS_NOTIFY; } - else if ( strcmp(token, "NOTFLAT") == 0 ) + else if ( _tcscmp(token, _T("NOTFLAT")) == 0 ) { style &= ~BS_FLAT; } else { - wrongArgValueException(context->threadContext, 1, BC_SETSTYLE_OPTS, token); + RXCT2A(token); + wrongArgValueException(context->threadContext, 1, BC_SETSTYLE_OPTS, tokenT); free(str); return NULLOBJECT; } - token = strtok(NULL, " "); + token = _tcstok(NULL, _T(" ")); } style |= typeStyle; @@ -1367,18 +1371,18 @@ { uint32_t style = 0; - if ( StrStrI(keyWords, "UPPER" ) ) style |= ES_UPPERCASE; - if ( StrStrI(keyWords, "LOWER" ) ) style |= ES_LOWERCASE; - if ( StrStrI(keyWords, "NUMBER" ) ) style |= ES_NUMBER; - if ( StrStrI(keyWords, "WANTRETURN") ) style |= ES_WANTRETURN; - if ( StrStrI(keyWords, "OEM" ) ) style |= ES_OEMCONVERT; + if ( StrStrIA(keyWords, "UPPER" ) ) style |= ES_UPPERCASE; + if ( StrStrIA(keyWords, "LOWER" ) ) style |= ES_LOWERCASE; + if ( StrStrIA(keyWords, "NUMBER" ) ) style |= ES_NUMBER; + if ( StrStrIA(keyWords, "WANTRETURN") ) style |= ES_WANTRETURN; + if ( StrStrIA(keyWords, "OEM" ) ) style |= ES_OEMCONVERT; /* Although these styles can be changed by individual ooDialog methods, as * a convenience, allow the programmer to include them when changing * multiple styles at once. */ - if ( StrStrI(keyWords, "TAB" ) ) style |= WS_TABSTOP; - if ( StrStrI(keyWords, "GROUP") ) style |= WS_GROUP; + if ( StrStrIA(keyWords, "TAB" ) ) style |= WS_TABSTOP; + if ( StrStrIA(keyWords, "GROUP") ) style |= WS_GROUP; return style; } @@ -1793,6 +1797,9 @@ RexxMethod4(RexxObjectPtr, e_showBallon, CSTRING, title, CSTRING, text, OPTIONAL_CSTRING, icon, CSELF, pCSelf) { + RXCA2T(title); + RXCA2T(text); + RXCA2T(icon); if ( ! requiredComCtl32Version(context, context->GetMessageName(), COMCTL32_6_0) ) { return TheOneObj; @@ -1815,8 +1822,8 @@ return TheOneObj; } - putUnicodeText((LPWORD)wszTitle, title); - putUnicodeText((LPWORD)wszText, text); + putUnicodeText((LPWORD)wszTitle, titleT); + putUnicodeText((LPWORD)wszText, textT); tip.cbStruct = sizeof(tip); tip.pszText = wszText; @@ -1825,15 +1832,15 @@ if ( argumentExists(3) ) { - switch( toupper(*icon) ) + switch( _totupper(*icon) ) { - case 'E' : + case _T('E') : tip.ttiIcon = TTI_ERROR; break; - case 'N' : + case _T('N') : tip.ttiIcon = TTI_NONE; break; - case 'W' : + case _T('W') : tip.ttiIcon = TTI_WARNING; break; } @@ -1848,6 +1855,7 @@ RexxMethod2(RexxObjectPtr, e_setCue, CSTRING, text, CSELF, pCSelf) { + RXCA2T(text); if ( ! requiredComCtl32Version(context, context->GetMessageName(), COMCTL32_6_0) ) { return TheOneObj; @@ -1861,7 +1869,7 @@ return TheOneObj; } - putUnicodeText((LPWORD)wszCue, text); + putUnicodeText((LPWORD)wszCue, textT); return (Edit_SetCueBannerText(getDChCtrl(pCSelf), wszCue) ? TheZeroObj : TheOneObj); } @@ -2108,19 +2116,19 @@ } -static int32_t cbLbAddDirectory(HWND hCtrl, CSTRING drivePath, CSTRING fileAttributes, oodControl_t ctrl) +static int32_t cbLbAddDirectory(HWND hCtrl, CSTRINGT drivePath, CSTRING fileAttributes, oodControl_t ctrl) { uint32_t attributes = DDL_READWRITE; if ( fileAttributes != NULL && *fileAttributes != '\0' ) { - if ( StrStrI(fileAttributes, "READWRITE") != 0 ) attributes |= DDL_READWRITE; - if ( StrStrI(fileAttributes, "READONLY" ) != 0 ) attributes |= DDL_READONLY; - if ( StrStrI(fileAttributes, "HIDDEN" ) != 0 ) attributes |= DDL_HIDDEN; - if ( StrStrI(fileAttributes, "SYSTEM" ) != 0 ) attributes |= DDL_SYSTEM; - if ( StrStrI(fileAttributes, "DIRECTORY") != 0 ) attributes |= DDL_DIRECTORY; - if ( StrStrI(fileAttributes, "ARCHIVE" ) != 0 ) attributes |= DDL_ARCHIVE; - if ( StrStrI(fileAttributes, "EXCLUSIVE") != 0 ) attributes |= DDL_EXCLUSIVE; - if ( StrStrI(fileAttributes, "DRIVES" ) != 0 ) attributes |= DDL_DRIVES; + if ( StrStrIA(fileAttributes, "READWRITE") != 0 ) attributes |= DDL_READWRITE; + if ( StrStrIA(fileAttributes, "READONLY" ) != 0 ) attributes |= DDL_READONLY; + if ( StrStrIA(fileAttributes, "HIDDEN" ) != 0 ) attributes |= DDL_HIDDEN; + if ( StrStrIA(fileAttributes, "SYSTEM" ) != 0 ) attributes |= DDL_SYSTEM; + if ( StrStrIA(fileAttributes, "DIRECTORY") != 0 ) attributes |= DDL_DIRECTORY; + if ( StrStrIA(fileAttributes, "ARCHIVE" ) != 0 ) attributes |= DDL_ARCHIVE; + if ( StrStrIA(fileAttributes, "EXCLUSIVE") != 0 ) attributes |= DDL_EXCLUSIVE; + if ( StrStrIA(fileAttributes, "DRIVES" ) != 0 ) attributes |= DDL_DRIVES; } uint32_t msg = (ctrl == winComboBox ? CB_DIR : LB_DIR); @@ -2434,7 +2442,8 @@ RexxMethod3(int32_t, lb_addDirectory, CSTRING, drivePath, OPTIONAL_CSTRING, fileAttributes, CSELF, pCSelf) { - return cbLbAddDirectory(((pCDialogControl)pCSelf)->hCtrl, drivePath, fileAttributes, winListBox); + RXCA2T(drivePath); + return cbLbAddDirectory(((pCDialogControl)pCSelf)->hCtrl, drivePathT, fileAttributes, winListBox); } /** @@ -2558,5 +2567,6 @@ RexxMethod3(int32_t, cb_addDirectory, CSTRING, drivePath, OPTIONAL_CSTRING, fileAttributes, CSELF, pCSelf) { - return cbLbAddDirectory(((pCDialogControl)pCSelf)->hCtrl, drivePath, fileAttributes, winComboBox); + RXCA2T(drivePath); + return cbLbAddDirectory(((pCDialogControl)pCSelf)->hCtrl, drivePathT, fileAttributes, winComboBox); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2010-05-09 22:46:19 UTC (rev 5929) @@ -71,7 +71,7 @@ */ void ooDialogInternalException(RexxMethodContext *c, char *function, int line, char *date, char *file) { - TCHAR buf[512]; + char buf[512]; _snprintf(buf, sizeof(buf), "Interpretation error: ooDialog's internal state is inconsistent " "Function: %s line: %d compiled date: %s File: %s", function, line, date, file); @@ -96,7 +96,7 @@ */ RexxObjectPtr noWindowsDialogException(RexxMethodContext *c, RexxObjectPtr rxDlg) { - TCHAR buf[512]; + char buf[512]; _snprintf(buf, sizeof(buf), "The %s method can not be invoked on %s when the Windows dialog does not exist.", c->GetMessageName(), c->ObjectToStringValue(rxDlg)); c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(buf)); @@ -120,7 +120,7 @@ */ RexxObjectPtr invalidWindowException(RexxMethodContext *c, RexxObjectPtr rxObj) { - TCHAR buf[512]; + char buf[512]; _snprintf(buf, sizeof(buf), "The %s method can not be invoked on %s when the window handle is not valid.", c->GetMessageName(), c->ObjectToStringValue(rxObj)); c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(buf)); @@ -142,7 +142,7 @@ */ RexxObjectPtr invalidCategoryPageException(RexxMethodContext *c, int pageNum, int pos) { - TCHAR buf[256]; + char buf[256]; _snprintf(buf, sizeof(buf), "Argument %d is not a valid category page number; found %d", pos, pageNum); c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(buf)); return NULLOBJECT; @@ -169,7 +169,7 @@ */ RexxObjectPtr wrongClassReplyException(RexxThreadContext *c, const char *n) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), "The windows message reply must be of the %s class", n); executionErrorException(c, buffer); @@ -178,7 +178,7 @@ void controlFailedException(RexxThreadContext *c, const char *msg, const char *func, const char *control) { - TCHAR buffer[256]; + char buffer[256]; _snprintf(buffer, sizeof(buffer), msg, func, control); systemServiceException(c, buffer); } @@ -360,7 +360,7 @@ goto done_out; } - char *symbol = NULL; + rxcharT *symbol = NULL; if ( ! context->ObjectToUnsignedInt32(id, &result) ) { @@ -373,14 +373,17 @@ * But, I guess we need to preserve that. */ - symbol = strdupupr_nospace(context->ObjectToStringValue(id)); + CSTRING value = context->ObjectToStringValue(id); + RXCA2T(value); + symbol = strdupupr_nospace(valueT); if ( symbol == NULL ) { outOfMemoryException(context->threadContext); goto done_out; } - RexxObjectPtr item = context->DirectoryAt(constDir, symbol); + RXCT2A(symbol); + RexxObjectPtr item = context->DirectoryAt(constDir, symbolT); if ( item != NULLOBJECT ) { context->ObjectToUnsignedInt32(item, &result); @@ -787,28 +790,28 @@ * * The caller is responsible for freeing the returned string. */ -char *strdupupr(const char *str) +rxcharT *strdupupr(const rxcharT *str) { - char *retStr = NULL; + rxcharT *retStr = NULL; if ( str ) { - size_t l = strlen(str); - retStr = (char *)malloc(l + 1); + size_t l = _tcslen(str); + retStr = (rxcharT *)malloc(l + 1); if ( retStr ) { - char *p; + rxcharT *p; for ( p = retStr; *str; ++str ) { - if ( ('a' <= *str) && (*str <= 'z') ) + if ( (_T('a') <= *str) && (*str <= _T('z')) ) { - *p++ = *str - ('a' - 'A'); + *p++ = *str - (_T('a') - _T('A')); } else { *p++ = *str; } } - *p = '\0'; + *p = _T('\0'); } } return retStr; @@ -824,25 +827,25 @@ * * @note The caller is responsible for freeing the returned string. */ -char *strdup_nospace(const char *str) +rxcharT *strdup_nospace(const rxcharT *str) { - char *retStr = NULL; + rxcharT *retStr = NULL; if ( str ) { - size_t l = strlen(str); - retStr = (char *)malloc(l + 1); + size_t l = _tcslen(str); + retStr = (rxcharT *)malloc(l + 1); if ( retStr ) { - char *p; + rxcharT *p; for ( p = retStr; *str; ++str ) { - if ( *str == ' ' || *str == '\t' ) + if ( *str == _T(' ') || *str == _T('\t') ) { continue; } *p++ = *str; } - *p = '\0'; + *p = _T('\0'); } } return retStr; @@ -858,32 +861,32 @@ * * @note The caller is responsible for freeing the returned string. */ -char *strdupupr_nospace(const char *str) +rxcharT *strdupupr_nospace(const rxcharT *str) { - char *retStr = NULL; + rxcharT *retStr = NULL; if ( str ) { - size_t l = strlen(str); - retStr = (char *)malloc(l + 1); + size_t l = _tcslen(str); + retStr = (rxcharT *)malloc(l + 1); if ( retStr ) { - char *p; + rxcharT *p; for ( p = retStr; *str; ++str ) { - if ( *str == ' ' ) + if ( *str == _T(' ') ) { continue; } - if ( ('a' <= *str) && (*str <= 'z') ) + if ( (_T('a') <= *str) && (*str <= _T('z')) ) { - *p++ = *str - ('a' - 'A'); + *p++ = *str - (_T('a') - _T('A')); } else { *p++ = *str; } } - *p = '\0'; + *p = _T('\0'); } } return retStr; @@ -902,19 +905,19 @@ * * @note The caller is responsible for freeing the returned string. */ -char *strdup_2methodName(const char *str) +rxcharT *strdup_2methodName(const rxcharT *str) { - char *retStr = NULL; + rxcharT *retStr = NULL; if ( str ) { - size_t l = strlen(str); - retStr = (char *)malloc(l + 1); + size_t l = _tcslen(str); + retStr = (rxcharT *)malloc(l + 1); if ( retStr ) { - char *p; + rxcharT *p; for ( p = retStr; *str; ++str ) { - if ( *str == ' '|| *str == '\t' || *str == '&' || *str == '+' || *str == ':' ) + if ( *str == _T(' ') || *str == _T('\t') || *str == _T('&') || *str == _T('+') || *str == _T(':') ) { continue; } @@ -923,7 +926,7 @@ *p++ = *str; } } - *(p - 3) == '.' ? *(p - 3) = '\0' : *p = '\0'; + *(p - 3) == _T('.') ? *(p - 3) = _T('\0') : *p = _T('\0'); } } return retStr; @@ -1089,7 +1092,8 @@ count = GetWindowText(hwnd, pBuf, count); if ( count != 0 ) { - *pStringObj = c->String(pBuf); + RXCT2A(pBuf); + *pStringObj = c->String(pBufT); } else { @@ -1207,7 +1211,7 @@ * * @return Return the value for the keyword, or -1 for not found. */ -int getKeywordValue(String2Int *cMap, const char * str) +int getKeywordValue(String2Int *cMap, const rxcharT * str) { String2Int::iterator itr; itr = cMap->find(str); @@ -1290,8 +1294,23 @@ * always be at least one, if an error occurs, the wide character null * is copied to the destination and 1 is returned. */ -int putUnicodeText(LPWORD dest, const char *text) +#ifdef UNICODE + +int putUnicodeText(LPWORD dest, const rxcharW *text) { + if ( text == NULL ) + { + *dest = 0; + return 1; + } + wcscpy((LPWSTR)dest, text); + return wcslen(text) + 1; +} + +#else + +int putUnicodeText(LPWORD dest, const rxcharA *text) +{ int count = 1; if ( text == NULL ) { @@ -1313,7 +1332,9 @@ return count; } +#endif + /** * * Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2010-05-09 22:46:19 UTC (rev 5929) @@ -45,7 +45,7 @@ #include <string> #include <map> using namespace std; -typedef map<string, int, less<string> > String2Int; +typedef map<rxstringT, int, less<rxstringT> > String2Int; #define COMCTL_ERR_TITLE "ooDialog - Windows Common Controls Error" @@ -63,7 +63,7 @@ "number of allocated icon table entries. The icon\n" \ "resource will not be added." -#define DEFAULT_FONTNAME "MS Shell Dlg" +#define DEFAULT_FONTNAME _T("MS Shell Dlg") #define DEFAULT_FONTSIZE 8 #define MAX_DEFAULT_FONTNAME 256 @@ -108,7 +108,7 @@ // Struct for the PlainBaseDialog class CSelf. typedef struct _pbdcCSelf { - char fontName[MAX_DEFAULT_FONTNAME]; + rxcharT fontName[MAX_DEFAULT_FONTNAME]; uint32_t fontSize; } CPlainBaseDialogClass; @@ -124,7 +124,7 @@ /* Struct for the PlainBaseDialog object CSelf. */ typedef struct _pbdCSelf { - char fontName[MAX_DEFAULT_FONTNAME]; + rxcharT fontName[MAX_DEFAULT_FONTNAME]; RexxInstance *interpreter; RexxThreadContext *dlgProcContext; pCWindowBase wndBase; @@ -193,10 +193,10 @@ extern RexxStringObject pointer2string(RexxMethodContext *, void *); extern RexxStringObject pointer2string(RexxThreadContext *c, void *pointer); extern RexxStringObject dword2string(RexxMethodContext *, uint32_t); -extern char * strdupupr(const char *str); -extern char * strdupupr_nospace(const char *str); -extern char * strdup_nospace(const char *str); -extern char * strdup_2methodName(const char *str); +extern rxcharT * strdupupr(const rxcharT *str); +extern rxcharT * strdupupr_nospace(const rxcharT *str); +extern rxcharT * strdup_nospace(const rxcharT *str); +extern rxcharT * strdup_2methodName(const rxcharT *str); extern DIALOGADMIN * getDlgAdm(RexxMethodContext *c, RexxObjectPtr dlg); extern void ooDialogInternalException(RexxMethodContext *, char *, int, char *, char *); @@ -240,10 +240,10 @@ extern bool rxIntFromDirectory(RexxMethodContext *, RexxDirectoryObject, CSTRING, int *, int, bool); extern RexxObjectPtr setWindowStyle(RexxMethodContext *c, HWND hwnd, uint32_t style); -extern int putUnicodeText(LPWORD dest, const char *text); +extern int putUnicodeText(LPWORD dest, const rxcharT *text); extern RexxStringObject unicode2String(RexxMethodContext *c, PWSTR wstr, int32_t len); extern char * unicode2Ansi(PWSTR wstr, int32_t len); -extern int getKeywordValue(String2Int *cMap, const char * str); +extern int getKeywordValue(String2Int *cMap, const rxcharT * str); extern bool goodMinMaxArgs(RexxMethodContext *c, RexxArrayObject args, size_t min, size_t max, size_t *arraySize); extern bool getRectFromArglist(RexxMethodContext *, RexxArrayObject, PRECT, bool, int, int, size_t *, size_t *); extern bool getPointFromArglist(RexxMethodContext *, RexxArrayObject, PPOINT, int, int, size_t *, size_t *); @@ -488,7 +488,9 @@ */ inline void internalErrorMsgBox(CSTRING pszMsg, CSTRING pszTitle) { - MessageBox(0, pszMsg, pszTitle, MB_OK | MB_ICONHAND | MB_SETFOREGROUND | MB_TASKMODAL); + RXCA2T(pszMsg); + RXCA2T(pszTitle); + MessageBox(0, pszMsgT, pszTitleT, MB_OK | MB_ICONHAND | MB_SETFOREGROUND | MB_TASKMODAL); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2010-05-09 13:41:53 UTC (rev 5928) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2010-05-09 22:46:19 UTC (rev 5929) @@ -54,7 +54,7 @@ #include "oodData.hpp" #include "oodControl.hpp" -const char *controlType2winName(oodControl_t control) +const rxcharT *controlType2winName(oodControl_t control) { switch ( control ) { @@ -75,7 +75,7 @@ case winMonthCalendar : return MONTHCAL_CLASS; case winDateTimePicker : return DATETIMEPICK_CLASS; case winUpDown : return UPDOWN_CLASS; - default : return ""; + default : return _T(""); } } @@ -106,22 +106,22 @@ } -oodControl_t winName2controlType(const char *className) +oodControl_t winName2controlType(const rxcharT *className) { - if ( strcmp(className, WC_STATIC ) == 0 ) return winStatic; - else if ( strcmp(className, WC_BUTTON ) == 0 ) return winPushButton; - else if ( strcmp(className, WC_EDIT ) == 0 ) return winEdit; - else if ( strcmp(className, WC_LISTBOX ) == 0 ) return winListBox; - else if ( strcmp(className, WC_COMBOBOX ) == 0 ) return winComboBox; - else if ( strcmp(className, WC_SCROLLBAR ) == 0 ) return winScrollBar; - else if ( strcmp(className, WC_TREEVIEW ) == 0 ) return winTreeView; - else if ( strcmp(className, WC_LISTVIEW ) == 0 ) return winListView; - else if ( strcmp(className, WC_TABCONTROL ) == 0 ) return winTab; - else if ( strcmp(className, PROGRESS_CLASS ) == 0 ) return winProgressBar; - else if ( strcmp(className, TRACKBAR_CLASS ) == 0 ) return winTrackBar; - else if ( strcmp(className, MONTHCAL_CLASS ) == 0 ) return winMonthCalendar; - else if ( strcmp(className, DATETIMEPICK_CLASS) == 0 ) return winDateTimePicker; - else if ( strcmp(className, UPDOWN_CLASS ) == 0 ) return winUpDown; + if ( _tcscmp(className, WC_STATIC ) == 0 ) return winStatic; + else if ( _tcscmp(className, WC_BUTTON ) == 0 ) return winPushButton; + else if ( _tcscmp(className, WC_EDIT ) == 0 ) return winEdit; + else if ( _tcscmp(className, WC_LISTBOX ) == 0 ) return winListBox; + else if ( _tcscmp(className, WC_COMBOBOX ) == 0 ) return winComboBox; + else if ( _tcscmp(className, WC_SCROLLBAR ) == 0 ) return winScrollBar; + else if ( _tcscmp(className, WC_TREEVIEW ) == 0 ) return winTreeView; + else if ( _tcscmp(className, WC_LISTVIEW ) == 0 ) return winListView; + else if ( _tcscmp(className, WC_TABCONTROL ) == 0 ) return winTab; + else if ( _tcscmp(className, PROGRESS_CLASS ) == 0 ) return winProgressBar; + else if ( _tcscmp(className, TRACKBAR_CLASS ) == 0 ) return winTrackBar; + else if ( _tcscmp(className, MONTHCAL_CLASS ) == 0 ) return winMonthCalendar; + else if ( _tcscmp(className, DATETIMEPICK_CLASS) == 0 ) return winDateTimePicker; + else if ( _tcscmp(className, UPDOWN_CLASS ) == 0 ) return winUpDown; else { return winUnknown; @@ -168,10 +168,10 @@ */ bool isControlMatch(HWND hControl, oodControl_t control) { - char buf[64]; - const char *pClass = controlType2winName(control); + rxcharT buf[64]; + const rxcharT *pClass = controlType2winName(control); - if ( ! RealGetWindowClass(hControl, buf, sizeof(buf)) || strcmp(buf, pClass) != 0 ) + if ( ... [truncated message content] |
From: <jfa...@us...> - 2010-05-13 23:26:33
|
Revision: 5958 http://oorexx.svn.sourceforge.net/oorexx/?rev=5958&view=rev Author: jfaucher Date: 2010-05-13 23:26:26 +0000 (Thu, 13 May 2010) Log Message: ----------- byte-char and wide-char configurations of oodialog are working. There are some problems, but I have the same problems in trunk, so I assume there are some work in progress there... See this screenshot showing french, german, hebrew, russian, greek, etc... http://oorexx.svn.sourceforge.net/viewvc/oorexx/sandbox/jlf/unicode/ooRexx/oodtree-demo.png Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodRoutines.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUser.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/rxwchar.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/rxwchar.hpp sandbox/jlf/trunk/makeorx.bat sandbox/jlf/trunk/platform/windows/buildorx.bat Added Paths: ----------- sandbox/jlf/trunk/makeorx_verbose.bat sandbox/jlf/unicode/ooRexx/bmp/ sandbox/jlf/unicode/ooRexx/bmp/oodtree.bmp sandbox/jlf/unicode/ooRexx/oodtree-demo.png sandbox/jlf/unicode/ooRexx/oodtree.inp sandbox/jlf/unicode/ooRexx/oodtree.rex sandbox/jlf/unicode/ooRexx/oodtreei.inp sandbox/jlf/unicode/ooRexx/rc/ sandbox/jlf/unicode/ooRexx/rc/oodtree.rc sandbox/jlf/unicode/ooRexx/rc/oodtreeNewItem.rc Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/_diary.txt 2010-05-13 23:26:26 UTC (rev 5958) @@ -31,6 +31,34 @@ =============================================================================== +2010 may 13 + +More work on wide-chars in oodialog. + +New configuration names : oodialogA and oodialogW. +No longer needed to pass "WCHAR=1" to build the wide-char configuration. +makeorx DEBUG builds both configurations +makeorx DEBUG oodialogA builds the byte-char configuration +makeorx DEBUG oodialogA clean cleans the byte-char configuration +makeorx DEBUG oodialogW builds the wide-char configuration +makeorx DEBUG oodialogW clean cleans the wide-char configuration +makeorx DEBUG oodialog like oodialogA + +byte-char and wide-char configurations of oodialog are working, tested with oodialog examples. +There are some problems, but I have the same problems in trunk, so I assume there are some work in progress there... + +Test of wide-char configuration : +It's not enough to put win32dbg/wchar in fromt of %PATH%, you must also rename +or remove win32dbg/oodialog.dll because it's this DLL which is loaded by default. +See unicode/ooRexx/oodtree.png for a screenshot with french, german, hebrew, russian, greek, etc... + +Summary of the changes made to the oodtree example : +oodtree.rex, added : call setCodePage 65001 -- UTF-8 +oodtree.rc, changed : FONT 8, "Arial Unicode MS" +oodtree.inp, added UTF-8 strings for demo + + +=============================================================================== 2010 may 9 Added support for wide-chars in oodialog. Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -75,7 +75,7 @@ if ( sub != NULL ) { char buffer[128]; - _snprintf(buffer, sizeof(buffer), msg, sub); + _snprintf(buffer, RXITEMCOUNT(buffer), msg, sub); systemServiceException(context, buffer); } else @@ -87,7 +87,7 @@ void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1, DWORD rc) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), msg, arg1, rc); + _snprintf(buffer, RXITEMCOUNT(buffer), msg, arg1, rc); systemServiceException(context, buffer); } @@ -99,7 +99,7 @@ void systemServiceExceptionComCode(RexxThreadContext *context, const char *msg, const char *arg1, HRESULT hr) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), msg, arg1, hr); + _snprintf(buffer, RXITEMCOUNT(buffer), msg, arg1, hr); systemServiceException(context, buffer); } @@ -134,7 +134,7 @@ void userDefinedMsgException(RexxThreadContext *c, int pos, CSTRING msg) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d %s", pos, msg); + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d %s", pos, msg); userDefinedMsgException(c, buffer); } @@ -175,7 +175,7 @@ RexxObjectPtr invalidTypeException(RexxThreadContext *c, size_t pos, const char *type) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d is not a valid%s", pos, type); + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d is not a valid%s", pos, type); userDefinedMsgException(c, buffer); return NULLOBJECT; } @@ -183,7 +183,7 @@ void invalidImageException(RexxThreadContext *c, int pos, CSTRING type, CSTRING actual) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be a %s image; found %s", pos, type, actual); + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d must be a %s image; found %s", pos, type, actual); userDefinedMsgException(c, buffer); } @@ -203,7 +203,7 @@ void stringTooLongException(RexxThreadContext *c, int pos, size_t len, size_t realLen) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be less than %d characters in length; length is %d", + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d must be less than %d characters in length; length is %d", pos, len, realLen); userDefinedMsgException(c, buffer); } @@ -223,7 +223,7 @@ void numberTooSmallException(RexxThreadContext *c, int pos, int min, RexxObjectPtr actual) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be a whole number greater than %d; actual %s", + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d must be a whole number greater than %d; actual %s", pos, min, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); } @@ -247,7 +247,7 @@ RexxObjectPtr notBooleanException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be true or false; found \"%s\"", + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d must be true or false; found \"%s\"", pos, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); return NULLOBJECT; @@ -256,14 +256,14 @@ void wrongObjInArrayException(RexxThreadContext *c, size_t argPos, size_t index, CSTRING obj) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d is an array and index %d is not a %s", argPos, index, obj); + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d is an array and index %d is not a %s", argPos, index, obj); userDefinedMsgException(c, buffer); } void wrongObjInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index, CSTRING needed, RexxObjectPtr actual) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), + _snprintf(buffer, RXITEMCOUNT(buffer), "Index, %s, of argument %d, must be %s; found \"%s\"", index, argPos, needed, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); @@ -272,7 +272,7 @@ void missingIndexInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), + _snprintf(buffer, RXITEMCOUNT(buffer), "Index, %s, of argument %d, is required", index, argPos); userDefinedMsgException(c, buffer); @@ -295,7 +295,7 @@ void wrongValueAtDirectoryIndexException(RexxThreadContext *c, size_t pos, CSTRING index, CSTRING list, RexxObjectPtr actual) { char buffer[512]; - _snprintf(buffer, sizeof(buffer), + _snprintf(buffer, RXITEMCOUNT(buffer), "Index, %s, of argument %d, must be one of %s; found \"%s\"", index, pos, list, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); @@ -318,7 +318,7 @@ void directoryIndexException(RexxThreadContext *c, size_t pos, CSTRING index, CSTRING msg, RexxObjectPtr actual) { char buffer[512]; - _snprintf(buffer, sizeof(buffer), + _snprintf(buffer, RXITEMCOUNT(buffer), "Index, %s, of argument %d, must be one of %s; found \"%s\"", index, pos, msg, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); @@ -327,14 +327,14 @@ void emptyArrayException(RexxThreadContext *c, int argPos) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be a non-empty array", argPos); + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d must be a non-empty array", argPos); userDefinedMsgException(c, buffer); } void sparseArrayException(RexxThreadContext *c, size_t argPos, size_t index) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be a non-sparse array, index %d is missing", argPos, index); + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d must be a non-sparse array, index %d is missing", argPos, index); userDefinedMsgException(c, buffer); } @@ -394,7 +394,7 @@ char buf[128]; RexxObjectPtr name = c->SendMessage0(source, "OBJECTNAME"); - _snprintf(buf, sizeof(buf), "Could not retrieve the %s information for %s", + _snprintf(buf, RXITEMCOUNT(buf), "Could not retrieve the %s information for %s", item, c->ObjectToStringValue(name)); c->RaiseException1(Rexx_Error_Execution_user_defined, c->String(buf)); @@ -405,11 +405,11 @@ char buffer[256]; if ( pos == 0 ) { - _snprintf(buffer, sizeof(buffer), "The %s object must not be null", name); + _snprintf(buffer, RXITEMCOUNT(buffer), "The %s object must not be null", name); } else { - _snprintf(buffer, sizeof(buffer), "Argument %d, the %s object, must not be null", pos, name); + _snprintf(buffer, RXITEMCOUNT(buffer), "Argument %d, the %s object, must not be null", pos, name); } userDefinedMsgException(c, buffer); } @@ -471,7 +471,7 @@ { char buffer[512]; - _snprintf(buffer, sizeof(buffer), "Method argument %d, option must be one of %s; found \"%s\"", pos, list, actual); + _snprintf(buffer, RXITEMCOUNT(buffer), "Method argument %d, option must be one of %s; found \"%s\"", pos, list, actual); userDefinedMsgException(c, buffer); return NULLOBJECT; } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -126,7 +126,7 @@ // This condition should have been intercepted by PlainBaseDialog::new() // But if it hasn't, we'll try to end everything. char buf[128]; - _snprintf(buf, sizeof(buf), "The number of active dialogs has reached the maximum (%d) allowed", MAXDIALOGS); + _snprintf(buf, RXITEMCOUNT(buf), "The number of active dialogs has reached the maximum (%d) allowed", MAXDIALOGS); userDefinedMsgException(c->threadContext, buf); goto too_many_out; @@ -140,7 +140,7 @@ goto err_out; } - adm->pMessageQueue = (rxcharT *)LocalAlloc(LPTR, MAXLENQUEUE); + adm->pMessageQueue = (rxcharT *)RXTLOCALALLOC(LPTR, MAXLENQUEUE); if ( adm->pMessageQueue == NULL ) { goto err_out; @@ -252,10 +252,10 @@ if ( ! dlgAdm->TheInstance ) { CHART msg[256]; - _stprintf(msg, + _sntprintf(msg, RXITEMCOUNT(msg), _T("Failed to load Dynamic Link Library (resource DLL.)\n") _T(" File name:\t\t\t%s\n") - _T(" Windows System Error Code:\t%d\n"), library, GetLastError()); + _T(" Windows System Error Code:\t%d\n"), libraryT.target(), GetLastError()); MessageBox(0, msg, _T("ooDialog DLL Load Error"), MB_OK | MB_ICONHAND | MB_SYSTEMMODAL); return false; } @@ -2224,7 +2224,7 @@ if ( StoredDialogs >= MAXDIALOGS ) { rxcharT buf[128]; - _sntprintf(buf, sizeof(buf), + _sntprintf(buf, RXITEMCOUNT(buf), _T("The number of active dialogs has\n") _T("reached the maximum (%d) allowed\n\n") _T("No more dialogs can be instantiated"), MAXDIALOGS); @@ -3735,7 +3735,7 @@ RexxStringObject result; bool peek = doPeek != 0 ? true : false; - *msg = '\0'; + *msg = _T('\0'); EnterCriticalSection(&crit_sec); @@ -3920,7 +3920,6 @@ */ RexxMethod4(int32_t, pbdlg_setControlData, RexxObjectPtr, rxID, CSTRING, data, NAME, msgName, CSELF, pCSelf) { - RXCA2T(data); pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; if ( pcpbd->hDlg == NULL ) { @@ -3936,6 +3935,7 @@ oodControl_t ctrlType = oodName2controlType(msgName + 3); + RXCA2T(data); return setControlData(context, pcpbd, id, dataT, pcpbd->hDlg, ctrlType); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -172,7 +172,7 @@ TEXTMETRIC tm; GetTextMetrics(hdc, &tm); - GetTextFace(hdc, sizeof(fontName), fontName); + GetTextFace(hdc, RXITEMCOUNT(fontName), fontName); long fontSize = MulDiv((tm.tmHeight - tm.tmInternalLeading), 72, GetDeviceCaps(hdc, LOGPIXELSY)); @@ -486,10 +486,10 @@ if ( argumentExists(3) ) { + italic = StrStrIA(fontStyle, "ITALIC" ) != NULL; + underline = StrStrIA(fontStyle, "UNDERLINE") != NULL; + strikeout = StrStrIA(fontStyle, "STRIKEOUT") != NULL; RXCA2T(fontStyle); - italic = StrStrI(fontStyleT, _T("ITALIC" )) != NULL; - underline = StrStrI(fontStyleT, _T("UNDERLINE")) != NULL; - strikeout = StrStrI(fontStyleT, _T("STRIKEOUT")) != NULL; weight = getWeight(fontStyleT); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -324,7 +324,7 @@ rxcharT buf[64]; BUTTONTYPE type = notButton; - if ( ! RealGetWindowClass(hwnd, buf, sizeof(buf)) || _tcscmp(buf, WC_BUTTON) ) + if ( ! RealGetWindowClass(hwnd, buf, RXITEMCOUNT(buf)) || _tcscmp(buf, WC_BUTTON) ) { if ( sub != NULL ) { @@ -1549,11 +1549,12 @@ */ RexxMethod3(RexxObjectPtr, e_replaceSelText, CSTRING, replacement, OPTIONAL_logical_t, canUndo, CSELF, pCSelf) { + RXCA2T(replacement); if ( argumentOmitted(2) ) { canUndo = TRUE; } - SendMessage(((pCDialogControl)pCSelf)->hCtrl, EM_REPLACESEL, canUndo, (LPARAM)replacement); + SendMessage(((pCDialogControl)pCSelf)->hCtrl, EM_REPLACESEL, canUndo, (LPARAM)replacementT.target()); return TheZeroObj; } @@ -1565,7 +1566,7 @@ * character from the beginning of the edit control. * * @param lineNumber The one-based index of the line whose character index is - * desired. A value of \x961 specifies the current line + * desired. A value of -1 specifies the current line * number (the line that contains the caret). * * @return The character index. -1 is returned if the specified line index is @@ -1619,7 +1620,7 @@ * Retrieves the text of the specified line. * * @param lineNumber The one-base index of the line whose text is desired. - * A value of \x961 specifies the current line number (the + * A value of -1 specifies the current line number (the * line that contains the caret). * @param ignored Prior to 4.0.1, ooDialog required the user to specify * how long the line was (or how much text to retrieve) if @@ -1634,7 +1635,7 @@ RexxMethod3(RexxStringObject, e_getLine, int32_t, lineNumber, OPTIONAL_RexxObjectPtr, ignored, CSELF, pCSelf) { HWND hwnd = getDChCtrl(pCSelf); - char *buf = NULL; + rxcharT *buf = NULL; RexxStringObject result = context->NullString(); if ( lineNumber == 0 ) @@ -1669,7 +1670,7 @@ goto done_out; } - buf = (char *)LocalAlloc(LPTR, ++count); + buf = (rxcharT *)RXTLOCALALLOC(LPTR, ++count); if ( buf == NULL ) { outOfMemoryException(context->threadContext); @@ -1679,7 +1680,8 @@ (*(WORD *)buf) = count; if ( SendMessage(hwnd, EM_GETLINE, lineNumber, (LPARAM)buf) != 0 ) { - result = context->String(buf); + RXCT2A(buf); + result = context->String(bufT); } } @@ -1799,7 +1801,6 @@ { RXCA2T(title); RXCA2T(text); - RXCA2T(icon); if ( ! requiredComCtl32Version(context, context->GetMessageName(), COMCTL32_6_0) ) { return TheOneObj; @@ -1832,15 +1833,15 @@ if ( argumentExists(3) ) { - switch( _totupper(*icon) ) + switch( toupper(*icon) ) { - case _T('E') : + case 'E' : tip.ttiIcon = TTI_ERROR; break; - case _T('N') : + case 'N' : tip.ttiIcon = TTI_NONE; break; - case _T('W') : + case 'W' : tip.ttiIcon = TTI_WARNING; break; } @@ -2005,7 +2006,7 @@ LRESULT l = SendMessage(hCtrl, msg, index, 0); if ( l > 0 ) { - char *buf = (char *)malloc(l + 1); + rxcharT *buf = (rxcharT *)RXTMALLOC(l + 1); if ( buf == NULL ) { outOfMemoryException(c->threadContext); @@ -2016,7 +2017,8 @@ l = SendMessage(hCtrl, msg, index, (LPARAM)buf); if ( l > 0 ) { - result = c->String(buf); + RXCT2A(buf); + result = c->String(bufT); } free(buf); } @@ -2052,7 +2054,8 @@ msg = (ctrl == winComboBox ? CB_INSERTSTRING : LB_INSERTSTRING); - int32_t ret = (int32_t)SendMessage(hCtrl, msg, (WPARAM)index, (LPARAM)text); + RXCA2T(text); + int32_t ret = (int32_t)SendMessage(hCtrl, msg, (WPARAM)index, (LPARAM)textT.target()); if ( ret >= 0 ) { ret++; @@ -2064,7 +2067,8 @@ { uint32_t msg = (ctrl == winComboBox ? CB_FINDSTRING : LB_FINDSTRING); - int32_t index = (int32_t)SendMessage(hCtrl, msg, 0, (LPARAM)text); + RXCA2T(text); + int32_t index = (int32_t)SendMessage(hCtrl, msg, 0, (LPARAM)textT.target()); if ( index < 0 ) { return 0; @@ -2110,13 +2114,14 @@ msg = (ctrl == winComboBox ? CB_FINDSTRING : LB_FINDSTRING); } - found = (int32_t)SendMessage(hCtrl, LB_FINDSTRING, startIndex, (LPARAM)text); + RXCA2T(text); + found = (int32_t)SendMessage(hCtrl, LB_FINDSTRING, startIndex, (LPARAM)textT.target()); return (found > 0 ? 0 : --found); } -static int32_t cbLbAddDirectory(HWND hCtrl, CSTRINGT drivePath, CSTRING fileAttributes, oodControl_t ctrl) +static int32_t cbLbAddDirectory(HWND hCtrl, CSTRING drivePath, CSTRING fileAttributes, oodControl_t ctrl) { uint32_t attributes = DDL_READWRITE; if ( fileAttributes != NULL && *fileAttributes != '\0' ) @@ -2132,7 +2137,8 @@ } uint32_t msg = (ctrl == winComboBox ? CB_DIR : LB_DIR); - return (int32_t)SendMessage(hCtrl, msg, attributes, (LPARAM)drivePath); + RXCA2T(drivePath); + return (int32_t)SendMessage(hCtrl, msg, attributes, (LPARAM)drivePathT.target()); } @@ -2167,7 +2173,8 @@ */ RexxMethod2(int32_t, lb_add, CSTRING, text, CSELF, pCSelf) { - int32_t ret = (int32_t)SendMessage(((pCDialogControl)pCSelf)->hCtrl, LB_ADDSTRING, 0, (LPARAM)text); + RXCA2T(text); + int32_t ret = (int32_t)SendMessage(((pCDialogControl)pCSelf)->hCtrl, LB_ADDSTRING, 0, (LPARAM)textT.target()); if ( ret >= 0 ) { ret++; @@ -2231,7 +2238,8 @@ } } - int32_t ret = (int32_t)SendMessage(hwnd, LB_INSERTSTRING, (WPARAM)index, (LPARAM)text); + RXCA2T(text); + int32_t ret = (int32_t)SendMessage(hwnd, LB_INSERTSTRING, (WPARAM)index, (LPARAM)textT.target()); if ( ret >= 0 ) { ret++; @@ -2442,8 +2450,7 @@ RexxMethod3(int32_t, lb_addDirectory, CSTRING, drivePath, OPTIONAL_CSTRING, fileAttributes, CSELF, pCSelf) { - RXCA2T(drivePath); - return cbLbAddDirectory(((pCDialogControl)pCSelf)->hCtrl, drivePathT, fileAttributes, winListBox); + return cbLbAddDirectory(((pCDialogControl)pCSelf)->hCtrl, drivePath, fileAttributes, winListBox); } /** @@ -2479,7 +2486,8 @@ */ RexxMethod2(int32_t, cb_add, CSTRING, text, CSELF, pCSelf) { - int32_t ret = (int32_t)SendMessage(((pCDialogControl)pCSelf)->hCtrl, CB_ADDSTRING, 0, (LPARAM)text); + RXCA2T(text); + int32_t ret = (int32_t)SendMessage(((pCDialogControl)pCSelf)->hCtrl, CB_ADDSTRING, 0, (LPARAM)textT.target()); if ( ret >= 0 ) { ret++; @@ -2567,6 +2575,5 @@ RexxMethod3(int32_t, cb_addDirectory, CSTRING, drivePath, OPTIONAL_CSTRING, fileAttributes, CSELF, pCSelf) { - RXCA2T(drivePath); - return cbLbAddDirectory(((pCDialogControl)pCSelf)->hCtrl, drivePathT, fileAttributes, winComboBox); + return cbLbAddDirectory(((pCDialogControl)pCSelf)->hCtrl, drivePath, fileAttributes, winComboBox); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -72,7 +72,7 @@ void ooDialogInternalException(RexxMethodContext *c, char *function, int line, char *date, char *file) { char buf[512]; - _snprintf(buf, sizeof(buf), "Interpretation error: ooDialog's internal state is inconsistent " + _snprintf(buf, RXITEMCOUNT(buf), "Interpretation error: ooDialog's internal state is inconsistent " "Function: %s line: %d compiled date: %s File: %s", function, line, date, file); c->RaiseException1(Rexx_Error_Interpretation_user_defined, c->String(buf)); @@ -97,7 +97,7 @@ RexxObjectPtr noWindowsDialogException(RexxMethodContext *c, RexxObjectPtr rxDlg) { char buf[512]; - _snprintf(buf, sizeof(buf), "The %s method can not be invoked on %s when the Windows dialog does not exist.", + _snprintf(buf, RXITEMCOUNT(buf), "The %s method can not be invoked on %s when the Windows dialog does not exist.", c->GetMessageName(), c->ObjectToStringValue(rxDlg)); c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(buf)); return NULLOBJECT; @@ -121,7 +121,7 @@ RexxObjectPtr invalidWindowException(RexxMethodContext *c, RexxObjectPtr rxObj) { char buf[512]; - _snprintf(buf, sizeof(buf), "The %s method can not be invoked on %s when the window handle is not valid.", + _snprintf(buf, RXITEMCOUNT(buf), "The %s method can not be invoked on %s when the window handle is not valid.", c->GetMessageName(), c->ObjectToStringValue(rxObj)); c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(buf)); return NULLOBJECT; @@ -143,7 +143,7 @@ RexxObjectPtr invalidCategoryPageException(RexxMethodContext *c, int pageNum, int pos) { char buf[256]; - _snprintf(buf, sizeof(buf), "Argument %d is not a valid category page number; found %d", pos, pageNum); + _snprintf(buf, RXITEMCOUNT(buf), "Argument %d is not a valid category page number; found %d", pos, pageNum); c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(buf)); return NULLOBJECT; } @@ -170,7 +170,7 @@ RexxObjectPtr wrongClassReplyException(RexxThreadContext *c, const char *n) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), "The windows message reply must be of the %s class", n); + _snprintf(buffer, RXITEMCOUNT(buffer), "The windows message reply must be of the %s class", n); executionErrorException(c, buffer); return NULLOBJECT; @@ -179,7 +179,7 @@ void controlFailedException(RexxThreadContext *c, const char *msg, const char *func, const char *control) { char buffer[256]; - _snprintf(buffer, sizeof(buffer), msg, func, control); + _snprintf(buffer, RXITEMCOUNT(buffer), msg, func, control); systemServiceException(c, buffer); } @@ -187,14 +187,14 @@ void wrongWindowStyleException(RexxMethodContext *c, const char *obj, const char *style) { char msg[128]; - _snprintf(msg, sizeof(msg), "This %s does not have the %s style", obj, style); + _snprintf(msg, RXITEMCOUNT(msg), "This %s does not have the %s style", obj, style); userDefinedMsgException(c->threadContext, msg); } RexxObjectPtr wrongWindowsVersionException(RexxMethodContext *context, const char *methodName, const char *windows) { char msg[256]; - _snprintf(msg, sizeof(msg), "The %s() method requires Windows %s or later", methodName, windows); + _snprintf(msg, RXITEMCOUNT(msg), "The %s() method requires Windows %s or later", methodName, windows); context->RaiseException1(Rexx_Error_Incorrect_method_user_defined, context->String(msg)); return NULLOBJECT; } @@ -218,7 +218,7 @@ if ( ComCtl32Version < minimum ) { char msg[256]; - _snprintf(msg, sizeof(msg), "The %s() method requires %s or later", methodName, comctl32VersionName(minimum)); + _snprintf(msg, RXITEMCOUNT(msg), "The %s() method requires %s or later", methodName, comctl32VersionName(minimum)); context->RaiseException1(Rexx_Error_System_service_user_defined, context->String(msg)); return false; } @@ -570,7 +570,7 @@ int32_t idError(RexxMethodContext *c, RexxObjectPtr rxID) { char buf[256]; - _snprintf(buf, sizeof(buf), + _snprintf(buf, RXITEMCOUNT(buf), "Error trying to add a dialog resource:\n\n%s is an undefined, non-numeric,\nidentification number.", c->ObjectToStringValue(rxID)); @@ -796,7 +796,7 @@ if ( str ) { size_t l = _tcslen(str); - retStr = (rxcharT *)malloc(l + 1); + retStr = (rxcharT *)RXTMALLOC(l + 1); if ( retStr ) { rxcharT *p; @@ -827,25 +827,25 @@ * * @note The caller is responsible for freeing the returned string. */ -rxcharT *strdup_nospace(const rxcharT *str) +char *strdup_nospace(const char *str) { - rxcharT *retStr = NULL; + char *retStr = NULL; if ( str ) { - size_t l = _tcslen(str); - retStr = (rxcharT *)malloc(l + 1); + size_t l = strlen(str); + retStr = (char *)malloc(l + 1); if ( retStr ) { - rxcharT *p; + char *p; for ( p = retStr; *str; ++str ) { - if ( *str == _T(' ') || *str == _T('\t') ) + if ( *str == ' ' || *str == '\t' ) { continue; } *p++ = *str; } - *p = _T('\0'); + *p = '\0'; } } return retStr; @@ -867,7 +867,7 @@ if ( str ) { size_t l = _tcslen(str); - retStr = (rxcharT *)malloc(l + 1); + retStr = (rxcharT *)RXTMALLOC(l + 1); if ( retStr ) { rxcharT *p; @@ -905,19 +905,19 @@ * * @note The caller is responsible for freeing the returned string. */ -rxcharT *strdup_2methodName(const rxcharT *str) +char *strdup_2methodName(const char *str) { - rxcharT *retStr = NULL; + char *retStr = NULL; if ( str ) { - size_t l = _tcslen(str); - retStr = (rxcharT *)malloc(l + 1); + size_t l = strlen(str); + retStr = (char *)malloc(l + 1); if ( retStr ) { - rxcharT *p; + char *p; for ( p = retStr; *str; ++str ) { - if ( *str == _T(' ') || *str == _T('\t') || *str == _T('&') || *str == _T('+') || *str == _T(':') ) + if ( *str == ' ' || *str == '\t' || *str == '&' || *str == '+' || *str == ':' ) { continue; } @@ -926,13 +926,20 @@ *p++ = *str; } } - *(p - 3) == _T('.') ? *(p - 3) = _T('\0') : *p = _T('\0'); + *(p - 3) == '.' ? *(p - 3) = '\0' : *p = '\0'; } } return retStr; } +char *strdup_2methodName(const rxcharW *str) +{ + RXCW2A(str); + return strdup_2methodName(strT); +} + + /** * Convenience function to retrieve the dialog admin block from a generic * ooDialog Rexx object. @@ -1082,7 +1089,7 @@ // should check the count and if bigger than a certain size, see if it could // be optimized by using a string buffer. - LPTSTR pBuf = (LPTSTR)malloc(++count); + LPTSTR pBuf = (LPTSTR)RXTMALLOC(++count); if ( pBuf == NULL ) { outOfMemoryException(c->threadContext); @@ -1320,7 +1327,7 @@ { int cchWideChar = (int)strlen(text) + 1; - count = MultiByteToWideChar(CP_ACP, 0, text, -1, (LPWSTR)dest, cchWideChar); + count = MultiByteToWideChar(rxgetCodePage(), 0, text, -1, (LPWSTR)dest, cchWideChar); if ( count == 0 ) { // Unlikely that this failed, but if it did, treat it as an empty @@ -1366,14 +1373,14 @@ } char *ansiStr = NULL; - int32_t neededLen = WideCharToMultiByte(CP_ACP, 0, wstr, len, NULL, 0, NULL, NULL); + int32_t neededLen = WideCharToMultiByte(rxgetCodePage(), 0, wstr, len, NULL, 0, NULL, NULL); if ( neededLen != 0 ) { ansiStr = (char *)malloc(neededLen); if ( ansiStr != NULL ) { - if ( WideCharToMultiByte(CP_ACP, 0, wstr, len, ansiStr, neededLen, NULL, NULL) == 0 ) + if ( WideCharToMultiByte(rxgetCodePage(), 0, wstr, len, ansiStr, neededLen, NULL, NULL) == 0 ) { /* conversion failed */ free(ansiStr); Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -195,8 +195,9 @@ extern RexxStringObject dword2string(RexxMethodContext *, uint32_t); extern rxcharT * strdupupr(const rxcharT *str); extern rxcharT * strdupupr_nospace(const rxcharT *str); -extern rxcharT * strdup_nospace(const rxcharT *str); -extern rxcharT * strdup_2methodName(const rxcharT *str); +extern char * strdup_nospace(const char *str); +extern char * strdup_2methodName(const char *str); +extern char * strdup_2methodName(const rxcharW *str); extern DIALOGADMIN * getDlgAdm(RexxMethodContext *c, RexxObjectPtr dlg); extern void ooDialogInternalException(RexxMethodContext *, char *, int, char *, char *); Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -133,7 +133,7 @@ oodControl_t type = winUnknown; TCHAR buf[64]; - if ( RealGetWindowClass(hControl, buf, sizeof(buf)) ) + if ( RealGetWindowClass(hControl, buf, RXITEMCOUNT(buf)) ) { type = winName2controlType(buf); if ( type == winPushButton ) @@ -171,7 +171,7 @@ rxcharT buf[64]; const rxcharT *pClass = controlType2winName(control); - if ( ! RealGetWindowClass(hControl, buf, sizeof(buf)) || _tcscmp(buf, pClass) != 0 ) + if ( ! RealGetWindowClass(hControl, buf, RXITEMCOUNT(buf)) || _tcscmp(buf, pClass) != 0 ) { return false; } @@ -549,12 +549,12 @@ { goto done_out; } - if ( *methodName == '\0' ) + if ( *methodName == _T('\0') ) { c->RaiseException1(Rexx_Error_Invalid_argument_null, TheOneObj); goto done_out; } - if ( *keys == '\0' ) + if ( *keys == _T('\0') ) { c->RaiseException1(Rexx_Error_Invalid_argument_null, TheTwoObj); goto done_out; Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -429,7 +429,7 @@ rxcharT data[DATA_BUFFER]; HWND hCtrl = GetDlgItem(hDlg, ctrlID); - if ( hCtrl != NULL && *ldat != '\0' ) + if ( hCtrl != NULL && *ldat != _T('\0') ) { HTREEITEM hTreeItem, root = TreeView_GetRoot(hCtrl); tvi.hItem = root; @@ -489,7 +489,7 @@ HWND iW = GetDlgItem(hW, item); size_t len = 0; - ldat[0] = '\0'; + ldat[0] = _T('\0'); cnt = ListView_GetSelectedCount(iW); if (!cnt) return TRUE; @@ -907,7 +907,7 @@ continue; } - data[0] = '\0'; + data[0] = _T('\0'); hwnd = dlgAdm->ChildDlg[dlgAdm->DataTab[j].category]; itemID = dlgAdm->DataTab[j].id; @@ -926,68 +926,68 @@ { if ( ! getListBoxData(hwnd, itemID, data) ) { - data[0] = '\0'; + data[0] = _T('\0'); } } else if ( controlType == winComboBox ) { if ( ! getComboBoxData(hwnd, itemID, data) ) { - data[0] = '\0'; + data[0] = _T('\0'); } } else if ( controlType == winTreeView ) { if ( ! getTreeViewData(hwnd, data, itemID) ) { - data[0] = '\0'; + data[0] = _T('\0'); } } else if ( controlType == winListView ) { if ( ! getListViewData(hwnd, data, itemID) ) { - data[0] = '\0'; + data[0] = _T('\0'); } } else if ( controlType == winTrackBar ) { if ( ! getTrackBarData(hwnd, data, itemID) ) { - data[0] = '\0'; + data[0] = _T('\0'); } } else if ( controlType == winTab ) { if ( ! getTabData(hwnd, data, itemID) ) { - data[0] = '\0'; + data[0] = _T('\0'); } } else if ( controlType == winDateTimePicker ) { if ( ! getDateTimeData(hwnd, data, itemID) ) { - data[0] = '\0'; + data[0] = _T('\0'); } } else if ( controlType == winMonthCalendar ) { if ( ! getMonthCalendarData(hwnd, data, itemID) ) { - data[0] = '\0'; + data[0] = _T('\0'); } } else if ( controlType == winUpDown ) { if ( ! getUpDownData(hwnd, data, itemID) ) { - data[0] = '\0'; + data[0] = _T('\0'); } } else { - data[0] = '\0'; + data[0] = _T('\0'); } RXCT2A(data); Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -783,17 +783,18 @@ if (fd < 1) { rxcharT *msg; - char *errBuff; + rxcharT *errBuff; uint32_t err = GetLastError(); - msg = (rxcharT *)LocalAlloc(LPTR, 512); + msg = (rxcharT *)RXTLOCALALLOC(LPTR, 512); if ( msg ) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&errBuff, 0, NULL); + RXCA2T(szFile); _sntprintf(msg, 512, _T("Failed to open the bitmap file: %s.\n\nSystem error (%u):\n%s"), - szFile, err, errBuff); + szFileT.target(), err, errBuff); MessageBox(NULL, msg, _T("ooDialog Error"), MB_OK | MB_ICONASTERISK); LocalFree(msg); @@ -2679,7 +2680,6 @@ RXCA2T(text); RXCA2T(fontName); RXCA2T(fontStyle); - pCPlainBaseDialog pcpbd = NULL; HWND hCtrl = NULL; RexxObjectPtr result = TheOneObj; @@ -2718,6 +2718,10 @@ sleep = (argumentOmitted(8) ? 10 : sleep); color = (argumentOmitted(9) ? 0 : color); + textT = text; + fontNameT = fontName; + fontStyleT = fontStyle; + HDC hDC = GetWindowDC(hCtrl); if ( hDC == NULL ) { @@ -3413,14 +3417,14 @@ void setNumStrStem(RexxMethodContext *c, RexxStemObject stem, size_t numPart, CSTRING strPart, RexxObjectPtr value) { char tailName[64]; - _snprintf(tailName, sizeof(tailName), "%d.%s", numPart, strPart); + _snprintf(tailName, RXITEMCOUNT(tailName), "%d.%s", numPart, strPart); c->SetStemElement(stem, tailName, value); } void setStrNumStrStem(RexxMethodContext *c, RexxStemObject stem, CSTRING prefix, size_t numPart, CSTRING strPart, RexxObjectPtr value) { char tailName[128]; - _snprintf(tailName, sizeof(tailName), "%s.%d.%s", prefix, numPart, strPart); + _snprintf(tailName, RXITEMCOUNT(tailName), "%s.%d.%s", prefix, numPart, strPart); c->SetStemElement(stem, tailName, value); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -127,7 +127,7 @@ static UINT getTrackFlags(const rxcharT *); static uint32_t deleteSeparatorByID(HMENU, uint32_t); static uint32_t menuHelpID(HMENU hMenu, DWORD helpID, BOOL recurse, uint32_t *id); -static uint32_t menuConnectItems(HMENU hMenu, pCEventNotification pcen, CSTRINGT msg, bool isSysMenu, logical_t handles); +static uint32_t menuConnectItems(HMENU hMenu, pCEventNotification pcen, CSTRING msg, bool isSysMenu, logical_t handles); /** @@ -149,24 +149,26 @@ * * @return 0 on success, ERROR_NOT_ENOUGH_MEMORY on failure. */ -inline uint32_t _connectItem(pCEventNotification pcen, uint32_t id, CSTRINGT msg) +inline uint32_t _connectItem(pCEventNotification pcen, uint32_t id, CSTRING msg) { if ( id < 3 || id == 9 ) { return 0; } - return addCommandMessage(pcen, id, 0x0000FFFF, 0, 0, msg, TAG_NOTHING) ? 0 : ERROR_NOT_ENOUGH_MEMORY; + RXCA2T(msg); + return addCommandMessage(pcen, id, 0x0000FFFF, 0, 0, msgT, TAG_NOTHING) ? 0 : ERROR_NOT_ENOUGH_MEMORY; } /* Same as above but connects a System Menu item */ -inline BOOL _connectSysItem(pCEventNotification pcen, uint32_t id, CSTRINGT msg, logical_t isHandled) +inline BOOL _connectSysItem(pCEventNotification pcen, uint32_t id, CSTRING msg, logical_t isHandled) { uint32_t tag = TAG_DIALOG | TAG_SYSMENUCOMMAND; if ( isHandled ) { tag |= TAG_MSGHANDLED; } - return addMiscMessage(pcen, WM_SYSCOMMAND, UINT32_MAX, id, 0x0000FFF0, 0, 0, msg, tag) ? 0 : ERROR_NOT_ENOUGH_MEMORY; + RXCA2T(msg); + return addMiscMessage(pcen, WM_SYSCOMMAND, UINT32_MAX, id, 0x0000FFF0, 0, 0, msgT, tag) ? 0 : ERROR_NOT_ENOUGH_MEMORY; } /** @@ -271,7 +273,7 @@ * * @note text is required to be not null, the empty string is okay. */ -logical_t CppMenu::addTemplateItem(RexxObjectPtr rxID, CSTRINGT text, CSTRINGT opts, CSTRINGT method) +logical_t CppMenu::addTemplateItem(RexxObjectPtr rxID, CSTRINGT text, CSTRINGT opts, CSTRING method) { logical_t success = FALSE; oodResetSysErrCode(c->threadContext); @@ -689,8 +691,7 @@ c->DirectoryPut(result, autoConnect ? TheTrueObj : TheFalseObj, "AUTOCONNECT"); if ( connectionMethod != NULL ) { - RXCT2A(connectionMethod); - c->DirectoryPut(result, c->CString(connectionMethodT), "METHODNAME"); + c->DirectoryPut(result, c->CString(connectionMethod), "METHODNAME"); } return result; } @@ -717,10 +718,10 @@ * @assumes id is a resource ID and not a by position ID. This menu is a menu * bar. */ -BOOL CppMenu::maybeConnectItem(uint32_t id, CSTRINGT text, logical_t connect, CSTRINGT methodName) +BOOL CppMenu::maybeConnectItem(uint32_t id, CSTRINGT text, logical_t connect, CSTRING methodName) { BOOL success = TRUE; - rxcharT * _methodName = NULL; + char * _methodName = NULL; bool doAutoConnection = autoConnect && (dlg != TheNilObj); if ( ! connect && ! doAutoConnection ) @@ -782,7 +783,7 @@ // add it to the connection queue. if ( pcpbd != NULL ) { - rc = _connectItem(pcpbd->enCSelf, id, _methodName); + rc = _connectItem(pcpbd->enCSelf, id, _methodName); // JLF : bug ? should _methodName be replaced by methodName ? if ( rc != 0 ) { oodSetSysErrCode(c->threadContext, rc); @@ -791,7 +792,7 @@ } else { - if ( ! addToConnectionQ(id, _methodName) ) + if ( ! addToConnectionQ(id, _methodName) ) // JLF : bug ? should _methodName be replaced by methodName ? { // Couldn't allocate memory goto done_out; @@ -806,7 +807,7 @@ } -bool CppMenu::addToConnectionQ(uint32_t id, CSTRINGT methodName) +bool CppMenu::addToConnectionQ(uint32_t id, CSTRING methodName) { bool result = false; @@ -848,7 +849,7 @@ } m->id = id; - m->methodName = (rxcharT *)GlobalAlloc(GMEM_FIXED, _tcslen(methodName) + 1); + m->methodName = (char *)GlobalAlloc(GMEM_FIXED, strlen(methodName) + 1); if ( m->methodName == NULL ) { GlobalFree(m); @@ -856,7 +857,7 @@ outOfMemoryException(c->threadContext); goto done_out; } - _tcscpy(m->methodName, methodName); + strcpy(m->methodName, methodName); connectionQ[connectionQIndex++] = m; result = true; @@ -947,7 +948,7 @@ } -logical_t CppMenu::assignToDlg(RexxObjectPtr dialog, logical_t _autoConnect, CSTRINGT methodName) +logical_t CppMenu::assignToDlg(RexxObjectPtr dialog, logical_t _autoConnect, CSTRING methodName) { oodResetSysErrCode(c->threadContext); logical_t success = FALSE; @@ -1236,7 +1237,6 @@ logical_t CppMenu::connectItem(RexxObjectPtr rxID, CSTRING methodName, RexxObjectPtr dialog, logical_t handles) { - RXCA2T(methodName); logical_t success = FALSE; pCEventNotification pcen = basicConnectSetup(dialog); @@ -1254,11 +1254,11 @@ uint32_t rc; if ( isSystemMenu() ) { - rc = _connectSysItem(pcen, id, methodNameT, handles); + rc = _connectSysItem(pcen, id, methodName, handles); } else { - rc = _connectItem(pcen, id, methodNameT); + rc = _connectItem(pcen, id, methodName); } if ( rc == 0 ) { @@ -1274,7 +1274,7 @@ } -logical_t CppMenu::connectAllCommandEvents(CSTRINGT methodName, RexxObjectPtr dialog, logical_t handles) +logical_t CppMenu::connectAllCommandEvents(CSTRING methodName, RexxObjectPtr dialog, logical_t handles) { logical_t success = FALSE; @@ -1303,10 +1303,9 @@ logical_t CppMenu::connectSomeCommandEvents(RexxObjectPtr rxItemIds, CSTRING method, logical_t byPosition, RexxObjectPtr _dlg, logical_t handles) { - RXCA2T(method); logical_t success = FALSE; uint32_t *ids = NULL; - rxcharT *name = NULL; + char *name = NULL; pCEventNotification pcen = basicConnectSetup(_dlg); if ( pcen == NULL ) @@ -1339,7 +1338,7 @@ // so we go ahead and get the menu item text, even though we might not // use it. That gives us access to a filled in mii to use to check the // type of the menu item. - if ( ! getItemText(id, byPosition, buf, sizeof(buf), &mii) ) + if ( ! getItemText(id, byPosition, buf, RXITEMCOUNT(buf), &mii) ) { goto done_out; } @@ -1362,11 +1361,11 @@ if ( isSystemMenu() ) { - rc = _connectSysItem(pcen, id, method == NULL ? name : methodT, handles); + rc = _connectSysItem(pcen, id, method == NULL ? name : method, handles); } else { - rc = _connectItem(pcen, id, method == NULL ? name : methodT); + rc = _connectItem(pcen, id, method == NULL ? name : method); } if ( rc != 0 ) @@ -1577,8 +1576,7 @@ if ( on ) { autoConnect = true; - RXCA2T(methodName); - connectionMethod = methodNameT; + connectionMethod = methodName; } else { @@ -2573,7 +2571,7 @@ * * @return 0 on success, the system error code on failure. */ -static uint32_t menuConnectItems(HMENU hMenu, pCEventNotification pcen, CSTRINGT msg, bool isSysMenu, logical_t handles) +static uint32_t menuConnectItems(HMENU hMenu, pCEventNotification pcen, CSTRING msg, bool isSysMenu, logical_t handles) { uint32_t rc = 0; int count = GetMenuItemCount(hMenu); @@ -2605,7 +2603,7 @@ { TCHAR buf[256]; mii.fMask = MIIM_ID | MIIM_STRING | MIIM_FTYPE; - mii.cch = sizeof(buf); + mii.cch = RXITEMCOUNT(buf); mii.dwTypeData = buf; if ( GetMenuItemInfo(hMenu, i, TRUE, &mii) == 0 ) @@ -2614,7 +2612,7 @@ } - rxcharT *pMsg = (rxcharT *)msg; + char *pMsg = (char *)msg; if ( pMsg == NULL ) { // strdup_2methodName removes any '&' and the trailing ... if any. @@ -2731,7 +2729,6 @@ RexxMethod5(logical_t, menu_connectCommandEvent_cls, RexxObjectPtr, rxID, CSTRING, methodName, RexxObjectPtr, dlg, OPTIONAL_logical_t, isHandled, OSELF, self) { - RXCA2T(methodName); logical_t success = FALSE; bool isSystemMenu = isOfClassType(context, self, "SystemMenu"); @@ -2750,11 +2747,11 @@ uint32_t rc; if ( isSystemMenu ) { - rc = _connectSysItem(pcen, id, methodNameT, isHandled); + rc = _connectSysItem(pcen, id, methodName, isHandled); } else { - rc = _connectItem(pcen, id, methodNameT); + rc = _connectItem(pcen, id, methodName); } (rc == 0) ? success = TRUE : oodSetSysErrCode(context->threadContext, rc); @@ -3595,9 +3592,6 @@ OPTIONAL_logical_t, connect, OPTIONAL_CSTRING, methodName, CSELF, cMenuPtr) { RXCA2T(text); - RXCA2T(stateOpts); - RXCA2T(typeOpts); - RXCA2T(methodName); CppMenu *cMenu = (CppMenu *)cMenuPtr; cMenu->setContext(context, TheFalseObj); @@ -3619,17 +3613,19 @@ mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_STRING | MIIM_ID; mii.fType = MFT_STRING; - mii.dwTypeData = (LPTSTR)textT.target(); // rxwchar tocheck : I assume it's safe to cast that way... Was like that before rxwcharization + mii.dwTypeData = (LPTSTR)textT.target(); // rxwchar tocheck : I assume it's safe to cast to non const... Was like that before rxwcharization mii.wID = id; if ( argumentExists(4) ) { + RXCA2T(stateOpts); mii.fState = getItemStateOpts(stateOptsT, 0); mii.fMask |= MIIM_STATE; } if ( argumentExists(5) ) { + RXCA2T(typeOpts); mii.fType |= getItemTypeOpts(typeOptsT, 0); mii.fMask |= MIIM_FTYPE; } @@ -3647,7 +3643,7 @@ if ( cMenu->isMenuBar() && ! byPosition ) { - success = cMenu->maybeConnectItem(id, textT, connect, methodNameT); + success = cMenu->maybeConnectItem(id, textT, connect, methodName); } done_out: @@ -3717,8 +3713,6 @@ OPTIONAL_CSTRING, stateOpts, OPTIONAL_CSTRING, typeOpts, OPTIONAL_logical_t, byPosition, CSELF, cMenuPtr) { RXCA2T(text); - RXCA2T(stateOpts); - RXCA2T(typeOpts); CppMenu *cMenu = (CppMenu *)cMenuPtr; cMenu->setContext(context, TheFalseObj); @@ -3751,17 +3745,19 @@ mii.fMask = MIIM_STRING | MIIM_SUBMENU | MIIM_ID; mii.fType = MFT_STRING; mii.hSubMenu = cPopMenu->getHMenu(); - mii.dwTypeData = (LPTSTR)textT.target(); // rxwchar tocheck : I assume it's safe to cast that way... Was like that before rxwcharization + mii.dwTypeData = (LPTSTR)textT.target(); // rxwchar tocheck : I assume it's safe to cast to non const... Was like that before rxwcharization mii.wID = id; if ( argumentExists(5) ) { + RXCA2T(stateOpts); mii.fState = getPopupStateOpts(stateOptsT, 0); mii.fMask |= MIIM_STATE; } if ( argumentExists(6) ) { + RXCA2T(typeOpts); mii.fType |= getPopupTypeOpts(typeOptsT, 0); mii.fMask |= MIIM_FTYPE; } @@ -4360,7 +4356,7 @@ ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_STRING; - mii.dwTypeData = (LPTSTR)textT.target(); // rxwchar tocheck : I assume it's safe to cast that way... Was like that before rxwcharization + mii.dwTypeData = (LPTSTR)textT.target(); // rxwchar tocheck : I assume it's safe to cast to non const... Was like that before rxwcharization if ( SetMenuItemInfo(cMenu->getHMenu(), itemID, (BOOL)byPosition, &mii) == 0 ) { oodSetSysErrCode(context->threadContext); @@ -4396,7 +4392,7 @@ cMenu->setContext(context, TheFalseObj); rxcharT buf[256]; - *buf = '\0'; + *buf = _T('\0'); MENUITEMINFO mii = {0}; uint32_t itemID; @@ -4415,7 +4411,7 @@ mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_STRING; mii.dwTypeData = (LPTSTR)buf; - mii.cch = sizeof(buf); + mii.cch = RXITEMCOUNT(buf); if ( GetMenuItemInfo(cMenu->getHMenu(), itemID, (BOOL)byPosition, &mii) == 0 ) { oodSetSysErrCode(context->threadContext); @@ -4485,13 +4481,11 @@ */ RexxMethod2(RexxStringObject, menu_itemTextToMethodName, CSTRING, text, OSELF, self) { - RXCA2T(text); RexxStringObject result = NULLOBJECT; - rxcharT *name = strdup_2methodName(textT); + char *name = strdup_2methodName(text); if ( name != NULL ) { - RXCT2A(name); - result = context->String(nameT); + result = context->String(name); free(name); } else @@ -4620,11 +4614,10 @@ */ RexxMethod3(logical_t, menu_connectAllCommandEvents, OPTIONAL_CSTRING, msg, OPTIONAL_RexxObjectPtr, _dlg, CSELF, cMenuPtr) { - RXCA2T(msg); CppMenu *cMenu = (CppMenu *)cMenuPtr; cMenu->setContext(context, TheFalseObj); - return cMenu->connectAllCommandEvents(msgT, _dlg, FALSE); + return cMenu->connectAllCommandEvents(msg, _dlg, FALSE); } /** Menu::connectSomeCommandEvents() @@ -4837,13 +4830,13 @@ RexxMethod5(logical_t, menuTemplate_addPopup, RexxObjectPtr, rxID, CSTRING, text, OPTIONAL_CSTRING, opts, OPTIONAL_RexxObjectPtr, rxHelpID, OSELF, self) { - RXCA2T(text); - RXCA2T(opts); RexxMethodContext *c = context; CppMenu *cMenu = menuToCSelf(context, self); cMenu->setContext(context, TheFalseObj); + RXCA2T(text); + RXCA2T(opts); return cMenu->addTemplatePopup(rxID, textT, optsT, rxHelpID); } @@ -4889,13 +4882,12 @@ RexxMethod5(logical_t, menuTemplate_addItem, RexxObjectPtr, rxID, CSTRING, text, OPTIONAL_CSTRING, opts, OPTIONAL_CSTRING, method, OSELF, self) { - RXCA2T(text); - RXCA2T(opts); - RXCA2T(method); CppMenu *cMenu = menuToCSelf(context, self); cMenu->setContext(context, TheFalseObj); - return cMenu->addTemplateItem(rxID, textT, optsT, methodT); + RXCA2T(text); + RXCA2T(opts); + return cMenu->addTemplateItem(rxID, textT, optsT, method); } @@ -4934,10 +4926,10 @@ */ RexxMethod3(logical_t, menuTemplate_addSeparator, RexxObjectPtr, rxID, OPTIONAL_CSTRING, opts, OSELF, self) { - RXCA2T(opts); CppMenu *cMenu = menuToCSelf(context, self); cMenu->setContext(context, TheFalseObj); + RXCA2T(opts); return cMenu->addTemplateSepartor(rxID, optsT); } @@ -5338,11 +5330,10 @@ */ RexxMethod3(logical_t, sysMenu_connectAllCommandEvents, logical_t, handles, OPTIONAL_CSTRING, msg, CSELF, cMenuPtr) { - RXCA2T(msg); CppMenu *cMenu = (CppMenu *)cMenuPtr; cMenu->setContext(context, TheFalseObj); - return cMenu->connectAllCommandEvents(msgT, NULLOBJECT, handles); + return cMenu->connectAllCommandEvents(msg, NULLOBJECT, handles); } /** SystemMenu::connectSomeCommandEvents() @@ -5677,11 +5668,10 @@ RexxMethod4(logical_t, popMenu_assignTo, RexxObjectPtr, dlg, OPTIONAL_logical_t, autoConnect, OPTIONAL_CSTRING, methodName, CSELF, cMenuPtr) { - RXCA2T(methodName); CppMenu *cMenu = (CppMenu *)cMenuPtr; cMenu->setContext(context, TheFalseObj); - return cMenu->assignToDlg(dlg, autoConnect, methodNameT); + return cMenu->assignToDlg(dlg, autoConnect, methodName); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -92,7 +92,7 @@ typedef struct _mapItem { uint32_t id; - rxcharT * methodName; + char * methodName; } MapItem; class CppMenu @@ -131,7 +131,7 @@ bool finishTemplate(); void deleteTemplate(); logical_t addTemplateSepartor(RexxObjectPtr rxID, CSTRINGT opts); - logical_t addTemplateItem(RexxObjectPtr rxID, CSTRINGT text, CSTRINGT opts, CSTRINGT method); + logical_t addTemplateItem(RexxObjectPtr rxID, CSTRINGT text, CSTRINGT opts, CSTRING method); logical_t addTemplatePopup(RexxObjectPtr rxID, CSTRINGT text, CSTRINGT opts, RexxObjectPtr helpID); inline logical_t templateIsComplete() { return isFinal ? TRUE : FALSE; } inline void noTempHelpID() { helpID = (uint32_t)-1; } @@ -145,17 +145,17 @@ RexxDirectoryObject autoConnectionStatus(); void setAutoConnection(logical_t on, CSTRING methodName); - BOOL maybeConnectItem(uint32_t id, CSTRINGT text, logical_t connect, CSTRINGT methodName); + BOOL maybeConnectItem(uint32_t id, CSTRINGT text, logical_t connect, CSTRING methodName); logical_t attachToDlg(RexxObjectPtr dialog); - logical_t assignToDlg(RexxObjectPtr dialog, logical_t autoConnect, CSTRINGT methodName); - bool addToConnectionQ(uint32_t id, CSTRINGT methodName); + logical_t assignToDlg(RexxObjectPtr dialog, logical_t autoConnect, CSTRING methodName); + bool addToConnectionQ(uint32_t id, CSTRING methodName); BOOL checkPendingConnections(); BOOL checkAutoConnect(pCEventNotification pcen); void releaseConnectionQ(); BOOL detach(bool skipChecks); BOOL destroy(); - logical_t connectAllCommandEvents(CSTRINGT msg, RexxObjectPtr dialog, logical_t handles); + logical_t connectAllCommandEvents(CSTRING msg, RexxObjectPtr dialog, logical_t handles); logical_t connectItem(RexxObjectPtr rxID, CSTRING methodName, RexxObjectPtr dialog, logical_t handles); logical_t connectSomeCommandEvents(RexxObjectPtr, CSTRING, logical_t, RexxObjectPtr, logical_t); logical_t connectMenuMessage(CSTRING, CSTRING, HWND, RexxObjectPtr, logical_t); @@ -199,7 +199,7 @@ size_t connectionQSize; size_t connectionQIndex; - CSTRINGT connectionMethod; + CSTRING connectionMethod; // Remember : Not CSTRINGT because 1) wide char not needed for method name and 2) wide char would create memory leak because of copy() bool autoConnect; }; Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2010-05-13 23:26:26 UTC (rev 5958) @@ -393,13 +393,13 @@ switch ( t ) { case NoPCPBDpased : - _snprintf(buf, sizeof(buf), NO_PCPBD_PASSED_MSG, pcpbd, hDlg); + _snprintf(buf, RXITEMCOUNT(buf), NO_PCPBD_PASSED_MSG, pcpbd, hDlg); break; case NoThreadAttach : - _snprintf(buf, sizeof(buf), NO_THREAD_ATTACH_MSG, pcpbd, hDlg); + _snprintf(buf, RXITEMCOUNT(buf), NO_THREAD_ATTACH_MSG, pcpbd, hDlg); break; case NoThreadContext : - _snprintf(buf, sizeof(buf), NO_THREAD_CONTEXT_MSG, pcpbd->dlgAdm, pcpbd->dlgProcContext, hDlg); + _snprintf(buf, RXITEMCOUNT(buf), NO_THREAD_CONTEXT_MSG, pcpbd->dlgAdm, pcpbd->dlgProcContext, hDlg); break; } @@ -424,7 +424,7 @@ } else { - _tprintf(_T("MESSAGE QUEUE OVERFLOW\n")); + printf("MESSAGE QUEUE OVERFLOW\n"); } return 0; } @@ -571,7 +571,7 @@ * enclosed in quotes to prevent errors. Now, the message string is * used with sendWith(), no interpret is involved. Since, some of the * args are strings, that could include commas, the individual args - * are separated here with ASCII \xFF (255, 0xFF, octal 377) and in the + * are separa... [truncated message content] |
From: <jfa...@us...> - 2010-05-14 19:53:58
|
Revision: 5961 http://oorexx.svn.sourceforge.net/oorexx/?rev=5961&view=rev Author: jfaucher Date: 2010-05-14 19:53:51 +0000 (Fri, 14 May 2010) Log Message: ----------- oodialog wide char : Fix crash in conversion, memory allocation was not good. Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/extensions/platform/windows/oodialog/rxwchar.cpp sandbox/jlf/unicode/_readme.odt Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-05-14 14:49:33 UTC (rev 5960) +++ sandbox/jlf/_diary.txt 2010-05-14 19:53:51 UTC (rev 5961) @@ -31,6 +31,36 @@ =============================================================================== +2010 may 14 + +More work on wide-chars in oodialog. + +Fixed a crash in the conversion A2W and W2A : The length must be asked to the Windows service, +and not calculated with bad assumptions as I did. + + +Something not clear to me : +In oodMessaging.cpp, there is a message queue implemented as a string. +Each element is separated by a special character 0xFF. +This message queue is declared rxcharT, so it's a wide-char string when building the wide-char configuration. +Several methods have a rexxMethod parameter, and I declared it rxcharT. +But normally, a method name is always a byte-char string, there is no need to convert it to wide-char... +Problem : if I declare it as rxcharA, then what should I do with the pMessageQueue ? +Can I declare it rxcharA ? in this case, I must encode wide-char to byte-char each time a message is added +Or is it better to keep it rxcharW ? Currently addDialogMessage takes two wide-char arguments... +It's a matter of conversion boundary... + + +The japanese characters are not properly displayed by MessageBox (i.e. InfoDialog). +It seems that under XP, one must install files for complex scripts. +Not needed under Vista. +--> go to the "Regional and Language Options" control panel, go to the "Languages" tab, +and select "Install filesfor complex script...". +You need to reboot :-( +--> good, after reboot it works... + + +=============================================================================== 2010 may 13 More work on wide-chars in oodialog. Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/rxwchar.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/rxwchar.cpp 2010-05-14 14:49:33 UTC (rev 5960) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/rxwchar.cpp 2010-05-14 19:53:51 UTC (rev 5961) @@ -68,15 +68,15 @@ return true; // NOERROR } - // Determine number of wide characters to be allocated for the - // Unicode string. - size_t cCharacters = strlen(pszA)+1; + size_t lengthA = strlen(pszA) + 1; + // Determine number of wide characters to be allocated for the Unicode string. + size_t lengthW = MultiByteToWideChar(rxgetCodePage(), 0, pszA, lengthA, NULL, 0); - *ppszW = (rxcharW *) malloc(cCharacters*2); + *ppszW = (rxcharW *) RXTMALLOC(lengthW + 1); if (NULL == *ppszW) return false; // E_OUTOFMEMORY; // Convert to Unicode. - if (0 == MultiByteToWideChar(rxgetCodePage(), 0, pszA, cCharacters, *ppszW, cCharacters)) + if (0 == MultiByteToWideChar(rxgetCodePage(), 0, pszA, lengthA, *ppszW, lengthW)) { DWORD dwError = GetLastError(); free(*ppszW); @@ -98,17 +98,15 @@ return true; // NOERROR } - size_t cCharacters = wcslen(pszW)+1; - // Determine number of bytes to be allocated for ANSI string. An - // ANSI string can have at most 2 bytes per character (for Double - // Byte Character Strings.) - size_t cbAnsi = cCharacters*2; + size_t lengthW = wcslen(pszW) + 1; + // Determine number of bytes to be allocated for ANSI string. + size_t lengthA = WideCharToMultiByte(rxgetCodePage(), 0, pszW, lengthW, NULL, 0, NULL, NULL); - *ppszA = (rxcharA *) malloc(cbAnsi); + *ppszA = (rxcharA *) malloc(lengthA + 1); if (NULL == *ppszA) return false; // E_OUTOFMEMORY; // Convert to ANSI. - if (0 == WideCharToMultiByte(rxgetCodePage(), 0, pszW, cCharacters, *ppszA, cbAnsi, NULL, NULL)) + if (0 == WideCharToMultiByte(rxgetCodePage(), 0, pszW, lengthW, *ppszA, lengthA, NULL, NULL)) { DWORD dwError = GetLastError(); free(*ppszA); Modified: sandbox/jlf/unicode/_readme.odt =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-05-14 21:41:57
|
Revision: 5962 http://oorexx.svn.sourceforge.net/oorexx/?rev=5962&view=rev Author: jfaucher Date: 2010-05-14 21:41:49 +0000 (Fri, 14 May 2010) Log Message: ----------- merge 5835-5957 from main/trunk Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/Makefile.am sandbox/jlf/trunk/bootstrap sandbox/jlf/trunk/common/platform/unix/SysFile.cpp sandbox/jlf/trunk/configure.ac sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp sandbox/jlf/trunk/interpreter/classes/BufferClass.hpp sandbox/jlf/trunk/interpreter/runtime/Interpreter.cpp sandbox/jlf/trunk/interpreter/runtime/RexxConstants.hpp sandbox/jlf/trunk/orxdb.bat sandbox/jlf/trunk/platform/unix/oorexx.spec.in sandbox/jlf/trunk/platform/windows/buildorx.bat sandbox/jlf/trunk/platform/windows/install/oorexx.nsi Added Paths: ----------- sandbox/jlf/trunk/extensions/hostemu/ sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp sandbox/jlf/trunk/extensions/hostemu/cmdparse.ypp sandbox/jlf/trunk/extensions/hostemu/hostemu.h sandbox/jlf/trunk/extensions/hostemu/platform/ sandbox/jlf/trunk/extensions/hostemu/platform/unix/ sandbox/jlf/trunk/extensions/hostemu/platform/unix/hostemu.cpp sandbox/jlf/trunk/extensions/hostemu/platform/windows/ sandbox/jlf/trunk/extensions/hostemu/platform/windows/hostemu.cpp sandbox/jlf/trunk/platform/unix/macosx/ sandbox/jlf/trunk/platform/unix/macosx/org.rexxla.oorexx.rxapid.plist sandbox/jlf/trunk/platform/unix/macosx/postflight sandbox/jlf/trunk/platform/unix/macosx/preflight sandbox/jlf/trunk/platform/windows/hostemu.def sandbox/jlf/trunk/platform/windows/hostemu.mak sandbox/jlf/trunk/platform/windows/misc.mak Removed Paths: ------------- sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp sandbox/jlf/trunk/extensions/hostemu/cmdparse.ypp sandbox/jlf/trunk/extensions/hostemu/hostemu.h sandbox/jlf/trunk/extensions/hostemu/platform/ sandbox/jlf/trunk/extensions/hostemu/platform/unix/ sandbox/jlf/trunk/extensions/hostemu/platform/unix/hostemu.cpp sandbox/jlf/trunk/extensions/hostemu/platform/windows/ sandbox/jlf/trunk/extensions/hostemu/platform/windows/hostemu.cpp sandbox/jlf/trunk/platform/unix/macosx/org.rexxla.oorexx.rxapid.plist sandbox/jlf/trunk/platform/unix/macosx/postflight sandbox/jlf/trunk/platform/unix/macosx/preflight sandbox/jlf/trunk/platform/windows/rxftp.mak Property Changed: ---------------- sandbox/jlf/trunk/ sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/rxsock/mime.cls sandbox/jlf/trunk/extensions/rxsock/smtp.cls sandbox/jlf/trunk/extensions/rxsock/streamsocket.cls Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-05-14 19:53:51 UTC (rev 5961) +++ sandbox/jlf/_diary.txt 2010-05-14 21:41:49 UTC (rev 5962) @@ -176,3 +176,4 @@ rev 5812 merge 5812-5835 from main/trunk +merge 5835-5957 from main/trunk Property changes on: sandbox/jlf/trunk ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk:5812-5835 + /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk:5812-5957 Modified: sandbox/jlf/trunk/Makefile.am =================================================================== --- sandbox/jlf/trunk/Makefile.am 2010-05-14 19:53:51 UTC (rev 5961) +++ sandbox/jlf/trunk/Makefile.am 2010-05-14 21:41:49 UTC (rev 5962) @@ -87,6 +87,7 @@ build_extensions_rxmath_dir = $(build_extensions_dir)/rxmath build_extensions_rxregexp_dir = $(build_extensions_dir)/rxregexp build_extensions_rxsock_dir = $(build_extensions_dir)/rxsock +build_extensions_hostemu_dir = $(build_extensions_dir)/hostemu build_utilities_dir = $(top_srcdir)/utilities build_utilities_rexximage_dir = $(build_utilities_dir)/rexximage build_api_dir = $(top_srcdir)/api @@ -101,6 +102,7 @@ interpreter_unix_dir = $(build_interpreter_dir)/platform/unix extensions_unix_dir = $(build_extensions_dir)/platform/unix extensions_rexutils_unix_dir = $(build_extensions_rexutils_dir)/platform/unix +extensions_hostemu_unix_dir = $(build_extensions_hostemu_dir)/platform/unix utilities_rexx_unix_dir = $(build_utilities_dir)/rexx/platform/unix utilities_rexxc_unix_dir = $(build_utilities_dir)/rexxc/platform/unix utilities_rxqueue_unix_dir = $(build_utilities_dir)/rxqueue/platform/unix @@ -355,6 +357,7 @@ $(build_extensions_rxregexp_dir)/dblqueue.hpp \ $(build_extensions_rxregexp_dir)/regexp.hpp rxsockHeaders = $(build_extensions_rxsock_dir)/rxsock.h +hostemuHeaders = $(build_extensions_hostemu_dir)/hostemu.h # Platform specific files windowsMiscFiles = unixMiscFiles = $(interpreter_unix_dir)/*.cat \ @@ -373,6 +376,7 @@ $(top_srcdir)/unix-like-build.txt \ $(top_srcdir)/windows-build.txt \ $(top_srcdir)/oorexx.ver \ + $(build_extensions_csvstream_dir)/csvStream.cls \ $(build_extensions_rxftp_dir)/rxftp.cls \ $(build_extensions_csvstream_dir)/csvStream.cls \ $(build_extensions_rxsock_dir)/socket.cls \ @@ -409,7 +413,8 @@ $(rexxapiCommonHeaders) \ $(rexxapiServerHeaders) \ $(rxregexpHeaders) \ - $(rxsockHeaders) + $(rxsockHeaders) \ + $(hostemuHeaders) # # These error message files are built BEFORE any other target @@ -424,7 +429,7 @@ # # Shared library targets # -pkglib_LTLIBRARIES = librexxapi.la librexx.la librexxutil.la librxmath.la librxregexp.la librxsock.la +pkglib_LTLIBRARIES = librexxapi.la librexx.la librexxutil.la librxmath.la librxregexp.la librxsock.la libhostemu.la # # Scripts to install @@ -923,9 +928,30 @@ librxregexp_la_LIBADD = @ORX_LIBADD_LIBRARY@ librxregexp_la_LDFLAGS = $(VERSION_INFO) @ORX_LDFLAGS_LIBRARY@ +#################### libhostemu.so ################ # +# Sources for libhostemu.so +# +libhostemu_la_SOURCES = $(extensions_hostemu_unix_dir)/hostemu.cpp \ + $(build_extensions_hostemu_dir)/hostemu.h \ + $(build_extensions_hostemu_dir)/cmdparse.ypp +# +# Preprocessor flags for libhostemu.so +# +libhostemu_la_CXXFLAGS = $(COMMON_CPPFLAGS) \ + -I$(build_api_dir) \ + -I$(build_api_platform_dir) \ + -I$(build_extensions_hostemu_dir) +# +# Extra libraries for libhostemu.so (maybe) +# +libhostemu_la_LIBADD = @ORX_LIBADD_LIBRARY@ +libhostemu_la_LDFLAGS = $(VERSION_INFO) @ORX_LDFLAGS_LIBRARY@ + +# # explicit targets: # + rexx.cat: $(build_messages_dir)/gencat.inp -gencat $(@) $(build_messages_dir)/gencat.inp @@ -1031,9 +1057,12 @@ $(install_sh_SCRIPT) $(build_extensions_rxsock_dir)/streamsocket.cls $(DESTDIR)$(prefix)/bin/streamsocket.cls $(install_sh_SCRIPT) $(build_extensions_rxsock_dir)/mime.cls $(DESTDIR)$(prefix)/bin/mime.cls $(install_sh_SCRIPT) $(build_extensions_rxsock_dir)/smtp.cls $(DESTDIR)$(prefix)/bin/smtp.cls - if test "$(ORX_SYS_STR)" != "AIX"; then \ + if test "$(ORX_SYS_STR)" != "AIX" -a "$(ORX_SYS_STR)" != "MACOSX"; then \ $(install_sh_SCRIPT) $(rexxapi_server_unix_dir)/rxapid $(DESTDIR)$(prefix)/bin/rxapid; \ fi + if test "$(ORX_SYS_STR)" = "MACOSX"; then \ + $(install_sh_SCRIPT) $(platform_unix_dir)/macosx/org.rexxla.oorexx.rxapid.plist $(DESTDIR)$(prefix)/bin/org.rexxla.oorexx.rxapid.plist; \ + fi for a in $(build_samples_dir)/*.rex; do \ bn=`basename $$a`; \ $(install_sh_SCRIPT) $$a $(DESTDIR)$(prefix)/share/ooRexx/$$bn; \ Modified: sandbox/jlf/trunk/bootstrap =================================================================== --- sandbox/jlf/trunk/bootstrap 2010-05-14 19:53:51 UTC (rev 5961) +++ sandbox/jlf/trunk/bootstrap 2010-05-14 21:41:49 UTC (rev 5962) @@ -1,7 +1,7 @@ -#! /bin/sh -x +#! /bin/sh #/*----------------------------------------------------------------------------*/ #/* */ -#/* Copyright (c) 2005-2006 Rexx Language Association. All rights reserved. */ +#/* Copyright (c) 2005-2010 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 */ @@ -39,9 +39,10 @@ OS=`uname -s` if [ "$OS" = "Darwin" ] then -glibtoolize --copy --force --automake; + export LIBTOOLIZE='glibtoolize autoreconf -fi' + glibtoolize --copy --force --automake; else -libtoolize --copy --force --automake; + libtoolize --copy --force --automake; fi aclocal autoheader Modified: sandbox/jlf/trunk/common/platform/unix/SysFile.cpp =================================================================== --- sandbox/jlf/trunk/common/platform/unix/SysFile.cpp 2010-05-14 19:53:51 UTC (rev 5961) +++ sandbox/jlf/trunk/common/platform/unix/SysFile.cpp 2010-05-14 21:41:49 UTC (rev 5962) @@ -63,7 +63,7 @@ # include <sys/filio.h> #endif -#ifdef __APPLE__ & __MACH__ +#if defined(__APPLE__) && defined(__MACH__) # define lseek64 lseek # define open64 open #endif Modified: sandbox/jlf/trunk/configure.ac =================================================================== --- sandbox/jlf/trunk/configure.ac 2010-05-14 19:53:51 UTC (rev 5961) +++ sandbox/jlf/trunk/configure.ac 2010-05-14 21:41:49 UTC (rev 5962) @@ -59,6 +59,7 @@ AC_PROG_INSTALL AC_PROG_MAKE_SET AC_PROG_RANLIB +AC_PROG_YACC AC_LIBTOOL_DLOPEN AC_PROG_LIBTOOL @@ -305,6 +306,7 @@ sys/time.h \ sys/utsname.h \ sys/wait.h \ + sys/syscall.h \ time.h \ unistd.h \ usersec.h \ Deleted: sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp =================================================================== --- main/trunk/extensions/hostemu/cmdparse.cpp 2010-05-13 15:36:24 UTC (rev 5957) +++ sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp 2010-05-14 21:41:49 UTC (rev 5962) @@ -1,826 +0,0 @@ -#ifndef lint -static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; -#endif - -#include <stdlib.h> -#include <string.h> - -#define YYBYACC 1 -#define YYMAJOR 1 -#define YYMINOR 9 -#define YYPATCH 20070509 - -#define YYEMPTY (-1) -#define yyclearin (yychar = YYEMPTY) -#define yyerrok (yyerrflag = 0) -#define YYRECOVERING (yyerrflag != 0) - -extern int yyparse(void); - -static int yygrowstack(void); -#define YYPREFIX "yy" -#line 2 "./extensions/hostemu/cmdparse.y" -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 2009-2010 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. */ -/* */ -/* Authors; */ -/* W. David Ashley <da...@us...> */ -/* */ -/*----------------------------------------------------------------------------*/ - - -/*----------------------------------------------------------------------------*/ -/* !!!CAUTION!!! */ -/* Do not edit the cmdparse.cpp file! This file is produced by yacc! You */ -/* should edit the cmdparse.y file and regen the changes via make! */ -/*----------------------------------------------------------------------------*/ - - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <ctype.h> -#include <rexx.h> - -#include "hostemu.h" - -/*--------------------------------------------------------------------*/ -/* Local function prototypes */ -/*--------------------------------------------------------------------*/ - -int yylex ( - void); /* no arguments */ -void yyerror ( - char * token); /* token string */ -int kwsearch ( - char * token); /* token string */ -bool isnumeric ( - char * token); /* token string */ - - -#line 73 "./extensions/hostemu/cmdparse.y" -typedef union - { - int numval; - char * strval; - } YYSTYPE; -#line 100 "./extensions/hostemu/cmdparse.cpp" -#define EXECIO 257 -#define HI 258 -#define TE 259 -#define TS 260 -#define CONSTANT 261 -#define DISKW 262 -#define DISKR 263 -#define STEM 264 -#define FINIS 265 -#define LIFO 266 -#define FIFO 267 -#define SKIP 268 -#define YYERRCODE 256 -short yylhs[] = { -1, - 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, - 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, - 5, 5, 5, 5, 5, -}; -short yylen[] = { 2, - 3, 3, 1, 1, 1, 3, 3, 4, 2, 0, - 1, 2, 2, 2, 2, 3, 3, 0, 2, 0, - 1, 2, 3, 3, 0, -}; -short yydefred[] = { 0, - 0, 3, 4, 5, 0, 0, 0, 0, 0, 1, - 2, 0, 0, 0, 6, 0, 0, 7, 0, 0, - 19, 8, 0, 0, 9, 0, 0, 0, 0, 13, - 12, 14, 23, 24, 16, 17, -}; -short yydgoto[] = { 5, - 10, 15, 18, 25, 21, -}; -short yysindex[] = { -250, - -41, 0, 0, 0, 0, -251, -251, -258, -248, 0, - 0, -26, -40, -249, 0, -21, -247, 0, -241, -243, - 0, 0, -239, -262, 0, -242, -237, -240, -235, 0, - 0, 0, 0, 0, 0, 0, -}; -short yyrindex[] = { 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 28, 29, 0, 28, 30, 0, 0, 31, - 0, 0, 0, 32, 0, 33, 0, 34, 0, 0, - 0, 0, 0, 0, 0, 0, -}; -short yygindex[] = { 0, - 35, 0, 19, 0, 0, -}; -#define YYTABLESIZE 221 -short yytable[] = { 17, - 7, 29, 12, 30, 31, 32, 1, 2, 3, 4, - 8, 9, 13, 14, 19, 20, 23, 24, 17, 26, - 27, 28, 33, 34, 35, 36, 20, 10, 25, 18, - 21, 11, 22, 15, 22, 0, 0, 0, 0, 0, - 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 16, -}; -short yycheck[] = { 40, - 42, 264, 261, 266, 267, 268, 257, 258, 259, 260, - 262, 263, 261, 40, 264, 265, 264, 265, 40, 261, - 264, 261, 265, 261, 265, 261, 0, 0, 0, 0, - 0, 0, 0, 0, 16, -1, -1, -1, -1, -1, - -1, 7, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 261, - 261, -}; -#define YYFINAL 5 -#ifndef YYDEBUG -#define YYDEBUG 0 -#endif -#define YYMAXTOKEN 268 -#if YYDEBUG -char *yyname[] = { -"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,"'('",0,"'*'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"EXECIO","HI","TE","TS", -"CONSTANT","DISKW","DISKR","STEM","FINIS","LIFO","FIFO","SKIP", -}; -char *yyrule[] = { -"$accept : stmt", -"stmt : EXECIO CONSTANT disk_clause", -"stmt : EXECIO '*' disk_clause", -"stmt : HI", -"stmt : TE", -"stmt : TS", -"disk_clause : DISKW CONSTANT diskw_option", -"disk_clause : DISKR CONSTANT diskr_option", -"disk_clause : DISKR CONSTANT CONSTANT diskr_option", -"diskr_option : '(' diskr_options", -"diskr_option :", -"diskr_options : FINIS", -"diskr_options : FINIS FIFO", -"diskr_options : FINIS LIFO", -"diskr_options : FINIS SKIP", -"diskr_options : STEM CONSTANT", -"diskr_options : STEM CONSTANT FINIS", -"diskr_options : FINIS STEM CONSTANT", -"diskr_options :", -"diskw_option : '(' diskw_options", -"diskw_option :", -"diskw_options : FINIS", -"diskw_options : STEM CONSTANT", -"diskw_options : STEM CONSTANT FINIS", -"diskw_options : FINIS STEM CONSTANT", -"diskw_options :", -}; -#endif -#if YYDEBUG -#include <stdio.h> -#endif - -/* define the initial stack-sizes */ -#ifdef YYSTACKSIZE -#undef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE -#else -#ifdef YYMAXDEPTH -#define YYSTACKSIZE YYMAXDEPTH -#else -#define YYSTACKSIZE 500 -#define YYMAXDEPTH 500 -#endif -#endif - -#define YYINITSTACKSIZE 500 - -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; - -/* variables for the parser stack */ -static short *yyss; -static short *yysslim; -static YYSTYPE *yyvs; -static int yystacksize; -#line 211 "./extensions/hostemu/cmdparse.y" - - -/*--------------------------------------------------------------------*/ -/* */ -/* yylex () - lexical analyzer. */ -/* */ -/*--------------------------------------------------------------------*/ - -int yylex ( - void) /* no arguments */ - { - - /* local function variables */ - int tktype, idx = 0; - static char token [1024]; - - while (*(prxCmd -> strptr + lCmdPtr) == ' ' || - *(prxCmd -> strptr + lCmdPtr) == '\t') - lCmdPtr++; - if (*(prxCmd -> strptr + lCmdPtr) == '\0') - return 0; - if (*(prxCmd -> strptr + lCmdPtr) == '*') - { - lCmdPtr++; - return '*'; - } - else if (*(prxCmd -> strptr + lCmdPtr) == '(') - { - lCmdPtr++; - return '('; - } - else if (*(prxCmd -> strptr + lCmdPtr) == '\"') - { - lCmdPtr++; - while (*(prxCmd -> strptr + lCmdPtr) != '\"') - { - if (*(prxCmd -> strptr + lCmdPtr) == '\0') - return 0; - if (idx == 1024) - return 0; - token[idx] = *(prxCmd -> strptr + lCmdPtr); - lCmdPtr++; - idx++; - } - token[idx] = '\0'; - lCmdPtr++; - /* insert it into our symbol table */ - if (ulNumSym == SYMTABLESIZE) - return 0; - pszSymbol[ulNumSym] = (char *)malloc(strlen (token) + 1); - strcpy (pszSymbol[ulNumSym], token); - yylval.strval = pszSymbol[ulNumSym]; - ulNumSym++; - return CONSTANT; - } - else if (isalpha (*(prxCmd -> strptr + lCmdPtr)) || - isdigit (*(prxCmd -> strptr + lCmdPtr)) || - *(prxCmd -> strptr + lCmdPtr) == '\\') - { - while (*(prxCmd -> strptr + lCmdPtr) != ' ' && - *(prxCmd -> strptr + lCmdPtr) != '\0') - { - if (idx == 1024) - return 0; - token[idx] = *(prxCmd -> strptr + lCmdPtr); - lCmdPtr++; - idx++; - } - token[idx] = '\0'; - /* insert it into our symbol table */ - if (ulNumSym == SYMTABLESIZE) - return 0; - pszSymbol[ulNumSym] = (char *)malloc(strlen (token) + 1); - strcpy (pszSymbol[ulNumSym], token); - yylval.strval = pszSymbol[ulNumSym]; - ulNumSym++; - return kwsearch (token); - } - } - - -/*--------------------------------------------------------------------*/ -/* */ -/* yyerror () - error handler. */ -/* */ -/*--------------------------------------------------------------------*/ - -void yyerror ( - char * token) /* token string */ - { - - fprintf (stderr, "Token \"%s\"\n", token); - return; - } - - -/*--------------------------------------------------------------------*/ -/* */ -/* Keyword table */ -/* */ -/*--------------------------------------------------------------------*/ - -static struct - { - const char * kw; - int type; - } kwtable [] = { - "HI", HI, - "TE", TE, - "TS", TS, - "EXECIO", EXECIO, - "DISKW", DISKW, - "DISKR", DISKR, - "STEM", STEM, - "FINIS", FINIS, - "FIFO", FIFO, - "LIFO", LIFO, - "SKIP", SKIP, - "eot", EOF - }; - - -/*--------------------------------------------------------------------*/ -/* */ -/* kwsearch () - search for keywords. */ -/* */ -/*--------------------------------------------------------------------*/ - -int kwsearch ( - char * token) /* token string */ - { - - /* local function variables */ - int i; - char *utoken, *uutoken; - - utoken = strdup(token); - uutoken = utoken; - while (*uutoken != '\0') - { - *uutoken = toupper(*uutoken); - uutoken++; - } - for (i = 0; kwtable[i].type != EOF; i++) - if (strcmp(utoken, kwtable[i].kw) == 0) - { - free(utoken); - return kwtable[i].type; - } - free(utoken); - return CONSTANT; - } - - -/*--------------------------------------------------------------------*/ -/* */ -/* isnumeric () - is a string numeric? */ -/* */ -/*--------------------------------------------------------------------*/ - -bool isnumeric ( - char * token) /* token string */ - { - - /* local function variables */ - int i; - - for (i = 0; i < strlen (token); i++) - if (!isdigit(*(token + i))) - return false; - return true; - } - -#line 451 "./extensions/hostemu/cmdparse.cpp" -/* allocate initial stack or double stack size, up to YYMAXDEPTH */ -static int yygrowstack(void) -{ - int newsize, i; - short *newss; - YYSTYPE *newvs; - - if ((newsize = yystacksize) == 0) - newsize = YYINITSTACKSIZE; - else if (newsize >= YYMAXDEPTH) - return -1; - else if ((newsize *= 2) > YYMAXDEPTH) - newsize = YYMAXDEPTH; - - i = yyssp - yyss; - newss = (yyss != 0) - ? (short *)realloc(yyss, newsize * sizeof(*newss)) - : (short *)malloc(newsize * sizeof(*newss)); - if (newss == 0) - return -1; - - yyss = newss; - yyssp = newss + i; - newvs = (yyvs != 0) - ? (YYSTYPE *)realloc(yyvs, newsize * sizeof(*newvs)) - : (YYSTYPE *)malloc(newsize * sizeof(*newvs)); - if (newvs == 0) - return -1; - - yyvs = newvs; - yyvsp = newvs + i; - yystacksize = newsize; - yysslim = yyss + newsize - 1; - return 0; -} - -#define YYABORT goto yyabort -#define YYREJECT goto yyabort -#define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab -int -yyparse(void) -{ - register int yym, yyn, yystate; -#if YYDEBUG - register const char *yys; - - if ((yys = getenv("YYDEBUG")) != 0) - { - yyn = *yys; - if (yyn >= '0' && yyn <= '9') - yydebug = yyn - '0'; - } -#endif - - yynerrs = 0; - yyerrflag = 0; - yychar = YYEMPTY; - - if (yyss == NULL && yygrowstack()) goto yyoverflow; - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; - -yyloop: - if ((yyn = yydefred[yystate]) != 0) goto yyreduce; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - } - if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, shifting to state %d\n", - YYPREFIX, yystate, yytable[yyn]); -#endif - if (yyssp >= yysslim && yygrowstack()) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = YYEMPTY; - if (yyerrflag > 0) --yyerrflag; - goto yyloop; - } - if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { - yyn = yytable[yyn]; - goto yyreduce; - } - if (yyerrflag) goto yyinrecovery; - - yyerror("syntax error"); - -#ifdef lint - goto yyerrlab; -#endif - -yyerrlab: - ++yynerrs; - -yyinrecovery: - if (yyerrflag < 3) - { - yyerrflag = 3; - for (;;) - { - if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, error recovery shifting\ - to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); -#endif - if (yyssp >= yysslim && yygrowstack()) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - goto yyloop; - } - else - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: error recovery discarding state %d\n", - YYPREFIX, *yyssp); -#endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; - } - } - } - else - { - if (yychar == 0) goto yyabort; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, error recovery discards token %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - yychar = YYEMPTY; - goto yyloop; - } - -yyreduce: -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, reducing by rule %d (%s)\n", - YYPREFIX, yystate, yyn, yyrule[yyn]); -#endif - yym = yylen[yyn]; - if (yym) - yyval = yyvsp[1-yym]; - else - memset(&yyval, 0, sizeof yyval); - switch (yyn) - { -case 1: -#line 96 "./extensions/hostemu/cmdparse.y" -{ - lStmtType = EXECIO_STMT; - ExecIO_Options.lStartRcd = 1; - /* if constant is not a numeric string we have an error */ - if (isnumeric (yyvsp[-1].strval)) - ExecIO_Options.lRcdCnt = atoi (yyvsp[-1].strval); - else - return 1; - } -break; -case 2: -#line 106 "./extensions/hostemu/cmdparse.y" -{ - lStmtType = EXECIO_STMT; - ExecIO_Options.lStartRcd = 1; - ExecIO_Options.lRcdCnt = -1; - } -break; -case 3: -#line 112 "./extensions/hostemu/cmdparse.y" -{ - lStmtType = HI_STMT; - } -break; -case 4: -#line 116 "./extensions/hostemu/cmdparse.y" -{ - lStmtType = TE_STMT; - } -break; -case 5: -#line 120 "./extensions/hostemu/cmdparse.y" -{ - lStmtType = TS_STMT; - } -break; -case 6: -#line 126 "./extensions/hostemu/cmdparse.y" -{ - ExecIO_Options.fRW = true; - strcpy (ExecIO_Options.aFilename, yyvsp[-1].strval); - } -break; -case 7: -#line 131 "./extensions/hostemu/cmdparse.y" -{ - ExecIO_Options.fRW = false; - strcpy (ExecIO_Options.aFilename, yyvsp[-1].strval); - } -break; -case 8: -#line 136 "./extensions/hostemu/cmdparse.y" -{ - ExecIO_Options.fRW = false; - strcpy (ExecIO_Options.aFilename, yyvsp[-2].strval); - /* if constant is not a numeric string we have an error */ - if (isnumeric (yyvsp[-1].strval)) - ExecIO_Options.lStartRcd = atoi (yyvsp[-1].strval); - else - return 1; - } -break; -case 11: -#line 152 "./extensions/hostemu/cmdparse.y" -{ - ExecIO_Options.fFinis = true; - } -break; -case 12: -#line 156 "./extensions/hostemu/cmdparse.y" -{ - ExecIO_Options.fFinis = false; - } -break; -case 13: -#line 160 "./extensions/hostemu/cmdparse.y" -{ - ExecIO_Options.fFinis = true; - ExecIO_Options.lDirection = 1; - } -break; -case 14: -#line 165 "./extensions/hostemu/cmdparse.y" -{ - ExecIO_Options.fFinis = true; - ExecIO_Options.lDirection = 2; - } -break; -case 15: -#line 170 "./extensions/hostemu/cmdparse.y" -{ - strcpy (ExecIO_Options.aStem, yyvsp[0].strval); - } -break; -case 16: -#line 174 "./extensions/hostemu/cmdparse.y" -{ - strcpy (ExecIO_Options.aStem, yyvsp[-1].strval); - ExecIO_Options.fFinis = true; - } -break; -case 17: -#line 179 "./extensions/hostemu/cmdparse.y" -{ - strcpy (ExecIO_Options.aStem, yyvsp[0].strval); - ExecIO_Options.fFinis = true; - } -break; -case 21: -#line 191 "./extensions/hostemu/cmdparse.y" -{ - ExecIO_Options.fFinis = true; - } -break; -case 22: -#line 195 "./extensions/hostemu/cmdparse.y" -{ - strcpy (ExecIO_Options.aStem, yyvsp[0].strval); - } -break; -case 23: -#line 199 "./extensions/hostemu/cmdparse.y" -{ - strcpy (ExecIO_Options.aStem, yyvsp[-1].strval); - ExecIO_Options.fFinis = true; - } -break; -case 24: -#line 204 "./extensions/hostemu/cmdparse.y" -{ - strcpy (ExecIO_Options.aStem, yyvsp[0].strval); - ExecIO_Options.fFinis = true; - } -break; -#line 768 "./extensions/hostemu/cmdparse.cpp" - } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; - yym = yylhs[yyn]; - if (yystate == 0 && yym == 0) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state 0 to\ - state %d\n", YYPREFIX, YYFINAL); -#endif - yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, YYFINAL, yychar, yys); - } -#endif - } - if (yychar == 0) goto yyaccept; - goto yyloop; - } - if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yystate) - yystate = yytable[yyn]; - else - yystate = yydgoto[yym]; -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state %d \ -to state %d\n", YYPREFIX, *yyssp, yystate); -#endif - if (yyssp >= yysslim && yygrowstack()) - { - goto yyoverflow; - } - *++yyssp = yystate; - *++yyvsp = yyval; - goto yyloop; - -yyoverflow: - yyerror("yacc stack overflow"); - -yyabort: - return (1); - -yyaccept: - return (0); -} Copied: sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp (from rev 5957, main/trunk/extensions/hostemu/cmdparse.cpp) =================================================================== --- sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp (rev 0) +++ sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp 2010-05-14 21:41:49 UTC (rev 5962) @@ -0,0 +1,826 @@ +#ifndef lint +static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; +#endif + +#include <stdlib.h> +#include <string.h> + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 +#define YYPATCH 20070509 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING (yyerrflag != 0) + +extern int yyparse(void); + +static int yygrowstack(void); +#define YYPREFIX "yy" +#line 2 "./extensions/hostemu/cmdparse.y" +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2009-2010 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. */ +/* */ +/* Authors; */ +/* W. David Ashley <da...@us...> */ +/* */ +/*----------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------*/ +/* !!!CAUTION!!! */ +/* Do not edit the cmdparse.cpp file! This file is produced by yacc! You */ +/* should edit the cmdparse.y file and regen the changes via make! */ +/*----------------------------------------------------------------------------*/ + + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <ctype.h> +#include <rexx.h> + +#include "hostemu.h" + +/*--------------------------------------------------------------------*/ +/* Local function prototypes */ +/*--------------------------------------------------------------------*/ + +int yylex ( + void); /* no arguments */ +void yyerror ( + char * token); /* token string */ +int kwsearch ( + char * token); /* token string */ +bool isnumeric ( + char * token); /* token string */ + + +#line 73 "./extensions/hostemu/cmdparse.y" +typedef union + { + int numval; + char * strval; + } YYSTYPE; +#line 100 "./extensions/hostemu/cmdparse.cpp" +#define EXECIO 257 +#define HI 258 +#define TE 259 +#define TS 260 +#define CONSTANT 261 +#define DISKW 262 +#define DISKR 263 +#define STEM 264 +#define FINIS 265 +#define LIFO 266 +#define FIFO 267 +#define SKIP 268 +#define YYERRCODE 256 +short yylhs[] = { -1, + 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, + 5, 5, 5, 5, 5, +}; +short yylen[] = { 2, + 3, 3, 1, 1, 1, 3, 3, 4, 2, 0, + 1, 2, 2, 2, 2, 3, 3, 0, 2, 0, + 1, 2, 3, 3, 0, +}; +short yydefred[] = { 0, + 0, 3, 4, 5, 0, 0, 0, 0, 0, 1, + 2, 0, 0, 0, 6, 0, 0, 7, 0, 0, + 19, 8, 0, 0, 9, 0, 0, 0, 0, 13, + 12, 14, 23, 24, 16, 17, +}; +short yydgoto[] = { 5, + 10, 15, 18, 25, 21, +}; +short yysindex[] = { -250, + -41, 0, 0, 0, 0, -251, -251, -258, -248, 0, + 0, -26, -40, -249, 0, -21, -247, 0, -241, -243, + 0, 0, -239, -262, 0, -242, -237, -240, -235, 0, + 0, 0, 0, 0, 0, 0, +}; +short yyrindex[] = { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 28, 29, 0, 28, 30, 0, 0, 31, + 0, 0, 0, 32, 0, 33, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, +}; +short yygindex[] = { 0, + 35, 0, 19, 0, 0, +}; +#define YYTABLESIZE 221 +short yytable[] = { 17, + 7, 29, 12, 30, 31, 32, 1, 2, 3, 4, + 8, 9, 13, 14, 19, 20, 23, 24, 17, 26, + 27, 28, 33, 34, 35, 36, 20, 10, 25, 18, + 21, 11, 22, 15, 22, 0, 0, 0, 0, 0, + 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 16, +}; +short yycheck[] = { 40, + 42, 264, 261, 266, 267, 268, 257, 258, 259, 260, + 262, 263, 261, 40, 264, 265, 264, 265, 40, 261, + 264, 261, 265, 261, 265, 261, 0, 0, 0, 0, + 0, 0, 0, 0, 16, -1, -1, -1, -1, -1, + -1, 7, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 261, + 261, +}; +#define YYFINAL 5 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 268 +#if YYDEBUG +char *yyname[] = { +"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,"'('",0,"'*'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"EXECIO","HI","TE","TS", +"CONSTANT","DISKW","DISKR","STEM","FINIS","LIFO","FIFO","SKIP", +}; +char *yyrule[] = { +"$accept : stmt", +"stmt : EXECIO CONSTANT disk_clause", +"stmt : EXECIO '*' disk_clause", +"stmt : HI", +"stmt : TE", +"stmt : TS", +"disk_clause : DISKW CONSTANT diskw_option", +"disk_clause : DISKR CONSTANT diskr_option", +"disk_clause : DISKR CONSTANT CONSTANT diskr_option", +"diskr_option : '(' diskr_options", +"diskr_option :", +"diskr_options : FINIS", +"diskr_options : FINIS FIFO", +"diskr_options : FINIS LIFO", +"diskr_options : FINIS SKIP", +"diskr_options : STEM CONSTANT", +"diskr_options : STEM CONSTANT FINIS", +"diskr_options : FINIS STEM CONSTANT", +"diskr_options :", +"diskw_option : '(' diskw_options", +"diskw_option :", +"diskw_options : FINIS", +"diskw_options : STEM CONSTANT", +"diskw_options : STEM CONSTANT FINIS", +"diskw_options : FINIS STEM CONSTANT", +"diskw_options :", +}; +#endif +#if YYDEBUG +#include <stdio.h> +#endif + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 500 +#define YYMAXDEPTH 500 +#endif +#endif + +#define YYINITSTACKSIZE 500 + +int yydebug; +int yynerrs; +int yyerrflag; +int yychar; +short *yyssp; +YYSTYPE *yyvsp; +YYSTYPE yyval; +YYSTYPE yylval; + +/* variables for the parser stack */ +static short *yyss; +static short *yysslim; +static YYSTYPE *yyvs; +static int yystacksize; +#line 211 "./extensions/hostemu/cmdparse.y" + + +/*--------------------------------------------------------------------*/ +/* */ +/* yylex () - lexical analyzer. */ +/* */ +/*--------------------------------------------------------------------*/ + +int yylex ( + void) /* no arguments */ + { + + /* local function variables */ + int tktype, idx = 0; + static char token [1024]; + + while (*(prxCmd -> strptr + lCmdPtr) == ' ' || + *(prxCmd -> strptr + lCmdPtr) == '\t') + lCmdPtr++; + if (*(prxCmd -> strptr + lCmdPtr) == '\0') + return 0; + if (*(prxCmd -> strptr + lCmdPtr) == '*') + { + lCmdPtr++; + return '*'; + } + else if (*(prxCmd -> strptr + lCmdPtr) == '(') + { + lCmdPtr++; + return '('; + } + else if (*(prxCmd -> strptr + lCmdPtr) == '\"') + { + lCmdPtr++; + while (*(prxCmd -> strptr + lCmdPtr) != '\"') + { + if (*(prxCmd -> strptr + lCmdPtr) == '\0') + return 0; + if (idx == 1024) + return 0; + token[idx] = *(prxCmd -> strptr + lCmdPtr); + lCmdPtr++; + idx++; + } + token[idx] = '\0'; + lCmdPtr++; + /* insert it into our symbol table */ + if (ulNumSym == SYMTABLESIZE) + return 0; + pszSymbol[ulNumSym] = (char *)malloc(strlen (token) + 1); + strcpy (pszSymbol[ulNumSym], token); + yylval.strval = pszSymbol[ulNumSym]; + ulNumSym++; + return CONSTANT; + } + else if (isalpha (*(prxCmd -> strptr + lCmdPtr)) || + isdigit (*(prxCmd -> strptr + lCmdPtr)) || + *(prxCmd -> strptr + lCmdPtr) == '\\') + { + while (*(prxCmd -> strptr + lCmdPtr) != ' ' && + *(prxCmd -> strptr + lCmdPtr) != '\0') + { + if (idx == 1024) + return 0; + token[idx] = *(prxCmd -> strptr + lCmdPtr); + lCmdPtr++; + idx++; + } + token[idx] = '\0'; + /* insert it into our symbol table */ + if (ulNumSym == SYMTABLESIZE) + return 0; + pszSymbol[ulNumSym] = (char *)malloc(strlen (token) + 1); + strcpy (pszSymbol[ulNumSym], token); + yylval.strval = pszSymbol[ulNumSym]; + ulNumSym++; + return kwsearch (token); + } + } + + +/*--------------------------------------------------------------------*/ +/* */ +/* yyerror () - error handler. */ +/* */ +/*--------------------------------------------------------------------*/ + +void yyerror ( + char * token) /* token string */ + { + + fprintf (stderr, "Token \"%s\"\n", token); + return; + } + + +/*--------------------------------------------------------------------*/ +/* */ +/* Keyword table */ +/* */ +/*--------------------------------------------------------------------*/ + +static struct + { + const char * kw; + int type; + } kwtable [] = { + "HI", HI, + "TE", TE, + "TS", TS, + "EXECIO", EXECIO, + "DISKW", DISKW, + "DISKR", DISKR, + "STEM", STEM, + "FINIS", FINIS, + "FIFO", FIFO, + "LIFO", LIFO, + "SKIP", SKIP, + "eot", EOF + }; + + +/*--------------------------------------------------------------------*/ +/* */ +/* kwsearch () - search for keywords. */ +/* */ +/*--------------------------------------------------------------------*/ + +int kwsearch ( + char * token) /* token string */ + { + + /* local function variables */ + int i; + char *utoken, *uutoken; + + utoken = strdup(token); + uutoken = utoken; + while (*uutoken != '\0') + { + *uutoken = toupper(*uutoken); + uutoken++; + } + for (i = 0; kwtable[i].type != EOF; i++) + if (strcmp(utoken, kwtable[i].kw) == 0) + { + free(utoken); + return kwtable[i].type; + } + free(utoken); + return CONSTANT; + } + + +/*--------------------------------------------------------------------*/ +/* */ +/* isnumeric () - is a string numeric? */ +/* */ +/*--------------------------------------------------------------------*/ + +bool isnumeric ( + char * token) /* token string */ + { + + /* local function variables */ + int i; + + for (i = 0; i < strlen (token); i++) + if (!isdigit(*(token + i))) + return false; + return true; + } + +#line 451 "./extensions/hostemu/cmdparse.cpp" +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(void) +{ + int newsize, i; + short *newss; + YYSTYPE *newvs; + + if ((newsize = yystacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = yyssp - yyss; + newss = (yyss != 0) + ? (short *)realloc(yyss, newsize * sizeof(*newss)) + : (short *)malloc(newsize * sizeof(*newss)); + if (newss == 0) + return -1; + + yyss = newss; + yyssp = newss + i; + newvs = (yyvs != 0) + ? (YYSTYPE *)realloc(yyvs, newsize * sizeof(*newvs)) + : (YYSTYPE *)malloc(newsize * sizeof(*newvs)); + if (newvs == 0) + return -1; + + yyvs = newvs; + yyvsp = newvs + i; + yystacksize = newsize; + yysslim = yyss + newsize - 1; + return 0; +} + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab +int +yyparse(void) +{ + register int yym, yyn, yystate; +#if YYDEBUG + register const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + + if (yyss == NULL && yygrowstack()) goto yyoverflow; + yyssp = yyss; + yyvsp = yyvs; + *yyssp = yystate = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = yylex()) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate = yytable[yyn]; + *++yyvsp = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + yyerror("syntax error"); + +#ifdef lint + goto yyerrlab; +#endif + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate = yytable[yyn]; + *++yyvsp = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yyssp); +#endif + if (yyssp <= yyss) goto yyabort; + --yyssp; + --yyvsp; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yyvsp[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 1: +#line 96 "./extensions/hostemu/cmdparse.y" +{ + lStmtType = EXECIO_STMT; + ExecIO_Opt... [truncated message content] |
From: <jfa...@us...> - 2010-05-15 20:49:53
|
Revision: 5963 http://oorexx.svn.sourceforge.net/oorexx/?rev=5963&view=rev Author: jfaucher Date: 2010-05-15 20:49:45 +0000 (Sat, 15 May 2010) Log Message: ----------- Added the function dbgprintf to write debug strings. Under Windows, it calls OutputDebugString. Under Linux, it calls syslog. Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/Makefile.am sandbox/jlf/trunk/api/platform/unix/rexxplatformapis.h sandbox/jlf/trunk/common/platform/unix/SysSemaphore.cpp sandbox/jlf/trunk/common/platform/unix/SysSemaphore.hpp sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp Added Paths: ----------- sandbox/jlf/trunk/common/platform/unix/SysDebug.cpp sandbox/jlf/trunk/common/platform/unix/SysDebug.hpp sandbox/jlf/trunk/common/platform/windows/SysDebug.cpp sandbox/jlf/trunk/common/platform/windows/SysDebug.hpp Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-05-14 21:41:49 UTC (rev 5962) +++ sandbox/jlf/_diary.txt 2010-05-15 20:49:45 UTC (rev 5963) @@ -31,6 +31,25 @@ =============================================================================== +2010 may 15 + + +Added the function dbgprintf to write debug strings. +Under Windows, it calls OutputDebugString. +Under Linux, it calls syslog. + +Remember, typical debug session under Linux: +Open a console : + syslogd -S -C + logread -f + The output of syslog is displayed by logread in this console (lock management, on client and server side). +Open a console, launch rxapi. + Has been compiled to stay as a foreground process. + It sends debug strings to stderr, more easy to follow in this console (messages between client and server). +Open a console, run the rexx command. The two other consoles are updated with debug infos. + + +=============================================================================== 2010 may 14 More work on wide-chars in oodialog. Modified: sandbox/jlf/trunk/Makefile.am =================================================================== --- sandbox/jlf/trunk/Makefile.am 2010-05-14 21:41:49 UTC (rev 5962) +++ sandbox/jlf/trunk/Makefile.am 2010-05-15 20:49:45 UTC (rev 5963) @@ -168,6 +168,7 @@ # Common headers commonHeaders = $(build_common_dir)/SynchronizedBlock.hpp \ $(build_common_dir)/Utilities.hpp \ + $(build_common_platform_dir)/SysDebug.hpp \ $(build_common_platform_dir)/SysFile.hpp \ $(build_common_platform_dir)/SysLibrary.hpp \ $(build_common_platform_dir)/SysSemaphore.hpp \ @@ -475,6 +476,7 @@ $(build_rexxapi_common_platform_dir)/SysCSStream.cpp \ $(build_rexxapi_common_platform_dir)/SysProcess.cpp \ $(build_common_dir)/Utilities.cpp \ + $(build_common_platform_dir)/SysDebug.cpp \ $(build_common_platform_dir)/SysSemaphore.cpp \ $(build_common_platform_dir)/SysLibrary.cpp \ $(build_common_platform_dir)/SysFile.cpp \ @@ -660,6 +662,7 @@ $(build_interpreter_platform_dir)/UseridFunction.cpp \ $(build_interpreter_platform_dir)/ValueFunction.cpp common_sources = $(build_common_dir)/Utilities.cpp \ + $(build_common_platform_dir)/SysDebug.cpp \ $(build_common_platform_dir)/SysFile.cpp \ $(build_common_platform_dir)/SysLibrary.cpp \ $(build_common_platform_dir)/SysSemaphore.cpp \ @@ -737,6 +740,7 @@ $(build_rexxapi_common_platform_dir)/SysCSStream.cpp \ $(build_rexxapi_common_platform_dir)/SysProcess.cpp \ $(build_common_dir)/Utilities.cpp \ + $(build_common_dir)/platform/unix/SysDebug.cpp \ $(build_common_dir)/platform/unix/SysSemaphore.cpp \ $(build_common_dir)/platform/unix/SysThread.cpp # Modified: sandbox/jlf/trunk/api/platform/unix/rexxplatformapis.h =================================================================== --- sandbox/jlf/trunk/api/platform/unix/rexxplatformapis.h 2010-05-14 21:41:49 UTC (rev 5962) +++ sandbox/jlf/trunk/api/platform/unix/rexxplatformapis.h 2010-05-15 20:49:45 UTC (rev 5963) @@ -63,7 +63,5 @@ typedef RexxReturnCode (REXXENTRY *PFNREXXPULLQUEUE)(CONSTANT_STRING, PRXSTRING, REXXDATETIME *, size_t); -#define OutputDebugString(s) fprintf(stderr, "%s", s) - #endif /* REXXPLATFORMAPIS_INCLUDED */ Added: sandbox/jlf/trunk/common/platform/unix/SysDebug.cpp =================================================================== --- sandbox/jlf/trunk/common/platform/unix/SysDebug.cpp (rev 0) +++ sandbox/jlf/trunk/common/platform/unix/SysDebug.cpp 2010-05-15 20:49:45 UTC (rev 5963) @@ -0,0 +1,56 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2010 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. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "SysDebug.hpp" +#include <stdio.h> +#include <stdarg.h> +#include <syslog.h> + +void dbgprintf(const char *format, ...) +{ + char buf[4096]; + char *p = buf; + va_list args; + int n; + + va_start(args, format); + n = vsnprintf(p, sizeof buf - 1, format, args); + va_end(args); + + syslog(LOG_DEBUG, "%s", buf); +} Added: sandbox/jlf/trunk/common/platform/unix/SysDebug.hpp =================================================================== --- sandbox/jlf/trunk/common/platform/unix/SysDebug.hpp (rev 0) +++ sandbox/jlf/trunk/common/platform/unix/SysDebug.hpp 2010-05-15 20:49:45 UTC (rev 5963) @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2010 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. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef Included_SysDebug +#define Included_SysDebug + +void dbgprintf(const char *format, ...); + +#endif Modified: sandbox/jlf/trunk/common/platform/unix/SysSemaphore.cpp =================================================================== --- sandbox/jlf/trunk/common/platform/unix/SysSemaphore.cpp 2010-05-14 21:41:49 UTC (rev 5962) +++ sandbox/jlf/trunk/common/platform/unix/SysSemaphore.cpp 2010-05-15 20:49:45 UTC (rev 5963) @@ -62,6 +62,7 @@ #include <errno.h> #include "SysSemaphore.hpp" +#include "SysDebug.hpp" /* ********************************************************************** */ @@ -183,12 +184,9 @@ if (this->postedCount == 0) // Has it been posted? { - char buffer[1024]; - sprintf(buffer, "(SysSemaphore)%s.wait : before pthread_cond_wait(0x%x, 0x%x) from %s (0x%x)\n", semVariable, (unsigned int)&(this->semCond), (unsigned int)&(this->semMutex), ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); - rc = pthread_cond_wait(&(this->semCond), &(this->semMutex)); // Nope, then wait on it. - sprintf(buffer, "(SysSemaphore)%s.wait : after pthread_cond_wait(0x%x, 0x%x) from %s (0x%x)\n", semVariable, (unsigned int)&(this->semCond), (unsigned int)&(this->semMutex), ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); + dbgprintf("(SysSemaphore)%s.wait : before pthread_cond_wait(0x%x, 0x%x) from %s (0x%x)\n", semVariable, (unsigned int)&(this->semCond), (unsigned int)&(this->semMutex), ds, (unsigned int)pthread_self()); + rc = pthread_cond_wait(&(this->semCond), &(this->semMutex)); // Nope, then wait on it. + dbgprintf("(SysSemaphore)%s.wait : after pthread_cond_wait(0x%x, 0x%x) from %s (0x%x)\n", semVariable, (unsigned int)&(this->semCond), (unsigned int)&(this->semMutex), ds, (unsigned int)pthread_self()); } pthread_mutex_unlock(&(this->semMutex)); // Release mutex lock @@ -207,13 +205,10 @@ pthread_mutex_lock(&(this->semMutex)); // Lock access to semaphore if (!this->postedCount) // Has it been posted? { - char buffer[1024]; - sprintf(buffer, "(SysSemaphore)%s.wait : before pthread_cond_timedwait(0x%x, 0x%x, ×truct) from %s (0x%x)\n", semVariable, (unsigned int)&(this->semCond),(unsigned int)&(this->semMutex), ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); + dbgprintf("(SysSemaphore)%s.wait : before pthread_cond_timedwait(0x%x, 0x%x, ×truct) from %s (0x%x)\n", semVariable, (unsigned int)&(this->semCond),(unsigned int)&(this->semMutex), ds, (unsigned int)pthread_self()); // wait with timeout - result = pthread_cond_timedwait(&(this->semCond),&(this->semMutex),×truct); - sprintf(buffer, "(SysSemaphore)%s.wait : after pthread_cond_timedwait(0x%x, 0x%x, ×truct) from %s (0x%x)\n", semVariable, (unsigned int)&(this->semCond),(unsigned int)&(this->semMutex), ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); + result = pthread_cond_timedwait(&(this->semCond),&(this->semMutex),×truct); + dbgprintf("(SysSemaphore)%s.wait : after pthread_cond_timedwait(0x%x, 0x%x, ×truct) from %s (0x%x)\n", semVariable, (unsigned int)&(this->semCond),(unsigned int)&(this->semMutex), ds, (unsigned int)pthread_self()); } pthread_mutex_unlock(&(this->semMutex)); // Release mutex lock // a false return means this timed out Modified: sandbox/jlf/trunk/common/platform/unix/SysSemaphore.hpp =================================================================== --- sandbox/jlf/trunk/common/platform/unix/SysSemaphore.hpp 2010-05-14 21:41:49 UTC (rev 5962) +++ sandbox/jlf/trunk/common/platform/unix/SysSemaphore.hpp 2010-05-15 20:49:45 UTC (rev 5963) @@ -49,6 +49,7 @@ #include <stdlib.h> #include <stdio.h> #include "rexx.h" +#include "SysDebug.hpp" class SysSemaphore { public: @@ -82,30 +83,21 @@ void close(); inline void request(const char *ds, int di) { - char buffer[1024]; - sprintf(buffer, "(SysMutex)%s.request : before pthread_mutex_lock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.request : before pthread_mutex_lock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); pthread_mutex_lock(&mutexMutex); - sprintf(buffer, "(SysMutex)%s.request : after pthread_mutex_lock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.request : after pthread_mutex_lock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); } inline void release(const char *ds, int di) { - char buffer[1024]; - sprintf(buffer, "(SysMutex)%s.release : before pthread_mutex_unlock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.release : before pthread_mutex_unlock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); pthread_mutex_unlock(&mutexMutex); - sprintf(buffer, "(SysMutex)%s.release : after pthread_mutex_unlock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.release : after pthread_mutex_unlock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); } inline bool requestImmediate(const char *ds, int di) { - char buffer[1024]; - sprintf(buffer, "(SysMutex)%s.requestImmediate : before pthread_mutex_trylock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.requestImmediate : before pthread_mutex_trylock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); bool result = pthread_mutex_trylock(&mutexMutex) == 0; - sprintf(buffer, "(SysMutex)%s.requestImmediate : after pthread_mutex_trylock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.requestImmediate : after pthread_mutex_trylock(0x%x) from %s (0x%x)\n", mutexVariable, (unsigned int)&mutexMutex, ds, (unsigned int)pthread_self()); return result; } Added: sandbox/jlf/trunk/common/platform/windows/SysDebug.cpp =================================================================== --- sandbox/jlf/trunk/common/platform/windows/SysDebug.cpp (rev 0) +++ sandbox/jlf/trunk/common/platform/windows/SysDebug.cpp 2010-05-15 20:49:45 UTC (rev 5963) @@ -0,0 +1,56 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2010 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. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "SysDebug.hpp" +#include <stdio.h> +#include <stdarg.h> +#include <windows.h> + +void dbgprintf(const char *format, ...) +{ + char buf[4096]; + char *p = buf; + va_list args; + int n; + + va_start(args, format); + n = vsnprintf(p, sizeof buf - 1, format, args); + va_end(args); + + OutputDebugString(buf); +} Added: sandbox/jlf/trunk/common/platform/windows/SysDebug.hpp =================================================================== --- sandbox/jlf/trunk/common/platform/windows/SysDebug.hpp (rev 0) +++ sandbox/jlf/trunk/common/platform/windows/SysDebug.hpp 2010-05-15 20:49:45 UTC (rev 5963) @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2009 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. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef Included_SysDebug +#define Included_SysDebug + +void dbgprintf(const char *format, ...); + +#endif Modified: sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp =================================================================== --- sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp 2010-05-14 21:41:49 UTC (rev 5962) +++ sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp 2010-05-15 20:49:45 UTC (rev 5963) @@ -46,6 +46,7 @@ #define Included_SysSemaphore #include "rexx.h" +#include "SysDebug.hpp" #include <stdlib.h> #include <stdio.h> @@ -63,22 +64,16 @@ void post() { SetEvent(sem); }; inline void wait(const char *ds, int di) { - char buffer[1024]; - sprintf(buffer, "(SysSemaphore)%s.wait : before waitHandle(0x%x) from %s (0x%x)\n", semVariable, sem, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysSemaphore)%s.wait : before waitHandle(0x%x) from %s (0x%x)\n", semVariable, sem, ds, GetCurrentThreadId()); waitHandle(sem); - sprintf(buffer, "(SysSemaphore)%s.wait : after waitHandle(0x%x) from %s (0x%x)\n", semVariable, sem, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysSemaphore)%s.wait : after waitHandle(0x%x) from %s (0x%x)\n", semVariable, sem, ds, GetCurrentThreadId()); } inline bool wait(const char *ds, int di, uint32_t timeout) { - char buffer[1024]; - sprintf(buffer, "(SysSemaphore)%s.wait : before WaitForSingleObject(0x%x, timemout) from %s (0x%x)\n", semVariable, sem, timeout, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysSemaphore)%s.wait : before WaitForSingleObject(0x%x, timemout) from %s (0x%x)\n", semVariable, sem, timeout, ds, GetCurrentThreadId()); bool result = WaitForSingleObject(sem, timeout) != WAIT_TIMEOUT; - sprintf(buffer, "(SysSemaphore)%s.wait : after WaitForSingleObject(0x%x, timemout) from %s (0x%x)\n", semVariable, sem, timeout, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysSemaphore)%s.wait : after WaitForSingleObject(0x%x, timemout) from %s (0x%x)\n", semVariable, sem, timeout, ds, GetCurrentThreadId()); return result; } @@ -120,32 +115,23 @@ void close(); inline void request(const char *ds, int di) { - char buffer[1024]; - sprintf(buffer, "(SysMutex)%s.request : before waitHandle(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.request : before waitHandle(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); waitHandle(mutexMutex); - sprintf(buffer, "(SysMutex)%s.request : after waitHandle(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.request : after waitHandle(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); } inline void release(const char *ds, int di) { - char buffer[1024]; - sprintf(buffer, "(SysMutex)%s.release : before ReleaseMutex(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.release : before ReleaseMutex(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); ReleaseMutex(mutexMutex); - sprintf(buffer, "(SysMutex)%s.release : after ReleaseMutex(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.release : after ReleaseMutex(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); } inline bool requestImmediate(const char *ds, int di) { - char buffer[1024]; - sprintf(buffer, "(SysMutex)%s.requestImmediate : before WaitForSingleObject(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.requestImmediate : before WaitForSingleObject(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); bool result = WaitForSingleObject(mutexMutex, 0) != WAIT_TIMEOUT; - sprintf(buffer, "(SysMutex)%s.requestImmediate : after WaitForSingleObject(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); - OutputDebugString(buffer); + dbgprintf("(SysMutex)%s.requestImmediate : after WaitForSingleObject(0x%x) from %s (0x%x)\n", mutexVariable, mutexMutex, ds, GetCurrentThreadId()); return result; } Modified: sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp 2010-05-14 21:41:49 UTC (rev 5962) +++ sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp 2010-05-15 20:49:45 UTC (rev 5963) @@ -69,9 +69,9 @@ #include <math.h> #include <limits.h> +#include "SysDebug.hpp" - /** * Initialize an activation for direct caching in the activation * cache. At this time, this is not an executable activation @@ -1590,7 +1590,7 @@ dispatcher.setContext(activity, this); activity->releaseAccess(); /* force this to "safe" mode */ dispatcher.run(); - OutputDebugString("after dispatcher.run"); + dbgprintf("after dispatcher.run\n"); activity->requestAccess(); /* now in unsafe mode again */ } catch (ActivityException) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-05-15 22:18:02
|
Revision: 5964 http://oorexx.svn.sourceforge.net/oorexx/?rev=5964&view=rev Author: jfaucher Date: 2010-05-15 22:17:55 +0000 (Sat, 15 May 2010) Log Message: ----------- Fix dbgprintf's link error under Windows. More work on wide-char oodialog : remove unneeded conversions. Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodResources.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodRoutines.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUser.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/rxwchar.hpp sandbox/jlf/trunk/interpreter/interpreter.mak sandbox/jlf/trunk/platform/windows/buildorx.bat sandbox/jlf/trunk/rexxapi/rexxapi.mak sandbox/jlf/unicode/_readme.odt Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/_diary.txt 2010-05-15 22:17:55 UTC (rev 5964) @@ -1,7 +1,7 @@ Sandbox for experimental work, some ideas to investigate : Try to understand the internal locks. ---> added some OutputDebugString (Windows only), now must analyze... +--> added some dbgprintf (Windows and Linux), now must analyze... Allow extension of the predefined ooRexx classes to get something similar to C# extension methods (but more powerful). --> unlock the define method : see samples/functional for an example of use. @@ -33,7 +33,24 @@ =============================================================================== 2010 may 15 +Fix build under Windows for dbgprintf (link error). +Changed the build for "oodialog" target : +Builds both oodialogA and oodialogW (and not just oodialogA as before) +Ex : +makeorx BOTH oodialog clean --> cleans the debug & release files of oodialogA and oodialogW +makeorx BOTH oodialog --> builds the debug & release files of oodialogA and oodialogW + +Made a review of the conversions and removed those unneeded. +opts can remain byte-char. +strdupupr and strdupupr_nospace can remain byte-char. +setControlData can remain byte-char. The conversion is done internally. +putUnicodeText converts to wide-char, so no need to convert byte-char to wide-char before calling it (but keep the wide-char signature) + + +=============================================================================== +2010 may 15 + Added the function dbgprintf to write debug strings. Under Windows, it calls OutputDebugString. Under Linux, it calls syslog. Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -2159,7 +2159,7 @@ { pCPlainBaseDialogClass pcpbdc = (pCPlainBaseDialogClass)context->BufferData(buf); - _tcscpy(pcpbdc->fontName, DEFAULT_FONTNAME); + _tcscpy(pcpbdc->fontName, _T(DEFAULT_FONTNAME)); pcpbdc->fontSize = DEFAULT_FONTSIZE; context->SetObjectVariable("CSELF", buf); } @@ -2189,7 +2189,7 @@ pCPlainBaseDialogClass pcpbdc = getPBDClass_CSelf(context); rxcharT *fontName = pcpbdc->fontName; RXCT2A(fontName); - return fontNameT; + return fontNameA; } RexxMethod1(uint32_t, pbdlg_getFontSize_cls, CSELF, pCSelf) { @@ -2465,7 +2465,7 @@ { CSTRINGT fontName = ((pCPlainBaseDialog)pCSelf)->fontName; RXCT2A(fontName); - result = context->String(fontNameT); + result = context->String(fontNameA); } else { @@ -3744,7 +3744,7 @@ { getDlgMessage(dlgAdm, msg, peek); RXCT2A(msg); - result = context->String(msgT); + result = context->String(msgA); } else { @@ -3935,8 +3935,7 @@ oodControl_t ctrlType = oodName2controlType(msgName + 3); - RXCA2T(data); - return setControlData(context, pcpbd, id, dataT, pcpbd->hDlg, ctrlType); + return setControlData(context, pcpbd, id, data, pcpbd->hDlg, ctrlType); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -371,7 +371,7 @@ BYTE key[COUNT_KEYPRESS_KEYS]; /* Value of key[x] is index to pMethods[] */ UINT usedMethods; /* Count of used slots in pMethods[] */ UINT topOfQ; /* Top of next free queue, 0 if empty */ - PCHART pMethods[MAX_KEYPRESS_METHODS + 1]; /* Index 0 intentionally left empty */ + PCHAR pMethods[MAX_KEYPRESS_METHODS + 1]; /* Index 0 intentionally left empty */ KEYFILTER *pFilters[MAX_KEYPRESS_METHODS + 1]; /* If null, no filter */ UINT nextFreeQ[MAX_KEYPRESS_METHODS]; /* Used only if existing connection removed */ } KEYPRESSDATA; Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -468,7 +468,6 @@ RexxMethod2(RexxObjectPtr, bc_setState, CSTRING, opts, CSELF, pCSelf) { - RXCA2T(opts); HWND hwnd = ((pCDialogControl)pCSelf)->hCtrl; HWND hDlg = ((pCDialogControl)pCSelf)->hDlg; @@ -476,18 +475,18 @@ UINT msg = 0; WPARAM wp = 0; - rxcharT *token; - rxcharT *str = strdupupr(optsT); + char *token; + char *str = strdupupr(opts); if ( ! str ) { outOfMemoryException(context->threadContext); return NULLOBJECT; } - token = _tcstok(str, _T(" ")); + token = strtok(str, " "); while ( token != NULL ) { - if ( _tcscmp(token, _T("CHECKED")) == 0 ) + if ( strcmp(token, "CHECKED") == 0 ) { if ( (type == check || type == radio) ) { @@ -495,7 +494,7 @@ wp = (WPARAM)BST_CHECKED; } } - else if ( _tcscmp(token, _T("UNCHECKED")) == 0 ) + else if ( strcmp(token, "UNCHECKED") == 0 ) { if ( (type == check || type == radio) ) { @@ -503,7 +502,7 @@ wp = (WPARAM)BST_UNCHECKED; } } - else if ( _tcscmp(token, _T("INDETERMINATE")) == 0 ) + else if ( strcmp(token, "INDETERMINATE") == 0 ) { if ( type == check ) { @@ -511,25 +510,24 @@ wp = (WPARAM)BST_INDETERMINATE; } } - else if ( _tcscmp(token, _T("FOCUS")) == 0 ) + else if ( strcmp(token, "FOCUS") == 0 ) { msg = 0; SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)hwnd, TRUE); } - else if ( _tcscmp(token, _T("PUSHED")) == 0 ) + else if ( strcmp(token, "PUSHED") == 0 ) { msg = BM_SETSTATE; wp = (WPARAM)TRUE; } - else if ( _tcscmp(token, _T("NOTPUSHED")) == 0 ) + else if ( strcmp(token, "NOTPUSHED") == 0 ) { msg = BM_SETSTATE; wp = (WPARAM)FALSE; } else { - RXCT2A(token); - wrongArgValueException(context->threadContext, 1, BC_SETSTATE_OPTS, tokenT); + wrongArgValueException(context->threadContext, 1, BC_SETSTATE_OPTS, token); free(str); return NULLOBJECT; } @@ -539,7 +537,7 @@ SendMessage(hwnd, msg, wp, 0); msg = 0; } - token = _tcstok(NULL, _T(" ")); + token = strtok(NULL, " "); } safeFree(str); @@ -587,7 +585,6 @@ RexxMethod2(RexxObjectPtr, bc_setStyle, CSTRING, opts, CSELF, pCSelf) { - RXCA2T(opts); HWND hwnd = getDChCtrl(pCSelf); BUTTONSUBTYPE sub; @@ -607,25 +604,25 @@ oldTypeStyle = ((DWORD)GetWindowLong(hwnd, GWL_STYLE) & BS_TYPEMASK); typeStyle = oldTypeStyle; - rxcharT *token; - rxcharT *str = strdupupr(optsT); + char *token; + char *str = strdupupr(opts); if ( ! str ) { outOfMemoryException(context->threadContext); return NULLOBJECT; } - token = _tcstok(str, _T(" ")); + token = strtok(str, " "); while ( token != NULL ) { - if ( _tcscmp(token, _T("PUSHBOX")) == 0 ) + if ( strcmp(token, "PUSHBOX") == 0 ) { if ( type == push ) { typeStyle = BS_PUSHBOX; } } - else if ( _tcscmp(token, _T("DEFPUSHBUTTON")) == 0 ) + else if ( strcmp(token, "DEFPUSHBUTTON") == 0 ) { if ( type == push && sub != def ) { @@ -633,143 +630,142 @@ changeDefButton = true; } } - else if ( _tcscmp(token, _T("CHECKBOX")) == 0 ) + else if ( strcmp(token, "CHECKBOX") == 0 ) { if ( type == check ) { typeStyle = BS_CHECKBOX; } } - else if ( _tcscmp(token, _T("AUTOCHECKBOX")) == 0 ) + else if ( strcmp(token, "AUTOCHECKBOX") == 0 ) { if ( type == check ) { typeStyle = BS_AUTOCHECKBOX; } } - else if ( _tcscmp(token, _T("3STATE")) == 0 ) + else if ( strcmp(token, "3STATE") == 0 ) { if ( type == check ) { typeStyle = BS_3STATE; } } - else if ( _tcscmp(token, _T("AUTO3STATE")) == 0 ) + else if ( strcmp(token, "AUTO3STATE") == 0 ) { if ( type == check ) { typeStyle = BS_AUTO3STATE; } } - else if ( _tcscmp(token, _T("RADIO")) == 0 ) + else if ( strcmp(token, "RADIO") == 0 ) { if ( type == radio ) { typeStyle = BS_RADIOBUTTON; } } - else if ( _tcscmp(token, _T("AUTORADIO")) == 0 ) + else if ( strcmp(token, "AUTORADIO") == 0 ) { if ( type == radio ) { typeStyle = BS_AUTORADIOBUTTON; } } - else if ( _tcscmp(token, _T("GROUPBOX")) == 0 || _tcscmp(token, _T("OWNERDRAW")) == 0 ) + else if ( strcmp(token, "GROUPBOX") == 0 || strcmp(token, "OWNERDRAW") == 0 ) { ; // Ignored. } - else if ( _tcscmp(token, _T("LEFTTEXT")) == 0 || _tcscmp(token, _T("RIGHTBUTTON")) == 0 ) + else if ( strcmp(token, "LEFTTEXT") == 0 || strcmp(token, "RIGHTBUTTON") == 0 ) { style |= BS_LEFTTEXT; } - else if ( _tcscmp(token, _T("NOTLEFTTEXT")) == 0 ) + else if ( strcmp(token, "NOTLEFTTEXT") == 0 ) { style &= ~BS_LEFTTEXT; } - else if ( _tcscmp(token, _T("TEXT")) == 0 ) + else if ( strcmp(token, "TEXT") == 0 ) { style &= ~(BS_ICON | BS_BITMAP); } - else if ( _tcscmp(token, _T("ICON")) == 0 ) + else if ( strcmp(token, "ICON") == 0 ) { style = (style & ~BS_BITMAP) | BS_ICON; } - else if ( _tcscmp(token, _T("BITMAP")) == 0 ) + else if ( strcmp(token, "BITMAP") == 0 ) { style = (style & ~BS_ICON) | BS_BITMAP; } - else if ( _tcscmp(token, _T("LEFT")) == 0 ) + else if ( strcmp(token, "LEFT") == 0 ) { style = (style & ~BS_CENTER) | BS_LEFT; } - else if ( _tcscmp(token, _T("RIGHT")) == 0 ) + else if ( strcmp(token, "RIGHT") == 0 ) { style = (style & ~BS_CENTER) | BS_RIGHT; } - else if ( _tcscmp(token, _T("HCENTER")) == 0 ) + else if ( strcmp(token, "HCENTER") == 0 ) { style |= BS_CENTER; } - else if ( _tcscmp(token, _T("TOP")) == 0 ) + else if ( strcmp(token, "TOP") == 0 ) { style = (style & ~BS_VCENTER) | BS_TOP; } - else if ( _tcscmp(token, _T("BOTTOM")) == 0 ) + else if ( strcmp(token, "BOTTOM") == 0 ) { style = (style & ~BS_VCENTER) | BS_BOTTOM; } - else if ( _tcscmp(token, _T("VCENTER")) == 0 ) + else if ( strcmp(token, "VCENTER") == 0 ) { style |= BS_VCENTER; } - else if ( _tcscmp(token, _T("PUSHLIKE")) == 0 ) + else if ( strcmp(token, "PUSHLIKE") == 0 ) { if ( type == check || type == radio ) { style |= BS_PUSHLIKE; } } - else if ( _tcscmp(token, _T("MULTILINE")) == 0 ) + else if ( strcmp(token, "MULTILINE") == 0 ) { style |= BS_MULTILINE; } - else if ( _tcscmp(token, _T("NOTIFY")) == 0 ) + else if ( strcmp(token, "NOTIFY") == 0 ) { style |= BS_NOTIFY; } - else if ( _tcscmp(token, _T("FLAT")) == 0 ) + else if ( strcmp(token, "FLAT") == 0 ) { style |= BS_FLAT; } - else if ( _tcscmp(token, _T("NOTPUSHLIKE")) == 0 ) + else if ( strcmp(token, "NOTPUSHLIKE") == 0 ) { if ( type == check || type == radio ) { style &= ~BS_PUSHLIKE; } } - else if ( _tcscmp(token, _T("NOTMULTILINE")) == 0 ) + else if ( strcmp(token, "NOTMULTILINE") == 0 ) { style &= ~BS_MULTILINE; } - else if ( _tcscmp(token, _T("NOTNOTIFY")) == 0 ) + else if ( strcmp(token, "NOTNOTIFY") == 0 ) { style &= ~BS_NOTIFY; } - else if ( _tcscmp(token, _T("NOTFLAT")) == 0 ) + else if ( strcmp(token, "NOTFLAT") == 0 ) { style &= ~BS_FLAT; } else { - RXCT2A(token); - wrongArgValueException(context->threadContext, 1, BC_SETSTYLE_OPTS, tokenT); + wrongArgValueException(context->threadContext, 1, BC_SETSTYLE_OPTS, token); free(str); return NULLOBJECT; } - token = _tcstok(NULL, _T(" ")); + token = strtok(NULL, " "); } style |= typeStyle; @@ -1681,7 +1677,7 @@ if ( SendMessage(hwnd, EM_GETLINE, lineNumber, (LPARAM)buf) != 0 ) { RXCT2A(buf); - result = context->String(bufT); + result = context->String(bufA); } } @@ -1799,8 +1795,6 @@ RexxMethod4(RexxObjectPtr, e_showBallon, CSTRING, title, CSTRING, text, OPTIONAL_CSTRING, icon, CSELF, pCSelf) { - RXCA2T(title); - RXCA2T(text); if ( ! requiredComCtl32Version(context, context->GetMessageName(), COMCTL32_6_0) ) { return TheOneObj; @@ -1823,8 +1817,8 @@ return TheOneObj; } - putUnicodeText((LPWORD)wszTitle, titleT); - putUnicodeText((LPWORD)wszText, textT); + putUnicodeText((LPWORD)wszTitle, title); + putUnicodeText((LPWORD)wszText, text); tip.cbStruct = sizeof(tip); tip.pszText = wszText; @@ -1856,7 +1850,6 @@ RexxMethod2(RexxObjectPtr, e_setCue, CSTRING, text, CSELF, pCSelf) { - RXCA2T(text); if ( ! requiredComCtl32Version(context, context->GetMessageName(), COMCTL32_6_0) ) { return TheOneObj; @@ -1870,7 +1863,7 @@ return TheOneObj; } - putUnicodeText((LPWORD)wszCue, textT); + putUnicodeText((LPWORD)wszCue, text); return (Edit_SetCueBannerText(getDChCtrl(pCSelf), wszCue) ? TheZeroObj : TheOneObj); } @@ -2018,7 +2011,7 @@ if ( l > 0 ) { RXCT2A(buf); - result = c->String(bufT); + result = c->String(bufA); } free(buf); } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -360,7 +360,7 @@ goto done_out; } - rxcharT *symbol = NULL; + char *symbol = NULL; if ( ! context->ObjectToUnsignedInt32(id, &result) ) { @@ -373,17 +373,14 @@ * But, I guess we need to preserve that. */ - CSTRING value = context->ObjectToStringValue(id); - RXCA2T(value); - symbol = strdupupr_nospace(valueT); + symbol = strdupupr_nospace(context->ObjectToStringValue(id)); if ( symbol == NULL ) { outOfMemoryException(context->threadContext); goto done_out; } - RXCT2A(symbol); - RexxObjectPtr item = context->DirectoryAt(constDir, symbolT); + RexxObjectPtr item = context->DirectoryAt(constDir, symbol); if ( item != NULLOBJECT ) { context->ObjectToUnsignedInt32(item, &result); @@ -790,28 +787,28 @@ * * The caller is responsible for freeing the returned string. */ -rxcharT *strdupupr(const rxcharT *str) +char *strdupupr(const char *str) { - rxcharT *retStr = NULL; + char *retStr = NULL; if ( str ) { - size_t l = _tcslen(str); - retStr = (rxcharT *)RXTMALLOC(l + 1); + size_t l = strlen(str); + retStr = (char *)malloc(l + 1); if ( retStr ) { - rxcharT *p; + char *p; for ( p = retStr; *str; ++str ) { - if ( (_T('a') <= *str) && (*str <= _T('z')) ) + if ( ('a' <= *str) && (*str <= 'z') ) { - *p++ = *str - (_T('a') - _T('A')); + *p++ = *str - ('a' - 'A'); } else { *p++ = *str; } } - *p = _T('\0'); + *p = '\0'; } } return retStr; @@ -861,32 +858,32 @@ * * @note The caller is responsible for freeing the returned string. */ -rxcharT *strdupupr_nospace(const rxcharT *str) +char *strdupupr_nospace(const char *str) { - rxcharT *retStr = NULL; + char *retStr = NULL; if ( str ) { - size_t l = _tcslen(str); - retStr = (rxcharT *)RXTMALLOC(l + 1); + size_t l = strlen(str); + retStr = (char *)malloc(l + 1); if ( retStr ) { - rxcharT *p; + char *p; for ( p = retStr; *str; ++str ) { - if ( *str == _T(' ') ) + if ( *str == ' ' ) { continue; } - if ( (_T('a') <= *str) && (*str <= _T('z')) ) + if ( ('a' <= *str) && (*str <= 'z') ) { - *p++ = *str - (_T('a') - _T('A')); + *p++ = *str - ('a' - 'A'); } else { *p++ = *str; } } - *p = _T('\0'); + *p = '\0'; } } return retStr; @@ -933,13 +930,6 @@ } -char *strdup_2methodName(const rxcharW *str) -{ - RXCW2A(str); - return strdup_2methodName(strT); -} - - /** * Convenience function to retrieve the dialog admin block from a generic * ooDialog Rexx object. @@ -1100,7 +1090,7 @@ if ( count != 0 ) { RXCT2A(pBuf); - *pStringObj = c->String(pBufT); + *pStringObj = c->String(pBufA); } else { @@ -1218,7 +1208,7 @@ * * @return Return the value for the keyword, or -1 for not found. */ -int getKeywordValue(String2Int *cMap, const rxcharT * str) +int getKeywordValue(String2Int *cMap, const char * str) { String2Int::iterator itr; itr = cMap->find(str); @@ -1301,23 +1291,8 @@ * always be at least one, if an error occurs, the wide character null * is copied to the destination and 1 is returned. */ -#ifdef UNICODE - -int putUnicodeText(LPWORD dest, const rxcharW *text) +int putUnicodeText(LPWORD dest, const char *text) { - if ( text == NULL ) - { - *dest = 0; - return 1; - } - wcscpy((LPWSTR)dest, text); - return wcslen(text) + 1; -} - -#else - -int putUnicodeText(LPWORD dest, const rxcharA *text) -{ int count = 1; if ( text == NULL ) { @@ -1339,7 +1314,16 @@ return count; } -#endif +int putUnicodeText(LPWORD dest, const rxcharW *text) +{ + if ( text == NULL ) + { + *dest = 0; + return 1; + } + wcscpy((LPWSTR)dest, text); + return wcslen(text) + 1; +} /** Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -45,7 +45,7 @@ #include <string> #include <map> using namespace std; -typedef map<rxstringT, int, less<rxstringT> > String2Int; +typedef map<string, int, less<string> > String2Int; #define COMCTL_ERR_TITLE "ooDialog - Windows Common Controls Error" @@ -63,7 +63,7 @@ "number of allocated icon table entries. The icon\n" \ "resource will not be added." -#define DEFAULT_FONTNAME _T("MS Shell Dlg") +#define DEFAULT_FONTNAME "MS Shell Dlg" #define DEFAULT_FONTSIZE 8 #define MAX_DEFAULT_FONTNAME 256 @@ -193,11 +193,10 @@ extern RexxStringObject pointer2string(RexxMethodContext *, void *); extern RexxStringObject pointer2string(RexxThreadContext *c, void *pointer); extern RexxStringObject dword2string(RexxMethodContext *, uint32_t); -extern rxcharT * strdupupr(const rxcharT *str); -extern rxcharT * strdupupr_nospace(const rxcharT *str); +extern char * strdupupr(const char *str); +extern char * strdupupr_nospace(const char *str); extern char * strdup_nospace(const char *str); extern char * strdup_2methodName(const char *str); -extern char * strdup_2methodName(const rxcharW *str); extern DIALOGADMIN * getDlgAdm(RexxMethodContext *c, RexxObjectPtr dlg); extern void ooDialogInternalException(RexxMethodContext *, char *, int, char *, char *); @@ -241,10 +240,11 @@ extern bool rxIntFromDirectory(RexxMethodContext *, RexxDirectoryObject, CSTRING, int *, int, bool); extern RexxObjectPtr setWindowStyle(RexxMethodContext *c, HWND hwnd, uint32_t style); -extern int putUnicodeText(LPWORD dest, const rxcharT *text); +extern int putUnicodeText(LPWORD dest, const char *text); +extern int putUnicodeText(LPWORD dest, const rxcharW *text); extern RexxStringObject unicode2String(RexxMethodContext *c, PWSTR wstr, int32_t len); extern char * unicode2Ansi(PWSTR wstr, int32_t len); -extern int getKeywordValue(String2Int *cMap, const rxcharT * str); +extern int getKeywordValue(String2Int *cMap, const char * str); extern bool goodMinMaxArgs(RexxMethodContext *c, RexxArrayObject args, size_t min, size_t max, size_t *arraySize); extern bool getRectFromArglist(RexxMethodContext *, RexxArrayObject, PRECT, bool, int, int, size_t *, size_t *); extern bool getPointFromArglist(RexxMethodContext *, RexxArrayObject, PPOINT, int, int, size_t *, size_t *); Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -541,7 +541,7 @@ } -static keyPressErr_t connectKeyPressSubclass(RexxMethodContext *c, CSTRINGT methodName, CSTRINGT keys, CSTRINGT filter, +static keyPressErr_t connectKeyPressSubclass(RexxMethodContext *c, CSTRING methodName, CSTRING keys, CSTRING filter, pCDialogControl pcdc) { keyPressErr_t result = nameErr; @@ -549,12 +549,12 @@ { goto done_out; } - if ( *methodName == _T('\0') ) + if ( *methodName == '\0' ) { c->RaiseException1(Rexx_Error_Invalid_argument_null, TheOneObj); goto done_out; } - if ( *keys == _T('\0') ) + if ( *keys == '\0' ) { c->RaiseException1(Rexx_Error_Invalid_argument_null, TheTwoObj); goto done_out; @@ -745,10 +745,7 @@ RexxMethod4(int32_t, dlgctrl_connectKeyPress, CSTRING, methodName, CSTRING, keys, OPTIONAL_CSTRING, filter, CSELF, pCSelf) { - RXCA2T(methodName); - RXCA2T(keys); - RXCA2T(filter); - keyPressErr_t result = connectKeyPressSubclass(context, methodNameT, keysT, filterT, (pCDialogControl)pCSelf); + keyPressErr_t result = connectKeyPressSubclass(context, methodName, keys, filter, (pCDialogControl)pCSelf); if ( result == memoryErr ) { outOfMemoryException(context->threadContext); @@ -758,8 +755,7 @@ RexxMethod2(int32_t, dlgctrl_connectFKeyPress, CSTRING, methodName, CSELF, pCSelf) { - RXCA2T(methodName); - keyPressErr_t result = connectKeyPressSubclass(context, methodNameT, _T("FKEYS"), NULL, (pCDialogControl)pCSelf); + keyPressErr_t result = connectKeyPressSubclass(context, methodName, "FKEYS", NULL, (pCDialogControl)pCSelf); if ( result == memoryErr ) { outOfMemoryException(context->threadContext); @@ -769,8 +765,7 @@ RexxMethod2(int32_t, dlgctrl_disconnectKeyPress, OPTIONAL_CSTRING, methodName, CSELF, pCSelf) { - RXCA2T(methodName); - rxcharT *tmpName = NULL; + char *tmpName = NULL; keyPressErr_t result = winAPIErr; if ( ! requiredComCtl32Version(context, context->GetMessageName(), COMCTL32_6_0) ) @@ -795,7 +790,7 @@ } // Have a method name, just remove that method from the mapping. - tmpName = strdupupr(methodNameT); + tmpName = strdupupr(methodName); if ( tmpName == NULL ) { result = memoryErr; @@ -836,7 +831,6 @@ RexxMethod2(logical_t, dlgctrl_hasKeyPressConnection, OPTIONAL_CSTRING, methodName, CSELF, pCSelf) { - RXCA2T(methodName); if ( ComCtl32Version < COMCTL32_6_0 ) { return FALSE; @@ -858,7 +852,7 @@ return TRUE; } - rxcharT *tmpName = strdupupr(methodNameT); + char *tmpName = strdupupr(methodName); if ( tmpName == NULL ) { outOfMemoryException(context->threadContext); @@ -1165,10 +1159,9 @@ */ RexxMethod2(RexxObjectPtr, dlgctrl_dataEquals, CSTRING, data, CSELF, pCSelf) { - RXCA2T(data); pCDialogControl pcdc = (pCDialogControl)pCSelf; - setControlData(context, dlgToCSelf(context, pcdc->oDlg), pcdc->id, dataT, pcdc->hDlg, pcdc->controlType); + setControlData(context, dlgToCSelf(context, pcdc->oDlg), pcdc->id, data, pcdc->hDlg, pcdc->controlType); return NULLOBJECT; } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.hpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.hpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -54,8 +54,8 @@ enum DateTimePart {dtFull, dtTime, dtDate, dtNow}; // Defined in oodUser.cpp -extern uint32_t listViewStyle(CSTRINGT opts, uint32_t style); -extern uint32_t monthCalendarStyle(CSTRINGT opts, uint32_t style); +extern uint32_t listViewStyle(CSTRING opts, uint32_t style); +extern uint32_t monthCalendarStyle(CSTRING opts, uint32_t style); extern RexxClassObject oodClass4controlType(RexxMethodContext *c, oodControl_t controlType); extern oodControl_t control2controlType(HWND hControl); Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -717,7 +717,7 @@ } RXCT2A(data); - return c->String(dataT); + return c->String(dataA); } /** @@ -731,7 +731,7 @@ * * @return uint32_t */ -int32_t setControlData(RexxMethodContext *c, pCPlainBaseDialog pcpbd, uint32_t id, CSTRINGT data, +int32_t setControlData(RexxMethodContext *c, pCPlainBaseDialog pcpbd, uint32_t id, CSTRING data, HWND hDlg, oodControl_t ctrlType) { if ( ctrlType == winUnknown ) @@ -743,33 +743,34 @@ } } + RXCA2T(data); switch ( ctrlType ) { case winEdit: case winStatic: - return (SetDlgItemText(hDlg, id, data) ? 0 : 1); + return (SetDlgItemText(hDlg, id, dataT) ? 0 : 1); case winCheckBox: - return (CheckDlgButton(hDlg, id, _tstoi(data)) ? 0 : 1); + return (CheckDlgButton(hDlg, id, atoi(data)) ? 0 : 1); case winRadioButton: - return (manualCheckRadioButton(pcpbd->dlgAdm, hDlg, id, _tstoi(data)) ? 0 : 1); + return (manualCheckRadioButton(pcpbd->dlgAdm, hDlg, id, atoi(data)) ? 0 : 1); case winListBox: - return (setListBoxData(hDlg, id, data) ? 0 : 1); + return (setListBoxData(hDlg, id, dataT) ? 0 : 1); case winComboBox: - return setComboBoxData(hDlg, id, data); + return setComboBoxData(hDlg, id, dataT); case winTreeView: - return (setTreeViewData(hDlg, data, id) ? 0 : 1); + return (setTreeViewData(hDlg, dataT, id) ? 0 : 1); case winListView: - return (setListViewData(hDlg, data, id) ? 0 : 1); + return (setListViewData(hDlg, dataT, id) ? 0 : 1); case winTrackBar: - return (setTrackBarData(hDlg, data, id) ? 0 : 1); + return (setTrackBarData(hDlg, dataT, id) ? 0 : 1); case winTab: - return (setTabData(hDlg, data, id) ? 0 : 1); + return (setTabData(hDlg, dataT, id) ? 0 : 1); case winDateTimePicker: - return (setDateTimeData(hDlg, data, id) ? 0 : 1); + return (setDateTimeData(hDlg, dataT, id) ? 0 : 1); case winMonthCalendar: - return (setMonthCalendarData(hDlg, data, id) ? 0 : 1); + return (setMonthCalendarData(hDlg, dataT, id) ? 0 : 1); case winUpDown: - return (setUpDownData(hDlg, data, id) ? 0 : 1); + return (setUpDownData(hDlg, dataT, id) ? 0 : 1); default: return 1; } @@ -991,7 +992,7 @@ } RXCT2A(data); - c->SetStemArrayElement(internDlgData, itemID, c->String(dataT)); + c->SetStemArrayElement(internDlgData, itemID, c->String(dataA)); } return 0; } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.hpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.hpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -42,7 +42,7 @@ extern uint32_t setDlgDataFromStem(RexxMethodContext *, pCPlainBaseDialog, RexxStemObject); extern uint32_t putDlgDataInStem(RexxMethodContext *, pCPlainBaseDialog, RexxStemObject); extern RexxObjectPtr getControlData(RexxMethodContext *, pCPlainBaseDialog, uint32_t, HWND, oodControl_t); -extern int32_t setControlData(RexxMethodContext *, pCPlainBaseDialog, uint32_t, CSTRINGT, HWND, oodControl_t); +extern int32_t setControlData(RexxMethodContext *, pCPlainBaseDialog, uint32_t, CSTRING, HWND, oodControl_t); extern uint32_t addToDataTable(RexxMethodContext *, DIALOGADMIN *, int, oodControl_t, uint32_t); extern RexxArrayObject getDataTableIDs(RexxMethodContext *, pCPlainBaseDialog, RexxObjectPtr); extern bool doDataAutoDetection(RexxMethodContext *, DIALOGADMIN *); Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -3450,7 +3450,7 @@ setNumStrStem(c, dStem, count, "DLL", pointer2string(c, dlgAdm->TheInstance)); PCHART messageQueue = dlgAdm->pMessageQueue; RXCT2A(messageQueue); - setNumStrStem(c, dStem, count, "QUEUE", c->String(messageQueueT)); + setNumStrStem(c, dStem, count, "QUEUE", c->String(messageQueueA)); setNumStrStem(c, dStem, count, "BMPBUTTONS", c->StringSize(dlgAdm->BT_size)); setNumStrStem(c, dStem, count, "DATAITEMS", c->StringSize(dlgAdm->DT_size)); setNumStrStem(c, dStem, count, "COLORITEMS", c->StringSize(dlgAdm->CT_size)); @@ -3479,7 +3479,7 @@ c->SetStemElement(dStem, "DLL", pointer2string(c, dlgAdm->TheInstance)); PCHART messageQueue = dlgAdm->pMessageQueue; RXCT2A(messageQueue); - c->SetStemElement(dStem, "QUEUE", c->String(messageQueueT)); + c->SetStemElement(dStem, "QUEUE", c->String(messageQueueA)); size_t i; size_t numPart; Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -119,12 +119,12 @@ // Local function prototypes. static uint32_t resolveItemID(RexxMethodContext *, RexxObjectPtr, logical_t, RexxObjectPtr, size_t); static bool getMII(CppMenu *, RexxObjectPtr, BOOL, uint32_t, uint32_t *, UINT, MENUITEMINFO *); -static UINT getPopupTypeOpts(const rxcharT *, UINT); -static UINT getPopupStateOpts(const rxcharT *, UINT); -static UINT getItemStateOpts(const rxcharT *, UINT); -static UINT getItemTypeOpts(const rxcharT *, UINT); -static UINT getSeparatorTypeOpts(const rxcharT *opts, UINT type); -static UINT getTrackFlags(const rxcharT *); +static UINT getPopupTypeOpts(const char *, UINT); +static UINT getPopupStateOpts(const char *, UINT); +static UINT getItemStateOpts(const char *, UINT); +static UINT getItemTypeOpts(const char *, UINT); +static UINT getSeparatorTypeOpts(const char *opts, UINT type); +static UINT getTrackFlags(const char *); static uint32_t deleteSeparatorByID(HMENU, uint32_t); static uint32_t menuHelpID(HMENU hMenu, DWORD helpID, BOOL recurse, uint32_t *id); static uint32_t menuConnectItems(HMENU hMenu, pCEventNotification pcen, CSTRING msg, bool isSysMenu, logical_t handles); @@ -222,11 +222,11 @@ return "ERROR unknown menu"; } -logical_t CppMenu::addTemplateSepartor(RexxObjectPtr rxID, CSTRINGT opts) +logical_t CppMenu::addTemplateSepartor(RexxObjectPtr rxID, CSTRING opts) { logical_t success = FALSE; oodResetSysErrCode(c->threadContext); - rxcharT *upperOpts = NULL; + char *upperOpts = NULL; uint32_t id = oodResolveSymbolicID(c, self, rxID, -1, 1); if ( id == OOD_ID_EXCEPTION ) @@ -253,7 +253,7 @@ } dwType = getSeparatorTypeOpts(upperOpts, dwType); - if ( _tcsstr(upperOpts, _T("END")) ) + if ( strstr(upperOpts, "END") ) { resInfo = MFR_END; } @@ -278,11 +278,11 @@ * * @note text is required to be not null, the empty string is okay. */ -logical_t CppMenu::addTemplateItem(RexxObjectPtr rxID, CSTRINGT text, CSTRINGT opts, CSTRING method) +logical_t CppMenu::addTemplateItem(RexxObjectPtr rxID, CSTRINGT text, CSTRING opts, CSTRING method) { logical_t success = FALSE; oodResetSysErrCode(c->threadContext); - rxcharT *upperOpts = NULL; + char *upperOpts = NULL; uint32_t id = oodResolveSymbolicID(c, self, rxID, -1, 1); if ( id == OOD_ID_EXCEPTION ) @@ -311,7 +311,7 @@ dwState = getItemStateOpts(upperOpts, 0); dwType = getItemTypeOpts(upperOpts, MFT_STRING); - if ( _tcsstr(upperOpts, _T("END")) ) + if ( strstr(upperOpts, "END") ) { resInfo = MFR_END; } @@ -347,11 +347,11 @@ * * @note Text is required to not be null, the empty string is okay. */ -logical_t CppMenu::addTemplatePopup(RexxObjectPtr rxID, CSTRINGT text, CSTRINGT opts, RexxObjectPtr helpID) +logical_t CppMenu::addTemplatePopup(RexxObjectPtr rxID, CSTRINGT text, CSTRING opts, RexxObjectPtr helpID) { logical_t success = FALSE; oodResetSysErrCode(c->threadContext); - rxcharT *upperOpts = NULL; + char *upperOpts = NULL; uint32_t id = oodResolveSymbolicID(c, self, rxID, -1, 1); if ( id == OOD_ID_EXCEPTION ) @@ -390,7 +390,7 @@ DWORD dwState = getPopupStateOpts(upperOpts, 0); DWORD dwType = getPopupTypeOpts(upperOpts, MFT_STRING); - if ( _tcsstr(upperOpts, _T("END")) ) + if ( strstr(upperOpts, "END") ) { resInfo |= MFR_END; } @@ -723,7 +723,7 @@ * @assumes id is a resource ID and not a by position ID. This menu is a menu * bar. */ -BOOL CppMenu::maybeConnectItem(uint32_t id, CSTRINGT text, logical_t connect, CSTRING methodName) +BOOL CppMenu::maybeConnectItem(uint32_t id, CSTRING text, logical_t connect, CSTRING methodName) { BOOL success = TRUE; char * _methodName = NULL; @@ -1356,7 +1356,8 @@ if ( method == NULL ) { - name = strdup_2methodName(buf); + RXCT2A(buf); + name = strdup_2methodName(bufA); if ( name == NULL ) { oodSetSysErrCode(c->threadContext, ERROR_NOT_ENOUGH_MEMORY); @@ -1618,7 +1619,6 @@ RexxObjectPtr CppMenu::trackPopup(RexxObjectPtr location, RexxObjectPtr _dlg, CSTRING opts, logical_t bothButtons, RexxObjectPtr excludeRect, bool doTrack) { - RXCA2T(opts); oodResetSysErrCode(c->threadContext); RexxObjectPtr result = TheNegativeOneObj; @@ -1674,7 +1674,7 @@ UINT flags = 0; if ( opts != NULL ) { - flags = getTrackFlags(optsT); + flags = getTrackFlags(opts); if ( flags == ERROR_OUTOFMEMORY ) { outOfMemoryException(c->threadContext); @@ -2621,7 +2621,9 @@ if ( pMsg == NULL ) { // strdup_2methodName removes any '&' and the trailing ... if any. - pMsg = strdup_2methodName(mii.dwTypeData); + rxcharT *mii_dwTypeData = mii.dwTypeData; + RXCT2A(mii_dwTypeData); + pMsg = strdup_2methodName(mii_dwTypeDataA); if ( ! pMsg ) { return ERROR_NOT_ENOUGH_MEMORY; @@ -3623,15 +3625,13 @@ if ( argumentExists(4) ) { - RXCA2T(stateOpts); - mii.fState = getItemStateOpts(stateOptsT, 0); + mii.fState = getItemStateOpts(stateOpts, 0); mii.fMask |= MIIM_STATE; } if ( argumentExists(5) ) { - RXCA2T(typeOpts); - mii.fType |= getItemTypeOpts(typeOptsT, 0); + mii.fType |= getItemTypeOpts(typeOpts, 0); mii.fMask |= MIIM_FTYPE; } @@ -3648,7 +3648,7 @@ if ( cMenu->isMenuBar() && ! byPosition ) { - success = cMenu->maybeConnectItem(id, textT, connect, methodName); + success = cMenu->maybeConnectItem(id, text, connect, methodName); } done_out: @@ -3755,15 +3755,13 @@ if ( argumentExists(5) ) { - RXCA2T(stateOpts); - mii.fState = getPopupStateOpts(stateOptsT, 0); + mii.fState = getPopupStateOpts(stateOpts, 0); mii.fMask |= MIIM_STATE; } if ( argumentExists(6) ) { - RXCA2T(typeOpts); - mii.fType |= getPopupTypeOpts(typeOptsT, 0); + mii.fType |= getPopupTypeOpts(typeOpts, 0); mii.fMask |= MIIM_FTYPE; } @@ -4424,7 +4422,7 @@ done_out: RXCT2A(buf); - return context->CString(bufT); + return context->CString(bufA); } @@ -4842,8 +4840,7 @@ cMenu->setContext(context, TheFalseObj); RXCA2T(text); - RXCA2T(opts); - return cMenu->addTemplatePopup(rxID, textT, optsT, rxHelpID); + return cMenu->addTemplatePopup(rxID, textT, opts, rxHelpID); } /** MenuTemplate::addItem() @@ -4892,8 +4889,7 @@ cMenu->setContext(context, TheFalseObj); RXCA2T(text); - RXCA2T(opts); - return cMenu->addTemplateItem(rxID, textT, optsT, method); + return cMenu->addTemplateItem(rxID, textT, opts, method); } @@ -4935,8 +4931,7 @@ CppMenu *cMenu = menuToCSelf(context, self); cMenu->setContext(context, TheFalseObj); - RXCA2T(opts); - return cMenu->addTemplateSepartor(rxID, optsT); + return cMenu->addTemplateSepartor(rxID, opts); } @@ -6055,64 +6050,64 @@ } -static UINT checkCommonTypeOpts(const rxcharT *opts, UINT type) +static UINT checkCommonTypeOpts(const char *opts, UINT type) { - if ( _tcsstr(opts, _T("NOTMENUBARBREAK")) != NULL ) + if ( strstr(opts, "NOTMENUBARBREAK") != NULL ) { type &= ~MFT_MENUBARBREAK; } - else if ( _tcsstr(opts, _T("MENUBARBREAK")) != NULL ) + else if ( strstr(opts, "MENUBARBREAK") != NULL ) { type |= MFT_MENUBARBREAK; } - if ( _tcsstr(opts, _T("NOTMENUBREAK")) != NULL ) + if ( strstr(opts, "NOTMENUBREAK") != NULL ) { type &= ~MFT_MENUBREAK; } - else if ( _tcsstr(opts, _T("MENUBREAK")) != NULL ) + else if ( strstr(opts, "MENUBREAK") != NULL ) { type |= MFT_MENUBREAK; } - if ( _tcsstr(opts, _T("NOTRIGHTJUSTIFY")) != NULL ) + if ( strstr(opts, "NOTRIGHTJUSTIFY") != NULL ) { type &= ~MFT_RIGHTJUSTIFY; } - else if ( _tcsstr(opts, _T("RIGHTJUSTIFY")) != NULL ) + else if ( strstr(opts, "RIGHTJUSTIFY") != NULL ) { type |= MFT_RIGHTJUSTIFY; } return type; } -static UINT checkCommonStateOpts(const rxcharT *opts, UINT state) +static UINT checkCommonStateOpts(const char *opts, UINT state) { - if ( _tcsstr(opts, _T("NOTDEFAULT")) != NULL ) + if ( strstr(opts, "NOTDEFAULT") != NULL ) { state &= ~MFS_DEFAULT; } - else if ( _tcsstr(opts, _T("DEFAULT")) != NULL ) + else if ( strstr(opts, "DEFAULT") != NULL ) { state |= MFS_DEFAULT; } - if ( _tcsstr(opts, _T("DISABLED")) != NULL ) + if ( strstr(opts, "DISABLED") != NULL ) { state |= MFS_DISABLED; } - if ( _tcsstr(opts, _T("GRAYED")) != NULL ) + if ( strstr(opts, "GRAYED") != NULL ) { state |= MFS_GRAYED; } - if ( _tcsstr(opts, _T("ENABLED")) != NULL ) + if ( strstr(opts, "ENABLED") != NULL ) { state &= ~MFS_DISABLED; } - if ( _tcsstr(opts, _T("UNHILITE")) != NULL ) + if ( strstr(opts, "UNHILITE") != NULL ) { state &= ~MFS_HILITE; } - else if ( _tcsstr(opts, _T("HILITE")) != NULL ) + else if ( strstr(opts, "HILITE") != NULL ) { state |= MFS_HILITE; } @@ -6131,14 +6126,14 @@ * * @return The combined MFT_* flags for a popup menu. */ -static UINT getPopupTypeOpts(const rxcharT *opts, UINT type) +static UINT getPopupTypeOpts(const char *opts, UINT type) { type = checkCommonTypeOpts(opts, type); - if ( _tcsstr(opts, _T("NOTRIGHTORDER")) != NULL ) + if ( strstr(opts, "NOTRIGHTORDER") != NULL ) { type &= ~MFT_RIGHTORDER; } - else if ( _tcsstr(opts, _T("RIGHTORDER")) != NULL ) + else if ( strstr(opts, "RIGHTORDER") != NULL ) { type |= MFT_RIGHTORDER; } @@ -6156,7 +6151,7 @@ * * Note that with extended menus disabled and grared are the same thing. */ -static UINT getPopupStateOpts(const rxcharT *opts, UINT state) +static UINT getPopupStateOpts(const char *opts, UINT state) { state = checkCommonStateOpts(opts, state); return state; @@ -6177,14 +6172,14 @@ * contain submenus, but menu items are perfectly valid in a menu bar. If the * right justify flag is used in a submenu, it has no effect. */ -static UINT getItemTypeOpts(const rxcharT *opts, UINT type) +static UINT getItemTypeOpts(const char *opts, UINT type) { type = checkCommonTypeOpts(opts, type); - if ( _tcsstr(opts, _T("NOTRADIO")) != NULL ) + if ( strstr(opts, "NOTRADIO") != NULL ) { type &= ~MFT_RADIOCHECK; } - else if ( _tcsstr(opts, _T("RADIO")) != NULL ) + else if ( strstr(opts, "RADIO") != NULL ) { type |= MFT_RADIOCHECK; } @@ -6203,32 +6198,32 @@ * * @return The combined MFT_* flags for a menu separtor. */ -static UINT getSeparatorTypeOpts(const rxcharT *opts, UINT type) +static UINT getSeparatorTypeOpts(const char *opts, UINT type) { - if ( _tcsstr(opts, _T("NOTMENUBARBREAK")) != NULL ) + if ( strstr(opts, "NOTMENUBARBREAK") != NULL ) { type &= ~MFT_MENUBARBREAK; } - else if ( _tcsstr(opts, _T("MENUBARBREAK")) != NULL ) + else if ( strstr(opts, "MENUBARBREAK") != NULL ) { type |= MFT_MENUBARBREAK; } - if ( _tcsstr(opts, _T("NOTMENUBREAK")) != NULL ) + if ( strstr(opts, "NOTMENUBREAK") != NULL ) { type &= ~MFT_MENUBREAK; } - else if ( _tcsstr(opts, _T("MENUBREAK")) != NULL ) + else if ( strstr(opts, "MENUBREAK") != NULL ) { type |= MFT_MENUBREAK; } // TODO test if RIGHTORDER is valid for a separator, I don't think it is. - if ( _tcsstr(opts, _T("NOTRIGHTORDER")) != NULL ) + if ( strstr(opts, "NOTRIGHTORDER") != NULL ) { type &= ~MFT_RIGHTORDER; } - else if ( _tcsstr(opts, _T("RIGHTORDER")) != NULL ) + else if ( strstr(opts, "RIGHTORDER") != NULL ) { type |= MFT_RIGHTORDER; } @@ -6249,15 +6244,15 @@ * * Note that with extended menus grayed and disabled are the same thing. */ -static UINT getItemStateOpts(const rxcharT *opts, UINT state) +static UINT getItemStateOpts(const char *opts, UINT state) { state = checkCommonStateOpts(opts, state); - if ( _tcsstr(opts, _T("UNCHECKED")) != NULL ) + if ( strstr(opts, "UNCHECKED") != NULL ) { state &= ~MFS_CHECKED; } - else if ( _tcsstr(opts, _T("CHECKED")) != NULL ) + else if ( strstr(opts, "CHECKED") != NULL ) { state |= MFS_CHECKED; } @@ -6265,21 +6260,21 @@ } -static UINT getTrackFlags(const rxcharT *opt) +static UINT getTrackFlags(const char *opt) { UINT flag = 0; - rxcharT *upperStr = strdupupr(opt); + char *upperStr = strdupupr(opt); if ( upperStr == NULL ) { return ERROR_OUTOFMEMORY; } - if ( _tcsstr(upperStr, _T("LEFT")) != NULL ) + if ( strstr(upperStr, "LEFT") != NULL ) { flag = TPM_LEFTALIGN; } - else if ( _tcsstr(upperStr, _T("HCENTER")) != NULL ) + else if ( strstr(upperStr, "HCENTER") != NULL ) { flag = TPM_CENTERALIGN; } @@ -6288,11 +6283,11 @@ flag = TPM_RIGHTALIGN; } - if ( _tcsstr(upperStr, _T("TOP")) != NULL ) + if ( strstr(upperStr, "TOP") != NULL ) { flag |= TPM_TOPALIGN; } - else if ( _tcsstr(upperStr, _T("VCENTER")) != NULL ) + else if ( strstr(upperStr, "VCENTER") != NULL ) { flag |= TPM_VCENTERALIGN; } @@ -6301,41 +6296,41 @@ flag |= TPM_BOTTOMALIGN; } - if ( _tcsstr(upperStr, _T("HORNEGANIMATION")) != NULL ) + if ( strstr(upperStr, "HORNEGANIMATION") != NULL ) { flag |= TPM_HORNEGANIMATION; } - if ( _tcsstr(upperStr, _T("HORPOSANIMATION")) != NULL ) + if ( strstr(upperStr, "HORPOSANIMATION") != NULL ) { flag |= TPM_HORPOSANIMATION; } - if ( _tcsstr(upperStr, _T("NOANIMATION")) != NULL ) + if ( strstr(upperStr, "NOANIMATION") != NULL ) { flag |= TPM_NOANIMATION; } - if ( _tcsstr(upperStr, _T("VERNEGANIMATION")) != NULL ) + if ( strstr(upperStr, "VERNEGANIMATION") != NULL ) { flag |= TPM_VERNEGANIMATION; } - if ( _tcsstr(upperStr, _T("VERPOSANIMATION")) != NULL ) + if ( strstr(upperStr, "VERPOSANIMATION") != NULL ) { flag |= TPM_VERPOSANIMATION; } - if ( _tcsstr(upperStr, _T("HORIZONTAL")) != NULL ) + if ( strstr(upperStr, "HORIZONTAL") != NULL ) { flag |= TPM_HORIZONTAL; } - if ( _tcsstr(upperStr, _T("VERTICAL")) != NULL ) + if ( strstr(upperStr, "VERTICAL") != NULL ) { flag |= TPM_VERTICAL; } - if ( _tcsstr(upperStr, _T("RECURSE")) != NULL ) + if ( strstr(upperStr, "RECURSE") != NULL ) { flag |= TPM_RECURSE; } if ( ComCtl32Version >= COMCTL32_6_0 ) { - if ( _tcsstr(upperStr, _T("LAYOUTRTL")) != NULL ) + if ( strstr(upperStr, "LAYOUTRTL") != NULL ) { flag |= TPM_LAYOUTRTL; } Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -130,9 +130,9 @@ BOOL addTemplateMenuItem(DWORD menuID, DWORD dwType, DWORD dwState, DWORD dwHelpID, WORD resInfo, CSTRINGT text); bool finishTemplate(); void deleteTemplate(); - logical_t addTemplateSepartor(RexxObjectPtr rxID, CSTRINGT opts); - logical_t addTemplateItem(RexxObjectPtr rxID, CSTRINGT text, CSTRINGT opts, CSTRING method); - logical_t addTemplatePopup(RexxObjectPtr rxID, CSTRINGT text, CSTRINGT opts, RexxObjectPtr helpID); + logical_t addTemplateSepartor(RexxObjectPtr rxID, CSTRING opts); + logical_t addTemplateItem(RexxObjectPtr rxID, CSTRINGT text, CSTRING opts, CSTRING method); + logical_t addTemplatePopup(RexxObjectPtr rxID, CSTRINGT text, CSTRING opts, RexxObjectPtr helpID); inline logical_t templateIsComplete() { return isFinal ? TRUE : FALSE; } inline void noTempHelpID() { helpID = (uint32_t)-1; } @@ -145,7 +145,7 @@ RexxDirectoryObject autoConnectionStatus(); void setAutoConnection(logical_t on, CSTRING methodName); - BOOL maybeConnectItem(uint32_t id, CSTRINGT text, logical_t connect, CSTRING methodName); + BOOL maybeConnectItem(uint32_t id, CSTRING text, logical_t connect, CSTRING methodName); logical_t attachToDlg(RexxObjectPtr dialog); logical_t assignToDlg(RexxObjectPtr dialog, logical_t autoConnect, CSTRING methodName); bool addToConnectionQ(uint32_t id, CSTRING methodName); Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2010-05-15 20:49:45 UTC (rev 5963) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2010-05-15 22:17:55 UTC (rev 5964) @@ -546,7 +546,7 @@ WPARAM wParam, LPARAM lParam) { RXCT2A(methodName); - RexxObjectPtr rexxReply = c->SendMessage2(pcpbd->rexxSelf, methodNameT, c->Uintptr(wParam), pointer2string(c, (void *)lParam)); + RexxObjectPtr rexxReply = c->SendMessage2(pcpbd->rexxSelf, methodNameA, c->Uintptr(wParam), pointer2string(c, (void *)lParam)); checkForCondition(c); return ReplyFalse; } @@ -726,7 +726,7 @@ RexxArrayObject args = c->ArrayOfFour(dt, valid, idFrom, hwndFrom); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); checkForCondition(c); return ReplyFalse; @@ -741,9 +741,9 @@ LPCTSTR format = pFormat->pszFormat; RXCT2A(format); - RexxArrayObject args = c->ArrayOfFour(c->String(formatT), dt, idFrom, hwndFrom); + RexxArrayObject args = c->ArrayOfFour(c->String(formatA), dt, idFrom, hwndFrom); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); if ( ! checkForCondition(c) ) { @@ -772,9 +772,9 @@ LPCTSTR format = pQuery->pszFormat; RXCT2A(format); - RexxArrayObject args = c->ArrayOfFour(c->String(formatT), _size, idFrom, hwndFrom); + RexxArrayObject args = c->ArrayOfFour(c->String(formatA), _size, idFrom, hwndFrom); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); checkForCondition(c); PSIZE size = (PSIZE)c->ObjectToCSelf(_size); @@ -792,7 +792,7 @@ RexxDirectoryObject d = (RexxDirectoryObject)rxNewBuiltinObject(c, "DIRECTORY"); LPCTSTR userString = pdts->pszUserString; RXCT2A(userString); - c->DirectoryPut(d, c->String(userStringT), "USERSTRING"); + c->DirectoryPut(d, c->String(userStringA), "USERSTRING"); c->DirectoryPut(d, TheNilObj, "DATETIME"); c->DirectoryPut(d, TheFalseObj, "VALID"); @@ -800,7 +800,7 @@ dt2sysTime(c, NULLOBJECT, &(pdts->st), dtNow); pdts->dwFlags = GDT_ERROR; - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, c->ArrayOfThree(d, idFrom, hwndFrom)); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, c->ArrayOfThree(d, idFrom, hwndFrom)); if ( checkForCondition(c) ) { @@ -851,13 +851,13 @@ RexxArrayObject args = c->NewArray(5); LPCTSTR format = pQuery->pszFormat; RXCT2A(format); - c->ArrayPut(args, c->String(formatT), 1); + c->ArrayPut(args, c->String(formatA), 1); c->ArrayPut(args, dt, 2); c->ArrayPut(args, c->Int32(pQuery->nVirtKey), 3); c->ArrayPut(args, idFrom, 4); c->ArrayPut(args, hwndFrom, 5); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); if ( ! checkForCondition(c) ) { @@ -883,7 +883,7 @@ case NM_KILLFOCUS: case NM_SETFOCUS: { - return genericNotifyInvoke(c, pcpbd, methodNameT, idFrom, hwndFrom); + return genericNotifyInvoke(c, pcpbd, methodNameA, idFrom, hwndFrom); } default : @@ -928,7 +928,7 @@ RexxArrayObject args = c->ArrayOfFour(idFrom, c->Int32(pIA->iItem), c->Int32(pIA->iSubItem), c->String(tmpBuffer)); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); checkForCondition(c); return ReplyFalse; @@ -955,7 +955,7 @@ RexxArrayObject args = c->ArrayOfThree(idFrom, item, c->String(p)); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); checkForCondition(c); return ReplyFalse; @@ -990,7 +990,7 @@ RexxArrayObject args = c->ArrayOfThree(idFrom, item, c->String(tmpBuffer)); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); checkForCondition(c); return ReplyFalse; @@ -1001,7 +1001,7 @@ RexxArrayObject args = c->ArrayOfThree(idFrom, item, c->String(p)); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); if ( checkForCondition(c) ) { @@ -1016,7 +1016,7 @@ RexxArrayObject args = c->ArrayOfThree(idFrom, item, c->String(p)); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); if ( checkForCondition(c) ) { @@ -1060,7 +1060,7 @@ RexxArrayObject args = c->ArrayOfFour(dt, c->Int32(pDayState->cDayState), idFrom, hwndFrom); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); if ( checkForCondition(c) ) { @@ -1088,7 +1088,7 @@ RexxArrayObject args = c->ArrayOfFour(dtStart, dtEnd, idFrom, hwndFrom); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); checkForCondition(c); return ReplyTrue; } @@ -1102,14 +1102,14 @@ RexxArrayObject args = c->ArrayOfFour(newView, oldView, idFrom, hwndFrom); - rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameT, args); + rexxReply = c->SendMessage(pcpbd->rexxSelf, methodNameA, args); checkForCondition(c); return ReplyTrue; } case NM_RELEASEDCAPTURE : { - return genericNotifyInvoke(c, pcpbd, methodNameT, idFrom, hwndFrom); + return genericNotifyInvoke(c, pcpbd, methodNameA, idFrom, hwndFrom); } default : @@ -1144,7 +1144,7 @@ RexxArrayObject args = c->ArrayOfFour(c->Int32(pUPD->iPos), c->Int32(pUPD->iDelta), idFrom2rexxArg(c, lParam), hw... [truncated message content] |
From: <jfa...@us...> - 2010-06-05 14:35:32
|
Revision: 5990 http://oorexx.svn.sourceforge.net/oorexx/?rev=5990&view=rev Author: jfaucher Date: 2010-06-05 14:35:24 +0000 (Sat, 05 Jun 2010) Log Message: ----------- merge 5957-5988 from main/trunk Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/Menu.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBarControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodResourceIDs.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodResources.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodRoutines.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUser.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp sandbox/jlf/trunk/interpreter/classes/StackFrameClass.hpp sandbox/jlf/trunk/interpreter/execution/RexxActivation.cpp sandbox/jlf/trunk/interpreter/platform/windows/FileSystem.cpp sandbox/jlf/trunk/platform/windows/install/oorexx.nsi sandbox/jlf/trunk/samples/windows/oodialog/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/calculator.rex sandbox/jlf/trunk/samples/windows/oodialog/controls/upDown.rex sandbox/jlf/trunk/samples/windows/oodialog/dlgAreaUDemo.rex sandbox/jlf/trunk/samples/windows/oodialog/examples/publicRoutines_demo.rex sandbox/jlf/trunk/samples/windows/oodialog/ooRexxTry/ooRexxTry.rex sandbox/jlf/trunk/samples/windows/oodialog/oobandit.rex sandbox/jlf/trunk/samples/windows/oodialog/oodlist.rex sandbox/jlf/trunk/samples/windows/oodialog/oodpbar.rex sandbox/jlf/trunk/samples/windows/oodialog/oodraw.rex sandbox/jlf/trunk/samples/windows/oodialog/oodtree.rex sandbox/jlf/trunk/samples/windows/oodialog/oophil.rex sandbox/jlf/trunk/samples/windows/oodialog/oowalk2.rex sandbox/jlf/trunk/samples/windows/oodialog/oowalker.rex sandbox/jlf/trunk/samples/windows/oodialog/rc/oophil1.rc sandbox/jlf/trunk/samples/windows/oodialog/simple/ReadMe.txt sandbox/jlf/trunk/samples/windows/oodialog/tutorial/drawing1.rex sandbox/jlf/trunk/samples/windows/oodialog/tutorial/drawing2.rex sandbox/jlf/trunk/samples/windows/oodialog/tutorial/emp_mend.rex sandbox/jlf/trunk/samples/windows/oodialog/tutorial/emp_menu.rex sandbox/jlf/trunk/samples/windows/oodialog/tutorial/employe5.rex sandbox/jlf/trunk/samples/windows/oodialog/tutorial/employe6.rex sandbox/jlf/trunk/samples/windows/oodialog/tutorial/employe7.rex sandbox/jlf/trunk/samples/windows/oodialog/tutorial/employe8.rex sandbox/jlf/trunk/samples/windows/oodialog/tutorial/employe9.rex sandbox/jlf/trunk/samples/windows/oodialog/tutorial/textscrl.rex Added Paths: ----------- sandbox/jlf/trunk/samples/windows/oodialog/ooDraw.h sandbox/jlf/trunk/samples/windows/oodialog/simple/ChangeFont.rex Property Changed: ---------------- sandbox/jlf/trunk/ sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/rxsock/mime.cls sandbox/jlf/trunk/extensions/rxsock/smtp.cls sandbox/jlf/trunk/extensions/rxsock/streamsocket.cls Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/_diary.txt 2010-06-05 14:35:24 UTC (rev 5990) @@ -213,3 +213,4 @@ rev 5812 merge 5812-5835 from main/trunk merge 5835-5957 from main/trunk +merge 5957-5988 from main/trunk \ No newline at end of file Property changes on: sandbox/jlf/trunk ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk:5812-5957 + /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk:5812-5988 Modified: sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp =================================================================== --- sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/hostemu/cmdparse.cpp 2010-06-05 14:35:24 UTC (rev 5990) @@ -19,7 +19,7 @@ static int yygrowstack(void); #define YYPREFIX "yy" -#line 2 "./extensions/hostemu/cmdparse.y" +#line 2 "cmdparse.ypp" /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 2009-2010 Rexx Language Association. All rights reserved. */ @@ -90,13 +90,13 @@ char * token); /* token string */ -#line 73 "./extensions/hostemu/cmdparse.y" +#line 73 "cmdparse.ypp" typedef union { int numval; char * strval; } YYSTYPE; -#line 100 "./extensions/hostemu/cmdparse.cpp" +#line 100 "cmdparse.cpp" #define EXECIO 257 #define HI 258 #define TE 259 @@ -273,7 +273,7 @@ static short *yysslim; static YYSTYPE *yyvs; static int yystacksize; -#line 211 "./extensions/hostemu/cmdparse.y" +#line 211 "cmdparse.ypp" /*--------------------------------------------------------------------*/ @@ -447,7 +447,7 @@ return true; } -#line 451 "./extensions/hostemu/cmdparse.cpp" +#line 451 "cmdparse.cpp" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ static int yygrowstack(void) { @@ -629,7 +629,7 @@ switch (yyn) { case 1: -#line 96 "./extensions/hostemu/cmdparse.y" +#line 96 "cmdparse.ypp" { lStmtType = EXECIO_STMT; ExecIO_Options.lStartRcd = 1; @@ -641,7 +641,7 @@ } break; case 2: -#line 106 "./extensions/hostemu/cmdparse.y" +#line 106 "cmdparse.ypp" { lStmtType = EXECIO_STMT; ExecIO_Options.lStartRcd = 1; @@ -649,39 +649,39 @@ } break; case 3: -#line 112 "./extensions/hostemu/cmdparse.y" +#line 112 "cmdparse.ypp" { lStmtType = HI_STMT; } break; case 4: -#line 116 "./extensions/hostemu/cmdparse.y" +#line 116 "cmdparse.ypp" { lStmtType = TE_STMT; } break; case 5: -#line 120 "./extensions/hostemu/cmdparse.y" +#line 120 "cmdparse.ypp" { lStmtType = TS_STMT; } break; case 6: -#line 126 "./extensions/hostemu/cmdparse.y" +#line 126 "cmdparse.ypp" { ExecIO_Options.fRW = true; strcpy (ExecIO_Options.aFilename, yyvsp[-1].strval); } break; case 7: -#line 131 "./extensions/hostemu/cmdparse.y" +#line 131 "cmdparse.ypp" { ExecIO_Options.fRW = false; strcpy (ExecIO_Options.aFilename, yyvsp[-1].strval); } break; case 8: -#line 136 "./extensions/hostemu/cmdparse.y" +#line 136 "cmdparse.ypp" { ExecIO_Options.fRW = false; strcpy (ExecIO_Options.aFilename, yyvsp[-2].strval); @@ -693,78 +693,78 @@ } break; case 11: -#line 152 "./extensions/hostemu/cmdparse.y" +#line 152 "cmdparse.ypp" { ExecIO_Options.fFinis = true; } break; case 12: -#line 156 "./extensions/hostemu/cmdparse.y" +#line 156 "cmdparse.ypp" { ExecIO_Options.fFinis = false; } break; case 13: -#line 160 "./extensions/hostemu/cmdparse.y" +#line 160 "cmdparse.ypp" { ExecIO_Options.fFinis = true; ExecIO_Options.lDirection = 1; } break; case 14: -#line 165 "./extensions/hostemu/cmdparse.y" +#line 165 "cmdparse.ypp" { ExecIO_Options.fFinis = true; ExecIO_Options.lDirection = 2; } break; case 15: -#line 170 "./extensions/hostemu/cmdparse.y" +#line 170 "cmdparse.ypp" { strcpy (ExecIO_Options.aStem, yyvsp[0].strval); } break; case 16: -#line 174 "./extensions/hostemu/cmdparse.y" +#line 174 "cmdparse.ypp" { strcpy (ExecIO_Options.aStem, yyvsp[-1].strval); ExecIO_Options.fFinis = true; } break; case 17: -#line 179 "./extensions/hostemu/cmdparse.y" +#line 179 "cmdparse.ypp" { strcpy (ExecIO_Options.aStem, yyvsp[0].strval); ExecIO_Options.fFinis = true; } break; case 21: -#line 191 "./extensions/hostemu/cmdparse.y" +#line 191 "cmdparse.ypp" { ExecIO_Options.fFinis = true; } break; case 22: -#line 195 "./extensions/hostemu/cmdparse.y" +#line 195 "cmdparse.ypp" { strcpy (ExecIO_Options.aStem, yyvsp[0].strval); } break; case 23: -#line 199 "./extensions/hostemu/cmdparse.y" +#line 199 "cmdparse.ypp" { strcpy (ExecIO_Options.aStem, yyvsp[-1].strval); ExecIO_Options.fFinis = true; } break; case 24: -#line 204 "./extensions/hostemu/cmdparse.y" +#line 204 "cmdparse.ypp" { strcpy (ExecIO_Options.aStem, yyvsp[0].strval); ExecIO_Options.fFinis = true; } break; -#line 768 "./extensions/hostemu/cmdparse.cpp" +#line 768 "cmdparse.cpp" } yyssp -= yym; yystate = *yyssp; Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-06-05 14:35:24 UTC (rev 5990) @@ -111,6 +111,8 @@ /** * Message * + * The number of active dialogs has reached the maximum (20) allowed + * * Raises 88.900 * * @param c Thread context we are executing in. @@ -124,12 +126,13 @@ /** * Argument 'argument' 'message' * - * Argument 2 message + * Argument 2 must be a whole number greater than 100; actual 100.5 * * Raises 88.900 * - * @param c Thread context we are executing in. - * @param msg "Some message" + * @param *c Thread context we are executing in. + * @param pos Argument position. + * @param msg "Some message" */ void userDefinedMsgException(RexxThreadContext *c, int pos, CSTRING msg) { @@ -139,6 +142,38 @@ } /** + * Message + * + * The 'methodName' argument must be less than 256 characters + * + * Raises 93.900 + * + * @param c Method context we are executing in. + * @param msg "Some message" + */ +void userDefinedMsgException(RexxMethodContext *c, CSTRING msg) +{ + c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(msg)); +} + +/** + * Method argument 'argument' 'message' + * + * Method argument 2 is not a handle + * + * Raises 93.900 + * + * @param c Method context we are executing in. + * @param msg "Some message" + */ +void userDefinedMsgException(RexxMethodContext *c, size_t pos, CSTRING msg) +{ + rxcharA buffer[256]; + _snprintf(buffer, sizeof(buffer), "Method argument %d %s", pos, msg); + userDefinedMsgException(c, buffer); +} + +/** * Argument 'argument' must be of the 'class' class * * Argument 4 must be of the ImageList class @@ -429,6 +464,11 @@ c->RaiseException2(Rexx_Error_Invalid_argument_nonnegative, c->StringSize(pos), actual); } +void notPositiveException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual) +{ + c->RaiseException2(Rexx_Error_Invalid_argument_positive, c->StringSize(pos), actual); +} + RexxObjectPtr wrongRangeException(RexxThreadContext *c, size_t pos, int min, int max, RexxObjectPtr actual) { c->RaiseException(Rexx_Error_Invalid_argument_range, Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2010-06-05 14:35:24 UTC (rev 5990) @@ -59,10 +59,13 @@ extern void outOfMemoryException(RexxThreadContext *c); extern void userDefinedMsgException(RexxThreadContext *c, CSTRING msg); extern void userDefinedMsgException(RexxThreadContext *c, int pos, CSTRING msg); +extern void userDefinedMsgException(RexxMethodContext *c, CSTRING msg); +extern void userDefinedMsgException(RexxMethodContext *c, size_t pos, CSTRING msg); extern void invalidImageException(RexxThreadContext *c, int pos, CSTRING type, CSTRING actual); extern void stringTooLongException(RexxThreadContext *c, int pos, size_t len, size_t realLen); extern void numberTooSmallException(RexxThreadContext *c, int pos, int min, RexxObjectPtr actual); extern void notNonNegativeException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual); +extern void notPositiveException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual); extern void wrongObjInArrayException(RexxThreadContext *c, size_t argPos, size_t index, CSTRING obj); extern void wrongObjInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index, CSTRING needed, RexxObjectPtr actual); extern void executionErrorException(RexxThreadContext *c, CSTRING msg); Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -126,7 +126,7 @@ else spos.y = spos.y + move.y end - if self~parentDlg~finished = 1 then return 1 + if self~parentDlg~finished then return 1 if (reset.x + reset.y) > 0 then do if reset.x = 1 then do @@ -147,11 +147,11 @@ if self~hittop = 1 then spos.y = spos.bottom - ss.y end end - if self~parentDlg~finished = 1 then return 1 + if self~parentDlg~finished then return 1 self~parentDlg~ChangeBitmapButton(sprite.buttonid, 0) /* self~parentDlg~ClearRect(spritewin, oldpos.x, oldpos.y, (oldpos.x + sprite.sizex), (oldpos.y + sprite.sizey)) */ end - if self~parentDlg~finished = 1 then return 1 + if self~parentDlg~finished then return 1 self~parentDlg~setBitmapPosition(sprite.buttonid, spos.x, spos.y); @@ -159,7 +159,7 @@ expose spritewin spos. sprite. use arg new.x, new.y - if self~parentDlg~finished = 1 then return 1 + if self~parentDlg~finished then return 1 self~parentDlg~ChangeBitmapButton(sprite.buttonid, 0) self~parentDlg~ClearRect(spritewin, spos.x, spos.y, (spos.x + sprite.sizex), (spos.y + sprite.sizey)) spos.x = new.x @@ -182,7 +182,7 @@ do actsprite = sprite.from by sprite.step to sprite.to if (sprite.movex \= 0) | (sprite.movey \=0) then self~movepos(sprite.movex, sprite.movey) - if self~parentDlg~finished = 1 then return 1 + if self~parentDlg~finished then return 1 self~parentDlg~ChangeBitmapButton(sprite.buttonid, actsprite,,,,opts) if (sprite.delay \= 0) then ret = msSleep(sprite.delay) end @@ -193,7 +193,7 @@ if (sprite.movex \= 0) | (sprite.movey \=0) then self~movepos(sprite.movex, sprite.movey) - if self~parentDlg~finished = 1 then return 1 + if self~parentDlg~finished then return 1 self~parentDlg~ChangeBitmapButton(sprite.buttonid, actsprite,,,,opts) if (sprite.delay \= 0) then ret = msSleep(sprite.delay) end @@ -225,12 +225,12 @@ ::method run unguarded - do until(self~stopped = 1) | (self~ParentStopped) | self~parentDlg~finished = 1 + do until(self~stopped = 1) | (self~parentStopped) | self~parentDlg~finished self~moveseq end return 0 -::method Parentstopped +::method parentStopped return self~parentDlg~finished ::method stop Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/anibuttn.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/anibuttn.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls:5812-5988 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -63,41 +63,43 @@ ::method initWindowExtensions external "LIBRARY oodialog winex_initWindowExtensions" ::method setFont unguarded external "LIBRARY oodialog winex_setFont" ::method getFont unguarded external "LIBRARY oodialog winex_getFont" + +-- createFont() has always been broken, maintained for program compatibility. +-- createFontEx() is a correct implementation. +::method createFont unguarded external "LIBRARY oodialog winex_createFont" +::method createFontEx unguarded external "LIBRARY oodialog winex_createFontEx" +::method deleteFont unguarded external "LIBRARY oodialog winex_deleteObject" + +::method scroll unguarded external "LIBRARY oodialog winex_scroll" ::method hScrollPos unguarded external "LIBRARY oodialog winex_getScrollPos" ::method setHScrollPos unguarded external "LIBRARY oodialog winex_setScrollPos" ::method vScrollPos unguarded external "LIBRARY oodialog winex_getScrollPos" ::method setVScrollPos unguarded external "LIBRARY oodialog winex_setScrollPos" -::method scroll unguarded external "LIBRARY oodialog winex_scroll" --- createFont() has always been broken, maintained for program compatibility. --- createFontEx() is a correct implementation. -::method createFont unguarded external "LIBRARY oodialog winex_createFont" -::method createFontEx unguarded external "LIBRARY oodialog winex_createFontEx" -::method writeDirect unguarded external "LIBRARY oodialog winex_writeDirect" ::method loadBitmap unguarded external "LIBRARY oodialog winex_loadBitmap" ::method removeBitmap unguarded external "LIBRARY oodialog winex_removeBitmap" -::method getDC unguarded external "LIBRARY oodialog winex_getDC" -::method freeDC unguarded external "LIBRARY oodialog winex_freeDC" +::method setCursorPos unguarded external "LIBRARY oodialog winex_setCursorPos" +::method getCursorPos unguarded external "LIBRARY oodialog winex_getCursorPos" +::method restoreCursorShape unguarded external "LIBRARY oodialog winex_restoreCursorShape" ::method cursor_Arrow unguarded external "LIBRARY oodialog winex_setCursorShape" ::method cursor_AppStarting unguarded external "LIBRARY oodialog winex_setCursorShape" ::method cursor_Cross unguarded external "LIBRARY oodialog winex_setCursorShape" ::method cursor_No unguarded external "LIBRARY oodialog winex_setCursorShape" ::method cursor_Wait unguarded external "LIBRARY oodialog winex_setCursorShape" -::method setCursorPos unguarded external "LIBRARY oodialog winex_setCursorPos" -::method getCursorPos unguarded external "LIBRARY oodialog winex_getCursorPos" -::method restoreCursorShape unguarded external "LIBRARY oodialog winex_restoreCursorShape" ::method cursorPos unguarded -- old method, returns a string forward message "getCursorPos" continue return result~x result~y ::method write unguarded external "LIBRARY oodialog winex_write" -::method deleteFont unguarded external "LIBRARY oodialog winex_deleteObject" +::method writeDirect unguarded external "LIBRARY oodialog winex_writeDirect" +::method createBrush unguarded external "LIBRARY oodialog winex_createBrush" +::method createPen unguarded external "LIBRARY oodialog winex_createPen" ::method deleteObject unguarded external "LIBRARY oodialog winex_deleteObject" -::method createBrush unguarded external "LIBRARY oodialog winex_createBrush" -::method CreatePen unguarded external "LIBRARY oodialog winex_createPen" +::method getDC unguarded external "LIBRARY oodialog winex_getDC" +::method freeDC unguarded external "LIBRARY oodialog winex_freeDC" ::method objectToDC unguarded external "LIBRARY oodialog winex_objectToDC" ::method fontToDC unguarded use strict arg dc, hFont @@ -111,7 +113,7 @@ ::method drawArc unguarded external "LIBRARY oodialog winex_drawArcOrPie" ::method drawPie unguarded external "LIBRARY oodialog winex_drawArcOrPie" ::method drawAngleArc unguarded external "LIBRARY oodialog winex_drawAngleArc" -::method FontColor unguarded external "LIBRARY oodialog winex_fontColor" +::method fontColor unguarded external "LIBRARY oodialog winex_fontColor" ::method transparentText unguarded external "LIBRARY oodialog winex_textBkMode" ::method opaqueText unguarded external "LIBRARY oodialog winex_textBkMode" ::method setArcDirection unguarded external "LIBRARY oodialog winex_getSetArcDirection" Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/basedlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/BaseDialog.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/basedlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/BaseDialog.cls:5812-5988 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/catdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/catdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls:5812-5988 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/msgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/msgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls:5812-5988 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -102,6 +102,7 @@ forward to (self~oDlg) ::method captureMouse external "LIBRARY oodialog dlgctrl_captureMouse" +::method connectKeyEvent unguarded external "LIBRARY oodialog dlgctrl_connectKeyEvent" ::method connectFKeyPress unguarded external "LIBRARY oodialog dlgctrl_connectFKeyPress" ::method connectKeyPress unguarded external "LIBRARY oodialog dlgctrl_connectKeyPress" ::method disconnectKeyPress unguarded external "LIBRARY oodialog dlgctrl_disconnectKeyPress" Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/advctrl.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogControls.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/advctrl.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogControls.cls:5812-5988 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2009 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2005-2010 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 */ @@ -44,15 +44,15 @@ ::class 'DialogExtensions' public mixinclass Object --- Execute with asynchronous message dispatching. +-- Like execute(), but does not wait for the dialog to close. ::method executeAsync unguarded - use strict arg sleepTime = 10, sh = "NORMAL", icon = 0, modeless = .false + use strict arg sleepTime = 1, sh = "NORMAL", icon = 0, modeless = .false if self~startIt(icon, modeless) \= 0 then do if self~useStem then self~setDataStem(self~dlgData) else self~setData self~show(sh) - self~start("asyncMessageHandling", sleepTime) + do while self~automaticMethods~Items > 0 p = self~automaticMethods~pull m = self~automaticMethods~pull @@ -62,66 +62,43 @@ end return 0 end - else self~stopit - return 1 + else do + self~finished = .true + self~stopit + return 1 + end --- End the asynchronous execution of the dialog. +-- Used to wait for a dialog started through executeAsync() to end. ::method endAsyncExecution unguarded - do while self~finished = 0 - call msSleep 20 - end + + self~run + if self~initCode = 1 then do if self~useStem then self~getDataStem(self~dlgData) self~getData end - if self~adm \= 0 then self~stopit + self~stopit return self~initCode --- Documented "internal use only" in 3.2.0 - Do not document. -::method asyncMessageHandling unguarded - use strict arg sleepTime = 10 - if \ sleepTime~datatype('W') then sleepTime = 10 - - do while self~finished = 0 & self~adm \= 0 - msg = self~getDlgMsg - if msg~pos("1DLGDELETED1") > 0 then do - if self~finished = 0 then self~finished = 2 - end - else do - if msg \= "" then do - parse var msg methodName '(' args ')' - argList = args~space(0)~makeArray(255~d2c) - self~sendWith(methodName, argList) - end - else do - call msSleep sleepTime - end - end - end - -- Run a modeless dialog ::method popup - use strict arg sh = "NORMAL", sleepTime = 10, icon = 0 - if \ sleepTime~datatype('W') then sleepTime = 10 + use strict arg sh = "NORMAL", sleepTime = 1, icon = 0 self~start("execute", sh, icon, sleeptime, .true) +-- Run a modeless dialog that will be automatically closed when its parent closes. ::method popupAsChild - use strict arg parent, sh = "NORMAL", sleepTime = 10, icon = 0 + use strict arg parent, sh = "NORMAL", sleepTime = 1, icon = 0 if \ parent~isA(.PlainBaseDialog) then do call errorDialog "Specified parent is not a dialog!" return -1 end - if \ sleepTime~datatype('W') then sleepTime = 10 parent~childDialogs~insert(self) /* add to the parents child list (last item) */ self~parentDlg = parent self~start("execute", sh, icon, sleeptime, .true) -::method peekDialogMessage unguarded - return self~getDlgMsg(.true) - ::method setSBRange unguarded use strict arg id, min, max, redraw = .true sb = self~newScrollBar(id) @@ -239,7 +216,26 @@ use arg hwnd return .Window~new(hwnd)~redraw --- DEPRECATED +-- DEPRECATED START +::method peekDialogMessage unguarded + return "" +::method dump + say "dump() deprecated." +::method clearButtonRect unguarded + forward message 'CLEARCONTROLRECT' +::method redrawButton unguarded + forward message 'REDRAWCONTROL' +::method setItemFont unguarded + forward message 'setControlFont' +::method setItemColor + forward message "setControlColor" +::method setItemSysColor + forward message "setControlSysColor" +::method connectAnimatedButton + forward message "INSTALLANIMATEDBUTTON" +::method connectBitmapButton + forward message "INSTALLBITMAPBUTTON" + ::method getWindowRect unguarded -- Old method returns coordinates as a string. forward message "windowRect" continue rect = result @@ -251,12 +247,6 @@ if \ rect~isA(.Rect) then return 1 -- mimic old behavior return rect~left rect~top rect~right rect~bottom -::method clearButtonRect unguarded - forward message 'CLEARCONTROLRECT' - -::method redrawButton unguarded - forward message 'REDRAWCONTROL' - ::method moveItem unguarded -- old method, this is not accurate use strict arg id, xPos, yPos, showOptions = "" p = .Point~new(trunc(xPos * self~factorX), trunc(yPos * self~factorY)) @@ -267,16 +257,7 @@ s = .Size~new(trunc(width * self~factorX), trunc(height * self~factorY)) return self~resizeControl(id, s, showOptions) -::method setItemFont unguarded - forward message 'setControlFont' - -::method setItemColor - forward message "setControlColor" - -::method setItemSysColor - forward message "setControlSysColor" - -::method combineELwithSB -- Use UpDown control +::method combineELwithSB -- Use UpDown control, this method works very poorly use strict arg elid, sbID, step = 0, poscode = 0 sb = self~newScrollBar(sbID) if sb == .nil then return -1 @@ -312,12 +293,6 @@ /******************************************************************************/ /* Bitmap extensions */ --- DEPRECATED TODO don't forget to document name change / deprecated -::method connectAnimatedButton - forward message "INSTALLANIMATEDBUTTON" -::method connectBitmapButton - forward message "INSTALLBITMAPBUTTON" - ::method installBitmapButton external "LIBRARY oodialog dlgext_installBitmapButton" ::method changeBitmapButton unguarded external "LIBRARY oodialog dlgext_changeBitmapButton" ::method getBitmapPosition unguarded external "LIBRARY oodialog dlgext_getBitmapPosition" @@ -543,62 +518,6 @@ ::method isMouseButtonDown external "LIBRARY oodialog dlgext_isMouseButtonDown" -::method dumpAdmin external "LIBRARY oodialog dlgext_dumpAdmin_pvt" -::method dump - use strict arg adm = "" - if arg() == 1 then do - say "Dump of current dialog administration" - say "=====================================" - self~dumpAdmin(ADMDUMP., adm) - say "Slot: " admdump.Slot - say "hThread: " admdump.hThread - say "hDialog: " admdump.hDialog - say "TopMost: " admdump.TopMost - say "CurrentChild:" admdump.CurrentChild - say "DLL: " admdump.Dll - say "Queue: " admdump.queue - say "BmpButtons: " admdump.BmpButtons - do i = 1 to admdump.BmpButtons - say " " admdump.BmpTab.i.id "->" admdump.BmpTab.i.normal "," admdump.BmpTab.i.focused "," admdump.BmpTab.i.selected "," admdump.BmpTab.i.disabled - end - say "Messages: " admdump.Messages - do i = 1 to admdump.Messages - say " " admdump.MsgTab.i.msg "," admdump.MsgTab.i.param1 "," admdump.MsgTab.i.param2 "==>" admdump.MsgTab.i.method - end - say "DataItems: " admdump.DataItems - do i = 1 to admdump.DataItems - say " " admdump.DataTab.i.id "("admdump.DataTab.i.type","admdump.DataTab.i.category")" - end - say "ColorItems: " admdump.ColorItems - do i = 1 to admdump.ColorItems - say " " admdump.ColorTab.i.id "(" admdump.ColorTab.i.Foreground "," admdump.ColorTab.i.Background ")" - end - end - else do - say "Dump of administration state" - say "============================" - self~dumpAdmin(ADMDUMP.) - d = Digits() - NUMERIC DIGITS 15 - do i = 1 to admdump.0 - say "AdmBlock: " admdump.i.AdmBlock - say "Slot: " admdump.i.Slot - say "hThread: " admdump.i.hThread - say "hDialog: " admdump.i.hDialog - if admdump.i.hDialog \=0 then say "Window title:" self~WindowTitle(admdump.i.hDialog) - say "TopMost: " admdump.i.TopMost - say "CurrentChild:" admdump.i.CurrentChild - say "DLL: " admdump.i.Dll - say "Queue: " admdump.i.queue - say "BmpButtons: " admdump.i.BmpButtons - say "Messages: " admdump.i.Messages - say "DataItems: " admdump.i.DataItems - say "ColorItems: " admdump.i.ColorItems - say "--------------------------" - end - NUMERIC DIGITS d - end - /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ These menu bar methods are needed to provide backward compatibility for the deprecated menu methods. The Rexx programmer is *strongly* discouraged from Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dlgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dlgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls:5812-5988 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -404,9 +404,7 @@ self~initDialog return self~dlgHandle -::method stopDynamic private external "LIBRARY oodialog dyndlg_stopDynamic_pvt" - -- This method creates a dialog from a resource script file (usually with extension of '.rc'.) -- It calls loadFrame() and loadItems() The argument 'loadOptions' can be one or more of:e -- "CENTER" : this will create the dialog on a centered position @@ -748,7 +746,7 @@ end end /* do while */ f~close - self~ProcessingLoad = 0 + self~processingLoad = 0 return 0 ::method getRCStyle private Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dyndlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dyndlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls:5812-5988 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/Menu.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/Menu.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/Menu.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -163,16 +163,37 @@ /* class: SystemMenu - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ A system menu class. System menus are also known as window or control - menus. They are the menu that appears when clicking on the icon in the - upper left corner of a window. + menus. It is the menu that appears when clicking on the icon in the upper + left corner of a window. \* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ ::class 'SystemMenu' public subclass Object inherit Menu ResourceUtils +::constant WM_SYSCOMMAND "0x0112" + +-- Use decimal value to allow comparison in event handlers. +::constant SC_SIZE 61440 +::constant SC_MOVE 61456 +::constant SC_MINIMIZE 61472 +::constant SC_MAXIMIZE 61488 +::constant SC_NEXTWINDOW 61504 +::constant SC_PREVWINDOW 61520 +::constant SC_CLOSE 61536 +::constant SC_VSCROLL 61552 +::constant SC_HSCROLL 61568 +::constant SC_MOUSEMENU 61584 +::constant SC_KEYMENU 61696 +::constant SC_ARRANGE 61712 +::constant SC_RESTORE 61728 +::constant SC_TASKLIST 61744 +::constant SC_SCREENSAVE 61760 +::constant SC_HOTKEY 61776 +::constant SC_DEFAULT 61792 +::constant SC_MONITORPOWER 61808 +::constant SC_CONTEXTHELP 61824 +::constant SC_SEPARATOR 61455 + ::method init external "LIBRARY oodialog sysMenu_init" ::method revert external "LIBRARY oodialog sysMenu_revert" -::method connectCommandEvent external "LIBRARY oodialog sysMenu_connectCommandEvent" -::method connectAllCommandEvents external "LIBRARY oodialog sysMenu_connectAllCommandEvents" -::method connectSomeCommandEvents external "LIBRARY oodialog sysMenu_connectSomeCommandEvents" /* class: BinaryMenuBar- - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ @@ -205,9 +226,10 @@ /* class: MenuTemplate - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\ A mix in class supplying the funtionality to create a menu template in - memory. + memory. This a private, internal use only, class. The methods are doc- + umented as part of the UserMenuBar, the class itself is not documented. \* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ -::class 'MenuTemplate' public mixinclass ResourceUtils +::class 'MenuTemplate' private mixinclass ResourceUtils ::method addPopup external "LIBRARY oodialog menuTemplate_addPopup" ::method addItem external "LIBRARY oodialog menuTemplate_addItem" Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -78,13 +78,13 @@ ::method sendMessageHandle unguarded external "LIBRARY oodialog wb_sendMessage" -- These shortcut methods are for internal use, do not document. -::method sendWinIntMsg unguarded external "LIBRARY oodialog wb_sendWinIntMsg" -::method sendWinIntMsgH unguarded external "LIBRARY oodialog wb_sendWinIntMsg" -::method sendWinUintMsg unguarded external "LIBRARY oodialog wb_sendWinUintMsg" -::method sendWinHandleMsg unguarded external "LIBRARY oodialog wb_sendWinHandleMsg" -::method sendWinHandleMsgH unguarded external "LIBRARY oodialog wb_sendWinHandleMsg" -::method sendWinHandle2Msg unguarded external "LIBRARY oodialog wb_sendWinHandle2Msg" -::method sendWinHandle2MsgH unguarded external "LIBRARY oodialog wb_sendWinHandle2Msg" +::method sendWinIntMsg unguarded external "LIBRARY oodialog wb_sendWinIntMsg" -- Internal use do not document +::method sendWinIntMsgH unguarded external "LIBRARY oodialog wb_sendWinIntMsg" -- Internal use do not document +::method sendWinUintMsg unguarded external "LIBRARY oodialog wb_sendWinUintMsg" -- Internal use do not document +::method sendWinHandleMsg unguarded external "LIBRARY oodialog wb_sendWinHandleMsg" -- Internal use do not document +::method sendWinHandleMsgH unguarded external "LIBRARY oodialog wb_sendWinHandleMsg" -- Internal use do not document +::method sendWinHandle2Msg unguarded external "LIBRARY oodialog wb_sendWinHandle2Msg" -- Internal use do not document +::method sendWinHandle2MsgH unguarded external "LIBRARY oodialog wb_sendWinHandle2Msg" -- Internal use do not document ::method enable unguarded external "LIBRARY oodialog wb_enable" ::method disable unguarded external "LIBRARY oodialog wb_enable" @@ -102,8 +102,7 @@ ::method redrawClient unguarded external "LIBRARY oodialog wb_redrawClient" ::method redraw unguarded external "LIBRARY oodialog wb_redraw" --- Not intending to document getWindowLong, at this point -::method getWindowLong private unguarded external "LIBRARY oodialog wb_getWindowLong_pvt" +::method getWindowLong private unguarded external "LIBRARY oodialog wb_getWindowLong_pvt" -- Not intending to document getWindowLong, at this point ::method getID unguarded return self~getWindowLong(-12) @@ -182,13 +181,11 @@ use arg msgname call errorDialog msgname || " is not a method of " || self --- DEPRECATED -::method getSystemMetrics unguarded +::method getSystemMetrics unguarded -- DEPRECATED use strict arg index return .DlgUtil~getSystemMetrics(index) --- DEPRECATED -::method assignWindow +::method assignWindow -- DEPRECATED return 0 @@ -332,9 +329,6 @@ ::method getFontSize class external "LIBRARY oodialog pbdlg_getFontSize_cls" ::method new class external "LIBRARY oodialog pbdlg_new_cls" --- External adminstration buffer. Get can not be private for now see MenuBar::attachTo() -::attribute adm get - -- Automatic data field detection on/off ::attribute autoDetect get external "LIBRARY oodialog pbdlg_getAutoDetect" ::attribute autoDetect set external "LIBRARY oodialog pbdlg_setAutoDetect" @@ -343,8 +337,11 @@ ::attribute dataConnection private -- store connections between ids and class attributes ::attribute useStem private -- flag whether to use a stem to set/get data or not -::attribute finished -- finsished state of dialog, not a logical, can be 0, 1, or 2 +-- finsished is now a boolean, when set to .true, the dialog ends. Older ooDialog set it +-- to 2 on an abnormal termination of the underlying dialog. This is no longer done. +::attribute finished + ::method dlgData private expose dlgData. return dlgData. @@ -371,16 +368,14 @@ ::method initDialog unguarded private return 0 --- Dispatches window messages until the dialog is terminated. +-- Needs a comment? Was documented. ::method run unguarded private - use strict arg sleepTime = 1 - if \ sleepTime~datatype('W') then sleepTime = 1 + expose finished + guard on when finished - do while self~finished = 0 - self~handleMessages(sleepTime) - end - -- Creates the dialog, shows it, and destroys it. Dialog "data" is set and received. +-- The sleepTime arg is ignored. This arg was never documented, but people might have +-- used it anyway, so it is left in the arg list. ::method execute unguarded expose dlgData. use strict arg sh = "NORMAL", icon = 0, sleepTime = 1, modeless = .false @@ -398,61 +393,27 @@ o~start(m) end - self~run(sleepTime) + self~run if self~initCode = 1 then do if self~useStem then self~getDataStem(dlgData.) self~getData end - if self~adm \= 0 then self~stopIt + self~stopIt return self~initCode end else do + self~finished = .true self~stopIt + return 0 end - return 0 --- Note: handleMessages() and clearMessages() were two methods that were previously marked protected. --- My believe is that there was some confusion in the original developement that led to methods being --- marked protected when they were meant to be marked private. However, changing these 2 methods to --- private: 1.) breaks an existing example 2.) the doc on clearMessages() would lead one to think that --- it is a public method. So, the methods are changed to public rather than private. +-- Not to be doumented. +::method ensureFinished unguarded + expose finished + self~initCode = 3 + finished = .true --- Retrieve and dispatch, if available, one window message. -::method handleMessages unguarded - use strict arg sleepTime = 1 - if self~adm = 0 then do - self~finished = 2 - return - end - - msg = self~getDlgMsg - if msg~pos("1DLGDELETED1") > 0 then do - if self~finished = 0 then self~finished = 2 - end - else do - if msg \= "" then do - parse var msg methodName '(' args ')' - argList = args~makeArray(255~d2c) - self~sendWith(methodName, argList) - end - else do - call msSleep sleepTime - end - end - --- Clear all pending window messages -::method clearMessages unguarded - if self~adm = 0 then return - msg = self~getDlgMsg - do while msg \= "" & self~adm \= 0 - if msg~pos("1DLGDELETED1") > 0 then do - if self~finished = 0 then self~finished = 2 - end - msg = self~getDlgMsg - end - -::method getDlgMsg external "LIBRARY oodialog pbdlg_getDlgMsg" ::method isDialogActive unguarded external "LIBRARY oodialog pbdlg_isDialogActive" -- Documented "internal use only" in 3.2.0 - Do not document. @@ -463,7 +424,7 @@ -- If we ourselves are a child dialog and not called by the parent's stopIt(), then -- remove ourself from the parent dialog's child list. (Child dialogs are independent -- and the user could close them at any time.) - if self~parentDlg \= .nil & caller \= "PARENT" then self~parentDlg~ChildDied(self) + if self~parentDlg \= .nil & caller \= "PARENT" then self~parentDlg~childDied(self) -- If we have child dialogs, then stop all of them. Child dialogs are always started -- through popupAsChild() and are always closed when the parent closes. @@ -874,24 +835,37 @@ ::method hasMenuBar return self~menuBar \== .nil & self~isLinked - /* The following methods are abstract methods that will be called */ - /* whenever the push buttons 1, 2, or 9 will be pressed */ - /* Method 'OK' will call method 'Validate' */ - /* If self~finished = 1 the dialog is destroyed, if 0 the dialog */ - /* execution will be continued */ - /* OK returns 1 if the dialog is going to be destroyed */ + /* + * The following methods are the default implementations of event handlers + * for the IDOK (resource ID 1,) IDCANCEL (resource ID 2,) and IDHELP + * (resource ID 9) push buttons. The methods are intended to be over-ridden + * if the programmer needs to alter the behavior. + * + * Note that as soon as self~finished is set to true, the dialog is + * terminated. As long as self~finished is false, the dialog continues + * to run. + */ + /** ok() + * This method first invokes the validate() method. If validate returns + * true, self~initCode is set to 1 and self~finished is set to true, + * terminating the dialog. + * + * If validate returns false, the dialog continues to run. + */ ::method ok unguarded - self~finished = self~validate - self~initCode = 1 - return self~finished + okayToClose = self~validate - /* If self~finished = 1 the dialog is destroyed, if 0 the dialog */ - /* execution will be continued */ + if okayToClose then do + self~initCode = 1 + self~finished = .true + end + return self~finished + ::method cancel unguarded - self~finished = 1 - if self~finished = 1 then self~initCode = 2 + self~initCode = 2 + self~finished = .true return self~finished ::method help unguarded @@ -903,8 +877,8 @@ /** validate() * This method is an abstract method that will be called to determin whether the * dialog can be closed or not. This function will be called by method OK. If - * the return value is 1 the dialog can be closed, if it is 0 the dialog - * values are invalid. + * the return value is true the dialog can be closed, if it is false the dialog + * should not be closed. */ ::method validate unguarded return .true @@ -930,9 +904,22 @@ -- DEPRECATED (to end of file) +::method clearMessages unguarded + ::method deInstall return 0 +-- There is no longer a message queue. TODO this was documented, do we need to +-- keep a sleep here? +::method handleMessages unguarded + j = SysSleep(.010) + +-- adm was never documented and should just be removed, but it would have been +-- needed in the dump() method which was documented. (Even though the +-- documentation never explained where a 'dialogadmin' block would come from.) +::attribute adm get + return 0 + ::method connectEntryLine unguarded forward message 'connectEdit' ::method connectMultiListBox unguarded Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/plbdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/plbdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls:5812-5988 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -119,8 +119,6 @@ ::method initDialog protected - /* this is to correct a redraw problem of a focused list view control that gets reactivated */ - self~addUserMsg(PropSheetActivated, "0x00000006", "0xFFFFFFFF") /* WM_ACTIVATE */ tc = self~newTab(9001, 0) if tc \= .nil then do @@ -143,17 +141,6 @@ self~showWindow(self~catalog['handles'][self~catalog['category']]) - /* this is to correct a redraw problem of a focused list view control. If the list control has the focus, - was overlapped by another window and is activated, the list is overlapped by the tab control */ -::method propSheetActivated - use arg wP, lp - if arg() = 0 then code = 0 - else code = .DlgUtil~loWord(wp) - if code \= 0 then do - self~update - .Window~new(self~catalog['handles'][self~catalog['category']])~update - end - ::method getSelectedPage unguarded return self~newTab(9001, 0)~selectedIndex+1 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/propsht.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/propsht.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls:5812-5988 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -65,7 +65,7 @@ icon = self~resolveIconID(icon) if \ modeless~datatype('O') then modeless = .false - if self~startDialog(library, resource, self~autoDetect, icon, modeless) then do + if self~startDialog(library, resource, icon, modeless) then do -- if autodetection is on, create the data attributes if self~autoDetect then do ids = self~getDataTableIDs Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/resdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/ResDialog.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/resdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/ResDialog.cls:5812-5988 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -51,10 +51,7 @@ ::method init external "LIBRARY oodialog userdlg_init" --- Documented "internal use only" in 3.2.0 - Do not document. -::method stopIt - forward class (super) continue - forward message "stopDynamic" +::method test external "LIBRARY oodialog userdlg_test" -- DEPRECATED menu bar methods. Use the Menu classes directly. ::method setMenu Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/userdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UserDialog.cls:5812-5957 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/userdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UserDialog.cls:5812-5988 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls 2010-06-05 02:44:04 UTC (rev 5989) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls 2010-06-05 14:35:24 UTC (rev 5990) @@ -67,6 +67,7 @@ ::method screenArea class external "LIBRARY oodialog dlgutil_screenArea_cls" ::method getSystemMetrics class external "LIBRARY oodialog dlgutil_getSystemMetrics_cls" ::method handleToPointer class external "LIBRARY oodialog dlgutil_handleToPointer_cls" +::method threadID class external "LIBRARY oodialog dlgutil_threadID_cls" ::method test class external "LIBRARY oodialog dlgutil_test_cls" @@ -273,6 +274,7 @@ if sleeping >= 0 then do if earlyReply then reply ret = msSleep(sleeping) + self~finished = .true self~stopit end @@ -605,6 +607,7 @@ return "" +-- Never documented and does not work well. Could be usefull if fixed. ::class 'StateIndicator' subclass UserDialog public ::method Xext attribute @@ -627,7 +630,7 @@ ::method initAutoDetection self~noAutoDetection -::method CalcSize +::method calcSize size = self~getTextSizeDu(self~msg) scrSize = screenSize() self~dims["sx"] = size~width @@ -650,19 +653,20 @@ self~dims["x"] = trunc((scrSize[1]-self~dims["cx"]) /2) self~dims["y"] = trunc((scrSize[2] - self~dims["cy"] - 20) /2) -::method Popup - self~CalcSize +::method popUp + self~calcSize self~create(self~dims["x"],self~dims["y"], self~dims["cx"], self~dims["cy"], self~TitleTxt,"NOMENU",,,1 ) self~startIt self~show("SHOWTOP") -::method Destroy - self~stopit +::method destroy + self~finished = .true + self~stopIt ::method "Message=" parse arg message self~msg = message - self~CalcSize + self~calcSize self~ResizeItem(100, self~dims["sx"]+2, self~dims["sy"]) if self~XExt = 0 then do self~Resize(self~dims["cx"], self~dims["cy"], "HIDE") @@ -675,6 +679,7 @@ if self~XExt = 0 then self~Move(self~dims["x"], self~dims["y"], "NORM... [truncated message content] |
From: <jfa...@us...> - 2010-07-03 23:29:22
|
Revision: 6053 http://oorexx.svn.sourceforge.net/oorexx/?rev=6053&view=rev Author: jfaucher Date: 2010-07-03 23:29:15 +0000 (Sat, 03 Jul 2010) Log Message: ----------- Fix a crash in GC (markObjectsMain) : a string popped from liveStack has a corrupted behaviour's vtable because of a DeadObject::insertAfter made on this string. If I'm not wrong, the problem comes from RexxSource::extractSource where the result array ("source") is not protected. In my case, a collect occurred while iterating over the lines put in the array. Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/interpreter/parser/SourceFile.cpp Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-06-27 20:20:22 UTC (rev 6052) +++ sandbox/jlf/_diary.txt 2010-07-03 23:29:15 UTC (rev 6053) @@ -31,6 +31,135 @@ =============================================================================== +2010 july 3 + +Debug crash in gc +RexxMemory::markObjectsMain + markObject->live(liveMark); + +0x003d2b8c --> this is 0x7eee1ac0->behaviour +Access violation reading location 0x44414550 --> this is the vfptr of the behaviour of a string + +((*(RexxVirtualBase*)(&(*(RexxInternalObject*)(&*markObject))))).__vfptr + + +RexxMemory::mark(RexxObject *markObject) + pushLiveStack((RexxObject *)markObject->behaviour); +markObject = 0x7eee1ac0 --> see below, this is the 30th element of string array + [RexxString] + if tmp<2 then -- start at first char + +called by RexxArray::live(size_t liveMark) ArrayClass.cpp +where this = 0x7f30ed70 +this->objects = 7f30ed98 +arrayPtr=7f30ee0c +0x7f30ee0c - 0x7f30ed98 = 116 = 29 * 4 --> this is the 30th element + +element 1 to 13 : not a string... but doesn't be a problem ++ (*(RexxString*)this->get(14)).stringData 0x7eee36a4 " len1=length(arg1string) -- get length of string" char [4] ++ (*(RexxString*)this->get(15)).stringData 0x7eee3704 " newArr=.array~new -- create new array for the arguments" char [4] ++ (*(RexxString*)this->get(16)).stringData 0x7eee376c " newArr[1]=new1string -- "new"-string" char [4] ++ (*(RexxString*)this->get(18)).stringData 0x7eee37e4 " prepend="" -- optional prepend string (if positioning before start!)" char [4] ++ (*(RexxString*)this->get(20)).stringData 0x7eee388c " arg2startori=arg2start -- save passed-in value, if any" char [4] ++ (*(RexxString*)this->get(21)).stringData 0x7eee38f4 " if arg4pad=="" then arg4pad=" "-- define blank as the default pad char" char [4] ++ (*(RexxString*)this->get(23)).stringData 0x7eee398c " if arg(3,"Exists") then -- start in "target"-string" char [4] ++ (*(RexxString*)this->get(24)).stringData 0x7eee2dfc " do" char [4] ++ (*(RexxString*)this->get(25)).stringData 0x7eee2e2c " if datatype(arg2start,"W") then" char [4] ++ (*(RexxString*)this->get(26)).stringData 0x7eee2e7c " do" char [4] ++ (*(RexxString*)this->get(27)).stringData 0x7eee2eac " if arg2start<0 then -- negative, start from right" char [4] ++ (*(RexxString*)this->get(28)).stringData 0x7eee2f14 " do" char [4] ++ (*(RexxString*)this->get(29)).stringData 0x7eee2f44 " tmp=len1+arg2start+1 -- get starting position" char [4] ++ (*(RexxString*)this->get(30)).stringData 0x7eee1ae4 " if tmp<2 then -- start at first char" char [4] ++ (*(RexxString*)this->get(31)).stringData 0x7eee1b44 " do" char [4] ++ (*(RexxString*)this->get(32)).stringData 0x7eee1b7c " if tmp<0 then" char [4] + +The behaviour of the 30th element is broken : ++ ((*(RexxVirtualBase*)(&(*(RexxInternalObject*)(&*(((*(RexxInternalObject*)(&*(this->get(28))))).behaviour)))))).__vfptr 0x003aa62c const RexxBehaviour::`vftable' * ++ ((*(RexxVirtualBase*)(&(*(RexxInternalObject*)(&*(((*(RexxInternalObject*)(&*(this->get(29))))).behaviour)))))).__vfptr 0x003aa62c const RexxBehaviour::`vftable' * ++ ((*(RexxVirtualBase*)(&(*(RexxInternalObject*)(&*(((*(RexxInternalObject*)(&*(this->get(30))))).behaviour)))))).__vfptr 0x44414548 * ++ ((*(RexxVirtualBase*)(&(*(RexxInternalObject*)(&*(((*(RexxInternalObject*)(&*(this->get(31))))).behaviour)))))).__vfptr 0x003aa62c const RexxBehaviour::`vftable' * ++ ((*(RexxVirtualBase*)(&(*(RexxInternalObject*)(&*(((*(RexxInternalObject*)(&*(this->get(32))))).behaviour)))))).__vfptr 0x003aa62c const RexxBehaviour::`vftable' * + +the behaviour of 30th element is stored at 0x7eee1acc + + +called by RexxMemory::markObjectsMain(RexxObject *rootObject) +where rootObject = ++ rootObject 0x003d2a90 class RexxMemory memoryObject {markWord=1 markReason=1 variableCache=0x7f5b55a8 ...} RexxObject * + +called by RexxMemory::markObjects() + +called by RexxMemory::collect() + +objectclass.hpp +inline void setBehaviour(RexxBehaviour *b) { behaviour = b; } <-- this method is called to assign the behavior of type 22 (T_String) +> rexx.dll!RexxInternalObject::setBehaviour(RexxBehaviour * b) Line 265 + 0x10 bytes C++ + rexx.dll!RexxObject::initializeNewObject(unsigned int mark, void * vft, RexxBehaviour * b) Line 362 C++ + rexx.dll!RexxMemory::newObject(unsigned int requestLength, unsigned int type) Line 1134 C++ + rexx.dll!new_object(unsigned int s, unsigned int t) Line 422 + 0x1e bytes C++ + rexx.dll!RexxString::newString(const char * string, unsigned int length) Line 1894 + 0xd bytes C++ + rexx.dll!new_string(const char * s, unsigned int l) Line 521 C++ + rexx.dll!RexxSource::get(unsigned int _position) Line 838 + 0x1d bytes C++ + rexx.dll!RexxSource::extractSource(SourceLocation & location) Line 1119 + 0x10 bytes C++ <-- counter = 735 + rexx.dll!RexxCode::getSource() Line 199 C++ + rexx.dll!BaseExecutable::source() Line 149 C++ + rexx.dll!CPPCode::run(RexxActivity * activity, RexxMethod * method, RexxObject * receiver, RexxString * messageName, RexxObject * * argPtr, unsigned int count, ProtectedObject & result) Line 144 + 0x6 bytes C++ + rexx.dll!RexxMethod::run(RexxActivity * activity, RexxObject * receiver, RexxString * msgname, RexxObject * * argPtr, unsigned int count, ProtectedObject & result) Line 325 C++ + rexx.dll!RexxObject::messageSend(RexxString * msgname, RexxObject * * arguments, unsigned int count, ProtectedObject & result) Line 793 C++ + rexx.dll!RexxExpressionStack::send(RexxString * message, unsigned int count, ProtectedObject & result) Line 74 + 0x33 bytes C++ + rexx.dll!RexxExpressionMessage::evaluate(RexxActivation * context, RexxExpressionStack * stack) Line 139 C++ + rexx.dll!RexxExpressionMessage::evaluate(RexxActivation * context, RexxExpressionStack * stack) Line 123 + 0x23 bytes C++ + rexx.dll!RexxInstructionAssignment::execute(RexxActivation * context, RexxExpressionStack * stack) Line 122 + 0x1d bytes C++ + rexx.dll!RexxActivation::run(RexxObject * _receiver, RexxString * msgname, RexxObject * * _arglist, unsigned int _argcount, RexxInstruction * start, ProtectedObject & resultObj) Line 522 C++ + rexx.dll!RexxCode::call(RexxActivity * activity, RoutineClass * routine, RexxString * msgname, RexxObject * * argPtr, unsigned int argcount, RexxString * calltype, RexxString * environment, int context, ProtectedObject & result) Line 116 C++ + rexx.dll!RexxCode::call(RexxActivity * activity, RoutineClass * routine, RexxString * msgname, RexxObject * * argPtr, unsigned int argcount, ProtectedObject & result) Line 92 C++ + rexx.dll!RoutineClass::call(RexxActivity * activity, RexxString * msgname, RexxObject * * argPtr, unsigned int argcount, ProtectedObject & result) Line 234 C++ + rexx.dll!InterpreterInstance::runRequires(RexxActivity * activity, RexxString * name, RoutineClass * code) Line 877 C++ + rexx.dll!InterpreterInstance::loadRequires(RexxActivity * activity, RexxString * shortName, RexxString * fullName) Line 932 C++ + rexx.dll!RexxSource::loadRequires(RexxActivity * activity, RexxString * target) Line 6082 + 0x14 bytes C++ + rexx.dll!PackageClass::loadPackage(RexxString * name, RexxArray * s) Line 366 + 0x16 bytes C++ <-- rgf_util2.rex + + +The previous behaviour is overwritten by +inline void insertAfter(DeadObject *newDead) DeadObject.hpp +where newDead = 7eee1ac0 + rexx.dll!DeadObject::insertAfter(DeadObject * newDead) Line 89 C++ + rexx.dll!DeadObjectPool::add(DeadObject * obj) Line 165 C++ +> rexx.dll!NormalSegmentSet::addDeadObject(char * object, unsigned int length) Line 461 C++ + rexx.dll!MemorySegmentSet::sweep() Line 1170 C++ + rexx.dll!RexxMemory::collect() Line 1038 C++ + rexx.dll!NormalSegmentSet::handleAllocationFailure(unsigned int allocationLength) Line 1272 C++ + rexx.dll!RexxMemory::newObject(unsigned int requestLength, unsigned int type) Line 1117 + 0x12 bytes C++ <-- length = 48, we are in "small object" part (lesser than LargeBlockThreshold 4096) + rexx.dll!new_object(unsigned int s, unsigned int t) Line 422 + 0x1e bytes C++ + rexx.dll!RexxString::newString(const char * string, unsigned int length) Line 1894 + 0xd bytes C++ + rexx.dll!new_string(const char * s, unsigned int l) Line 521 C++ + rexx.dll!new_string(const char * s, unsigned int l) Line 521 C++ + rexx.dll!RexxSource::get(unsigned int _position) Line 838 + 0x1d bytes C++ + rexx.dll!RexxSource::extractSource(SourceLocation & location) Line 1119 + 0x10 bytes C++ <-- counter = 754 + rexx.dll!RexxCode::getSource() Line 199 C++ + rexx.dll!BaseExecutable::source() Line 149 C++ + rexx.dll!CPPCode::run(RexxActivity * activity, RexxMethod * method, RexxObject * receiver, RexxString * messageName, RexxObject * * argPtr, unsigned int count, ProtectedObject & result) Line 144 + 0x6 bytes C++ + rexx.dll!RexxMethod::run(RexxActivity * activity, RexxObject * receiver, RexxString * msgname, RexxObject * * argPtr, unsigned int count, ProtectedObject & result) Line 325 C++ + rexx.dll!RexxObject::messageSend(RexxString * msgname, RexxObject * * arguments, unsigned int count, ProtectedObject & result) Line 793 C++ + rexx.dll!RexxExpressionStack::send(RexxString * message, unsigned int count, ProtectedObject & result) Line 74 + 0x33 bytes C++ + rexx.dll!RexxExpressionMessage::evaluate(RexxActivation * context, RexxExpressionStack * stack) Line 139 C++ + rexx.dll!RexxExpressionMessage::evaluate(RexxActivation * context, RexxExpressionStack * stack) Line 123 + 0x23 bytes C++ + rexx.dll!RexxInstructionAssignment::execute(RexxActivation * context, RexxExpressionStack * stack) Line 122 + 0x1d bytes C++ + rexx.dll!RexxActivation::run(RexxObject * _receiver, RexxString * msgname, RexxObject * * _arglist, unsigned int _argcount, RexxInstruction * start, ProtectedObject & resultObj) Line 522 C++ + rexx.dll!RexxCode::call(RexxActivity * activity, RoutineClass * routine, RexxString * msgname, RexxObject * * argPtr, unsigned int argcount, RexxString * calltype, RexxString * environment, int context, ProtectedObject & result) Line 116 C++ + rexx.dll!RexxCode::call(RexxActivity * activity, RoutineClass * routine, RexxString * msgname, RexxObject * * argPtr, unsigned int argcount, ProtectedObject & result) Line 92 C++ + rexx.dll!RoutineClass::call(RexxActivity * activity, RexxString * msgname, RexxObject * * argPtr, unsigned int argcount, ProtectedObject & result) Line 234 C++ + rexx.dll!InterpreterInstance::runRequires(RexxActivity * activity, RexxString * name, RoutineClass * code) Line 877 C++ + rexx.dll!InterpreterInstance::loadRequires(RexxActivity * activity, RexxString * shortName, RexxString * fullName) Line 932 C++ + rexx.dll!RexxSource::loadRequires(RexxActivity * activity, RexxString * target) Line 6082 + 0x14 bytes C++ + rexx.dll!PackageClass::loadPackage(RexxString * name, RexxArray * s) Line 366 + 0x16 bytes C++ <-- rgf_util2.rex + while loading rgf_util2.rex + +Why is 0x7eee1ac0 a dead object ? +In RexxSource::extractSource, the array "source" is created, but is not a ProtectedObject. + + +=============================================================================== 2010 may 15 Fix build under Windows for dbgprintf (link error). Modified: sandbox/jlf/trunk/interpreter/parser/SourceFile.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/parser/SourceFile.cpp 2010-06-27 20:20:22 UTC (rev 6052) +++ sandbox/jlf/trunk/interpreter/parser/SourceFile.cpp 2010-07-03 23:29:15 UTC (rev 6053) @@ -1087,6 +1087,7 @@ } /* get the result array */ RexxArray *source = new_array(location.getEndLine() - location.getLineNumber() + 1); + ProtectedObject p(source); /* all on one line? */ if (location.getLineNumber() == location.getEndLine()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-07-03 23:45:24
|
Revision: 6054 http://oorexx.svn.sourceforge.net/oorexx/?rev=6054&view=rev Author: jfaucher Date: 2010-07-03 23:45:17 +0000 (Sat, 03 Jul 2010) Log Message: ----------- _readme.odt : more notes about Unicode support (Falcon review). oodtree.rex : report changes from trunk. ooRexxTry : modified to work with wide char oodialog (use utf8 encoding, Arial Unicode MS). Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/unicode/_readme.odt sandbox/jlf/unicode/ooRexx/oodtree.rex Added Paths: ----------- sandbox/jlf/unicode/ooRexx/ooRexxTry-demo.png sandbox/jlf/unicode/ooRexx/ooRexxTry-demo.txt sandbox/jlf/unicode/ooRexx/ooRexxTry.rex Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-07-03 23:29:15 UTC (rev 6053) +++ sandbox/jlf/_diary.txt 2010-07-03 23:45:17 UTC (rev 6054) @@ -33,6 +33,15 @@ =============================================================================== 2010 july 3 +Continue Unicode review : added notes about Falcon. + +Adapted ooRexxTry to use utf8 encoding and Arial Unicode MS. +Preloads all the main components (math, ftp, socket, bsf, hostemu, ...). + + +=============================================================================== +2010 july 3 + Debug crash in gc RexxMemory::markObjectsMain markObject->live(liveMark); Modified: sandbox/jlf/unicode/_readme.odt =================================================================== (Binary files differ) Added: sandbox/jlf/unicode/ooRexx/ooRexxTry-demo.png =================================================================== (Binary files differ) Property changes on: sandbox/jlf/unicode/ooRexx/ooRexxTry-demo.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: sandbox/jlf/unicode/ooRexx/ooRexxTry-demo.txt =================================================================== --- sandbox/jlf/unicode/ooRexx/ooRexxTry-demo.txt (rev 0) +++ sandbox/jlf/unicode/ooRexx/ooRexxTry-demo.txt 2010-07-03 23:45:17 UTC (rev 6054) @@ -0,0 +1,37 @@ +say "===== hostemu =====" +address hostemu 'execio * diskr "test unicode output.txt" (finis stem in.' +do i =1 to in.0 +say in.i +end +say "===== hostemu =====" + +say +say "Immer Ärger mit übergroßen Öffis!"~parseWords2(.rgf.alpha || "ÄäÖöÜüß", "W") +"Immer Ärger mit übergroßen Öffis!"~parseWords2(.rgf.alpha || "ÄäÖöÜüß", "W")~dump2 +say + +say "# English: The quick brown fox jumps over the lazy dog." +say "# Jamaican: Chruu, a kwik di kwik brong fox a jomp huova di liezi daag de, yu no siit?" +say "# Dutch: Pa's wijze lynx bezag vroom het fikse aquaduct." +say "# German: Falsches Üben von Xylophonmusik quält jeden größeren Zwerg. (1)" +say "# German: Im finſteren Jagdſchloß am offenen Felsquellwaſſer patzte der affig-flatterhafte kauzig-höfliche Bäcker über ſeinem verſifften kniffligen C-Xylophon. (2)" +say "# Swedish: Flygande bäckasiner söka strax hwila på mjuka tuvor." +say "# Icelandic: Sævör grét áðan því úlpan var ónýt." +say "# Polish: Pchnąć w tę łódź jeża lub ośm skrzyń fig." +say "# Czech: Příliš žluťoučký kůň úpěl ďábelské kódy." +say "# Slovak: Starý kôň na hŕbe kníh žuje tíško povädnuté ruže, na stĺpe sa ďateľ učí kvákať novú ódu o živote." +say "# Greek (monotonic): ξεσκεπάζω την ψυχοφθόρα βδελυγμία" +say "# Greek (polytonic): ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία" +say "# Russian: Съешь же ещё этих мягких французских булок да выпей чаю." +say "# Russian: В чащах юга жил-был цитрус? Да, но фальшивый экземпляр! ёъ." +say "# Bulgarian: Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон." +say "# Sami (Northern): Vuol Ruoŧa geđggiid leat máŋga luosa ja čuovžža." +say "# Hungarian: Árvíztűrő tükörfúrógép." +say "# Spanish: El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y frío, añoraba a su querido cachorro." +say "# Portuguese: O próximo vôo à noite sobre o Atlântico, põe freqüentemente o único médico." +say "# French: Les naïfs ægithales hâtifs pondant à Noël où il gèle sont sûrs d'être déçus et de voir leurs drôles d'œufs abîmés." +say "# Esperanto: Eĥoŝanĝo ĉiuĵaŭde." +say "# Hebrew: זה כיף סתם לשמוע איך תנצח קרפד עץ טוב בגן." +say "# Japanese (Hiragana): あさきゆめみじ ゑひもせず" +say "あさきゆめみじ ゑひもせず"~mapchar('return arg(1)~c2x" "') +return "あさきゆめみじ ゑひもせず"~left(7) -- todo : utf8 not (yet) supported : return 7 bytes, not 7 characters, and this is displayed as 2 graphemes Property changes on: sandbox/jlf/unicode/ooRexx/ooRexxTry-demo.txt ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/unicode/ooRexx/ooRexxTry.rex =================================================================== --- sandbox/jlf/unicode/ooRexx/ooRexxTry.rex (rev 0) +++ sandbox/jlf/unicode/ooRexx/ooRexxTry.rex 2010-07-03 23:45:17 UTC (rev 6054) @@ -0,0 +1,1068 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2007-2009 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. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/* oorexxtry.rex */ +/* +What: 21st Century version of Rexxtry +Who: Lee Peedin +See documentation for version control + +10/04/07 Extended fileNameDialog mask for open (*.*) +10/05/07 Added charout method to sayCatcher class + Added lineout method to sayCatcher class + +10/15/07 Directives now work - return values aren't captured +10/16/07 Added header to copy all + +11/29/07 Modified ~getText for occasions when lines should not be stripped. + Place in the incubator + +04/19/09 Removed deprecated createFont() and replaced it with createFontEx(). +04/19/09 Enhanced the menu to use check marks for font name, size, and silent. +*/ + + parse arg isDefault + .local~useDefault = .false + if isDefault~translate = 'DEFAULT' then + .local~useDefault = .true + + -- To investigate : if I change the code page to 65001 from the "Code" area then at the next + -- run, some characters like russian or japanese are not displayed correctly. + -- At the second run, everything is ok... + -- By setting the code page here, I'm sure it works always. + call setCodePage 65001 -- UTF-8 + + call LoadEnvironment -- Set up the environment to work with + .platform~initialize + call LoadOptionalComponents + code = .oort_dialog~new() -- Create the dialog + if code~initCode \= 0 then + do + call errorDialog 'Error creating code dialog. initCode:' code~initCode + exit + end + say + say "This console will receive the output of your system commands." + say "Try 'dir' for example." + say + code~Execute('ShowTop') -- Execute the dialog + code~DeInstall -- Finished, so deInstall +exit + +------------------------------------------------------------------------------- +-- Load optional packages/libraries +-- Remember : don't implement that as a procedure or routine or method ! +LoadOptionalComponents: + if .platform~is("windows") then do + call loadPackage("oodialog.cls") + call loadPackage("winsystm.cls") + end + call loadLibrary("hostemu") + call loadPackage("mime.cls") + call loadPackage("rxftp.cls") + call loadLibrary("rxmath") + call loadPackage("rxregexp.cls") + call loadPackage("smtp.cls") + call loadPackage("socket.cls") + call loadPackage("streamsocket.cls") + call loadPackage("BSF.CLS") + call loadPackage("UNO.CLS") + call loadPackage("rgf_util2.rex") -- http://wi.wu.ac.at/rgf/rexx/orx20/rgf_util2.rex + call loadPackage("../../samples/extension/functional.rex") + call loadPackage("../../samples/rgf_util2/wrappers.rex") + return + + +------------------------------------------------------------------------------- +-- Remember : don't implement that as a procedure or routine or method ! +loadPackage: + use strict arg filename + signal on syntax name loadPackageError + .context~package~loadPackage(filename) + return .true + loadPackageError: + return .false + + +------------------------------------------------------------------------------- +-- Remember : don't implement that as a procedure or routine or method ! +loadLibrary: + use strict arg filename + signal on syntax name loadLibraryError + return .context~package~loadLibrary(filename) + loadLibraryError: + return .false + + +------------------------------------------------------------------------------- +::requires "ooDialog.cls" -- Needed for the dialog +::requires 'winsystm.cls' -- Needed for the Windows clipboard + +::class oort_dialog subclass userdialog +::method Init + self~init:super + rc = self~Create(.dx,.dy,.dwidth,.dheight,.title,'ThickFrame MinimizeBox MaximizeBox') + self~InitCode = (rc=0) + self~connectResize('OnResize') + self~fontMenuHelper + +::method DefineDialog + expose u + u = .dlgAreaU~new(self) + if .nil \= u~lastError then + call errorDialog u~lastError + +---------- Arguments title & dialog area + at = .dlgArea~new(0,0,u~w,10) + self~addText(at~x,at~y,at~w,at~h,'Arguments','CENTER',17) + ad = .dlgArea~new(0,at~y + 10,u~w,u~h('15%')) + self~addEntryLine(12,'args_data',ad~x,ad~y,ad~w,ad~h,'multiline hscroll vscroll') + +---------- Code title & dialog area + ct = .dlgArea~new(0,ad~y + ad~h,u~w,10) + self~addText(ct~x,ct~y,ct~w,ct~h,'Code','CENTER',18) + cd = .dlgArea~new(0,ct~y + ct~h,u~w,u~h('40%')) + self~addEntryLine(13,'code_data',cd~x,cd~y,cd~w,cd~h,'multiline hscroll vscroll') + +---------- Says title & dialog area + st = .dlgArea~new(0,cd~y + cd~h,u~w('50%'),10) + self~addText(st~x,st~y,st~w,st~h,'Says','CENTER',19) + sd = .dlgArea~new(0,st~y + st~h,u~w('50%'),u~h('43%')) + self~addEntryLine(14,'say_data',sd~x,sd~y,sd~w,sd~h,'notab readonly multiline hscroll vscroll') + +---------- Returns title & dialog area + rt = .dlgArea~new(sd~x + sd~w,cd~y + cd~h,u~w('50%'),10) + self~addText(rt~x,rt~y,rt~w,rt~h,'Returns','CENTER',20) + rd = .dlgArea~new(rt~x,st~y + st~h,u~w('50%'),u~h('15%')) + self~addEntryLine(15,'results_data',rd~x,rd~y,rd~w,rd~h,'notab readonly multiline hscroll vscroll') + +---------- Errors/Information title & dialog area + et = .dlgArea~new(rt~x,rd~y + rd~h,u~w('50%'),10) + self~addText(et~x,et~y,et~w,et~h,'Errors / Information','CENTER',21) + ed = .dlgArea~new(rt~x,et~y + et~h,u~w('50%'),u~h('17%')) + self~addEntryLine(16,'error_data',ed~x,ed~y,ed~w,ed~h,'notab readonly multiline hscroll vscroll') + +---------- Run & Exit buttons for easier execution + self~AddButton(80,ed~x ,ed~y + ed~h + 2,35,10,'&Run','RunIt') + self~AddButton(81,ed~x + 40,ed~y + ed~h + 2,35,10,'E&xit','Cancel') + +---------- + self~createMenu + self~AddPopupMenu('&File') + self~addMenuItem('&Run' ,22, ,'RunIt') + self~addMenuItem('&SaveAs',23, ,'FileDialog') + self~addMenuItem('&Open' ,25, ,'FileDialog') + self~addMenuItem('E&xit' ,24,'END','Cancel') + + self~addPopUpMenu('&Edit') + self~addPopupMenu('Font&Name') + self~addMenuItem('&Arial Unicode MS',30, ,'onFontMenuClick') + self~addMenuItem('&Lucida Console',31, ,'onFontMenuClick') + self~addMenuItem('&Courier New' ,32,'END','onFontMenuClick') + self~addMenuSeparator + self~addPopUpMenu('Font&Size','END') + self~addMenuItem('&8' ,40, ,'onFontMenuClick') + self~addMenuItem('1&0',41, ,'onFontMenuClick') + self~addMenuItem('1&2',42, ,'onFontMenuClick') + self~addMenuItem('1&4',43, ,'onFontMenuClick') + self~addMenuItem('1&6',44, ,'onFontMenuClick') + self~addMenuItem('1&8',45,'END','onFontMenuClick') + + self~AddPopUpMenu('&Tools') + self~addPopupMenu('&Copy') + self~addMenuItem('&Args' ,50, ,'Clipboard') + self~addMenuItem('&Code' ,51, ,'Clipboard') + self~addMenuItem('&Says' ,52, ,'ClipBoard') + self~addMenuItem('&Returns',53, ,'ClipBoard') + self~addMenuItem('&Errors' ,54, ,'ClipBoard') + self~addMenuItem('A&ll' ,55,'END','ClipBoard') + self~addMenuSeparator + self~addPopupMenu('C&lear') + self~addMenuItem('&Args' ,60, ,'ClearAll') + self~addMenuItem('&Code' ,61, ,'ClearAll') + self~addMenuItem('&Says' ,62, ,'ClearAll') + self~addMenuItem('&Returns',63, ,'ClearAll') + self~addMenuItem('&Errors' ,64, ,'ClearAll') + self~addMenuItem('A&ll' ,65,'END','ClearAll') + self~addMenuSeparator + self~addPopupMenu('&Silent') + self~addMenuItem('&No' ,66, ,'Silent') + self~addMenuItem('&Yes' ,67,'END','Silent') + self~addMenuSeparator + self~addPopupMenu('Sa&ve Settings','END') + self~addMenuItem('Sa&ve' ,72,'END','SaveSettings') + self~addPopupMenu('&Help','END') + self~addMenuItem('Current &Settings',71, ,'Settings') + self~addMenuItem('&About' ,70,'END','Help') + +::method InitDialog + expose args_input code_input result_input say_input errors_input + -- Use font data from .ini file or defaults if .ini not present yet + + -- FW_EXTRALIGHT == 200 + d = .Directory~new + d~weight = 200 + hfont = self~createFontEx(.fontname,.fontsize,d) + self~setMenu + + -- Set the font and silent menu item check marks. + self~setFontMenuChecks + if .silent then self~checkMenuItem(67) + else self~checkMenuItem(66) + + -- Get the controls for all dialog elements that will need to be adjusted + args_input = self~newEdit(12) + code_input = self~newEdit(13) + say_input = self~newEdit(14) + result_input = self~newEdit(15) + errors_input = self~newEdit(16) + args_title = self~newStatic(17) + code_title = self~newStatic(18) + say_title = self~newStatic(19) + result_title = self~newStatic(20) + errors_title = self~newStatic(21) + + -- Set the color of the titles + args_title ~setColor(5,10) + code_title ~setColor(16,10) + say_title ~setColor(15,0) + result_title~setColor(14,0) + errors_title~setColor(13,10) + + -- Set the font name/size to the default values + self~ReDraw + + if \.useDefault then + do + -- Read oorexxtry.ini position & size the dialog based on its values + handle = self~getSelf + k1 = SysIni('oorexxtry.ini','oorexxtry','k1') + k2 = SysIni('oorexxtry.ini','oorexxtry','k2') + k3 = SysIni('oorexxtry.ini','oorexxtry','k3') + k4 = SysIni('oorexxtry.ini','oorexxtry','k4') + if k1 = 'ERROR:' | k2 = 'ERROR:' | k3 = 'ERROR:' | k4 = 'ERROR:' then + nop -- First exection will not find the ini file + else + do + self~setWindowRect(handle,k1,k2,k3-k1,k4-k2) + self~ensureVisible + end + end + +-- Run menu option +::method RunIt + expose args_input code_input result_input say_input errors_input + parse value code_input~getPos() with siX siY + parse value code_input~getSize() with siW siH + ch1 = code_input~Cursor_Wait + parse value self~CursorPos with preCX preCY + code_input~SetCursorPos((siX+(siW/2))*self~FactorX,(siY+(siH/2))*self~FactorY) + arg_array = self~getText(args_input,.true) + .local~si = say_input + w1 = code_input~selected~word(1) + w2 = code_input~selected~word(2) + code_array = self~getText(code_input,.true) + if (w1 = .max_length & w2 = .max_length) | (w1 = w2) then + nop -- we've already loaded our code_array + else + do + code_string = code_array~makeString + code_array = code_string~substr(w1,w2-w1)~makearray + end + + -- Clear any previous error data + self~error_data = '' + errors_input~title = self~error_data + + -- Clear any previous say data + self~say_data = '' + say_input~title = self~say_data + + -- Clear any previous returns data + self~results_data = '' + result_input~title = self~results_data + + .local~emsg = '' + .local~imsg = '' + + self~error_data = 'Code Is Executing' + errors_input~title = self~error_data + + .local~Error? = .false + .local~badarg = '' + -- Interpret each argument so that expressions can be used + signal on syntax name ArgSyntax + do i = 1 to arg_array~items + .local~badarg = i arg_array[i] + interpret 'arg_array['i'] =' arg_array[i] + end + signal off syntax + + -- Run the code in a dynamically created method + + found_cc = .false + do ca = 1 to code_array~items + a_ca = code_array[ca]~strip() + if a_ca~pos('::') = 1 then + do + found_cc = .true + leave ca + end + end + + if \found_cc then + do + exec = .executor~new('oorexxtry.code',code_array) + exec~run(arg_array) + end + else + do + tempFile = '.\ooRexxTry_test9999.rex' + c_stream = .stream~new(tempFile) + c_stream~open('Write Replace') + do ca = 1 to code_array~items + c_stream~lineout(code_array[ca]) + end + c_stream~close + arg_string = '' + do ca = 1 to arg_array~items + arg_ca = '"'arg_array[ca]'"' + arg_string = arg_string','arg_ca + end + arg_string = arg_string~strip('b',',') + exec = .executor~new('oorexxtry.code','call ooRexxTry_test9999.rex' arg_string) + exec~run(arg_array) + rv = SysFileDelete(tempFile) + end + + if .emsg \= '' then + do + if \.silent then + call beep 600,100 + self~error_data = .emsg + errors_input~title = self~error_data + self~results_data = '' + result_input~title = self~results_data + end + else + do + self~error_data = 'Code Execution Complete' + errors_input~title = self~error_data + end + + if .nil \= .run_results['returns'] then + do + self~results_data = .run_results['returns'] + result_input~title = self~results_data + end + if \.silent then -- Let the user know when code execution is complete + call beep 150,150 + code_input~RestoreCursorShape(ch1) + self~SetCursorPos(preCX,preCY) + self~ReturnFocus +return + +ArgSyntax: + msg = 'Trapped In'~right(11)'..: ArgSyntax' + obj = condition('o') + msg = msg||.endOfLine||'Message'~right(11)'..:' obj['MESSAGE'] + msg = msg||.endOfLine||'ErrorText'~right(11)'..:' obj['ERRORTEXT'] + msg = msg||.endOfLine||'Code'~right(11)'..:' obj['CODE'] + msg = msg||.endOfLine||('Argument' .badarg~word(1))~right(11)'..:' .badarg~subword(2) + .local~emsg = msg + if \.silent then + call beep 600,100 + self~error_data = .emsg + errors_input~title = self~error_data + self~results_data = '' + result_input~title = self~results_data + .local~emsg = '' + self~focusItem(12) + args_input~select(1,1) + code_input~RestoreCursorShape(ch1) + self~SetCursorPos(preCX,preCY) +return + +::method Cancel + handle = self~getSelf + sp = self~getWindowRect(handle) + -- Write out the size,position,fontname,fontsize, & silent to the .ini file + if \self~isMinimized & \self~isMaximized then + do + rv = SysIni('oorexxtry.ini','oorexxtry','k1',sp~word(1)) + rv = SysIni('oorexxtry.ini','oorexxtry','k2',sp~word(2)) + rv = SysIni('oorexxtry.ini','oorexxtry','k3',sp~word(3)) + rv = SysIni('oorexxtry.ini','oorexxtry','k4',sp~word(4)) + end + rv = SysIni('oorexxtry.ini','oorexxtry','fn',.fontname) + rv = SysIni('oorexxtry.ini','oorexxtry','fs',.fontsize) + rv = SysIni('oorexxtry.ini','oorexxtry','sl',.silent) +return self~ok:super + +-- Clipboard menu option +::method ClipBoard + expose args_input errors_input code_input say_input result_input + use arg msg, args + cp = .WindowsClipBoard~new + select + when msg = 50 then + do + cp_array = self~getText(args_input,.false) + cp_string = cp_array~makestring + cp~Copy(cp_string) + .local~imsg = 'Arguments Are On ClipBoard' + end + when msg = 51 then + do + cp_array = self~getText(code_input,.false) + cp_string = cp_array~makestring + cp~Copy(cp_string) + .local~imsg = 'Code Is On ClipBoard' + end + when msg = 52 then + do + cp_array = self~getText(say_input,.false) + cp_string = cp_array~makestring + cp~Copy(cp_string) + .local~imsg = 'Says Are On The ClipBoard' + end + when msg = 53 then + do + cp_array = self~getText(result_input,.false) + cp_string = cp_array~makestring + cp~Copy(cp_string) + .local~imsg = 'Returns Are On ClipBoard' + end + when msg = 54 then + do + cp_array = self~getText(errors_input,.false) + cp_string = cp_array~makestring + cp~Copy(cp_string) + .local~imsg = 'Errors Are On ClipBoard' + end + when msg = 55 then + do + allData = 'The Following Output Was Generated With ooRexxTry'.endOfLine||.endOfLine + cp_array = self~getText(args_input,.false) + cp_string = cp_array~makestring + allData = alldata||'Arguments'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp_array = self~getText(code_input,.false) + cp_string = cp_array~makestring + allData = allData||'Code'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp_array = self~getText(say_input,.false) + cp_string = cp_array~makestring + allData = allData||'Says'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp_array = self~getText(result_input,.false) + cp_string = cp_array~makestring + allData = allData||'Results'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp_array = self~getText(errors_input,.false) + cp_string = cp_array~makestring + allData = allData||'Errors/Information'||.endOfLine||cp_string||.endOfLine||'-'~copies(20)||.endOfLine + + cp~Copy(allData) + .local~imsg = 'All Data Is On ClipBoard' + end + otherwise + nop + end + self~error_data = .imsg + errors_input~title = self~error_data + self~ReturnFocus + +-- Code2File menu option +::method FileDialog + expose code_input errors_input + use arg msg, args + if msg = 23 then + do + c_array = self~getText(code_input,.false) + c_string = c_array~makestring + action = 'S' + dtitle = 'ooRexxTry File Save' + end + else + do + action = 'L' + dtitle = 'ooRexxTry File Open' + end + + delimiter = '0'x + filemask = 'ooRexx Files (*.rex)'delimiter'*.rex'delimiter||- + 'All Files (*.*)'delimiter'*.*'delimiter + handle = self~getSelf + a_file = FileNameDialog(.preferred_path,handle,filemask,action,dtitle,'.rex') + if a_file \= 0 then + do + ostream = .stream~new(a_file) + if msg = 23 then + do + ostream~open('Write Replace') + ostream~lineout(c_string) + ostream~close + .local~imsg = 'Code Saved As' a_file + self~error_data = .imsg + errors_input~title = self~error_data + end + else + do + oarray = ostream~charin(,ostream~chars)~makearray + ostream~close + mycode = '' + do i = 1 to oarray~items + mycode = mycode||oarray[i] + if i < oarray~items then + mycode = mycode||.endOfLine + end + self~code_data = mycode + code_input~title = self~code_data + + .local~imsg = 'Code From' a_file 'In Code Dialog' + self~error_data = .imsg + errors_input~title = self~error_data + end + end + self~ReturnFocus + +-- ClearAll menu option +::method ClearAll + expose args_input code_input result_input say_input errors_input + use arg msg, args + select + when msg = 60 then + do + self~args_data = '' + args_input~title = self~args_data + end + when msg = 61 then + do + self~code_data = '' + code_input~title = self~code_data + end + when msg = 62 then + do + self~say_data = '' + say_input~title = self~say_data + end + when msg = 63 then + do + self~results_data = '' + result_input~title = self~results_data + end + when msg = 64 then + do + self~error_data = '' + errors_input~title = self~error_data + end + when msg = 65 then + do + self~args_data = '' + args_input~title = self~args_data + + self~code_data = '' + code_input~title = self~code_data + + self~results_data = '' + result_input~title = self~results_data + + self~say_data = '' + say_input~title = self~say_data + + self~error_data = '' + errors_input~title = self~error_data + end + otherwise + nop + end + self~ReturnFocus + +::method Silent + use arg msg, args + select + when msg = 66 then do + .local~silent = .false + self~checkMenuItem(66) + self~unCheckMenuItem(67) + end + when msg = 67 then do + .local~silent = .true + self~checkMenuItem(67) + self~unCheckMenuItem(66) + end + otherwise + nop + end + self~ReturnFocus + +::method SaveSettings + use arg msg, args + handle = self~getSelf + sp = self~getWindowRect(handle) + select + when msg = 72 then + do + if \self~isMinimized & \self~isMaximized then + do + rv = SysIni('oorexxtry.ini','oorexxtry','k1',sp~word(1)) + rv = SysIni('oorexxtry.ini','oorexxtry','k2',sp~word(2)) + rv = SysIni('oorexxtry.ini','oorexxtry','k3',sp~word(3)) + rv = SysIni('oorexxtry.ini','oorexxtry','k4',sp~word(4)) + end + rv = SysIni('oorexxtry.ini','oorexxtry','fn',.fontname) + rv = SysIni('oorexxtry.ini','oorexxtry','fs',.fontsize) + rv = SysIni('oorexxtry.ini','oorexxtry','sl',.silent) + end + otherwise + nop + end + self~ReturnFocus + +::method ReturnFocus + expose code_input + w1 = code_input~selected~word(1) + w2 = code_input~selected~word(2) + code_array = self~getText(code_input,.true) + if w1 = .max_length & w2 = .max_length then + do + sel_start = .max_length + sel_end = .max_length + end + else + do + sel_start = w1 + sel_end = w2 + end + self~focusItem(13) + code_input~select(sel_start,sel_end) + +-- Method to handle all the resizing +::method OnResize + expose u + use arg dummy,sizeinfo + u~resize(self,sizeinfo) + +::method Help + expose code_input u + handle = self~getSelf + parse value self~GetWindowRect(handle) with var1 var2 var3 var4 + .local~dw = (var3 - var1) / self~factorX + .local~dh = (var4 - var2) / self~factorY + + parse value self~GetPos with dx dy + .local~dx = dx + .local~dy = dy + + help = .help_dialog~new() + if help~initCode \= 0 then + do + call errorDialog 'Error creating help dialog. initCode:' help~initCode + exit + end + help~Execute('ShowTop') + help~DeInstall + +::method Settings + expose code_input u + handle = self~getSelf + parse value self~GetWindowRect(handle) with var1 var2 var3 var4 + .local~dw = (var3 - var1) / self~factorX + .local~dh = (var4 - var2) / self~factorY + + parse value self~GetPos with dx dy + .local~dx = dx + .local~dy = dy + + settings = .settings_dialog~new() + if settings~initCode \= 0 then + do + call errorDialog 'Error creating help dialog. initCode:' settings~initCode + exit + end + settings~Execute('ShowTop') + settings~DeInstall + +-- Redraw applicable areas of the dialog based on the font menu choice +::method ReDraw + expose args_input code_input say_input result_input errors_input + + -- FW_EXTRALIGHT == 200 + d = .Directory~new + d~weight = 200 + hfont = self~createFontEx(.fontname,.fontsize,d) + args_input ~setFont(hfont) + code_input ~setFont(hfont) + say_input ~setFont(hfont) + result_input~setFont(hfont) + errors_input~setFont(hfont) + +::method getText + use arg the_input,stripIt + iarray = .array~new() + max_length = 0 + do i = 1 to the_input~lines + if stripIt then + do + if the_input~getLine(i)~strip() \= '' then + do + iarray~append(the_input~getLine(i)) + max_length += iarray[iarray~last]~length + end + end + else + do + iarray~append(the_input~getLine(i)) + max_length += iarray[iarray~last]~length + end + end + .local~max_length = max_length + 1 +return iarray + +-- This method is invoked whenever the user clicks on one of the font menu items. +-- The first arg to the method is the resource id of the menu id that was clicked. +::method onFontMenuClick + expose fontMenuIDs + use arg id + + -- Map the menu item id to a font setting. Could be size of name. + item = fontMenuIDs~index(id) + + -- If item is a number, then it is a font size menu item, otherwis a font name. + if item~datatype('W') then .local~fontSize = item + else .local~fontname = item + + -- Reset the menu item check marks and redraw in the new font. + self~setFontMenuChecks + self~ReDraw + +-- This method sets the appropriate font menu item check state. Checked for selected +-- and unchecked for unselected. +::method setFontMenuChecks private + expose fontMenuIDs + + -- Iterate over all items in the table unchecking each menu item. Brute force, + -- but easy, and there are not many items. The alternative is to keep track of + -- which items are checked and uncheck / check the correct ones. + do id over fontMenuIDs~allItems + self~uncheckMenuItem(id) + end + + -- Now check the menu item that matches what font name and size is currently + -- in use. + self~checkMenuItem(fontMenuIDs[.fontname]) + self~checkMenuItem(fontMenuIDs[.fontsize]) + +-- A private help method that sets up things to make working with the font menu easier +::method fontMenuHelper private + expose fontMenuIDs + + -- Create a table that maps menu item IDs to the matching font setting. Since + -- the Table class has the index() method, the mapping works both ways. + fontMenuIDs = .Table~new + fontMenuIDs["Arial Unicode MS"] = 30 + fontMenuIDs["Lucida Console"] = 31 + fontMenuIDs["Courier New"] = 32 + + fontMenuIDs[ 8] = 40 + fontMenuIDs[10] = 41 + fontMenuIDs[12] = 42 + fontMenuIDs[14] = 43 + fontMenuIDs[16] = 44 + fontMenuIDs[18] = 45 + +-- Class that dynamically creates a method to take the arguments and execute the code +::class executor public +::method init + expose rt_method + use arg method_name,code + .local~Error? = .false + signal on syntax name ExecSyntax + rt_method = .method~new(method_name, code) +return + +-- Syntax trap similiar to rexxc.exe +ExecSynTax: + msg = 'Trapped In'~right(11)'..: ExecSyntax' + obj = condition('o') + msg = msg||.endOfLine||'Message'~right(11)'..:' obj['MESSAGE'] + msg = msg||.endOfLine||'ErrorText'~right(11)'..:' obj['ERRORTEXT'] + msg = msg||.endOfLine||'Code'~right(11)'..:' obj['CODE'] + msg = msg||.endOfLine||'Line #'~right(11)'..:' obj['POSITION'] + .local~emsg = msg + .local~Error? = .true +return + +-- Method that actually runs our code +::method run + expose rt_method say_string + signal on syntax name RunSyntax + .local~run_results = .directory~new + .local~say_stg = '' + my_result = '' + if \.Error? then + do + -- Redirect STDOUT for say statements + scrnOut = .SayCatcher~New('STDOUT')~~Command('open write nobuffer') + theSayMonitor = .monitor~New(scrnOut) + .output~Destination(theSayMonitor) + -- Run the Code + args = arg(1) + self~run:super(rt_method, 'a', args) + -- Test if there was anything returned by the code + if symbol('result') = 'VAR' then + my_result = result + -- Load the says and returns into environment variables for updating the dialog areas + .local~run_results['returns'] = my_result + -- Redirect STDOUT back to what it was (probably the screen) + .output~Destination() + end +return .run_results + +-- Syntax trap for errors in the code +RunSyntax: + msg = 'Trapped In'~right(11)'..: RunSyntax' + obj = condition('o') + msg = msg||.endOfLine||'Message'~right(11)'..:' obj['MESSAGE'] + msg = msg||.endOfLine||'ErrorText'~right(11)'..:' obj['ERRORTEXT'] + msg = msg||.endOfLine||'Code'~right(11)'..:' obj['CODE'] + msg = msg||.endOfLine||'Line #'~right(11)'..:' obj['POSITION'] + .local~emsg = msg +return + +-- Class to "catch" all say,charout,lineout statements in the code +-- Will not catch charout & lineout if the first argument is supplied +::class SayCatcher subclass stream +::method say + expose .si + use arg input + .local~say_stg = .say_stg||input||.endOfLine + .si~title = .say_stg +return + +::method charout + expose .si + use arg input + .local~say_stg = .say_stg||input + .si~title = .say_stg +return 0 + +::method lineout + expose .si + use arg input + .local~say_stg = .say_stg||input||.endOfLine + .si~title = .say_stg +return 0 + + +::class help_dialog subclass userdialog +::method Init + self~init:super + lp = (.dx + (.dw / 2) - 50)~format( , 0) + tp = (.dy + (.dh / 2) - 30)~format( , 0) + rc = self~Create(lp,tp,100,60,.title) + self~InitCode = (rc=0) + +::method DefineDialog + expose h + h = .dlgAreaU~new(self) + if .nil \= h~lastError then + call errorDialog h~lastError + vt = .dlgArea~new(h~x,0,h~w,10) + self~addText(vt~x,vt~y,vt~w,vt~h,'Version','CENTER',20) + vd = .dlgArea~new(h~x,vt~y + vt~h,h~w,10) + self~addText(vd~x,vd~y,vd~w,vd~h,.version,'CENTER',21) + + at = .dlgArea~new(h~x,vd~y + vd~h,h~w,10) + self~addText(at~x,at~y,at~w,at~h,'Author','CENTER',22) + ad = .dlgArea~new(h~x,at~y + at~h,h~w,10) + self~addText(ad~x,ad~y,ad~w,ad~h,'Lee Peedin','CENTER',23) + + dt = .dlgArea~new(h~x,ad~y + ad~h,h~w,10) + self~addText(dt~x,dt~y,dt~w,dt~h,'Documentation','CENTER',24) + dd = .dlgArea~new(h~x,dt~y + dt~h,h~w,10) + self~AddButton(25,dd~x,dd~y,dd~w,10,'&PDF','Help') + +::method InitDialog + v_title = self~newStatic(20) + a_title = self~newStatic(22) + d_title = self~newStatic(24) + + v_title~setColor(5,10) + a_title~setColor(5,10) + d_title~setColor(5,10) + +::method Help + -- The help doc is supposed to be in the 'doc' subdirectory, but we will also check the + -- current directory, then the Rexx home directory. + if SysFileExists('doc\ooRexxTry.pdf') then do + helpDoc = 'doc\ooRexxTry.pdf' + end + else if SysFileExists('ooRexxTry.pdf') then do + helpDoc = 'ooRexxTry.pdf' + end + else if SysfileExists(value("REXX_HOME",,"ENVIRONMENT")||"\doc\ooRexxTry.pdf") then do + helpDoc = value("REXX_HOME",,"ENVIRONMENT")||"\doc\ooRexxTry.pdf" + end + else do + msg = "The ooRexxTry.pdf help documentation could not be located." || .endOfLine - + || .endOfLine || - + "Tried:" || .endOfLine - + " doc subdirectory: "||directory()||"\doc\ooRexxTry.pdf" || .endOfLine - + " current directory: "||directory()||"\ooRexxTry.pdf" || .endOfLine - + " Rexx home: "||value("REXX_HOME",,"ENVIRONMENT")||"\doc\ooRexxTry.pdf" || .endOfLine - + || .endOfLine || - + "Sorry, no help is available" + call errorDialog msg + return + end + 'start "ooRexxTry Online Documentation"' '"'||helpDoc||'"' + + +::class settings_dialog subclass userdialog +::method Init + self~init:super + lp = (.dx + (.dw / 2) - 50)~format( , 0) + tp = (.dy + (.dh / 2) - 30)~format( , 0) + rc = self~Create(lp,tp,100,60,.title) + self~InitCode = (rc=0) + +::method DefineDialog + expose h + h = .dlgAreaU~new(self) + if .nil \= h~lastError then + call errorDialog h~lastError + vt = .dlgArea~new(h~x,0,h~w,10) + self~addText(vt~x,vt~y,vt~w,vt~h,'Font Name','CENTER',20) + vd = .dlgArea~new(h~x,vt~y + vt~h,h~w,10) + self~addText(vd~x,vd~y,vd~w,vd~h,.fontname,'CENTER',21) + + at = .dlgArea~new(h~x,vd~y + vd~h,h~w,10) + self~addText(at~x,at~y,at~w,at~h,'Font Size','CENTER',22) + ad = .dlgArea~new(h~x,at~y + at~h,h~w,10) + self~addText(ad~x,ad~y,ad~w,ad~h,.fontsize,'CENTER',23) + + dt = .dlgArea~new(h~x,ad~y + ad~h,h~w,10) + self~addText(dt~x,dt~y,dt~w,dt~h,'Silent','CENTER',24) + dd = .dlgArea~new(h~x,dt~y + dt~h,h~w,10) + self~addText(dd~x,dd~y,dd~w,dd~h,.silent,'CENTER',23) + +::method InitDialog + v_title = self~newStatic(20) + a_title = self~newStatic(22) + d_title = self~newStatic(24) + + v_title~setColor(14,0) + a_title~setColor(14,0) + d_title~setColor(14,0) + +::routine LoadEnvironment + .local~px = ScreenSize()[3] + .local~py = ScreenSize()[4] + +-- Establish dialog area sizes based of the user's screen resolution - will only be used for the first +-- execution - from then on data is retrieved from the .ini file, unless user specifies default as an +-- execution argument from the command line + .local~dwidth = ((.px / 2.5) * .65)~format(,0) + .local~dheight = ((.py / 2.5) * .65)~format(,0) + .local~dx = 0 + .local~dy = 0 + + +-- Need a few generic variables + .local~version = '1.0' -- Internal version control + .local~preferred_path = '' -- Default starting path for Save As dialog - will be either + -- the folder ooRexxTry is executed from or the last folder that + -- was accessed using the Windows File Dialog + .local~title = 'ooRexxTry' -- Title to use for the dialogs + +-- If the .ini file is present, use it for font/silent variables + .local~fontname = SysIni('oorexxtry.ini','oorexxtry','fn') + .local~fontsize = SysIni('oorexxtry.ini','oorexxtry','fs') + .local~silent = SysIni('oorexxtry.ini','oorexxtry','sl') + +-- Else use some defaults + if .fontname = 'ERROR:' | .useDefault then + .local~fontname = 'Arial Unicode MS' -- 'Lucida Console' + if .fontsize = 'ERROR:' | .useDefault then + .local~fontsize = 8 -- 12 + if .silent = 'ERROR:' | .useDefault then + .local~silent = .false +return + + +------------------------------------------------------------------------------- +::class platform +------------------------------------------------------------------------------- + +-- Class level + +::attribute current class -- the current platform is a singleton + + +::method initialize class -- init not supported (can't instantiate itself or subclass from init) + use strict arg -- none + parse source sysrx . + select + when sysrx~caselessAbbrev("windows") then self~current = self~new("windows") + when sysrx~caselessAbbrev("aix") then self~current = self~new("aix") + when sysrx~caselessAbbrev("sunos") then self~current = self~new("sunos") + when sysrx~caselessAbbrev("linux") then self~current = self~new("linux") + otherwise self~current = self~new(sysrx~word(1)~lower) + end + + +::method is class + use strict arg name + return self~name~caselessEquals(name) + + +::method unknown class -- delegates to the singleton + use strict arg msg, args + forward to (self~current) message (msg) arguments (args) + + +-- Instance level + +::attribute name + + +::method init + use strict arg name + self~name = name + Modified: sandbox/jlf/unicode/ooRexx/oodtree.rex =================================================================== --- sandbox/jlf/unicode/ooRexx/oodtree.rex 2010-07-03 23:29:15 UTC (rev 6053) +++ sandbox/jlf/unicode/ooRexx/oodtree.rex 2010-07-03 23:45:17 UTC (rev 6054) @@ -57,9 +57,9 @@ call setCodePage 65001 -- UTF-8 -MyDialog = .MyDialogClass~new -if MyDialog~InitCode = 0 then do - rc = MyDialog~Execute("SHOWTOP") +myDialog = .MyDialogClass~new +if myDialog~InitCode = 0 then do + rc = myDialog~Execute("SHOWTOP") end /* Add program code here */ @@ -71,26 +71,29 @@ CleanUp: call errorDialog "Error" rc "occurred at line" sigl":" errortext(rc), || "a"x || condition("o")~message - if MyDialog~IsDialogActive then MyDialog~StopIt + if myDialog~isDialogActive then do + myDialog~finished = .true + myDialog~stopIt + end ::requires "ooDialog.cls" /* This file contains the ooDialog classes */ -::requires "WINSYSTM.CLS" /* This file contains the Windows classes */ +::requires "winSystm.CLS" /* This file contains the Windows classes */ /* ---------------------------- Directives ---------------------------------*/ ::class 'MyDialogClass' subclass UserDialog inherit VirtualKeyCodes -::method Init - use arg InitStem. - if Arg(1,"o") = 1 then - InitRet = self~Init:super +::method init + use arg initStem. + if arg(1,"o") = 1 then + initRet = self~init:super else - InitRet = self~Init:super(InitStem.) /* Initialization stem is used */ + initRet = self~init:super(initStem.) /* Initialization stem is used */ - if self~Load("rc\oodtree.rc", ) \= 0 then do - self~InitCode = 1 + if self~load("rc\oodtree.rc", ) \= 0 then do + self~initCode = 1 return end @@ -114,15 +117,13 @@ self~IDC_TREE= 'Products' /* Text of the item which schould be selected */ /* Add your initialization code here */ - return InitRet + return initRet /* Initialization Code, fill tree with initialization data */ -::method InitDialog +::method initDialog expose bmpFile treeFile itemFile - InitDlgRet = self~InitDialog:super - curTree = self~newTreeView("IDC_TREE") if curTree \= .Nil then do @@ -163,16 +164,11 @@ end end - return InitDlgRet +::method defineDialog + /* Additional dialog items could be added here (e.g. createEditInputGroup) */ -::method DefineDialog - result = self~DefineDialog:super - if result = 0 then do - /* Additional dialog items (e.g. createEditInputGroup) */ - end - /* --------------------- message handler -----------------------------------*/ /* Method OnSelChanging_IDC_TREE handles notification 'SelChanging' for item IDC_TREE */ @@ -211,16 +207,7 @@ end end -/* track and display the notification messages */ -/* uncomment this if you want to get the notification messages and their parameters displayed */ -/* -::method HandleMessages - msg = self~PeekDialogMessage - if msg \= "" then say msg - forward class(super) -*/ - /* Method OnKeyDown_IDC_TREE handles notification 'KeyDown' for item IDC_TREE */ ::method OnKeyDown_IDC_TREE use arg treeId, key This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-07-10 11:06:42
|
Revision: 6060 http://oorexx.svn.sourceforge.net/oorexx/?rev=6060&view=rev Author: jfaucher Date: 2010-07-10 11:06:30 +0000 (Sat, 10 Jul 2010) Log Message: ----------- merge 5988-6048 from main/trunk Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/Makefile.am sandbox/jlf/trunk/configure.ac sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/RcDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/m_oodcls.rex sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUser.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodialog.mak sandbox/jlf/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp sandbox/jlf/trunk/interpreter/platform/windows/FileSystem.cpp sandbox/jlf/trunk/samples/windows/oodialog/oograph.rex sandbox/jlf/trunk/samples/windows/oodialog/ooticket.rex sandbox/jlf/trunk/samples/windows/oodialog/propdemo.rex sandbox/jlf/trunk/samples/windows/oodialog/rc/ticket.rc Added Paths: ----------- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ControlDialog.cls Property Changed: ---------------- sandbox/jlf/trunk/ sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/rxsock/mime.cls sandbox/jlf/trunk/extensions/rxsock/smtp.cls sandbox/jlf/trunk/extensions/rxsock/streamsocket.cls Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/_diary.txt 2010-07-10 11:06:30 UTC (rev 6060) @@ -351,4 +351,5 @@ rev 5812 merge 5812-5835 from main/trunk merge 5835-5957 from main/trunk -merge 5957-5988 from main/trunk \ No newline at end of file +merge 5957-5988 from main/trunk +merge 5988-6048 from main/trunk Property changes on: sandbox/jlf/trunk ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk:5812-5988 + /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk:5812-6048 Modified: sandbox/jlf/trunk/Makefile.am =================================================================== --- sandbox/jlf/trunk/Makefile.am 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/Makefile.am 2010-07-10 11:06:30 UTC (rev 6060) @@ -989,6 +989,7 @@ $(build_behaviour_dir)/VirtualFunctionTable.cpp: $(build_behaviour_dir)/VirtualFunctionTable.xsl $(classesXML) sh ./xsl.sh $(@) $(classesXML) $(build_behaviour_dir)/VirtualFunctionTable.xsl +rexx.img: LD_LIBRARY_PATH = ./.libs rexx.img: rexximage librexxutil.la $(core_classes) $(core_platform_classes) cp $(build_rexxclasses_dir)/*.orx . cp $(build_interpreter_platform_dir)/*.orx . Modified: sandbox/jlf/trunk/configure.ac =================================================================== --- sandbox/jlf/trunk/configure.ac 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/configure.ac 2010-07-10 11:06:30 UTC (rev 6060) @@ -310,6 +310,7 @@ time.h \ unistd.h \ usersec.h \ + attr/xattr.h \ ]) dnl Checks for library functions. Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-07-10 11:06:30 UTC (rev 6060) @@ -187,7 +187,7 @@ * @return Pointer to void, could be used in the return statement of a method * to return NULLOBJECT after the exeception is raised. */ -RexxObjectPtr wrongClassException(RexxThreadContext *c, int pos, const char *n) +RexxObjectPtr wrongClassException(RexxThreadContext *c, size_t pos, const char *n) { c->RaiseException2(Rexx_Error_Invalid_argument_noclass, c->WholeNumber(pos), c->String(n)); return NULLOBJECT; @@ -384,9 +384,10 @@ * @param c * @param msg */ -void executionErrorException(RexxThreadContext *c, CSTRING msg) +void *executionErrorException(RexxThreadContext *c, CSTRING msg) { c->RaiseException1(Rexx_Error_Execution_user_defined, c->CString(msg)); + return NULL; } /** Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2010-07-10 11:06:30 UTC (rev 6060) @@ -50,37 +50,37 @@ #define NO_LOCAL_ENVIRONMENT_MSG "the .local environment was not found" #define NO_SIZE_CLASS_MSG "the .Size class was not found" -extern void severeErrorException(RexxThreadContext *c, char *msg); -extern void systemServiceException(RexxThreadContext *context, char *msg); -extern void systemServiceException(RexxThreadContext *context, char *msg, const char *sub); -extern void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1, DWORD rc); -extern void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1); -extern void systemServiceExceptionComCode(RexxThreadContext *context, const char *msg, const char *arg1, HRESULT hr); -extern void outOfMemoryException(RexxThreadContext *c); -extern void userDefinedMsgException(RexxThreadContext *c, CSTRING msg); -extern void userDefinedMsgException(RexxThreadContext *c, int pos, CSTRING msg); -extern void userDefinedMsgException(RexxMethodContext *c, CSTRING msg); -extern void userDefinedMsgException(RexxMethodContext *c, size_t pos, CSTRING msg); -extern void invalidImageException(RexxThreadContext *c, int pos, CSTRING type, CSTRING actual); -extern void stringTooLongException(RexxThreadContext *c, int pos, size_t len, size_t realLen); -extern void numberTooSmallException(RexxThreadContext *c, int pos, int min, RexxObjectPtr actual); -extern void notNonNegativeException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual); -extern void notPositiveException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual); -extern void wrongObjInArrayException(RexxThreadContext *c, size_t argPos, size_t index, CSTRING obj); -extern void wrongObjInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index, CSTRING needed, RexxObjectPtr actual); -extern void executionErrorException(RexxThreadContext *c, CSTRING msg); -extern void doOverException(RexxThreadContext *c, RexxObjectPtr obj); -extern void failedToRetrieveException(RexxThreadContext *c, CSTRING item, RexxObjectPtr source); -extern void missingIndexInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index); -extern void directoryIndexException(RexxThreadContext *c, size_t pos, CSTRING index, CSTRING msg, RexxObjectPtr actual); -extern void wrongValueAtDirectoryIndexException(RexxThreadContext *, size_t pos, CSTRING index, CSTRING list, RexxObjectPtr actual); -extern void emptyArrayException(RexxThreadContext *c, int argPos); -extern void sparseArrayException(RexxThreadContext *c, size_t argPos, size_t index); -extern void nullObjectException(RexxThreadContext *c, CSTRING name, int pos); -extern void nullObjectException(RexxThreadContext *c, CSTRING name); -extern void nullPointerException(RexxThreadContext *c, int pos); +extern void severeErrorException(RexxThreadContext *c, char *msg); +extern void systemServiceException(RexxThreadContext *context, char *msg); +extern void systemServiceException(RexxThreadContext *context, char *msg, const char *sub); +extern void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1, DWORD rc); +extern void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1); +extern void systemServiceExceptionComCode(RexxThreadContext *context, const char *msg, const char *arg1, HRESULT hr); +extern void outOfMemoryException(RexxThreadContext *c); +extern void userDefinedMsgException(RexxThreadContext *c, CSTRING msg); +extern void userDefinedMsgException(RexxThreadContext *c, int pos, CSTRING msg); +extern void userDefinedMsgException(RexxMethodContext *c, CSTRING msg); +extern void userDefinedMsgException(RexxMethodContext *c, size_t pos, CSTRING msg); +extern void invalidImageException(RexxThreadContext *c, int pos, CSTRING type, CSTRING actual); +extern void stringTooLongException(RexxThreadContext *c, int pos, size_t len, size_t realLen); +extern void numberTooSmallException(RexxThreadContext *c, int pos, int min, RexxObjectPtr actual); +extern void notNonNegativeException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual); +extern void notPositiveException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual); +extern void wrongObjInArrayException(RexxThreadContext *c, size_t argPos, size_t index, CSTRING obj); +extern void wrongObjInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index, CSTRING needed, RexxObjectPtr actual); +extern void *executionErrorException(RexxThreadContext *c, CSTRING msg); +extern void doOverException(RexxThreadContext *c, RexxObjectPtr obj); +extern void failedToRetrieveException(RexxThreadContext *c, CSTRING item, RexxObjectPtr source); +extern void missingIndexInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index); +extern void directoryIndexException(RexxThreadContext *c, size_t pos, CSTRING index, CSTRING msg, RexxObjectPtr actual); +extern void wrongValueAtDirectoryIndexException(RexxThreadContext *, size_t pos, CSTRING index, CSTRING list, RexxObjectPtr actual); +extern void emptyArrayException(RexxThreadContext *c, int argPos); +extern void sparseArrayException(RexxThreadContext *c, size_t argPos, size_t index); +extern void nullObjectException(RexxThreadContext *c, CSTRING name, int pos); +extern void nullObjectException(RexxThreadContext *c, CSTRING name); +extern void nullPointerException(RexxThreadContext *c, int pos); -extern RexxObjectPtr wrongClassException(RexxThreadContext *c, int pos, const char *n); +extern RexxObjectPtr wrongClassException(RexxThreadContext *c, size_t pos, const char *n); extern RexxObjectPtr wrongArgValueException(RexxThreadContext *c, size_t pos, const char *list, RexxObjectPtr actual); extern RexxObjectPtr wrongArgValueException(RexxThreadContext *c, size_t pos, const char *list, const char *actual); extern RexxObjectPtr wrongRangeException(RexxThreadContext *c, size_t pos, int min, int max, RexxObjectPtr actual); Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/anibuttn.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/anibuttn.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls:5812-6048 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -113,11 +113,11 @@ ::method drawArc unguarded external "LIBRARY oodialog winex_drawArcOrPie" ::method drawPie unguarded external "LIBRARY oodialog winex_drawArcOrPie" ::method drawAngleArc unguarded external "LIBRARY oodialog winex_drawAngleArc" +::method getArcDirection unguarded external "LIBRARY oodialog winex_getSetArcDirection" +::method setArcDirection unguarded external "LIBRARY oodialog winex_getSetArcDirection" ::method fontColor unguarded external "LIBRARY oodialog winex_fontColor" ::method transparentText unguarded external "LIBRARY oodialog winex_textBkMode" ::method opaqueText unguarded external "LIBRARY oodialog winex_textBkMode" -::method setArcDirection unguarded external "LIBRARY oodialog winex_getSetArcDirection" -::method getArcDirection unguarded external "LIBRARY oodialog winex_getSetArcDirection" -- DEPRECATED Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/basedlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/BaseDialog.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/basedlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/BaseDialog.cls:5812-6048 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -107,7 +107,7 @@ self~catalog['count'] = i end - self~InitCategories() /* user overwrite */ + self~initCategories() /* user overwrite */ if cdtable = '' then do @@ -121,15 +121,11 @@ end end - if self~catStyle~wordpos("WIZZARD") > 0 then do - self~wizard = 1 - self~catStyle = self~catStyle~changestr("WIZZARD","") + if self~catStyle~wordpos("WIZZARD") > 0 | self~catStyle~wordpos("WIZARD") > 0 then do + self~wizard = .true + self~catStyle = self~catStyle~changestr("WIZZARD", "") end - else if self~catStyle~wordpos("WIZARD") > 0 then do - self~wizard = 1 - self~catStyle = self~catStyle~changestr("WIZARD","") - end - else self~wizard = 0 + else self~wizard = .false -- Documented "internal use only" in 3.2.0 - Do not document. self~catalog['id'] = .array~new(self~catalog['count'],100) @@ -273,19 +269,24 @@ rbtext = self~catalog['page']['rightbtntext'] if lbtext~pos(" ") > 0 then lbtext = '"' || lbtext || '"' if rbtext~pos(" ") > 0 then rbtext = '"' || rbtext || '"' - if (self~catalog['page']['btnwidth'] > 0) then - do - self~createPushButtonGroup(self~sizeX-self~catalog['page']['btnwidth']*2-15,, - self~sizeY - 15,self~catalog['page']['btnwidth'],, "&Ok 1 OK &Cancel 2 CANCEL", 1, "DEFAULT") - if self~wizard = 1 then - self~createPushButtonGroup(5,self~sizeY - 15,self~catalog['page']['btnwidth'],, - ,lbtext" 11 PreviousPage" rbtext" 12 NextPage", 1, "") + + x = 5 + y = self~sizeY - 15 + cx = self~catalog['page']['btnwidth'] + + wizardTextIdMsg = lbtext" 11 PreviousPage" rbtext" 12 NextPage" + + if (self~catalog['page']['btnwidth'] > 0) then do + x = trunc(self~sizeX - self~catalog['page']['btnwidth'] * 2 - 15) + + self~createPushButtonGroup(x, y, cx, , "&Ok 1 OK &Cancel 2 CANCEL", 1, "DEFAULT") + if self~wizard then self~createPushButtonGroup(x, y, cx, , wizardTextIdMsg, 1, "") end else do self~createOkCancelRightBottom - if self~wizard = 1 then - self~createPushButtonGroup(5, self~sizeY - 15,,, lbtext" 11 PreviousPage" rbtext" 12 NextPage", 1, "") + if self~wizard then self~createPushButtonGroup(x, y, , , wizardTextIdMsg, 1, "") end + self~createBlackFrame(-1, 0, self~sizeY - 20, self~sizeX, 1) ::method createCategoryDialog private external "LIBRARY oodialog catdlg_createCategoryDialog" @@ -364,7 +365,7 @@ self~HideWindowFast(self~catalog['handles'][self~catalog['category']]) self~catalog['category'] = NewPage - if self~wizard = 1 then do + if self~wizard then do if NewPage = 1 then do self~DisableItem(11) self~EnableItem(12) Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/catdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/catdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls:5812-6048 Copied: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ControlDialog.cls (from rev 6048, main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls) =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ControlDialog.cls (rev 0) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -0,0 +1,106 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2010 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. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * Windows Dialog Interface for Open Object Rexx (ooRexx.) + * + * Control Dialog Classes and interfaces. A control dialog is a dialog with a + * style that allows it work well as a dialog within a top-level dialog. The + * top-level dialog is both the owner and the parent of the control dialog. + * + * Control dialogs work well as the content for tab controls and as the pages of + * a Windows PropertySheet dialog, not to be confused with the wrongly named + * ooDialog PropertySheet class. + * + * A control dialog is also a child of the owner / parent dialog. The + * popupAsChild() method also uses the concept of parent child dialogs. To + * prevent confusion with that, the control dialog classes use the terms control + * dialog and owner dialog. + */ + +::class 'ControlDialog' mixinclass Object public + +::attribute ownerDialog get external "LIBRARY oodialog chld_getOwnerDialog" +::attribute ownerDialog set external "LIBRARY oodialog chld_setOwnerDialog" + + +::class 'UserControlDialog' public subclass UserDialog inherit ControlDialog + +-- Over-ride the superclass startIt(). The superclass startIt() creates a top- +-- level dialog and takes an 'icon' and a 'modeless' icon. We need to accept +-- those arguments, but we don't use them. So we just ignore all args +::method startIt + + if self~basePtr = 0 then return 0 + + if self~startChildDialog(self~basePtr, 0) == 0 then return 0 + + self~initDialog + return self~dlgHandle + + +::class 'ResControlDialog' public subclass ResDialog inherit ControlDialog + +::method startDialog private external "LIBRARY oodialog resCtrlDlg_startDialog_pvt" + + +::class 'RcControlDialog' subclass UserControlDialog public + +::method init + use strict arg rcFile, idDlg, initData. = .nil, includeFile = "", options = "", expected = 200, ownerDlg = .nil + + newArgs = .array~new(5) + if arg(3, 'E') then newArgs[1] = arg(3) + if arg(4, 'E') then newArgs[2] = arg(4) + if arg(7, 'E') then newArgs[5] = arg(7) + newArgs[3] = rcFile + newArgs[4] = idDlg + + forward class (super) arguments (newArgs) continue + if result <> 0 then return result + + self~initCode = self~load(rcFile, idDlg, options, expected) + + return self~initCode + + +::class 'OwnerDialog' mixinclass Object public + +::method init + say 'In OwnerDialog::init()' + --forward class (super) continue + say 'Back in OwnerDialog::init()' Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/msgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/msgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls:5812-6048 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -919,7 +919,7 @@ ::method setSize forward message "setItemSize" continue - return result~cx result~cy + return result~width result~height ::method posRectangle use strict arg item Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/advctrl.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogControls.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/advctrl.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogControls.cls:5812-6048 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -71,7 +71,7 @@ -- Used to wait for a dialog started through executeAsync() to end. ::method endAsyncExecution unguarded - self~run + self~waitForDialog if self~initCode = 1 then do if self~useStem then self~getDataStem(self~dlgData) @@ -83,7 +83,7 @@ -- Run a modeless dialog ::method popup use strict arg sh = "NORMAL", sleepTime = 1, icon = 0 - self~start("execute", sh, icon, sleeptime, .true) + return self~start("execute", sh, icon, sleeptime, .true) -- Run a modeless dialog that will be automatically closed when its parent closes. ::method popupAsChild @@ -97,7 +97,7 @@ parent~childDialogs~insert(self) /* add to the parents child list (last item) */ self~parentDlg = parent - self~start("execute", sh, icon, sleeptime, .true) + return self~start("execute", sh, icon, sleeptime, .true) ::method setSBRange unguarded use strict arg id, min, max, redraw = .true @@ -217,10 +217,6 @@ return .Window~new(hwnd)~redraw -- DEPRECATED START -::method peekDialogMessage unguarded - return "" -::method dump - say "dump() deprecated." ::method clearButtonRect unguarded forward message 'CLEARCONTROLRECT' ::method redrawButton unguarded Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dlgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dlgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls:5812-6048 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -494,6 +494,7 @@ internopts = internopts || self~getRCStyle(dlg.style, "DLG") + dlg.title = "" s = f~linein; fl = fl -1 do while s~wordpos("CAPTION ") = 0 & s~wordpos("FONT ") = 0 & fl > 0 s = f~linein; fl = fl -1 @@ -518,6 +519,8 @@ end f~close + if dlg.title == "" then internopts ||= " NOBORDER" + if self~create(dlg.x, dlg.y, dlg.w, dlg.h, dlg.title, internopts,, dlg.font, dlg.fsize, expected) then return 0 else return 1 @@ -766,6 +769,8 @@ if style~wordpos("WS_MINIMIZEBOX") > 0 | style~wordpos("WS_GROUP") > 0 then ret = ret ||" MINIMIZEBOX" if style~wordpos("WS_MAXIMIZEBOX") > 0 | style~wordpos("WS_TABSTOP") > 0 then ret = ret ||" MAXIMIZEBOX" if style~wordpos("WS_OVERLAPPED") > 0 then ret = ret ||" OVERLAPPED" + if style~wordpos("WS_POPUP") > 0 then ret = ret ||" POPUP" + if style~wordpos("DS_CONTROL") > 0 | style~wordpos("WS_CHILD") > 0 then ret = ret ||" CONTROL" end else if kind = "BTN" then do if style~wordpos("WS_OWNERDRAW") > 0 | style~wordpos("BS_OWNERDRAW") > 0 then ret = ret || " OWNER" Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dyndlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dyndlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls:5812-6048 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -123,6 +123,9 @@ ::method setRect unguarded external "LIBRARY oodialog wb_setRect" ::method resizeTo unguarded external "LIBRARY oodialog wb_resizeMove" ::method moveTo unguarded external "LIBRARY oodialog wb_resizeMove" +::method setWindowPos unguarded external "LIBRARY oodialog wb_setWindowPos" +::method moveWindow unguarded external "LIBRARY oodialog wb_moveSizeWindow" +::method sizeWindow unguarded external "LIBRARY oodialog wb_moveSizeWindow" ::method getRealSize unguarded external "LIBRARY oodialog wb_getSizePos" ::method getRealPos unguarded external "LIBRARY oodialog wb_getSizePos" ::method windowRect unguarded external "LIBRARY oodialog wb_windowRect" @@ -133,13 +136,15 @@ use strict arg width, height, showOptions = "" p = .Point~new(0, 0) s = .Size~new(trunc(width * self~factorX), trunc(height * self~factorY)) - return self~setRect(p, s, "NOMOVE " || showOptions); + if self~setRect(p, s, "NOMOVE " || showOptions) then return 0 + else return 1 ::method move unguarded -- old method, this is not accurate. use strict arg xPos, yPos, showOptions = "" p = .Point~new(trunc(xPos * self~factorX), trunc(yPos * self~factorY)) s = .Size~new(0, 0) - return self~setRect(p, s, "NOSIZE " || showOptions); + if self~setRect(p, s, "NOSIZE " || showOptions) then return 0 + else return 1 ::method getSize unguarded -- old method, this is not accurate. forward message "getRealSize" continue @@ -329,12 +334,13 @@ ::method getFontSize class external "LIBRARY oodialog pbdlg_getFontSize_cls" ::method new class external "LIBRARY oodialog pbdlg_new_cls" +::attribute library get unguarded private external "LIBRARY oodialog pbdlg_getLibrary" -- Internal use do not document +::attribute resourceID get unguarded private external "LIBRARY oodialog pbdlg_getResourceID" -- Internal use do not document + -- Automatic data field detection on/off ::attribute autoDetect get external "LIBRARY oodialog pbdlg_getAutoDetect" ::attribute autoDetect set external "LIBRARY oodialog pbdlg_setAutoDetect" -::attribute scrollNow -- Indicator whether or not scrolling is active - ::attribute dataConnection private -- store connections between ids and class attributes ::attribute useStem private -- flag whether to use a stem to set/get data or not @@ -362,17 +368,8 @@ * set up of the dialog management block, for all dialogs. */ ::method init external "LIBRARY oodialog pbdlg_init" -::method unInit external "LIBRARY oodialog pbdlg_unInit" ::method setDlgFont external "LIBRARY oodialog pbdlg_setDlgFont" -::method initDialog unguarded private - return 0 - --- Needs a comment? Was documented. -::method run unguarded private - expose finished - guard on when finished - -- Creates the dialog, shows it, and destroys it. Dialog "data" is set and received. -- The sleepTime arg is ignored. This arg was never documented, but people might have -- used it anyway, so it is left in the arg list. @@ -393,7 +390,7 @@ o~start(m) end - self~run + self~waitForDialog if self~initCode = 1 then do if self~useStem then self~getDataStem(dlgData.) @@ -408,17 +405,69 @@ return 0 end --- Not to be doumented. -::method ensureFinished unguarded +::method isDialogActive unguarded external "LIBRARY oodialog pbdlg_isDialogActive" + + + /* + * The following methods are the default implementations for methods that are + * intended to be over-ridden by the programmer if the default behavior needs + * to be altered. + */ + +::method initDialog unguarded private + return 0 + + /** ok() + * This method first invokes the validate() method. If validate returns + * true, self~initCode is set to 1 and self~finished is set to true, + * terminating the dialog. + * + * If validate returns false, the dialog continues to run. + */ +::method ok unguarded + okayToClose = self~validate + + if okayToClose then do + self~initCode = 1 + self~finished = .true + end + + return self~finished + +::method cancel unguarded + self~initCode = 2 + self~finished = .true + return self~finished + +::method help unguarded + return 0 + +::method leaving + return + +/** validate() + * This method is an abstract method that will be called to determin whether the + * dialog can be closed or not. This function will be called by method OK. If + * the return value is true the dialog can be closed, if it is false the dialog + * should not be closed. + */ +::method validate unguarded + return .true + + + +-- waitForDialog() replaces the run() method. run() now just spins doing nothing. +::method waitForDialog unguarded private -- Not to be doumented. + expose finished + guard on when finished + +::method ensureFinished unguarded -- Not to be doumented. expose finished self~initCode = 3 finished = .true -::method isDialogActive unguarded external "LIBRARY oodialog pbdlg_isDialogActive" - --- Documented "internal use only" in 3.2.0 - Do not document. -::method stopIt external "LIBRARY oodialog pbdlg_stopIt" -::method finalStopIt private +::method stopIt external "LIBRARY oodialog pbdlg_stopIt" -- Not to be doumented. Documented "internal use only" in 3.2.0 +::method finalStopIt private -- Not to be doumented. use arg caller -- If we ourselves are a child dialog and not called by the parent's stopIt(), then @@ -439,7 +488,7 @@ -- Remove a child dialog from the chain of child dialogs. -::method childDied +::method childDied -- Not to be doumented. use arg child if self~childDialogs \= .nil then do ndx = self~childDialogs~first @@ -452,6 +501,9 @@ end end +::method unInit external "LIBRARY oodialog pbdlg_unInit" -- Not to be doumented. + + ::method sendMessageToWindow unguarded external "LIBRARY oodialog pbdlg_sendMessageToWindow" ::method sendMessageToWindowH unguarded external "LIBRARY oodialog pbdlg_sendMessageToWindow" ::method sendMessageToControl unguarded external "LIBRARY oodialog pbdlg_sendMessageToControl" @@ -484,6 +536,17 @@ return self~sendWinIntMsg(self~DM_REPOSITION, 0, 0) +-- initAutoDetection() is invoked by init() to set the default for automatic data field detection. +-- Therefore, subclasses can over-ride this method to change the default, which is enabled. +::method initAutoDetection private -- First data attribute method + self~autoDetection -- autodetection is enabled by default + +::method noAutoDetection + self~autoDetect = .false -- disable autodetection + +::method autoDetection + self~autoDetect = .true -- enable autodetection + /* The following methods 'connect' a Windows dialog control with a 'data' attribute of the Rexx * dialog object. For each dialog control an attribute of the dialog object is created and an * entry is added to the data table to 'connect' the control and the attribute. When auto detection @@ -503,34 +566,20 @@ ::method connectTab unguarded external "LIBRARY oodialog pbdlg_connect_ControName" ::method connectDateTimePicker unguarded external "LIBRARY oodialog pbdlg_connect_ControName" ::method connectMonthCalendar unguarded external "LIBRARY oodialog pbdlg_connect_ControName" -::method connectSeparator unguarded external "LIBRARY oodialog pbdlg_connect_ControName" +::method connectUpDown unguarded external "LIBRARY oodialog pbdlg_connect_ControName" --- Documented "internal use only" in 3.2.0 - Do not document. -::method addAttribute private - use strict arg id, attributeName = ("DATA"id~space(0)) +-- This method gets the 'data' of all the connected dialog controls and uses that data to set the value of the +-- associated attribute. See comment above for setData() +::method getData unguarded + self~putDlgDataInStem(InternDlgData.) - if \ id~dataType("W") then do - if self~processingLoad = 1 then attributeName = id - id = self~resolveSymbolicId(id) + id = self~dataConnection~first + do while (id \= .nil) + self~sendWith(self~dataConnection[id]'=', .array~of(InternDlgData.id)) + id = self~dataConnection~next(id) end - if id < 1 then return -1 - -- Remove any possible spaces, &, and :, then check for a valid name - attributeName = attributeName~space(0)~changestr('&','')~changestr(':','') - if attributeName == "" | self~HasMethod(attributeName) | \ attributeName~datatype('V') then - attributeName = "DATA"id~space(0) - self~dataConnection[id] = attributeName - self~setmethod(attributeName, "expose "attributeName"; return "attributeName) - self~setmethod(attributeName || "=", "expose "attributeName"; use arg "attributeName) - self~sendWith(attributeName || '=', .array~of("")) /* initial value = "" */ - return id - - --- Internal use only. - Do not document. -::method setDlgDataFromStem private unguarded external "LIBRARY oodialog pbdlg_setDlgDataFromStem_pvt" -::method putDlgDataInStem private unguarded external "LIBRARY oodialog pbdlg_putDlgDataInStem_pvt" - -- This method sets the 'data' of all the connected dialog controls using the value of the associated attribute. -- The Windows dialog controls are associated with with a data attribute of the Rexx dialog object through the -- connectXXX methods. connectListBox(), connectComboBox(), etc.. @@ -544,33 +593,20 @@ return self~setDlgDataFromStem(InternDlgData.) --- This method gets the 'data' of all the connected dialog controls and uses that data to set the value of the --- associated attribute. See comment above for setData() -::method getData unguarded +-- This method gets the 'data' of all of the connected dialog controls and sets the indexes of the specified +-- stem with the 'data'. The resource ID of each dialog control is used as an index and the 'data' of that +-- dialog control is set as the value. In addition, if the numeric resource ID has a matching symbolic ID in +-- the constDir, then the symbolic ID is used as a second index and set with the 'data' of the the dialog control. +::method getDataStem unguarded + use arg dataStem. self~putDlgDataInStem(InternDlgData.) - - id = self~dataConnection~first - do while (id \= .nil) - self~sendWith(self~dataConnection[id]'=', .array~of(InternDlgData.id)) - id = self~dataConnection~next(id) + do k over InternDlgData. + dataStem.k = InternDlgData.k + symbolicID = self~resolveNumericID(k) + if symbolicID \== -1 then dataStem.symbolicID = InternDlgData.k end --- The method returns an array that contains the value of each of the attributes associated with a dialog --- control. MM What good is this, you don't know which control is associated with each of the 'data' pieces? -::method makeArray unguarded - - a = .array~new(self~dataConnection~items) - id = self~dataConnection~first - do j = 1 while (id \= .nil) - attributeName = self~dataConnection~at(id) - data = self~send(attributeName) - a[j] = data - id = self~dataConnection~next(id) - end - return a - - -- This method sets the 'data' of each of the connected dialog controls using the values of the specified stem. -- Each index of the stem should be the resource ID of a connected dialog control and the value at that index is -- the 'data' to set the control with. @@ -586,20 +622,6 @@ return self~setDlgDataFromStem(InternDlgData.) --- This method gets the 'data' of all of the connected dialog controls and sets the indexes of the specified --- stem with the 'data'. The resource ID of each dialog control is used as an index and the 'data' of that --- dialog control is set as the value. In addition, if the numeric resource ID has a matching symbolic ID in --- the constDir, then the symbolic ID is used as a second index and set with the 'data' of the the dialog control. -::method getDataStem unguarded - use arg dataStem. - self~putDlgDataInStem(InternDlgData.) - do k over InternDlgData. - dataStem.k = InternDlgData.k - symbolicID = self~resolveNumericID(k) - if symbolicID \== -1 then dataStem.symbolicID = InternDlgData.k - end - - -- The following methods are used to get the 'data' from a single dialog control -- This method gets the 'data' of a dialog control. You don't have to know what kind of control it is @@ -653,7 +675,49 @@ id = self~dataConnection~next(id) end +-- Documented "internal use only" in 3.2.0 - Do not document. +::method addAttribute private -- Not to be doumented. + use strict arg id, attributeName = ("DATA"id~space(0)) + if \ id~dataType("W") then do + if self~processingLoad = 1 then attributeName = id + id = self~resolveSymbolicId(id) + end + if id < 1 then return -1 + + -- Remove any possible spaces, &, and :, then check for a valid name + attributeName = attributeName~space(0)~changestr('&','')~changestr(':','') + if attributeName == "" | self~HasMethod(attributeName) | \ attributeName~datatype('V') then + attributeName = "DATA"id~space(0) + + self~dataConnection[id] = attributeName + self~setmethod(attributeName, "expose "attributeName"; return "attributeName) + self~setmethod(attributeName || "=", "expose "attributeName"; use arg "attributeName) + self~sendWith(attributeName || '=', .array~of("")) /* initial value = "" */ + return id + + +-- Internal use only. - Do not document. +::method setDlgDataFromStem private unguarded external "LIBRARY oodialog pbdlg_setDlgDataFromStem_pvt" -- Not to be doumented. +::method putDlgDataInStem private unguarded external "LIBRARY oodialog pbdlg_putDlgDataInStem_pvt" -- Not to be doumented. + +-- The method returns an array that contains the value of each of the attributes associated with a dialog +-- control. MM What good is this, you don't know which control is associated with each of the 'data' pieces? +::method makeArray unguarded -- Never documented, do not intend to document now -- Last data attribute method. + + a = .array~new(self~dataConnection~items) + id = self~dataConnection~first + do j = 1 while (id \= .nil) + attributeName = self~dataConnection~at(id) + data = self~send(attributeName) + a[j] = data + id = self~dataConnection~next(id) + end + return a + + + + -- Methods to manipulate a ComboBox ::method addComboEntry unguarded @@ -818,71 +882,12 @@ ::method setGroup unguarded external "LIBRARY oodialog pbdlg_setTabGroup" ::method center unguarded external "LIBRARY oodialog pbdlg_center" --- initAutoDetection() is invoked by init() to set the default for automatic data field detection. --- Therefore, subclasses can over-ride this method to change the default, which is enabled. -::method initAutoDetection private - self~autoDetection -- autodetection is enabled by default - -::method noAutoDetection - self~autoDetect = .false -- disable autodetection - -::method autoDetection - self~autoDetect = .true -- enable autodetection - ::method getMenuBar return self~menuBar ::method hasMenuBar return self~menuBar \== .nil & self~isLinked - /* - * The following methods are the default implementations of event handlers - * for the IDOK (resource ID 1,) IDCANCEL (resource ID 2,) and IDHELP - * (resource ID 9) push buttons. The methods are intended to be over-ridden - * if the programmer needs to alter the behavior. - * - * Note that as soon as self~finished is set to true, the dialog is - * terminated. As long as self~finished is false, the dialog continues - * to run. - */ - - /** ok() - * This method first invokes the validate() method. If validate returns - * true, self~initCode is set to 1 and self~finished is set to true, - * terminating the dialog. - * - * If validate returns false, the dialog continues to run. - */ -::method ok unguarded - okayToClose = self~validate - - if okayToClose then do - self~initCode = 1 - self~finished = .true - end - - return self~finished - -::method cancel unguarded - self~initCode = 2 - self~finished = .true - return self~finished - -::method help unguarded - return 0 - -::method leaving - return - -/** validate() - * This method is an abstract method that will be called to determin whether the - * dialog can be closed or not. This function will be called by method OK. If - * the return value is true the dialog can be closed, if it is false the dialog - * should not be closed. - */ -::method validate unguarded - return .true - ::method newStatic unguarded external "LIBRARY oodialog pbdlg_newControl" ::method newPushButton unguarded external "LIBRARY oodialog pbdlg_newControl" ::method newRadioButton unguarded external "LIBRARY oodialog pbdlg_newControl" @@ -904,16 +909,27 @@ -- DEPRECATED (to end of file) -::method clearMessages unguarded ::method deInstall return 0 --- There is no longer a message queue. TODO this was documented, do we need to --- keep a sleep here? +-- There is no longer a message queue. +::method run unguarded private + do while \ self~finished + self~handleMessages + end + ::method handleMessages unguarded j = SysSleep(.010) +::method clearMessages unguarded +::method peekDialogMessage unguarded + return "" + +-- There is no longer a DIALOGADMIN block. +::method dump + say "dump() deprecated." + -- adm was never documented and should just be removed, but it would have been -- needed in the dump() method which was documented. (Even though the -- documentation never explained where a 'dialogadmin' block would come from.) Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/plbdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/plbdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls:5812-6048 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2009 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2005-2010 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 */ @@ -110,14 +110,18 @@ rbtext = p['rightbtntext'] if lbtext~pos(" ") > 0 then lbtext = '"' || lbtext || '"' if rbtext~pos(" ") > 0 then rbtext = '"' || rbtext || '"' + if (p['btnwidth'] > 0) then bw = p['btnwidth']; else bw = 35 - self~createPushButtonGroup(p['w']+p['x']+2-bw*2.25, self~sizeY - 15, bw, , "&Ok 1 OK &Cancel 2 CANCEL", 1, "DEFAULT") - if self~wizard then do - self~createPushButtonGroup(p['x']-2,self~sizeY - 15, bw, , lbtext" 11 PreviousPage" rbtext" 12 NextPage", 1, "") - end + x = trunc(p['w'] + p['x'] + 2 - bw * 2.25) + y = self~sizeY - 15 + pbTextIdMsg = "&Ok 1 OK &Cancel 2 CANCEL" + wizardTextIdMsg = lbtext" 11 PreviousPage" rbtext" 12 NextPage" + self~createPushButtonGroup(x, y, bw, , pbTextIdMsg, 1, "DEFAULT") + if self~wizard then self~createPushButtonGroup(p['x'] - 2, y, bw, , wizardTextIdMsg, 1, "") + ::method initDialog protected tc = self~newTab(9001, 0) @@ -129,11 +133,18 @@ end if self~wizard then self~disableItem(11) - -- call initXXXX for each category, if such a method exists + -- call initXXXX for each category, if such a method exists. The Rect is for + -- setWindowPos(), where the values are ignored because of NOMOVE / NOSIZE. + r = .Rect~new do i = 1 to self~catalog['count'] self~catalog['category'] = i initMethod = "init" || self~catalog['names'][i]~space(0) if self~hasMethod(initMethod) then self~send(initMethod) + + -- This ensures the child dialog is above the tab control and prevents painting + -- problems when the dialog is covered by another window and then uncovered. + wnd = .Window~new(self~catalog['handles'][i]) + wnd~setWindowPos(TOP, r, "NOSIZE NOMOVE NOOWNERZORDER") end /* set the mark to the first radio button */ Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/propsht.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/propsht.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls:5812-6048 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/RcDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/RcDialog.cls 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/RcDialog.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -50,13 +50,16 @@ ::method init use arg rcFile, idDlg, initData., includeFile, options = "", expected = 200 - newArgs = .array~new(2) + newArgs = .array~new(5) if arg(3, 'E') then newArgs[1] = arg(3) if arg(4, 'E') then newArgs[2] = arg(4) + newArgs[3] = rcFile + newArgs[4] = idDlg + forward class (super) arguments (newArgs) continue if result <> 0 then return result self~initCode = self~load(rcFile, idDlg, options, expected) -return self~initCode + return self~initCode Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls 2010-07-10 11:06:30 UTC (rev 6060) @@ -45,27 +45,16 @@ ::class 'ResDialog' subclass PlainBaseDialog public -::method init - expose library resource dlgData. - use arg library, resource, dlgData., includeFile +::method init external "LIBRARY oodialog resdlg_init" - forward class (super) continue - if result \= 0 then return result - - if \ resource~datatype("W") then resource = self~resolveSymbolicId(resource) - if resource < 1 then self~initCode = -1 - - return self~initCode - -- Documented "internal use only" in 3.2.0 - Do not document. ::method startIt - expose library resource dlgData. use strict arg icon = 0, modeless = .false icon = self~resolveIconID(icon) if \ modeless~datatype('O') then modeless = .false - if self~startDialog(library, resource, icon, modeless) then do + if self~startDialog(self~library, self~resourceID, icon, modeless) then do -- if autodetection is on, create the data attributes if self~autoDetect then do ids = self~getDataTableIDs Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/resdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/ResDialog.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/resdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/ResDialog.cls:5812-6048 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/userdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UserDialog.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/userdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UserDialog.cls:5812-6048 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/oodutils.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls:5812-5988 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/oodutils.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls:5812-6048 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/m_oodcls.rex =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/m_oodcls.rex 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/m_oodcls.rex 2010-07-10 11:06:30 UTC (rev 6060) @@ -74,7 +74,7 @@ srcFiles = .array~of("UtilityClasses.cls", "AnimatedButton.cls", "BaseDialog.cls", "CategoryDialog.cls", - "DeprecatedClasses.cls", "DialogControls.cls", "DialogExtensions.cls", "DynamicDialog.cls", - "EventNotification.cls", "Menu.cls", "PlainBaseDialog.cls", "PropertySheet.cls", - - "RcDialog.cls", "ResDialog.cls", "UserDialog.cls") + "RcDialog.cls", "ResDialog.cls", "UserDialog.cls", "ControlDialog.cls") outFile = .stream~new(outdir || outname[3]) if outFile~open("WRITE REPLACE") \= "READY:" then return 9 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-07-09 13:50:50 UTC (rev 6059) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-07-10 11:06:30 UTC (rev 6060) @@ -168,6 +168,23 @@ return hBrush; } +bool loadResourceDLL(pCPlainBaseDialog pcpbd, CSTRING library) +{ + RXCA2T(library); + pcpbd->hInstance = LoadLibrary(libraryT); + if ( ! pcpbd->hInstance ) + { + CHART msg[256]; + _sntprintf(msg, RXITEMCOUNT(msg), + _T("Failed to load Dynamic Link Library (resource DLL.)\n") + _T(" File name:\t\t\t%s\n") + _T(" Windows System Error Code:\t%d\n"), library, GetLastError()); + MessageBox(0, msg, _T("ooDialog DLL Load Error"), MB_OK | MB_ICONHAND | MB_SYSTEMMODAL); + return false; + }... [truncated message content] |
From: <jfa...@us...> - 2010-08-29 23:40:58
|
Revision: 6137 http://oorexx.svn.sourceforge.net/oorexx/?rev=6137&view=rev Author: jfaucher Date: 2010-08-29 23:40:48 +0000 (Sun, 29 Aug 2010) Log Message: ----------- Experimental : Start working on support for encoded strings (m17n). Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/Makefile.am sandbox/jlf/trunk/api/rexx.h sandbox/jlf/trunk/common/Utilities.hpp sandbox/jlf/trunk/common/platform/windows/SysDebug.cpp sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp sandbox/jlf/trunk/interpreter/classes/StringClass.cpp sandbox/jlf/trunk/interpreter/classes/StringClass.hpp sandbox/jlf/trunk/interpreter/interpreter.mak sandbox/jlf/trunk/interpreter/runtime/Interpreter.cpp sandbox/jlf/trunk/orxdb.bat sandbox/jlf/trunk/platform/windows/buildorx.bat sandbox/jlf/unicode/_readme.odt Added Paths: ----------- sandbox/jlf/trunk/common/platform/unix/SysUtilities.cpp sandbox/jlf/trunk/common/platform/windows/SysUtilities.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/ sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/ sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_ascii.c sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_ascii.h sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_binary.c sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_binary.h sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_iso-8859-1.c sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_iso-8859-1.h sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_tables.c sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_tables.h sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_unicode.c sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_unicode.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/ sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_fixed_8.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_fixed_8.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs2.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs2.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs4.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs4.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf16.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf16.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf8.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf8.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_api.c sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_cclass.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_charset.c sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_charset.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_encoding.c sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_encoding.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_string.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_string_funcs.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_unicode.h Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-08-28 15:15:09 UTC (rev 6136) +++ sandbox/jlf/_diary.txt 2010-08-29 23:40:48 UTC (rev 6137) @@ -20,6 +20,11 @@ Named parameters (by opposition to positional parameters). In C#, they say it's useful for calling COM services. I have some Excel macros that would be simpler to call with that. +--> I started to think about that, but it appears that the ooRexx arguments are not easy to manage by name. +It's because the arguments are not declared in a single place at the begining of a procedure/routine/method. +They can be declared several times, and complex expressions can be used (stem, instance's attribute, ...). +Moreover, named arguments can be passed in any order, and that's a problem with current management by array. +So, I give up... Deferred evaluation of parameters. Let the routine/method decide which parameters must be evaluated, ex : iif(cond, iftrue, ifalse) @@ -28,9 +33,65 @@ Unicode ? --> added support for wide-chars in oodialog. +--> in progress : m17n =============================================================================== +2010 aug 28 + +Added encoding to RexxString (m17n) : I borrowed the Parrot's implementation +(the overall design is kept, but a lot of things has been adapted to ooRexx). + +For the moment, I have three sources of inspiration : Parrot, Ruby, Falcon +I choosed Parrot to start, because it uses ICU if available at compile-time. +It's a minimal use, but at least I can put my hands on ICU through a concrete work. +One pointer for charset and one pointer for encoding is probably too much, but this is +how Parrot is implemented... And a third pointer is coming, for NFG. +[2010 aug 25] New, there is an RFC to merge charsets and encodings : +http://lists.parrot.org/pipermail/parrot-dev/2010-August/004633.html + +Ruby's m17n is more complete than Parrot's, but seems more difficult to apprehend. +The encoding is stored as a 16 bits index. + +Falcon is not like Parrot or Ruby, its internal charset is Unicode only. +I'm interested by its "string polymorphism". +The string manager (ako encoding) is stored as a pointer. + +See unicode/_readme.odt for more details. + + +To build with ICU under Windows : + set HAVE_ICU=1 <-- assign 0 or put this line in comment if you don't want to build with ICU + set icu_dir=D:\local\Unicode\ICU\icu4c-4_4_1-Win32-msvc9 + set PATH=%icu_dir%\bin;%PATH% + set INCLUDE=%icu_dir%\include;%INCLUDE% + set LIB=%icu_dir%\lib;%LIB% + +The environment variable HAVE_ICU is tested in buildorx.bat : + set ICU_OPTION= + if defined HAVE_ICU set ICU_OPTION="HAVE_ICU=%HAVE_ICU%" + NMAKE /F INTERPRETER.MAK %ICU_OPTION% + +interpreter.mak : + !IFNDEF HAVE_ICU + HAVE_ICU=0 + !ENDIF + + !IF "$(HAVE_ICU)" == "0" + ICU_OPTIONS= + !ELSE + ICU_OPTIONS=/DHAVE_ICU + !ENDIF + + +Careful if building from Visual Studio (no problem when building from Cmd shell) : +The INCLUDE environment variable is redefined by Visual Studio, and because of that, +the ICU headers are not found. You must launch Visual Studio like that : + vcexpress /useenv +See makeorx_verbose.bat for more details to build from Visual Studio. + + +=============================================================================== 2010 july 3 Continue Unicode review : added notes about Falcon. Modified: sandbox/jlf/trunk/Makefile.am =================================================================== --- sandbox/jlf/trunk/Makefile.am 2010-08-28 15:15:09 UTC (rev 6136) +++ sandbox/jlf/trunk/Makefile.am 2010-08-29 23:40:48 UTC (rev 6137) @@ -477,6 +477,7 @@ $(build_rexxapi_common_platform_dir)/SysProcess.cpp \ $(build_common_dir)/Utilities.cpp \ $(build_common_platform_dir)/SysDebug.cpp \ + $(build_common_platform_dir)/SysUtilities.cpp \ $(build_common_platform_dir)/SysSemaphore.cpp \ $(build_common_platform_dir)/SysLibrary.cpp \ $(build_common_platform_dir)/SysFile.cpp \ @@ -663,6 +664,7 @@ $(build_interpreter_platform_dir)/ValueFunction.cpp common_sources = $(build_common_dir)/Utilities.cpp \ $(build_common_platform_dir)/SysDebug.cpp \ + $(build_common_platform_dir)/SysUtilities.cpp \ $(build_common_platform_dir)/SysFile.cpp \ $(build_common_platform_dir)/SysLibrary.cpp \ $(build_common_platform_dir)/SysSemaphore.cpp \ Modified: sandbox/jlf/trunk/api/rexx.h =================================================================== --- sandbox/jlf/trunk/api/rexx.h 2010-08-28 15:15:09 UTC (rev 6136) +++ sandbox/jlf/trunk/api/rexx.h 2010-08-29 23:40:48 UTC (rev 6137) @@ -222,6 +222,7 @@ #include "rexxplatformdefs.h" // Platform specific stuff typedef size_t stringsize_t; // a Rexx string size +typedef ssize_t sstringsize_t; // a Rexx signed string size, which allows to pass -1 as default value typedef ssize_t wholenumber_t; // a Rexx whole number typedef size_t logical_t; // a Rexx logical (1 or 0) value Modified: sandbox/jlf/trunk/common/Utilities.hpp =================================================================== --- sandbox/jlf/trunk/common/Utilities.hpp 2010-08-28 15:15:09 UTC (rev 6136) +++ sandbox/jlf/trunk/common/Utilities.hpp 2010-08-29 23:40:48 UTC (rev 6137) @@ -51,6 +51,8 @@ static void strlower(char *str); static const char *strnchr(const char *, size_t n, char ch); static const char *locateCharacter(const char *s, const char *set, size_t l); + static int vsnprintf(char *buffer, size_t count, const char *format, va_list args); + static int snprintf(char *buffer, size_t count, const char *format, ...); }; #endif Added: sandbox/jlf/trunk/common/platform/unix/SysUtilities.cpp =================================================================== --- sandbox/jlf/trunk/common/platform/unix/SysUtilities.cpp (rev 0) +++ sandbox/jlf/trunk/common/platform/unix/SysUtilities.cpp 2010-08-29 23:40:48 UTC (rev 6137) @@ -0,0 +1,121 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2010 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 <stdio.h> +#include "Utilities.hpp" + +/** + * Encapsulation of vsnprintf Unix implementation. + * The goal is to have the same behavior on all platforms. + * + * @param buffer Buffer receiving the formated output. + * @param size Size of buffer. + * @param format Format string. + * @param args Pointer to optional arguments + * + * @return Upon successful completion, return the number of bytes stored in buffer, not counting the terminating null character + * or a negative value if an error was encountered. + */ +int Utilities::vsnprintf(char *buffer, size_t count, const char *format, va_list args) +{ + /* + http://linux.die.net/man/3/snprintf + + Return value + Upon successful return, return the number of characters printed (not including the trailing '\0' used to end output to strings). + The functions snprintf() do not write more than size bytes (including the trailing '\0'). + If the output was truncated due to this limit then the return value is the number of characters (not including the trailing '\0') which would have been written to the final string if enough space had been available. + Thus, a return value of size or more means that the output was truncated. (See also below under NOTES.) + If an output error is encountered, a negative value is returned. + + Conforming To + The snprintf() function conform to C99. + Concerning the return value of snprintf(), SUSv2 and C99 contradict each other: + when snprintf() is called with size=0 then SUSv2 stipulates an unspecified return value less than 1, + while C99 allows str to be NULL in this case, and gives the return value (as always) as the number of characters that would have been written in case the output string has been large enough. + + Notes + The glibc implementation of the functions snprintf() conforms to the C99 standard, i.e., behaves as described above, since glibc version 2.1. + Until glibc 2.0.6 they would return -1 when the output was truncated. + */ + + /* + vsnprintf behavior, assuming the buffer is 4 bytes : + 0 1 2 3 + "x" x \0 return value = 1 + "xx" x x \0 return value = 2 + "xxx" x x x \0 return value = 3 + "xxxx" x x x \0 return value = 4 <-- different from Windows + "xxxxx" x x x \0 return value = 5 <-- different from Windows + */ + + if (buffer == NULL || count == 0) return -1; + int n = vsnprintf(buffer, count, format, args); + buffer[count-1] = '\0'; // Normally not needed, but... + if (n >= count) n = -1; // The output has been truncated, return -1 to have a common behavior with Windows platform + return n; +} + + +/** + * Encapsulation of snprintf Unix implementation. + * The goal is to have the same behavior on all platforms. + * + * @param buffer Buffer receiving the formated output. + * @param size Size of buffer. + * @param format Format string. + * @param ... Optional arguments + * + * @return Upon successful completion, return the number of bytes stored in buffer, not counting the terminating null character + * or a negative value if an error was encountered. + */ +int Utilities::snprintf(char *buffer, size_t count, const char *format, ...) +{ + va_list args; + va_start(args, format); + int n = Utilities::vsnprintf(buffer, count, format, args); + va_end(args); + return n; +} + Property changes on: sandbox/jlf/trunk/common/platform/unix/SysUtilities.cpp ___________________________________________________________________ Added: svn:eol-style + LF Modified: sandbox/jlf/trunk/common/platform/windows/SysDebug.cpp =================================================================== --- sandbox/jlf/trunk/common/platform/windows/SysDebug.cpp 2010-08-28 15:15:09 UTC (rev 6136) +++ sandbox/jlf/trunk/common/platform/windows/SysDebug.cpp 2010-08-29 23:40:48 UTC (rev 6137) @@ -49,7 +49,7 @@ int n; va_start(args, format); - n = vsnprintf(p, sizeof buf - 1, format, args); + n = _vsnprintf(p, sizeof buf - 1, format, args); va_end(args); OutputDebugString(buf); Added: sandbox/jlf/trunk/common/platform/windows/SysUtilities.cpp =================================================================== --- sandbox/jlf/trunk/common/platform/windows/SysUtilities.cpp (rev 0) +++ sandbox/jlf/trunk/common/platform/windows/SysUtilities.cpp 2010-08-29 23:40:48 UTC (rev 6137) @@ -0,0 +1,113 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ +/* Copyright (c) 2005-2010 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 <stdio.h> +#include <stdarg.h> + +#include "Utilities.hpp" + +/** + * Encapsulation of _vsnprintf Windows implementation. + * The goal is to have the same behavior on all platforms. + * + * @param buffer Buffer receiving the formated output. + * @param size Size of buffer. + * @param format Format string. + * @param args Pointer to optional arguments + * + * @return Upon successful completion, return the number of bytes stored in buffer, not counting the terminating null character + * or a negative value if an error was encountered. + */ +int Utilities::vsnprintf(char *buffer, size_t count, const char *format, va_list args) +{ + /* + http://msdn.microsoft.com/en-us/library/1kt27hek%28v=VS.71%29.aspx + + Return value + _vsnprintf returns the number of bytes stored in buffer, not counting the terminating null character. + If the number of bytes required to store the data exceeds count, then count bytes of data are stored in buffer and a negative value is returned. + + Remarks + The _snprintf function formats and stores count or fewer characters and values (including a terminating null character that is always appended + unless count is zero or the formatted string length is greater than or equal to count characters) in buffer. + */ + + /* + _vsnprintf behavior, assuming the buffer is 4 bytes : + 0 1 2 3 + "x" x \0 return value = 1 + "xx" x x \0 return value = 2 + "xxx" x x x \0 return value = 3 + "xxxx" x x x x return value = -1 (truncated, no final '\0') + "xxxxx" x x x x return value = -1 (truncated, no final '\0') + */ + + if (buffer == NULL || count == 0) return -1; + int n = _vsnprintf(buffer, count, format, args); + buffer[count-1] = '\0'; // Unlike Unix implementation, we are not sure to have a final '\0' + return n; +} + + +/** + * Encapsulation of snprintf Windows implementation. + * The goal is to have the same behavior on all platforms. + * + * @param buffer Buffer receiving the formated output. + * @param size Size of buffer. + * @param format Format string. + * @param ... Optional arguments + * + * @return Upon successful completion, return the number of bytes stored in buffer, not counting the terminating null character + * or a negative value if an error was encountered. + */ +int Utilities::snprintf(char *buffer, size_t count, const char *format, ...) +{ + va_list args; + va_start(args, format); + int n = Utilities::vsnprintf(buffer, count, format, args); + va_end(args); + return n; +} + Property changes on: sandbox/jlf/trunk/common/platform/windows/SysUtilities.cpp ___________________________________________________________________ Added: svn:eol-style + LF Modified: sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp 2010-08-28 15:15:09 UTC (rev 6136) +++ sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp 2010-08-29 23:40:48 UTC (rev 6137) @@ -50,6 +50,7 @@ #include "MutableBufferClass.hpp" #include "ProtectedObject.hpp" #include "StringUtil.hpp" +#include "m17n_charset.h" // singleton class instance @@ -103,15 +104,18 @@ /* input string longer than demanded */ /* minimum size? expand accordingly */ - if (string->getLength() > bufferLength) + if (string->getBLength() > bufferLength) { - bufferLength = string->getLength(); + bufferLength = string->getBLength(); } /* allocate the new object */ newBuffer = new ((RexxClass *)this) RexxMutableBuffer(bufferLength, defaultSize); - newBuffer->dataLength = string->getLength(); + newBuffer->setBLength(string->getBLength()); + newBuffer->setCLength(string->getCLength()); + newBuffer->setCharset(string->getCharset()); + newBuffer->setEncoding(string->getEncoding()); /* copy the content */ - newBuffer->data->copyData(0, string->getStringData(), string->getLength()); + newBuffer->data->copyData(0, string->getStringData(), string->getBLength()); ProtectedObject p(newBuffer); newBuffer->sendMessage(OREF_INIT, args, argc > 2 ? argc - 2 : 0); @@ -122,7 +126,7 @@ /** * Default constructor. */ -RexxMutableBuffer::RexxMutableBuffer() +RexxMutableBuffer::RexxMutableBuffer(const char *charsetName) { bufferLength = DEFAULT_BUFFER_LENGTH; /* save the length of the buffer */ defaultSize = bufferLength; /* store the default buffer size */ @@ -131,17 +135,47 @@ // reference. data = OREF_NULL; data = new_buffer(bufferLength); + data->setDataLength(0); // strange to have dataLength equal to bufferSize by default... I assign 0 instead. + dataBLength = 0; + dataCLength = 0; + CHARSET *charset = NULL; + if (charsetName != NULL) charset = m17n_find_charset(charsetName, true); // true : raise exception if unknown + if (charset == NULL) charset = m17n_default_charset(); + ENCODING *encoding = charset->preferred_encoding; + this->setCharset(charset); + this->setEncoding(encoding); } /** + * Constructor with explicitly set charset and encoding. + */ +RexxMutableBuffer::RexxMutableBuffer(CHARSET *charset, ENCODING *encoding) +{ + bufferLength = DEFAULT_BUFFER_LENGTH; /* save the length of the buffer */ + defaultSize = bufferLength; /* store the default buffer size */ + // NB: we clear this before we allocate the new buffer because allocating the + // new buffer might trigger a garbage collection, causing us to mark bogus + // reference. + data = OREF_NULL; + data = new_buffer(bufferLength); + data->setDataLength(0); // strange to have dataLength equal to bufferSize by default... I assign 0 instead. + dataBLength = 0; + dataCLength = 0; + + this->setCharset(charset ? charset : m17n_default_charset()); + this->setEncoding(encoding ? encoding : charset->preferred_encoding); +} + + +/** * Constructor with explicitly set size and default. * * @param l Initial length. * @param d The explicit default size. */ -RexxMutableBuffer::RexxMutableBuffer(size_t l, size_t d) +RexxMutableBuffer::RexxMutableBuffer(size_t l, size_t d, const char *charsetName) { bufferLength = l; /* save the length of the buffer */ defaultSize = d; /* store the default buffer size */ @@ -149,10 +183,43 @@ // new buffer in case garbage collection is triggered. data = OREF_NULL; data = new_buffer(bufferLength); + data->setDataLength(0); // strange to have dataLength equal to bufferSize by default... I assign 0 instead. + dataBLength = 0; + dataCLength = 0; + + CHARSET *charset = NULL; + if (charsetName != NULL) charset = m17n_find_charset(charsetName, true); // true : raise exception if unknown + if (charset == NULL) charset = m17n_default_charset(); + ENCODING *encoding = charset->preferred_encoding; + this->setCharset(charset); + this->setEncoding(encoding); } /** + * Constructor with explicitly set size and default, and explicitly set charset and encoding. + * + * @param l Initial length. + * @param d The explicit default size. + */ +RexxMutableBuffer::RexxMutableBuffer(size_t l, size_t d, CHARSET *charset, ENCODING *encoding) +{ + bufferLength = l; /* save the length of the buffer */ + defaultSize = d; /* store the default buffer size */ + // NB: As in the default constructor, we clear this before we allocate the + // new buffer in case garbage collection is triggered. + data = OREF_NULL; + data = new_buffer(bufferLength); + data->setDataLength(0); // strange to have dataLength equal to bufferSize by default... I assign 0 instead. + dataBLength = 0; + dataCLength = 0; + + this->setCharset(charset ? charset : m17n_default_charset()); + this->setEncoding(encoding ? encoding : charset->preferred_encoding); +} + + +/** * Create a new mutable buffer object from a potential subclass. * * @param size The size of the buffer object. @@ -225,7 +292,8 @@ /* see the comments in ::newRexx()!! */ newObj->data = new_buffer(bufferLength); - newObj->dataLength = this->dataLength; + newObj->dataBLength = this->dataBLength; + newObj->dataCLength = this->dataCLength; newObj->data->copyData(0, data->getData(), bufferLength); newObj->defaultSize = this->defaultSize; @@ -238,7 +306,7 @@ /* Function: append to the mutable buffer */ /******************************************************************************/ { - size_t resultLength = this->dataLength + addedLength; + size_t resultLength = this->dataBLength + addedLength; if (resultLength > bufferLength) { /* need to enlarge? */ @@ -250,7 +318,7 @@ RexxBuffer *newBuffer = new_buffer(bufferLength); // copy the data into the new buffer - newBuffer->copyData(0, data->getData(), dataLength); + newBuffer->copyData(0, data->getData(), dataBLength); // replace the old data buffer OrefSet(this, this->data, newBuffer); } @@ -264,7 +332,7 @@ */ RexxObject *RexxMutableBuffer::lengthRexx() { - return new_integer(dataLength); + return new_integer(getLength()); } @@ -276,14 +344,30 @@ RexxString *string = stringArgument(obj, ARG_ONE); ProtectedObject p(string); // make sure we have enough room - ensureCapacity(string->getLength()); + ensureCapacity(string->getBLength()); - data->copyData(dataLength, string->getStringData(), string->getLength()); - this->dataLength += string->getLength(); + data->copyData(dataBLength, string->getStringData(), string->getBLength()); + this->dataBLength += string->getBLength(); + this->dataCLength += string->getCLength(); return this; } +RexxMutableBuffer *RexxMutableBuffer::appendCstring(const char *data, size_t blength) +/******************************************************************************/ +/* Function: append to the mutable buffer */ +/******************************************************************************/ +{ + // make sure we have enough room + ensureCapacity(blength); + + this->data->copyData(dataBLength, data, blength); + this->dataBLength += blength; + this->dataCLength += this->getEncoding()->codepoints(data, blength); + return this; +} + + RexxMutableBuffer *RexxMutableBuffer::insert(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad) /******************************************************************************/ /* Function: insert string at given position */ @@ -304,7 +388,7 @@ // if inserting within the current bounds, we only need to add the length // if inserting beyond the end, we need to make sure we add space for the gap too - if (begin < dataLength) + if (begin < dataBLength) { // if inserting a zero length string, this is simple! if (insertLength == 0) @@ -315,19 +399,19 @@ } else { - ensureCapacity(insertLength + (begin - dataLength)); + ensureCapacity(insertLength + (begin - dataBLength)); } /* create space in the buffer */ - if (begin < dataLength) + if (begin < dataBLength) { - data->openGap(begin, insertLength, dataLength - begin); + data->openGap(begin, insertLength, dataBLength - begin); } - else if (begin > this->dataLength) + else if (begin > this->dataBLength) { /* pad before insertion */ - data->setData(dataLength, padChar, begin - dataLength); + data->setData(dataBLength, padChar, begin - dataBLength); } /* insert string contents */ data->copyData(begin, string->getStringData(), copyLength); @@ -337,14 +421,14 @@ data->setData(begin + string->getLength(), padChar, padLength); } // inserting after the end? the resulting length is measured from the insertion point - if (begin > this->dataLength) + if (begin > this->dataBLength) { - this->dataLength = begin + insertLength; + this->dataBLength = begin + insertLength; } else { // just add in the inserted length - this->dataLength += insertLength; + this->dataBLength += insertLength; } return this; } @@ -365,10 +449,10 @@ ensureCapacity(begin + replaceLength); // is our start position beyond the current data end? - if (begin > dataLength) + if (begin > dataBLength) { // add padding to the gap - data->setData(dataLength, padChar, begin - dataLength); + data->setData(dataBLength, padChar, begin - dataBLength); } // now overlay the string data @@ -381,10 +465,10 @@ } // did this add to the size? - if (begin + replaceLength > dataLength) + if (begin + replaceLength > dataBLength) { //adjust upward - dataLength = begin + replaceLength; + dataBLength = begin + replaceLength; } return this; } @@ -420,7 +504,7 @@ // will this extend beyond the end of the string, we require // space for the position + the replacement string length - if (begin + newLength > dataLength) + if (begin + newLength > dataBLength) { finalLength = begin + newLength; } @@ -428,7 +512,7 @@ { // we need to add the delta between the excised string and the inserted // replacement string - finalLength = dataLength - replaceLength + newLength; + finalLength = dataBLength - replaceLength + newLength; } // make sure we have room for this @@ -437,10 +521,10 @@ // is our start position beyond the current data end? // NB: Even though we've adjusted the buffer size, the dataLength is still // the original entry length. - if (begin > dataLength) + if (begin > dataBLength) { // add padding to the gap - data->setData(dataLength, padChar, begin - dataLength); + data->setData(dataBLength, padChar, begin - dataBLength); // now overlay the string data data->copyData(begin, string->getStringData(), newLength); } @@ -458,7 +542,7 @@ } // and finally adjust the length - dataLength = finalLength; + dataBLength = finalLength; // our return value is always the target mutable buffer return this; } @@ -473,31 +557,30 @@ size_t range = optionalLengthArgument(len, this->data->getDataLength() - begin, ARG_TWO); // is the begin point actually within the string? - if (begin < dataLength) + if (begin < dataBLength) { /* got some work to do? */ // deleting from the middle? - if (begin + range < dataLength) + if (begin + range < dataBLength) { // shift everything over - data->closeGap(begin, range, dataLength - (begin + range)); - dataLength -= range; + data->closeGap(begin, range, dataBLength - (begin + range)); + dataBLength -= range; } else { // we're just truncating - dataLength = begin; + dataBLength = begin; } } return this; } -RexxObject *RexxMutableBuffer::setBufferSize(RexxInteger *size) +RexxObject *RexxMutableBuffer::setBufferLength(size_t newsize) /******************************************************************************/ /* Function: set the size of the buffer */ /******************************************************************************/ { - size_t newsize = lengthArgument(size, ARG_ONE); // has a reset to zero been requested? if (newsize == 0) { @@ -509,7 +592,8 @@ // reset the size to the default bufferLength = defaultSize; } - dataLength = 0; + dataBLength = 0; + dataCLength = 0; } // an actual resize? else if (newsize != bufferLength) @@ -517,8 +601,9 @@ // reallocate the buffer RexxBuffer *newBuffer = new_buffer(newsize); // if we're shrinking this, it truncates. - dataLength = Numerics::minVal(dataLength, newsize); - newBuffer->copyData(0, data->getData(), dataLength); + dataBLength = Numerics::minVal(dataBLength, newsize); + // todo : dataCLength + newBuffer->copyData(0, data->getData(), dataBLength); // replace the old buffer OrefSet(this, this->data, newBuffer); // and update the size.... @@ -528,12 +613,22 @@ } +RexxObject *RexxMutableBuffer::setBufferSize(RexxInteger *size) +/******************************************************************************/ +/* Function: set the size of the buffer */ +/******************************************************************************/ +{ + size_t newsize = lengthArgument(size, ARG_ONE); + return this->setBufferLength(newsize); +} + + RexxString *RexxMutableBuffer::makeString() /******************************************************************************/ /* Function: Handle a REQUEST('STRING') request for a mutablebuffer object */ /******************************************************************************/ { - return new_string(data->getData(), dataLength); + return new_string(this->data->getData(), this->dataBLength, this->dataCLength, this->getCharset(), this->getEncoding()); } @@ -811,7 +906,8 @@ } } // update the result length, and return - dataLength = resultLength; + dataBLength = resultLength; + // todo : dataCLength return this; } @@ -949,7 +1045,8 @@ } } // update the result length, and return - dataLength = resultLength; + dataBLength = resultLength; + // todo : dataCLength return this; } @@ -1483,10 +1580,11 @@ StringUtil::skipBlanks(&nextSite, &length);/* skip over trailing blanks */ } - size_t gapSize = dataLength - (deletePosition + length); + size_t gapSize = dataBLength - (deletePosition + length); // close up the delete part closeGap(deletePosition, gapSize, length); // adjust for the deleted data - dataLength -= gapSize; + dataBLength -= gapSize; + // todo : dataCLength return this; } Modified: sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp 2010-08-28 15:15:09 UTC (rev 6136) +++ sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp 2010-08-29 23:40:48 UTC (rev 6137) @@ -48,6 +48,9 @@ #include "IntegerClass.hpp" #include "BufferClass.hpp" +class ENCODING; +class CHARSET; + class RexxMutableBuffer; class RexxClass; @@ -64,8 +67,10 @@ inline void *operator new(size_t size, void *ptr){return ptr;}; void *operator new(size_t size, RexxClass *bufferClass); void *operator new(size_t size); - RexxMutableBuffer(); - RexxMutableBuffer(size_t, size_t); + RexxMutableBuffer(const char *charsetName=NULL); + RexxMutableBuffer(CHARSET *charset, ENCODING *encoding); + RexxMutableBuffer(size_t, size_t, const char *charsetName=NULL); + RexxMutableBuffer(size_t, size_t, CHARSET *charset, ENCODING *encoding); inline RexxMutableBuffer(RESTORETYPE restoreType) { ; }; void live(size_t); @@ -78,6 +83,7 @@ RexxObject *lengthRexx(); RexxMutableBuffer *append(RexxObject*); + RexxMutableBuffer *appendCstring(const char*, size_t blength); // Must not overload append : would generate error cannot convert from 'overloaded-function' to 'PCPPM' in memory/setup.cpp RexxMutableBuffer *insert(RexxObject*, RexxObject*, RexxObject*, RexxObject*); RexxMutableBuffer *overlay(RexxObject*, RexxObject*, RexxObject*, RexxObject*); RexxMutableBuffer *replaceAt(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad); @@ -116,8 +122,19 @@ RexxInteger *caselessWordPos(RexxString *, RexxInteger *); RexxMutableBuffer *delWord(RexxInteger *position, RexxInteger *plength); + inline CHARSET *getCharset() { return m17n_get_charset(this->charset); } + inline void setCharset(CHARSET *c) { this->charset = c ? (int8_t) c->number : -1; } + inline ENCODING *getEncoding() { return m17n_get_encoding(this->encoding); } + inline void setEncoding(ENCODING *e) { this->encoding = e ? (int8_t) e->number : -1; } inline const char *getStringData() { return data->getData(); } - inline size_t getLength() { return dataLength; } + inline size_t getLength() { return dataBLength; } // which length to return ? the number of bytes seems safer for legacy applications. See also RexxString::getLength + inline size_t getBLength() { return dataBLength; } + inline size_t getCLength() { return dataCLength; } + inline void setLength(size_t l) { dataBLength = l; }; // see getLength + inline void setBLength(size_t l) { dataBLength = l; }; + inline void setCLength(size_t l) { dataCLength = l; }; + inline size_t getBufferLength() { return bufferLength; } + RexxObject *setBufferLength(size_t); inline char * getData() { return data->getData(); } inline void copyData(size_t offset, const char *string, size_t l) { data->copyData(offset, string, l); } inline void openGap(size_t offset, size_t _size, size_t tailSize) { data->openGap(offset, _size, tailSize); } @@ -132,9 +149,35 @@ protected: - size_t bufferLength; /* buffer length */ + int8_t encoding; // string encoding (how the codepoints are serialized in stringData) + int8_t charset; // string charset (what is the semantic of the codepoints) + size_t bufferLength; /* buffer length in bytes */ size_t defaultSize; /* default size when emptied */ - size_t dataLength; // current length of data + size_t dataBLength; // current length of data in bytes + size_t dataCLength; // current length of data in characters RexxBuffer *data; /* buffer used for the data */ }; + + // For the needs of m17n, must have a common interface for RexxString and RexxMutableBuffer. + // Can't use multiple inheritance, so I use delegation... + class RexxMutableBufferWrapper : public IRexxString { + public: + RexxMutableBufferWrapper(RexxMutableBuffer *s) : str(s) {} + inline RexxString *makeString() { return str->makeString(); } + inline RexxMutableBuffer *makeMutableBuffer() { return str; } + inline CHARSET *getCharset() { return str->getCharset(); } + inline void setCharset(CHARSET *c) { return str->setCharset(c); } + inline ENCODING *getEncoding() { return str->getEncoding(); } + inline void setEncoding(ENCODING *e) { str->setEncoding(e); } + inline size_t getBLength() { return str->getBLength(); }; + inline size_t getCLength() { return str->getCLength(); }; + inline void setLength(size_t l) { str->setBLength(l); }; + inline void setBLength(size_t l) { str->setBLength(l); }; + inline void setCLength(size_t l) { str->setCLength(l); }; + inline const char *getStringData() { return str->getStringData(); } + inline char *getWritableData() { return str->getData(); } + private: + RexxMutableBuffer *str; + }; + #endif Modified: sandbox/jlf/trunk/interpreter/classes/StringClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/StringClass.cpp 2010-08-28 15:15:09 UTC (rev 6136) +++ sandbox/jlf/trunk/interpreter/classes/StringClass.cpp 2010-08-29 23:40:48 UTC (rev 6137) @@ -56,6 +56,7 @@ #include "StringUtil.hpp" #include "RexxCompoundTail.hpp" #include "SystemInterpreter.hpp" +#include "MutableBufferClass.hpp" // singleton class instance RexxClass *RexxString::classInstance = OREF_NULL; @@ -192,7 +193,7 @@ } else /* need to build a new string */ { - return new_string(this->getStringData(), this->getLength()); + return new_string(this->getStringData(), this->getBLength(), this->getCLength(), this->getCharset(), this->getEncoding()); } } @@ -207,7 +208,7 @@ } else /* need to create a new string */ { - return new_string(this->getStringData(), this->getLength()); + return new_string(this->getStringData(), this->getBLength(), this->getCLength(), this->getCharset(), this->getEncoding()); } } @@ -218,7 +219,7 @@ /******************************************************************************/ { /* copy this directly into the tail */ - tail->append(this->getStringData(), this->getLength()); + tail->append(this->getStringData(), this->getLength()); // todo : to restrict to fixed-8:ascii ? } @@ -443,15 +444,15 @@ { size_t copylen = 0; - if (startPos < this->getLength()) + if (startPos < this->getBLength()) { - if (bufl <= this->getLength() - startPos) + if (bufl <= this->getBLength() - startPos) { copylen = bufl; } else { - copylen = this->getLength() - startPos; + copylen = this->getBLength() - startPos; } memcpy(buffer, this->getStringData() + startPos, (size_t)copylen); } @@ -1075,32 +1076,38 @@ /* Function: Concatenate two strings together */ /******************************************************************************/ { - size_t len1; /* length of first string */ - size_t len2; /* length of second string */ + // Todo : use m17n service for concatenation. + // Current implementation is safe only if both strings have same charset and same encoding. + size_t blen1; /* length of first string */ + size_t clen1; + size_t blen2; /* length of second string */ + size_t clen2; RexxString *result; /* result string */ char *data; /* character pointer */ - len1 = this->getLength(); /* get this length */ - len2 = other->getLength(); /* and the other length */ + blen1 = this->getBLength(); /* get this length */ + clen1 = this->getCLength(); + blen2 = other->getBLength(); /* and the other length */ + clen2 = other->getCLength(); - if (len2 == 0) // some people have taken to using a''b + if (blen2 == 0) // some people have taken to using a''b { // to perform concatenation operations return this; // it makes sense to optimize concatenation } // with a null string by just returning - if (len1 == 0) // the non-null object. + if (blen1 == 0) // the non-null object. { return other; } /* create a new string */ - result = (RexxString *)raw_string(len1+len2); + result = (RexxString *)raw_string(blen1+blen2, clen1+clen2, this->getCharset(), this->getEncoding()); data = result->getWritableData(); /* point to the string data */ // both lengths are non-zero because of the test above, so we can // unconditionally copy /* copy the front part */ - memcpy(data, this->getStringData(), len1); - memcpy(data + len1, other->getStringData(), len2); + memcpy(data, this->getStringData(), blen1); + memcpy(data + blen1, other->getStringData(), blen2); return result; /* return the result */ } @@ -1110,8 +1117,12 @@ /* Function: Rexx level concatenate...requires conversion and checking */ /******************************************************************************/ { - size_t len1; /* length of first string */ - size_t len2; /* length of second string */ + // Todo : use m17n service for concatenation. + // Current implementation is safe only if both strings have same charset and same encoding. + size_t blen1; /* length of first string */ + size_t clen1; + size_t blen2; /* length of second string */ + size_t clen2; RexxString *result; /* result string */ RexxString *other; char *data; /* character pointer */ @@ -1130,72 +1141,117 @@ /* in string_concat, but is repeated */ /* here because this is a VERY high */ /* use function */ - len1 = this->getLength(); /* get this length */ - len2 = other->getLength(); /* and the other length */ + blen1 = this->getBLength(); /* get this length */ + clen1 = this->getCLength(); + blen2 = other->getBLength(); /* and the other length */ + clen2 = other->getCLength(); /* create a new string */ - result = (RexxString *)raw_string(len1+len2); + result = (RexxString *)raw_string(blen1+blen2, clen1+clen2, this->getCharset(), this->getEncoding()); data = result->getWritableData(); /* point to the string data */ - if (len1 != 0) + if (blen1 != 0) { /* have real data? */ /* copy the front part */ - memcpy(data, this->getStringData(), len1); - data += len1; /* step past the length */ + memcpy(data, this->getStringData(), blen1); + data += blen1; /* step past the length */ } - if (len2 != 0) /* have a second length */ + if (blen2 != 0) /* have a second length */ { /* and the second part */ - memcpy(data, other->getStringData(), len2); + memcpy(data, other->getStringData(), blen2); } return result; /* return the result */ } -RexxString *RexxString::concatToCstring(const char *other) +RexxString *RexxString::concatToCstring(const char *other, CHARSET *charset, ENCODING *encoding) /******************************************************************************/ /* Function: Concatenate a string object onto an ASCII-Z string */ /******************************************************************************/ { - size_t len1; /* length of first string */ - size_t len2; /* length of ASCII-Z string */ + // Todo : use m17n service for concatenation. + // Current implementation is safe only if both strings have same charset and same encoding. + size_t blen1; /* length of first string */ + size_t clen1; + size_t blen2; /* length of ASCII-Z string */ + size_t clen2; RexxString *result; /* result string */ - len1 = this->getLength(); /* get this length */ - len2 = strlen(other); /* and the other length */ + blen1 = this->getBLength(); /* get this length */ + clen1 = this->getCLength(); + blen2 = strlen(other); /* and the other length */ + clen2 = encoding->codepoints(other, blen2); /* create a new string */ - result = (RexxString *)raw_string(len1+len2); + result = (RexxString *)raw_string(blen1+blen2, clen1+clen2, charset, encoding); /* copy the front part */ - memcpy(result->getWritableData(), other, len2); + memcpy(result->getWritableData(), other, blen2); /* and the second part */ - memcpy(result->getWritableData() + len2, this->getStringData(), len1); + memcpy(result->getWritableData() + blen2, this->getStringData(), blen1); return result; } -RexxString *RexxString::concatWithCstring(const char *other) +RexxString *RexxString::concatToCstring(const char *other, const char *charsetName) /******************************************************************************/ +/* Function: Concatenate a string object onto an ASCII-Z string */ +/* If the charset is unknown then raise an exception and return a string with */ +/* default charset & encoding. */ +/******************************************************************************/ +{ + CHARSET *charset = NULL; + if (charsetName != NULL) charset = m17n_find_charset(charsetName, true); // true : raise exception if unknown + if (charset == NULL) charset = m17n_default_charset(); + return RexxString::concatToCstring(other, charset, charset->preferred_encoding); +} + +RexxString *RexxString::concatWithCstring(const char *other, CHARSET *charset, ENCODING *encoding) +/******************************************************************************/ /* Function: Concatenate an ASCII-Z string onto a string object */ /******************************************************************************/ { - size_t len1; /* length of first string */ - size_t len2; /* length of ASCII-Z string */ + // Todo : use m17n service for concatenation. + // Current implementation is safe only if both strings have same charset and same encoding. + size_t blen1; /* length of first string */ + size_t clen1; + size_t blen2; /* length of ASCII-Z string */ + size_t clen2; RexxString *result; /* result string */ - len1 = this->getLength(); /* get this length */ - len2 = strlen(other); /* and the other length */ + blen1 = this->getBLength(); /* get this length */ + clen1 = this->getCLength(); + blen2 = strlen(other); /* and the other length */ + clen2 = encoding->codepoints(other, blen2); /* create a new string */ - result = (RexxString *)raw_string(len1+len2); + result = (RexxString *)raw_string(blen1+blen2, clen1+clen2, this->getCharset(), this->getEncoding()); /* copy the string object */ - memcpy(result->getWritableData(), this->getStringData(), len1); + memcpy(result->getWritableData(), this->getStringData(), blen1); /* copy the ASCII-Z string */ - memcpy(result->getWritableData() + len1, other, len2); + memcpy(result->getWritableData() + blen1, other, blen2); return result; } +RexxString *RexxString::concatWithCstring(const char *other, const char *charsetName) +/******************************************************************************/ +/* Function: Concatenate an ASCII-Z string onto a string object */ +/* If the charset is unknown then raise an exception and return a string with */ +/* default charset & encoding. */ +/******************************************************************************/ +{ + CHARSET *charset = NULL; + if (charsetName != NULL) charset = m17n_find_charset(charsetName, true); // true : raise exception if unknown + if (charset == NULL) charset = m17n_default_charset(); + return RexxString::concatWithCstring(other, charset, charset->preferred_encoding); +} + RexxString *RexxString::concatBlank(RexxObject *otherObj) /******************************************************************************/ /* Function: Concatenate two strings with a blank in between */ /******************************************************************************/ { - size_t len1; /* length of first string */ - size_t len2; /* length of second string */ + // Todo : use m17n service for concatenation. + // Current implementation is safe only if both strings have same charset and same encoding. + // The hardcoded ' ' separator is compatible only with encoding_fixed_8 and encoding_utf8. + size_t blen1; /* length of first string */ + size_t clen1; + size_t blen2; /* length of second string */ + size_t clen2; RexxString *result; /* result string */ RexxString *other; /* result string */ char *data; /* character pointer */ @@ -1222,22 +1278,24 @@ /* in string_concat_with, but is */ /* repeated here because this is a */ /* VERY high use function */ - len1 = this->getLength(); /* get this length */ - len2 = other->getLength(); /* and the other length */ + blen1 = this->getBLength(); /* get this length */ + clen1 = this->getCLength(); + blen2 = other->getBLength(); /* and the other length */ + clen2 = other->getCLength(); /* create a new string */ - result = (RexxString *)raw_string(len1+len2+1); + result = (RexxString *)raw_string(blen1+blen2+1, clen1+clen2, this->getCharset(), this->getEncoding()); data = result->getWritableData(); /* point to the string data */ - if (len1 != 0) + if (blen1 != 0... [truncated message content] |
From: <jfa...@us...> - 2010-09-05 20:15:40
|
Revision: 6144 http://oorexx.svn.sourceforge.net/oorexx/?rev=6144&view=rev Author: jfaucher Date: 2010-09-05 20:15:31 +0000 (Sun, 05 Sep 2010) Log Message: ----------- Fix errors found by the test suite. Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/interpreter/classes/BufferClass.hpp sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_charset.c Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-09-03 14:11:05 UTC (rev 6143) +++ sandbox/jlf/_diary.txt 2010-09-05 20:15:31 UTC (rev 6144) @@ -37,6 +37,19 @@ =============================================================================== +2010 sep 05 + +Found a bug, fixed in sandbox, to fix in trunk. +.mutablebuffer~new('abcdef')~replaceat('XXX', 1, 16) +makes the interpreter crash. + + +Parrot charset/encoding merge : +http://lists.parrot.org/pipermail/parrot-dev/2010-September/004678.html +I will wait for the move in Parrot's trunk before analysing that. + + +=============================================================================== 2010 aug 28 Added encoding to RexxString (m17n) : I borrowed the Parrot's implementation Modified: sandbox/jlf/trunk/interpreter/classes/BufferClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/BufferClass.hpp 2010-09-03 14:11:05 UTC (rev 6143) +++ sandbox/jlf/trunk/interpreter/classes/BufferClass.hpp 2010-09-05 20:15:31 UTC (rev 6144) @@ -68,7 +68,17 @@ inline void adjustGap(size_t offset, size_t _size, size_t _newSize) { - memmove(getData() + offset + _newSize, getData() + offset + _size, getDataLength() - (offset + _size)); + // We have _size bytes to replace by _newSize bytes + // 0 1 2 3 4 5 6 7 8 9 offset = 3, XX to be replaced by YYY + // a b c X X f g _size = 2 + // a b c Y Y Y f g _newSize = 3 + size_t offset_from = offset + _size; // offset of the 1st byte to move + if (offset_from < getDataLength()) + { + size_t offset_to = offset + _newSize; // destination offset of the 1st byte to move + size_t tailSize = getDataLength() - offset_from; + memmove(getData() + offset_to, getData() + offset_from, tailSize); + } } inline void setData(size_t offset, char character, size_t l) { Modified: sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp 2010-09-03 14:11:05 UTC (rev 6143) +++ sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp 2010-09-05 20:15:31 UTC (rev 6144) @@ -292,8 +292,8 @@ /* see the comments in ::newRexx()!! */ newObj->data = new_buffer(bufferLength); - newObj->dataBLength = this->dataBLength; - newObj->dataCLength = this->dataCLength; + newObj->setBLength(this->dataBLength); + newObj->setCLength(this->dataCLength); newObj->data->copyData(0, data->getData(), bufferLength); newObj->defaultSize = this->defaultSize; @@ -319,6 +319,7 @@ RexxBuffer *newBuffer = new_buffer(bufferLength); // copy the data into the new buffer newBuffer->copyData(0, data->getData(), dataBLength); + newBuffer->setDataLength(data->getDataLength()); // replace the old data buffer OrefSet(this, this->data, newBuffer); } @@ -347,8 +348,8 @@ ensureCapacity(string->getBLength()); data->copyData(dataBLength, string->getStringData(), string->getBLength()); - this->dataBLength += string->getBLength(); - this->dataCLength += string->getCLength(); + this->setBLength(this->dataBLength + string->getBLength()); + this->setCLength(this->dataCLength + string->getCLength()); return this; } @@ -362,8 +363,8 @@ ensureCapacity(blength); this->data->copyData(dataBLength, data, blength); - this->dataBLength += blength; - this->dataCLength += this->getEncoding()->codepoints(data, blength); + this->setBLength(this->dataBLength + blength); + this->setCLength(this->dataCLength + this->getEncoding()->codepoints(data, blength)); return this; } @@ -423,12 +424,12 @@ // inserting after the end? the resulting length is measured from the insertion point if (begin > this->dataBLength) { - this->dataBLength = begin + insertLength; + this->setBLength(begin + insertLength); } else { // just add in the inserted length - this->dataBLength += insertLength; + this->setBLength(this->dataBLength + insertLength); } return this; } @@ -468,7 +469,7 @@ if (begin + replaceLength > dataBLength) { //adjust upward - dataBLength = begin + replaceLength; + this->setBLength(begin + replaceLength); } return this; } @@ -542,7 +543,7 @@ } // and finally adjust the length - dataBLength = finalLength; + this->setBLength(finalLength); // our return value is always the target mutable buffer return this; } @@ -564,12 +565,12 @@ { // shift everything over data->closeGap(begin, range, dataBLength - (begin + range)); - dataBLength -= range; + this->setBLength(dataBLength - range); } else { // we're just truncating - dataBLength = begin; + this->setBLength(begin); } } return this; @@ -592,8 +593,8 @@ // reset the size to the default bufferLength = defaultSize; } - dataBLength = 0; - dataCLength = 0; + this->setBLength(0); + this->setCLength(0); } // an actual resize? else if (newsize != bufferLength) @@ -601,7 +602,7 @@ // reallocate the buffer RexxBuffer *newBuffer = new_buffer(newsize); // if we're shrinking this, it truncates. - dataBLength = Numerics::minVal(dataBLength, newsize); + this->setBLength(Numerics::minVal(dataBLength, newsize)); // todo : dataCLength newBuffer->copyData(0, data->getData(), dataBLength); // replace the old buffer @@ -906,7 +907,7 @@ } } // update the result length, and return - dataBLength = resultLength; + this->setBLength(resultLength); // todo : dataCLength return this; } @@ -1045,7 +1046,7 @@ } } // update the result length, and return - dataBLength = resultLength; + this->setBLength(resultLength); // todo : dataCLength return this; } @@ -1584,7 +1585,7 @@ // close up the delete part closeGap(deletePosition, gapSize, length); // adjust for the deleted data - dataBLength -= gapSize; + this->setBLength(dataBLength - gapSize); // todo : dataCLength return this; } Modified: sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp 2010-09-03 14:11:05 UTC (rev 6143) +++ sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp 2010-09-05 20:15:31 UTC (rev 6144) @@ -131,7 +131,7 @@ inline size_t getBLength() { return dataBLength; } inline size_t getCLength() { return dataCLength; } inline void setLength(size_t l) { dataBLength = l; }; // see getLength - inline void setBLength(size_t l) { dataBLength = l; }; + inline void setBLength(size_t l) { dataBLength = l; data->setDataLength(l);}; inline void setCLength(size_t l) { dataCLength = l; }; inline size_t getBufferLength() { return bufferLength; } RexxObject *setBufferLength(size_t); Modified: sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_charset.c =================================================================== --- sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_charset.c 2010-09-03 14:11:05 UTC (rev 6143) +++ sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_charset.c 2010-09-05 20:15:31 UTC (rev 6144) @@ -145,7 +145,7 @@ if (raiseException) { - RexxString *msg = raw_string(200, 200); + RexxString *msg = raw_string(200); rsnprintf(msg, "Can't make %s charset strings", charsetname); reportException(Rexx_Error_Execution_user_defined, msg); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-09-15 21:48:45
|
Revision: 6191 http://oorexx.svn.sourceforge.net/oorexx/?rev=6191&view=rev Author: jfaucher Date: 2010-09-15 21:48:33 +0000 (Wed, 15 Sep 2010) Log Message: ----------- merge 6048-6189 from main/trunk Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/samples/mutablebuffer/_readme.txt sandbox/jlf/trunk/Makefile.am sandbox/jlf/trunk/api/oorexxapi.h sandbox/jlf/trunk/bootstrap sandbox/jlf/trunk/common/platform/unix/SysFile.cpp sandbox/jlf/trunk/common/platform/windows/ArgumentParser.h sandbox/jlf/trunk/configure.ac sandbox/jlf/trunk/extensions/hostemu/platform/windows/hostemu.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/APICommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ControlDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/EventNotification.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/Menu.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/RcDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.def sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBarControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodControl.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodData.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMenu.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodResourceIDs.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodResources.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodResources.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodRoutines.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUser.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodialog.mak sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodialog.rc sandbox/jlf/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp sandbox/jlf/trunk/extensions/rxftp/rxftp.cls sandbox/jlf/trunk/extensions/rxsock/rxsockfn.cpp sandbox/jlf/trunk/extensions/rxsock/socket.cls sandbox/jlf/trunk/interpreter/RexxClasses/CoreClasses.orx sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp sandbox/jlf/trunk/interpreter/package/PackageManager.cpp sandbox/jlf/trunk/interpreter/platform/unix/FileSystem.cpp sandbox/jlf/trunk/interpreter/platform/unix/SysFileSystem.cpp sandbox/jlf/trunk/interpreter/platform/unix/SysFileSystem.hpp sandbox/jlf/trunk/interpreter/platform/windows/ExternalFunctions.cpp sandbox/jlf/trunk/interpreter/runtime/Version.cpp sandbox/jlf/trunk/interpreter/streamLibrary/StreamNative.cpp sandbox/jlf/trunk/lib/orxwin32.mak sandbox/jlf/trunk/oorexx.ver sandbox/jlf/trunk/platform/unix/debian/compat sandbox/jlf/trunk/platform/unix/oorexx-config.1 sandbox/jlf/trunk/platform/unix/oorexx.spec.in sandbox/jlf/trunk/platform/unix/rexx.1 sandbox/jlf/trunk/platform/unix/rexxc.1 sandbox/jlf/trunk/platform/unix/rxqueue.1 sandbox/jlf/trunk/platform/unix/rxsubcom.1 sandbox/jlf/trunk/platform/windows/buildorx.bat sandbox/jlf/trunk/platform/windows/install/WriteEnv.nsh sandbox/jlf/trunk/platform/windows/install/oorexx.nsi sandbox/jlf/trunk/platform/windows/rxregexp.mak sandbox/jlf/trunk/samples/windows/oodialog/bmp/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/rc/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/sample.rex sandbox/jlf/trunk/utilities/platform/windows/rexxhide/rexxhide.cpp sandbox/jlf/trunk/utilities/platform/windows/rexxpaws/rexxpaws.cpp sandbox/jlf/trunk/utilities/rexx/platform/windows/rexx.cpp sandbox/jlf/trunk/windows-build.txt Added Paths: ----------- sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/ sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.cpp sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.h sandbox/jlf/trunk/extensions/platform/windows/oodialog/0_READ_ME_FIRST.txt sandbox/jlf/trunk/extensions/platform/windows/oodialog/build_ooDialog_cls.rex sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUser.hpp sandbox/jlf/trunk/platform/unix/macosx/MakeRexxPackage.in sandbox/jlf/trunk/platform/unix/macosx/PackageInfo.in sandbox/jlf/trunk/platform/unix/macosx/postflight.in sandbox/jlf/trunk/platform/unix/macosx/preflight.in sandbox/jlf/trunk/samples/windows/oodialog/PropertySheetDemo.rex sandbox/jlf/trunk/samples/windows/oodialog/bmp/propertySheetDemoListView.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/propertySheetDemoTab.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/propertySheetDemoTreeView.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/ticketWizardMovie.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/ticketWizardRexxLA.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/ticketWizardTheater.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/ticketWizardTicket.bmp sandbox/jlf/trunk/samples/windows/oodialog/rc/PropertySheetDemo.h sandbox/jlf/trunk/samples/windows/oodialog/rc/PropertySheetDemo.rc sandbox/jlf/trunk/samples/windows/oodialog/rc/ticketWizard.h sandbox/jlf/trunk/samples/windows/oodialog/rc/ticketWizard.rc sandbox/jlf/trunk/samples/windows/oodialog/ticketWizard.rex Removed Paths: ------------- sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.cpp sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.h sandbox/jlf/trunk/extensions/platform/windows/oodialog/build.rex sandbox/jlf/trunk/extensions/platform/windows/oodialog/m_oodcls.rex sandbox/jlf/trunk/extensions/platform/windows/oodialog/tokenize.bat sandbox/jlf/trunk/platform/unix/macosx/postflight sandbox/jlf/trunk/platform/unix/macosx/preflight sandbox/jlf/trunk/samples/windows/oodialog/bmp/movie.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/psdemoTab.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/psdemolv.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/psdemotv.bmp sandbox/jlf/trunk/samples/windows/oodialog/bmp/ticket.bmp sandbox/jlf/trunk/samples/windows/oodialog/ooticket.rex sandbox/jlf/trunk/samples/windows/oodialog/propdemo.rex sandbox/jlf/trunk/samples/windows/oodialog/rc/movies.rc sandbox/jlf/trunk/samples/windows/oodialog/rc/propdemo.rc sandbox/jlf/trunk/samples/windows/oodialog/rc/ticket.rc Property Changed: ---------------- sandbox/jlf/trunk/ sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/rxsock/mime.cls sandbox/jlf/trunk/extensions/rxsock/smtp.cls sandbox/jlf/trunk/extensions/rxsock/streamsocket.cls Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-09-14 15:32:55 UTC (rev 6190) +++ sandbox/jlf/_diary.txt 2010-09-15 21:48:33 UTC (rev 6191) @@ -427,3 +427,5 @@ merge 5835-5957 from main/trunk merge 5957-5988 from main/trunk merge 5988-6048 from main/trunk +merge 6048-6142 from main/trunk +merge 6142-6189 from main/trunk Modified: sandbox/jlf/samples/mutablebuffer/_readme.txt =================================================================== --- sandbox/jlf/samples/mutablebuffer/_readme.txt 2010-09-14 15:32:55 UTC (rev 6190) +++ sandbox/jlf/samples/mutablebuffer/_readme.txt 2010-09-15 21:48:33 UTC (rev 6191) @@ -1,3 +1,5 @@ +[JLF sept 15, 2010] Fixed in trunk revision 6147 + Current implementation of MutableBuffer~replaceAt calls adjustGap when needed. This script illustrates the performance problem of adjustGap, which occurs because the encapsulated buffer's dataLength is equal to its bufferSize. Property changes on: sandbox/jlf/trunk ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk:5812-6048 + /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk:5812-6189 Modified: sandbox/jlf/trunk/Makefile.am =================================================================== --- sandbox/jlf/trunk/Makefile.am 2010-09-14 15:32:55 UTC (rev 6190) +++ sandbox/jlf/trunk/Makefile.am 2010-09-15 21:48:33 UTC (rev 6191) @@ -430,7 +430,7 @@ # # Shared library targets # -pkglib_LTLIBRARIES = librexxapi.la librexx.la librexxutil.la librxmath.la librxregexp.la librxsock.la libhostemu.la +pkglib_LTLIBRARIES = librexxapi.la librexx.la librexxutil.la librxmath.la librxregexp.la librxsock.la libhostemu.la librxunixsys.la # # Scripts to install @@ -954,7 +954,26 @@ libhostemu_la_LIBADD = @ORX_LIBADD_LIBRARY@ libhostemu_la_LDFLAGS = $(VERSION_INFO) @ORX_LDFLAGS_LIBRARY@ +#################### librxunixsys.so ################ # +# Sources for librxunixsys.so +# +librxunixsys_la_SOURCES = $(extensions_unix_dir)/rxunixsys/rxunixsys.cpp \ + $(extensions_unix_dir)/rxunixsys/rxunixsys.h +# +# Preprocessor flags for librxunixsys.so +# +librxunixsys_la_CXXFLAGS = $(COMMON_CPPFLAGS) \ + -I$(build_api_dir) \ + -I$(build_api_platform_dir) \ + -I$(extensions_unix_dir)/rxunixsys +# +# Extra libraries for librxunixsys.so (maybe) +# +librxunixsys_la_LIBADD = @ORX_LIBADD_LIBRARY@ +librxunixsys_la_LDFLAGS = $(VERSION_INFO) @ORX_LDFLAGS_LIBRARY@ + +# # explicit targets: # @@ -1067,9 +1086,24 @@ if test "$(ORX_SYS_STR)" != "AIX" -a "$(ORX_SYS_STR)" != "MACOSX"; then \ $(install_sh_SCRIPT) $(rexxapi_server_unix_dir)/rxapid $(DESTDIR)$(prefix)/bin/rxapid; \ fi + if test "$(ORX_SYS_STR)" = "MACOSX"; then \ - $(install_sh_SCRIPT) $(platform_unix_dir)/macosx/org.rexxla.oorexx.rxapid.plist $(DESTDIR)$(prefix)/bin/org.rexxla.oorexx.rxapid.plist; \ + $(install_sh_SCRIPT) $(platform_unix_dir)/macosx/org.rexxla.oorexx.rxapid.plist \ + $(DESTDIR)$(prefix)/bin/org.rexxla.oorexx.rxapid.plist; \ + mkdir $(platform_unix_dir)/macosx/scripts; \ + sed -e "s/^VER=/VER=$(ORX_MAJOR)/" -e "s/^REL=/REL=$(ORX_AGE)/" -e "s/^MOD=/MOD=$(ORX_REVISION)/" \ + -e "s-^PREFIX=-PREFIX=$(prefix)-" $(platform_unix_dir)/macosx/postflight.in \ + >$(platform_unix_dir)/macosx/scripts/postflight; \ + sed -e "s-^PREFIX=-PREFIX=$(prefix)-" $(platform_unix_dir)/macosx/preflight.in \ + >$(platform_unix_dir)/macosx/scripts/preflight; \ + sed -e "s/^VER=/VER=$(ORX_MAJOR)/" -e "s/^REL=/REL=$(ORX_MINOR)/" -e "s/^MOD=/MOD=$(ORX_MOD_LVL)/" \ + -e "s-^PREFIX=-PREFIX=$(prefix)-" -e "s-^BLD_DIR=-BLD_DIR=$(top_srcdir)-" \ + $(platform_unix_dir)/macosx/MakeRexxPackage.in >$(platform_unix_dir)/macosx/MakeRexxPackage; \ + sed -e "s-#PREF#-$(prefix)-" $(platform_unix_dir)/macosx/PackageInfo.in >$(platform_unix_dir)/macosx/PackageInfo; \ + chmod 755 $(platform_unix_dir)/macosx/scripts/preflight $(platform_unix_dir)/macosx/scripts/postflight \ + $(platform_unix_dir)/macosx/MakeRexxPackage; \ fi + for a in $(build_samples_dir)/*.rex; do \ bn=`basename $$a`; \ $(install_sh_SCRIPT) $$a $(DESTDIR)$(prefix)/share/ooRexx/$$bn; \ Modified: sandbox/jlf/trunk/api/oorexxapi.h =================================================================== --- sandbox/jlf/trunk/api/oorexxapi.h 2010-09-14 15:32:55 UTC (rev 6190) +++ sandbox/jlf/trunk/api/oorexxapi.h 2010-09-15 21:48:33 UTC (rev 6191) @@ -215,11 +215,13 @@ #define REXX_INTERPRETER_4_0_0 0x00040000 #define REXX_INTERPRETER_4_0_1 0x00040001 #define REXX_INTERPRETER_4_1_0 0x00040100 -#define REXX_CURRENT_INTERPRETER_VERSION REXX_INTERPRETER_4_1_0 +#define REXX_INTERPRETER_4_2_0 0x00040100 +#define REXX_CURRENT_INTERPRETER_VERSION REXX_INTERPRETER_4_2_0 #define NO_VERSION_YET NULL #define REXX_LANGUAGE_6_03 0x00000603 -#define REXX_CURRENT_LANGUAGE_LEVEL REXX_LANGUAGE_6_03 +#define REXX_LANGUAGE_6_04 0x00000604 +#define REXX_CURRENT_LANGUAGE_LEVEL REXX_LANGUAGE_6_04 #define STANDARD_PACKAGE_HEADER sizeof(RexxPackageEntry), REXX_PACKAGE_API_NO, Modified: sandbox/jlf/trunk/bootstrap =================================================================== --- sandbox/jlf/trunk/bootstrap 2010-09-14 15:32:55 UTC (rev 6190) +++ sandbox/jlf/trunk/bootstrap 2010-09-15 21:48:33 UTC (rev 6191) @@ -39,7 +39,7 @@ OS=`uname -s` if [ "$OS" = "Darwin" ] then - export LIBTOOLIZE='glibtoolize autoreconf -fi' + env LIBTOOLIZE=glibtoolize autoreconf -fi; glibtoolize --copy --force --automake; else libtoolize --copy --force --automake; Modified: sandbox/jlf/trunk/common/platform/unix/SysFile.cpp =================================================================== --- sandbox/jlf/trunk/common/platform/unix/SysFile.cpp 2010-09-14 15:32:55 UTC (rev 6190) +++ sandbox/jlf/trunk/common/platform/unix/SysFile.cpp 2010-09-15 21:48:33 UTC (rev 6191) @@ -1099,6 +1099,11 @@ { readable = true; } + // tagged as FIFO, then this is also a transient + if ((fileInfo.st_mode & S_IFIFO) != 0) + { + transient = true; + } } } Modified: sandbox/jlf/trunk/common/platform/windows/ArgumentParser.h =================================================================== --- sandbox/jlf/trunk/common/platform/windows/ArgumentParser.h 2010-09-14 15:32:55 UTC (rev 6190) +++ sandbox/jlf/trunk/common/platform/windows/ArgumentParser.h 2010-09-15 21:48:33 UTC (rev 6191) @@ -36,26 +36,38 @@ /* */ /*----------------------------------------------------------------------------*/ -const char *nextArgument(BOOL getprog, const char *argptr, PULONG ndx, PULONG len, BOOL allocate, ULONG maxarglength) +const char *nextArgument(BOOL getprog, const char *argptr, PULONG ndx, PULONG len, BOOL allocate) { PCHAR ret; if (argptr[*ndx] == ' ') /* skip blanks of previous argument */ - while ((argptr[*ndx] == ' ') && argptr[*ndx] && (*ndx<maxarglength)) (*ndx)++; + { + while ((argptr[*ndx] == ' ') && argptr[*ndx]) + { + (*ndx)++; + } + } *len = 0; const char *tmp = &argptr[*ndx]; if (!allocate) { - while ((argptr[*ndx] != ' ') && argptr[*ndx] && (*ndx<maxarglength)) + while ((argptr[*ndx] != ' ') && argptr[*ndx]) { if (argptr[*ndx] == '\"') do + { + if (argptr[*ndx] != '\"') + { + (*len)++; + } + (*ndx)++; + } while ((argptr[*ndx] != '\"') && argptr[*ndx]); + if (argptr[*ndx]) { - if (argptr[*ndx] != '\"') (*len)++; + if (argptr[*ndx] != '\"') + { + (*len)++; + } (*ndx)++; - } while ((argptr[*ndx] != '\"') && argptr[*ndx] && (*ndx<maxarglength)); - if (argptr[*ndx]) { - if (argptr[*ndx] != '\"') (*len)++; - (*ndx)++; } } } @@ -63,60 +75,91 @@ else if (getprog) { if (argptr[*ndx] == '\"') - do { - (*len)++;(*ndx)++; - } while ((argptr[*ndx] != '\"') && argptr[*ndx] && (*ndx<maxarglength)); - while (argptr[*ndx] && (argptr[*ndx] != ' ') && (*ndx<maxarglength)) { (*len)++; (*ndx)++;} + do + { + (*len)++; + (*ndx)++; + } while ((argptr[*ndx] != '\"') && argptr[*ndx]); + while (argptr[*ndx] && (argptr[*ndx] != ' ')) + { + (*len)++; + (*ndx)++; + } } - else while (argptr[*ndx] && (*ndx<maxarglength)) { (*len)++; (*ndx)++;} + else + { + while (argptr[*ndx]) + { + (*len)++; + (*ndx)++; + } + } if (*len) { - if (allocate) { + if (allocate) + { /* program name must not be enclosed within "" for REXXHIDE */ - if (getprog && (tmp[0] == '\"')) {tmp++;(*len)-=2;}; + if (getprog && (tmp[0] == '\"')) + { + tmp++;(*len)-=2; + }; ret = (PCHAR) GlobalAlloc(GMEM_FIXED, (*len)+1); memcpy(ret, tmp, (*len)+1); - if (getprog) ret[*len]='\0'; + if (getprog) + { + ret[*len]='\0'; + } return ret; - } else return tmp; + } + else + { + return tmp; + } } - else return NULL; + else + { + return NULL; + } } PCONSTRXSTRING getArguments(const char **program, const char *argptr, size_t *count, PCONSTRXSTRING retarr) { - ULONG i, isave, len, maxarglen; + ULONG i, isave, len; /* don't forget the break after program_name */ - /* WindowsNT accepts 2048 bytes, Windows95/98 1024 bytes */ - maxarglen=2048; - i = 0; if (program) - (*program) = nextArgument(TRUE, argptr, &i, &len, TRUE, maxarglen); /* for REXXHIDE script is first argument */ + { + (*program) = nextArgument(TRUE, argptr, &i, &len, TRUE); /* for REXXHIDE script is first argument */ + } else { - nextArgument(FALSE, argptr, &i, &len, FALSE, maxarglen); /* skip REXX*.EXE */ - const char *tmp = nextArgument(FALSE, argptr, &i, &len, FALSE, maxarglen); /* skip REXX script or -e switch */ + nextArgument(FALSE, argptr, &i, &len, FALSE); /* skip REXX*.EXE */ + const char *tmp = nextArgument(FALSE, argptr, &i, &len, FALSE); /* skip REXX script or -e switch */ /* the following test ensure that the -e switch on rexx.exe is not included in the arguments */ /* passed to the running program as specified on the command line. Unfortunately it also */ /* affects rexxhide, rexxpaws, etc, that all use this code; may not be important */ if (tmp && strlen(tmp) > 1 && (tmp[0] == '/' || tmp[0] == '-') && (tmp[1] == 'e' || tmp[1] == 'E') ) - nextArgument(FALSE, argptr, &i, &len, FALSE, maxarglen); /* skip REXX code*/ + { + nextArgument(FALSE, argptr, &i, &len, FALSE); /* skip REXX code*/ + } } retarr->strptr = NULL; isave = i; *count = 0; - if (nextArgument(FALSE, argptr, &i, &len, FALSE, maxarglen)) (*count)++; + if (nextArgument(FALSE, argptr, &i, &len, FALSE)) + { + (*count)++; + } if (*count) { i = isave; - retarr->strptr = nextArgument(FALSE, argptr, &i, &len, TRUE, maxarglen); + retarr->strptr = nextArgument(FALSE, argptr, &i, &len, TRUE); retarr->strlength = len; } return retarr; Modified: sandbox/jlf/trunk/configure.ac =================================================================== --- sandbox/jlf/trunk/configure.ac 2010-09-14 15:32:55 UTC (rev 6190) +++ sandbox/jlf/trunk/configure.ac 2010-09-15 21:48:33 UTC (rev 6191) @@ -34,7 +34,7 @@ dnl dnl Process this file with autoconf to produce a configure script -AC_INIT(oorexx, 4.1.0) +AC_INIT(oorexx, 4.2.0) AC_PREFIX_DEFAULT(/opt/ooRexx) dnl This is to fix a problem with distribution prior to Fedora 7. Fedora 7 @@ -45,7 +45,7 @@ mandir="\$(prefix)/share/man" PACKAGE=ooRexx -VERSION=4.1.0 +VERSION=4.2.0 AC_CANONICAL_SYSTEM @@ -242,6 +242,7 @@ *apple-darwin*) ORX_SYS_STR="MACOSX" ORX_SHARED_LIBRARY_EXT=".dylib" + ORX_LDFLAGS_PACKAGE="" ;; *hp-hpux*) ORX_SHARED_LIBRARY_EXT=".sl" Modified: sandbox/jlf/trunk/extensions/hostemu/platform/windows/hostemu.cpp =================================================================== --- sandbox/jlf/trunk/extensions/hostemu/platform/windows/hostemu.cpp 2010-09-14 15:32:55 UTC (rev 6190) +++ sandbox/jlf/trunk/extensions/hostemu/platform/windows/hostemu.cpp 2010-09-15 21:48:33 UTC (rev 6191) @@ -317,8 +317,14 @@ } memset(pll, '\0', sizeof (LL)); strcpy(pll -> FileName, ExecIO_Options.aFilename); + + /* try to open an existing file */ pll -> pFile = fopen(pll -> FileName, "r+"); - /* try to open an existing file */ + + /* read only files can not be opened in read / write mode (r+) */ + if ( pll -> pFile == NULL && ! ExecIO_Options.fRW ) { + pll -> pFile = fopen(pll -> FileName, "r"); + } if (pll -> pFile == NULL) { /* no existing file, so open a new file */ pll -> pFile = fopen(pll -> FileName, "w+"); @@ -418,7 +424,7 @@ char * Stem; /* Stem variable name */ char * Index; /* Stem index value (string) */ RXSTRING rxVal; /* Rexx stem variable value */ - int elements; + int elements; /* process request */ if (ExecIO_Options.lRcdCnt == 0) @@ -800,7 +806,7 @@ { /* local function variables */ - size_t elements; + size_t elements; RexxQueryQueue("SESSION", &elements); return (long)elements; Deleted: sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.cpp =================================================================== --- main/trunk/extensions/platform/unix/rxunixsys/rxunixsys.cpp 2010-09-12 16:53:14 UTC (rev 6189) +++ sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.cpp 2010-09-15 21:48:33 UTC (rev 6191) @@ -1,1754 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 2009-2010 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. */ -/* */ -/* Authors; */ -/* W. David Ashley <da...@us...> */ -/* */ -/*----------------------------------------------------------------------------*/ - - -#include "rxunixsys.h" - - -/*----------------------------------------------------------------------------*/ -/* Global variables */ -/*----------------------------------------------------------------------------*/ - - -/*----------------------------------------------------------------------------*/ -/* Local Definitions */ -/*----------------------------------------------------------------------------*/ - - -/*============================================================================*/ -/* Private Functions */ -/*============================================================================*/ - - -/*============================================================================*/ -/* Public Functions */ -/*============================================================================*/ - -/** - * Function: SysSignal - * - * Change a signal behavior. - * - * @param signum The signal number. - * - * @param sigact The new signal action. - * - * @return Function return code - */ -RexxRoutine2(int, - SysSignal, - int, signum, - CSTRING, sigact) -{ - - if (strlen(sigact) == 0) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysSignal")); - return 0; - } - // According to POSIX we should only allow the following values for this function - else if (*sigact == 'D' || *sigact == 'd') { - signal(signum, SIG_DFL); - return 0; - } - else if (*sigact == 'I' || *sigact == 'i') { - signal(signum, SIG_IGN); - return 0; - } - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysSignal")); - return 0; -} - - -/** - * Method: SysUname - * - * Return the uname information. - * - * @param ichar The option string. - * - * @return Option information - */ -RexxRoutine1(RexxObjectPtr, - SysUname, - OPTIONAL_CSTRING, ichar) -{ - struct utsname name; - - uname(&name); - if (ichar == NULL || *ichar == 'S' || *ichar == 's') { - return (RexxObjectPtr)context->NewStringFromAsciiz(name.sysname); - } - else if (*ichar == 'N' || *ichar == 'n') { - return (RexxObjectPtr)context->NewStringFromAsciiz(name.nodename); - } - else if (*ichar == 'R' || *ichar == 'r') { - return (RexxObjectPtr)context->NewStringFromAsciiz(name.release); - } - else if (*ichar == 'V' || *ichar == 'v') { - return (RexxObjectPtr)context->NewStringFromAsciiz(name.version); - } - else if (*ichar == 'M' || *ichar == 'm') { - return (RexxObjectPtr)context->NewStringFromAsciiz(name.machine); - } - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysUname")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); -} - - -/** - * Method: SysSetsid - * - * Set the Session id. - * - * @return Process id - */ -RexxRoutine0(RexxObjectPtr, - SysSetsid) -{ - pid_t pid; - - pid = setsid(); - return context->WholeNumberToObject((wholenumber_t)pid); -} - - -/** - * Method: SysGetsid - * - * Get the Session id. - * - * @param pid The pid. - * - * @return Session id - */ -RexxRoutine1(RexxObjectPtr, - SysGetsid, - int, pid) -{ - pid = getsid((pid_t)pid); - return context->WholeNumberToObject((wholenumber_t)pid); -} - - -/** - * Method: SysSetuid - * - * Set the userid. - * - * @param uid The userid. - * - * @return 0 or -1 - */ -RexxRoutine1(RexxObjectPtr, - SysSetuid, - int, uid) -{ - - return context->WholeNumberToObject((wholenumber_t)setuid((uid_t)uid)); -} - - -/** - * Method: SysGetuid - * - * Get the userid. - * - * @return uid - */ -RexxRoutine0(RexxObjectPtr, - SysGetuid) -{ - - return context->WholeNumberToObject((wholenumber_t)getuid()); -} - - -/** - * Method: SysSeteuid - * - * Set the effective userid. - * - * @param uid The userid. - * - * @return 0 or -1 - */ -RexxRoutine1(RexxObjectPtr, - SysSeteuid, - int, uid) -{ - - return context->WholeNumberToObject((wholenumber_t)seteuid((uid_t)uid)); -} - - -/** - * Method: SysGeteuid - * - * Get the effective userid. - * - * @return uid - */ -RexxRoutine0(RexxObjectPtr, - SysGeteuid) -{ - - return context->WholeNumberToObject((wholenumber_t)geteuid()); -} - - -/** - * Method: SysSetgid - * - * Set the groupid. - * - * @param gid The groupid. - * - * @return 0 or -1 - */ -RexxRoutine1(RexxObjectPtr, - SysSetgid, - int, gid) -{ - - return context->WholeNumberToObject((wholenumber_t)setgid((gid_t)gid)); -} - - -/** - * Method: SysGetgid - * - * Get the groupid. - * - * @return 0 or -1 - */ -RexxRoutine0(RexxObjectPtr, - SysGetgid) -{ - - return context->WholeNumberToObject((wholenumber_t)getgid()); -} - - -/** - * Method: SysSetegid - * - * Set the effective groupid. - * - * @param gid The groupid. - * - * @return 0 or -1 - */ -RexxRoutine1(RexxObjectPtr, - SysSetegid, - int, gid) -{ - - return context->WholeNumberToObject((wholenumber_t)setegid((gid_t)gid)); -} - - -/** - * Method: SysGetegid - * - * Get the effective groupid. - * - * @return 0 or -1 - */ -RexxRoutine0(RexxObjectPtr, - SysGetegid) -{ - - return context->WholeNumberToObject((wholenumber_t)getegid()); -} - - -/** - * Method: SysSetpgrp - * - * Set the pgrp. - * - * @return 0 or -1 - */ -RexxRoutine0(RexxObjectPtr, - SysSetpgrp) -{ - - return context->WholeNumberToObject((wholenumber_t)setpgrp()); -} - - -/** - * Method: SysGetpgrp - * - * Get the pgrp. - * - * @return 0 or -1 - */ -RexxRoutine0(RexxObjectPtr, - SysGetpgrp) -{ - - return context->WholeNumberToObject((wholenumber_t)getpgrp()); -} - - -/** - * Method: SysSetpgid - * - * Set the pgid. - * - * @param pid1 The pid to set. - * - * @param pid2 The new pid. - * - * @return 0 or -1 - */ -RexxRoutine2(RexxObjectPtr, - SysSetpgid, - int, pid1, - int, pid2) -{ - - return context->WholeNumberToObject((wholenumber_t)setpgid((pid_t)pid1, (pid_t)pid2)); -} - - -/** - * Method: SysGetpgid - * - * Get the pgid. - * - * @param pid1 The pid to query. - * - * @return The pid. - */ -RexxRoutine1(RexxObjectPtr, - SysGetpgid, - int, pid) -{ - - return context->WholeNumberToObject((wholenumber_t)getpgid((pid_t)pid)); -} - - -/** - * Method: SysGetpid - * - * Get the pid. - * - * @return pid - */ -RexxRoutine0(RexxObjectPtr, - SysGetpid) -{ - pid_t pid = getpid(); - return context->WholeNumberToObject((wholenumber_t)pid); -} - - -/** - * Method: SysGetppid - * - * Get the ppid. - * - * @return pid - */ -RexxRoutine0(RexxObjectPtr, - SysGetppid) -{ - pid_t pid = getppid(); - return context->WholeNumberToObject((wholenumber_t)pid); -} - - -/** - * Method: SysGettid - * - * Get the tid. - * - * @return tid - */ -RexxRoutine0(RexxObjectPtr, - SysGettid) -{ - pthread_t tid = pthread_self(); - return context->UnsignedInt64ToObject((uint64_t)tid); -} - - -/** - * Method: SysSymlink - * - * Create a symbolic link. - * - * @param path1 The source path. - * - * @param path2 The target path. - * - * @return int error code - */ -RexxRoutine2(int, - SysSymlink, - CSTRING, path1, - CSTRING, path2) -{ - return symlink(path1, path2); -} - - -/** - * Method: SysLink - * - * Create a hard link. - * - * @param path1 The source path. - * - * @param path2 The target path. - * - * @return int error code - */ -RexxRoutine2(int, - SysLink, - CSTRING, path1, - CSTRING, path2) -{ - return link(path1, path2); -} - - -/** - * Method: SysUnlink - * - * Remove a hard or soft link. - * - * @param path1 The source path. - * - * @return int error code - */ -RexxRoutine1(int, - SysUnlink, - CSTRING, path1) -{ - return unlink(path1); -} - - -/** - * Method: SysChown - * - * Change the owner and group of a file. - * - * @param path1 The file path. - * - * @param uid The new userid. - * - * @param gid The new groupid. - * - * @return int error code - */ -RexxRoutine3(int, - SysChown, - CSTRING, path1, - int, uid, - int, gid) -{ - return chown(path1, (uid_t)uid, (gid_t)gid); -} - - -/** - * Method: SysLchown - * - * Change the owner and group of a file. - * - * @param path1 The file path. - * - * @param uid The new userid. - * - * @param gid The new groupid. - * - * @return int error code - */ -RexxRoutine3(int, - SysLchown, - CSTRING, path1, - int, uid, - int, gid) -{ - return lchown(path1, (uid_t)uid, (gid_t)gid); -} - - -/** - * Method: SysChroot - * - * Changes the root directory of the calling process. - * - * @param path1 The new root path. - * - * @return int error code - */ -RexxRoutine1(int, - SysChroot, - CSTRING, path1) -{ - return chroot(path1); -} - - -/** - * Method: SysUmask - * - * Sets the calling process umask. - * - * @param nmask The new umask. - * - * @return the old umansk value - */ -RexxRoutine1(int, - SysUmask, - int, nmask) -{ - return umask((mode_t)nmask); -} - - -/** - * Method: SysGetpwnam - * - * Return user name information from the passwd file. - * - * @param user The user name. - * - * @param ichar The option string. - * - * @return Option information - */ -RexxRoutine2(RexxObjectPtr, - SysGetpwnam, - CSTRING, user, - CSTRING, ichar) -{ - if (strlen(user) == 0 || strlen(ichar) != 1) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetpwnam")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - struct passwd *pw = getpwnam(user); - if (pw == NULL) { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - else if (*ichar == 'N' || *ichar == 'n') { - return (RexxObjectPtr)context->NewStringFromAsciiz(pw->pw_name); - } - else if (*ichar == 'U' || *ichar == 'u') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)pw->pw_uid); - } - else if (*ichar == 'G' || *ichar == 'g') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)pw->pw_gid); - } - else if (*ichar == 'R' || *ichar == 'r') { - return (RexxObjectPtr)context->NewStringFromAsciiz(pw->pw_gecos); - } - else if (*ichar == 'D' || *ichar == 'd') { - return (RexxObjectPtr)context->NewStringFromAsciiz(pw->pw_dir); - } - else if (*ichar == 'S' || *ichar == 's') { - return (RexxObjectPtr)context->NewStringFromAsciiz(pw->pw_shell); - } - else if (*ichar == 'P' || *ichar == 'p') { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetpwnam")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); -} - - -/** - * Method: SysGetpwuid - * - * Return user name information from the passwd file. - * - * @param user The uid. - * - * @param ichar The option string. - * - * @return Option information - */ -RexxRoutine2(RexxObjectPtr, - SysGetpwuid, - int, uid, - CSTRING, ichar) -{ - if (strlen(ichar) != 1) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetpwuid")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - struct passwd *pw = getpwuid((uid_t)uid); - if (pw == NULL) { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - else if (*ichar == 'N' || *ichar == 'n') { - return (RexxObjectPtr)context->NewStringFromAsciiz(pw->pw_name); - } - else if (*ichar == 'U' || *ichar == 'u') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)pw->pw_uid); - } - else if (*ichar == 'G' || *ichar == 'g') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)pw->pw_gid); - } - else if (*ichar == 'R' || *ichar == 'r') { - return (RexxObjectPtr)context->NewStringFromAsciiz(pw->pw_gecos); - } - else if (*ichar == 'D' || *ichar == 'd') { - return (RexxObjectPtr)context->NewStringFromAsciiz(pw->pw_dir); - } - else if (*ichar == 'S' || *ichar == 's') { - return (RexxObjectPtr)context->NewStringFromAsciiz(pw->pw_shell); - } - else if (*ichar == 'P' || *ichar == 'p') { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetpwnam")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); -} - - -/** - * Method: SysGetgrnam - * - * Return group name information from the group file. - * - * @param user The group name. - * - * @param ichar The option string. - * - * @return Option information - */ -RexxRoutine2(RexxObjectPtr, - SysGetgrnam, - CSTRING, grpname, - CSTRING, ichar) -{ - if (strlen(grpname) == 0 || strlen(ichar) != 1) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetgrnam")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - struct group *gr = getgrnam(grpname); - if (*ichar == 'N' || *ichar == 'n') { - return (RexxObjectPtr)context->NewStringFromAsciiz(gr->gr_name); - } - else if (*ichar == 'P' || *ichar == 'p') { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - else if (*ichar == 'G' || *ichar == 'g') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)gr->gr_gid); - } - else if (*ichar == 'M' || *ichar == 'm') { - RexxArrayObject arr = context->NewArray(1); - char **members = gr->gr_mem; - while (*members != NULL) { - context->ArrayAppendString(arr, *members, strlen(*members)); - members++; - } - return (RexxObjectPtr)arr; - } - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetgrnam")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); -} - - -/** - * Method: SysGetgrgid - * - * Return group name information from the group file. - * - * @param user The gid. - * - * @param ichar The option string. - * - * @return Option information - */ -RexxRoutine2(RexxObjectPtr, - SysGetgrgid, - int, gid, - CSTRING, ichar) -{ - if (strlen(ichar) != 1) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetgrgid")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - struct group *gr = getgrgid(gid); - if (*ichar == 'N' || *ichar == 'n') { - return (RexxObjectPtr)context->NewStringFromAsciiz(gr->gr_name); - } - else if (*ichar == 'P' || *ichar == 'p') { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - else if (*ichar == 'G' || *ichar == 'g') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)gr->gr_gid); - } - else if (*ichar == 'M' || *ichar == 'm') { - RexxArrayObject arr = context->NewArray(1); - char **members = gr->gr_mem; - while (*members != NULL) { - context->ArrayAppendString(arr, *members, strlen(*members)); - members++; - } - return (RexxObjectPtr)arr; - } - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetgrnam")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); -} - - -/** - * Method: SysStat - * - * Return information from the stat API. - * - * @param user The file name. - * - * @param ichar The option string. - * - * @return Option information - */ -RexxRoutine2(RexxObjectPtr, - SysStat, - CSTRING, fname, - CSTRING, ichar) -{ - struct tm *ftime; - struct stat64 mystat; - char buf[32]; // used for both the file times and the permissions - - if (strlen(fname) == 0 || strlen(ichar) != 1) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysStat")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - int retc = stat64(fname, &mystat); - if (retc != 0) { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - else if (*ichar == 'D' || *ichar == 'd') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)mystat.st_dev); - } - else if (*ichar == 'I' || *ichar == 'i') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)mystat.st_ino); - } - else if (*ichar == 'P' || *ichar == 'p') { - // 1- file type - if (S_IFDIR & mystat.st_mode == S_IFDIR) { - strcpy(buf, "d"); - } - else if (S_IFCHR & mystat.st_mode == S_IFCHR) { - strcpy(buf, "c"); - } - else if (S_IFBLK & mystat.st_mode == S_IFBLK) { - strcpy(buf, "b"); - } - else if (S_IFIFO & mystat.st_mode == S_IFIFO) { - strcpy(buf, "p"); - } - else if (S_IFREG & mystat.st_mode == S_IFREG) { - strcpy(buf, "-"); - } - else if (S_IFLNK & mystat.st_mode == S_IFLNK) { - strcpy(buf, "l"); - } - else if (S_IFSOCK & mystat.st_mode == S_IFSOCK) { - strcpy(buf, "s"); - } - else strcpy(buf, "-"); - // 2 - user read - if (S_IRUSR & mystat.st_mode) { - strcat(buf, "r"); - } - else strcat(buf, "-"); - // 3 - user write - if (S_IWUSR & mystat.st_mode) { - strcat(buf, "w"); - } - else strcat(buf, "-"); - // 4 - user execute - if ((S_IXUSR & mystat.st_mode) && (S_ISUID & mystat.st_mode) && - (S_ISGID & mystat.st_mode)) { - strcat(buf, "s"); - } - else if (!(S_IXUSR & mystat.st_mode) && (S_ISUID & mystat.st_mode) && - (S_ISGID & mystat.st_mode)) { - strcat(buf, "S"); - } - else if ((S_IXUSR & mystat.st_mode) && (S_ISVTX & mystat.st_mode)) { - strcat(buf, "t"); - } - else if (!(S_IXUSR & mystat.st_mode) && (S_ISVTX & mystat.st_mode)) { - strcat(buf, "T"); - } - else if (S_IXUSR & mystat.st_mode) { - strcat(buf, "x"); - } - else strcat(buf, "-"); - // 5 -group read - if (S_IRGRP & mystat.st_mode) { - strcat(buf, "r"); - } - else strcat(buf, "-"); - // 6 - group write - if (S_IWGRP & mystat.st_mode) { - strcat(buf, "w"); - } - else strcat(buf, "-"); - // 7 - group execute - if ((S_IXGRP & mystat.st_mode) && (S_ISUID & mystat.st_mode) && - (S_ISGID & mystat.st_mode)) { - strcat(buf, "s"); - } - else if (!(S_IXGRP & mystat.st_mode) && (S_ISUID & mystat.st_mode) && - (S_ISGID & mystat.st_mode)) { - strcat(buf, "S"); - } - else if ((S_IXGRP & mystat.st_mode) && (S_ISVTX & mystat.st_mode)) { - strcat(buf, "t"); - } - else if (!(S_IXGRP & mystat.st_mode) && (S_ISVTX & mystat.st_mode)) { - strcat(buf, "T"); - } - else if (S_IXGRP & mystat.st_mode) { - strcat(buf, "x"); - } - else strcat(buf, "-"); - // 8 - other read - if (S_IROTH & mystat.st_mode) { - strcat(buf, "r"); - } - else strcat(buf, "-"); - // 9 - other write - if (S_IWOTH & mystat.st_mode) { - strcat(buf, "w"); - } - else strcat(buf, "-"); - // 10 - other execute - if ((S_IXOTH & mystat.st_mode) && (S_ISUID & mystat.st_mode) && - (S_ISGID & mystat.st_mode)) { - strcat(buf, "s"); - } - else if (!(S_IXOTH & mystat.st_mode) && (S_ISUID & mystat.st_mode) && - (S_ISGID & mystat.st_mode)) { - strcat(buf, "S"); - } - else if ((S_IXOTH & mystat.st_mode) && (S_ISVTX & mystat.st_mode)) { - strcat(buf, "t"); - } - else if (!(S_IXOTH & mystat.st_mode) && (S_ISVTX & mystat.st_mode)) { - strcat(buf, "T"); - } - else if (S_IXOTH & mystat.st_mode) { - strcat(buf, "x"); - } - else strcat(buf, "-"); - return (RexxObjectPtr)context->NewStringFromAsciiz(buf); - } - else if (*ichar == 'N' || *ichar == 'n') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)mystat.st_nlink); - } - else if (*ichar == 'U' || *ichar == 'u') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)mystat.st_uid); - } - else if (*ichar == 'G' || *ichar == 'g') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)mystat.st_gid); - } - else if (*ichar == 'R' || *ichar == 'r') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)mystat.st_rdev); - } - else if (*ichar == 'S' || *ichar == 's') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)mystat.st_size); - } - else if (*ichar == 'A' || *ichar == 'a') { - ftime = localtime(&mystat.st_atime); - strftime(buf, sizeof(buf), "%F %T", ftime); - return (RexxObjectPtr)context->NewStringFromAsciiz(buf); - } - else if (*ichar == 'M' || *ichar == 'm') { - ftime = localtime(&mystat.st_mtime); - strftime(buf, sizeof(buf), "%F %T", ftime); - return (RexxObjectPtr)context->NewStringFromAsciiz(buf); - } - else if (*ichar == 'C' || *ichar == 'c') { - ftime = localtime(&mystat.st_ctime); - strftime(buf, sizeof(buf), "%F %T", ftime); - return (RexxObjectPtr)context->NewStringFromAsciiz(buf); - } - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysStat")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); -} - - -/** - * Method: SysAccess - * - * Return access information. - * - * @param file The file specification. - * - * @param ichar The integer option. - * - * @return 0 = access allowed. - */ -RexxRoutine2(int, - SysAccess, - CSTRING, file, - int, option) -{ - - return access(file, option); -} - - -/** - * Method: SysEuidaccess - * - * Return access information using the effective userid. - * - * @param file The file specification. - * - * @param ichar The integer option. - * - * @return 0 = access allowed. - */ -RexxRoutine2(int, - SysEuidaccess, - CSTRING, file, - int, option) -{ - - return euidaccess(file, option); -} - - -/** - * Method: SysGetservbyname - * - * Return service information from the services file. - * - * @param name The service name. - * - * @param proto The service protocol. - * - * @param option The option string. - * - * @return Option information - */ -RexxRoutine3(RexxObjectPtr, - SysGetservbyname, - CSTRING, name, - CSTRING, proto, - CSTRING, ichar) -{ - if (strlen(name) == 0 || strlen(proto) == 0 || strlen(ichar) != 1) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetservbyname")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - struct servent *se = getservbyname(name, proto); - if (*ichar == 'N' || *ichar == 'n') { - return (RexxObjectPtr)context->NewStringFromAsciiz(se->s_name); - } - else if (*ichar == 'P' || *ichar == 'p') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)se->s_port); - } - else if (*ichar == 'A' || *ichar == 'a') { - RexxArrayObject arr = context->NewArray(1); - char **members = se->s_aliases; - while (*members != NULL) { - context->ArrayAppendString(arr, *members, strlen(*members)); - members++; - } - return (RexxObjectPtr)arr; - } - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetservbyname")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); -} - - -/** - * Method: SysGetservbyport - * - * Return service information from the services file. - * - * @param port The service port. - * - * @param proto The service protocol. - * - * @param option The option string. - * - * @return Option information - */ -RexxRoutine3(RexxObjectPtr, - SysGetservbyport, - int, port, - CSTRING, proto, - CSTRING, ichar) -{ - if (port == 0 || strlen(proto) == 0 || strlen(ichar) != 1) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetservbyname")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - struct servent *se = getservbyport(port, proto); - if (ichar == NULL) { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - else if (*ichar == 'N' || *ichar == 'n') { - return (RexxObjectPtr)context->NewStringFromAsciiz(se->s_name); - } - else if (*ichar == 'P' || *ichar == 'p') { - return (RexxObjectPtr)context->WholeNumberToObject((wholenumber_t)se->s_port); - } - else if (*ichar == 'A' || *ichar == 'a') { - RexxArrayObject arr = context->NewArray(1); - char **members = se->s_aliases; - while (*members != NULL) { - context->ArrayAppendString(arr, *members, strlen(*members)); - members++; - } - return (RexxObjectPtr)arr; - } - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysGetservbyname")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); -} - - -/** - * Method: SysWordexp - * - * Return an array of files matching the input expression. - * - * @param inexp The input expression. - * - * @return Array of file names. - */ -RexxRoutine1(RexxObjectPtr, - SysWordexp, - CSTRING, inexp) -{ - wordexp_t p; - char **w; - if (strlen(inexp) == 0) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysWordexp")); - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - RexxArrayObject arr = context->NewArray(1); - - wordexp(inexp, &p, 0); - - w = p.we_wordv; - for (int i = 0; i < p.we_wordc; i++) { - context->ArrayAppendString(arr, w[i], strlen(w[i])); - } - wordfree(&p); - return (RexxObjectPtr)arr; -} - - -#ifdef HAVE_XATTR_H -/** - * Method: SysSetxattr - * - * Set a file extended attribute. - * - * @param fname The file name. - * - * @param name The extended attribute name. - * - * @param val The extended attribute value. - * - * @return 0 or -1. - */ -RexxRoutine3(int, - SysSetxattr, - CSTRING, fname, - CSTRING, name, - CSTRING, val) -{ - return setxattr(fname, name, val, strlen(val) + 1, 0); -} - - -/** - * Method: SysGetxattr - * - * Get a file extended attribute. - * - * @param fname The file name. - * - * @param name The extended attribute name. - * - * @return 0 or -1. - */ -RexxRoutine2(RexxObjectPtr, - SysGetxattr, - CSTRING, fname, - CSTRING, name) -{ - ssize_t sz; - char *buf; - - sz = getxattr(fname, name, NULL, 0); - if (sz == -1) { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - buf = (char *)alloca(sz); - getxattr(fname, name, buf, sz); - - return (RexxObjectPtr)context->NewStringFromAsciiz(buf); -} - - -/** - * Method: SysListxattr - * - * List a file's extended attribute(s). - * - * @param fname The file name. - * - * @return 0 or -1. - */ -RexxRoutine1(RexxObjectPtr, - SysListxattr, - CSTRING, fname) -{ - ssize_t sz; - char *buf, *name; - - sz = listxattr(fname, NULL, 0); - if (sz == -1) { - return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); - } - buf = (char *)alloca(sz); - listxattr(fname, buf, sz); - - // create a Rexx array of the xattr names - RexxArrayObject arr = context->NewArray(1); - while (sz > 0) { - context->ArrayAppendString(arr, buf, strlen(buf)); - sz -= strlen(buf) + 1; - buf += strlen(buf) + 1; - } - - return (RexxObjectPtr)arr; -} - - -/** - * Method: SysRemovexattr - * - * Remove an extended attribute. - * - * @param fname The file name. - * - * @param name The extended attribute name. - * - * @return 0 or -1. - */ -RexxRoutine2(int, - SysRemovexattr, - CSTRING, fname, - CSTRING, name) -{ - - - return removexattr(fname, name); -} -#endif - - -/** - * Method: SysGetsizeofptr - * - * Get the size of the ooRexx application pointers (in bits). - * - * @return 32 or 64. - */ -RexxRoutine0(int, - SysGetsizeofptr) -{ - - - return sizeof(void *) * 8; -} - - -/** - * Method: SysGethostname - * - * Get the machine hostname. - * - * @return hostname. - */ -RexxRoutine0(RexxObjectPtr, - SysGethostname) -{ - char hostname[HOST_NAME_MAX]; - - gethostname(hostname, HOST_NAME_MAX); - return (RexxObjectPtr)context->NewStringFromAsciiz(hostname); -} - - -/** - * Method: SysChmod - * - * Change the file permissions. - * - * @param usr The user permissions. - * - * @param grp The group permissions. - * - * @param oth The other permissions. - * - * @return Return code from chmod(). - */ -RexxRoutine2(int, - SysChmod, - CSTRING, file, - CSTRING, mode) -{ - mode_t perm = 0; - - // make sure the mode is the correct size - if (strlen(mode) != 9) { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysChmod")); - return -1; - } - - // set usr bits - if (mode[0] == 'r') { - perm |= S_IRUSR; - } - else if (mode[0] == '-') { - } - else { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysChmod")); - return -1; - } - if (mode[1] == 'w') { - perm |= S_IWUSR; - } - else if (mode[1] == '-') { - } - else { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysChmod")); - return -1; - } - if (mode[2] == 'x') { - perm |= S_IXUSR; - } - else if (mode[2] == 'S') { - perm |= S_ISUID; - } - else if (mode[2] == 's') { - perm |= S_IXUSR; - perm |= S_ISUID; - } - else if (mode[2] == '-') { - } - else { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysChmod")); - return -1; - } - - // set grp bits - if (mode[3] == 'r') { - perm |= S_IRGRP; - } - else if (mode[3] == '-') { - } - else { - context->RaiseException1(40001, (RexxObjectPtr) context->NewStringFromAsciiz("SysChmod")); - return -1; - } - if (mode[4] == 'w') { - perm |= S_IWGRP; - } - else if (mode[4] == '-') { - } - else { - context->RaiseException1(40001, (... [truncated message content] |
From: <jfa...@us...> - 2010-11-14 22:18:59
|
Revision: 6388 http://oorexx.svn.sourceforge.net/oorexx/?rev=6388&view=rev Author: jfaucher Date: 2010-11-14 22:18:47 +0000 (Sun, 14 Nov 2010) Log Message: ----------- m17n : replaced size_t by strong types in BufferClass and StringClass, to detect misuse between 'size in bytes' and 'size in chars'. As expected, that generated a lot of compilation errors, now fixed and annotated with "todo m17n". Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/Makefile.am sandbox/jlf/trunk/api/rexx.h sandbox/jlf/trunk/common/Utilities.cpp sandbox/jlf/trunk/common/Utilities.hpp sandbox/jlf/trunk/interpreter/api/ThreadContextStubs.cpp sandbox/jlf/trunk/interpreter/classes/BufferClass.cpp sandbox/jlf/trunk/interpreter/classes/BufferClass.hpp sandbox/jlf/trunk/interpreter/classes/DirectoryClass.cpp sandbox/jlf/trunk/interpreter/classes/IntegerClass.cpp sandbox/jlf/trunk/interpreter/classes/IntegerClass.hpp sandbox/jlf/trunk/interpreter/classes/MessageClass.cpp sandbox/jlf/trunk/interpreter/classes/MethodClass.cpp sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp sandbox/jlf/trunk/interpreter/classes/NumberStringClass.cpp sandbox/jlf/trunk/interpreter/classes/NumberStringClass.hpp sandbox/jlf/trunk/interpreter/classes/ObjectClass.cpp sandbox/jlf/trunk/interpreter/classes/RoutineClass.cpp sandbox/jlf/trunk/interpreter/classes/StringClass.cpp sandbox/jlf/trunk/interpreter/classes/StringClass.hpp sandbox/jlf/trunk/interpreter/classes/StringClassBit.cpp sandbox/jlf/trunk/interpreter/classes/StringClassConversion.cpp sandbox/jlf/trunk/interpreter/classes/StringClassMisc.cpp sandbox/jlf/trunk/interpreter/classes/StringClassSub.cpp sandbox/jlf/trunk/interpreter/classes/StringClassUtil.cpp sandbox/jlf/trunk/interpreter/classes/StringClassWord.cpp sandbox/jlf/trunk/interpreter/classes/support/ProgramMetaData.cpp sandbox/jlf/trunk/interpreter/classes/support/RexxCompoundTail.cpp sandbox/jlf/trunk/interpreter/classes/support/RexxCompoundTail.hpp sandbox/jlf/trunk/interpreter/classes/support/RexxHashTable.cpp sandbox/jlf/trunk/interpreter/classes/support/StringUtil.cpp sandbox/jlf/trunk/interpreter/classes/support/StringUtil.hpp sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_ascii.h sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_binary.h sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_iso-8859-1.h sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_tables.h sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_unicode.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_fixed_8.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs2.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs4.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf16.h sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf8.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_charset.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_encoding.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_string.h sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_string_funcs.h sandbox/jlf/trunk/interpreter/concurrency/CommandHandler.cpp sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp sandbox/jlf/trunk/interpreter/execution/RexxActivation.cpp sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp sandbox/jlf/trunk/interpreter/execution/RexxVariableDictionary.cpp sandbox/jlf/trunk/interpreter/expression/BuiltinFunctions.cpp sandbox/jlf/trunk/interpreter/expression/ExpressionCompoundVariable.cpp sandbox/jlf/trunk/interpreter/expression/IndirectVariableReference.cpp sandbox/jlf/trunk/interpreter/instructions/OptionsInstruction.cpp sandbox/jlf/trunk/interpreter/instructions/ParseTarget.cpp sandbox/jlf/trunk/interpreter/instructions/ParseTarget.hpp sandbox/jlf/trunk/interpreter/instructions/RexxInstruction.hpp sandbox/jlf/trunk/interpreter/interpreter.mak sandbox/jlf/trunk/interpreter/memory/RexxSmartBuffer.cpp sandbox/jlf/trunk/interpreter/memory/RexxSmartBuffer.hpp sandbox/jlf/trunk/interpreter/parser/Clause.cpp sandbox/jlf/trunk/interpreter/parser/Clause.hpp sandbox/jlf/trunk/interpreter/parser/KeywordConstants.cpp sandbox/jlf/trunk/interpreter/parser/Scanner.cpp sandbox/jlf/trunk/interpreter/parser/SourceFile.cpp sandbox/jlf/trunk/interpreter/parser/SourceFile.hpp sandbox/jlf/trunk/interpreter/parser/SourceLocation.hpp sandbox/jlf/trunk/interpreter/platform/unix/MemorySupport.cpp sandbox/jlf/trunk/interpreter/platform/unix/SystemInterpreter.hpp sandbox/jlf/trunk/interpreter/platform/windows/MemorySupport.cpp sandbox/jlf/trunk/interpreter/platform/windows/MiscSystem.cpp sandbox/jlf/trunk/interpreter/platform/windows/SysFileSystem.cpp sandbox/jlf/trunk/interpreter/platform/windows/SystemInterpreter.hpp sandbox/jlf/trunk/interpreter/platform/windows/ValueFunction.cpp sandbox/jlf/trunk/interpreter/runtime/Interpreter.cpp sandbox/jlf/trunk/interpreter/runtime/Numerics.hpp sandbox/jlf/trunk/interpreter/runtime/RexxCore.h sandbox/jlf/unicode/_readme.odt Added Paths: ----------- sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_ascii.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_binary.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_iso-8859-1.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_tables.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_unicode.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_fixed_8.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs2.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs4.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf16.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf8.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_api.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_charset.cpp sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_encoding.cpp Removed Paths: ------------- sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_ascii.c sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_binary.c sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_iso-8859-1.c sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_tables.c sandbox/jlf/trunk/interpreter/classes/support/m17n/charset/m17n_charset_unicode.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_fixed_8.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs2.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_ucs4.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf16.c sandbox/jlf/trunk/interpreter/classes/support/m17n/encoding/m17n_encoding_utf8.c sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_api.c sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_charset.c sandbox/jlf/trunk/interpreter/classes/support/m17n/m17n_encoding.c Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/_diary.txt 2010-11-14 22:18:47 UTC (rev 6388) @@ -33,10 +33,69 @@ Unicode ? --> added support for wide-chars in oodialog. ---> in progress : m17n +--> in progress : m17n (but this is not the way proposed by Rick) +Extension of the message term : keyword and multiple dispatch. +http://atomo-lang.org/ +http://slatelanguage.org/ + =============================================================================== +2010 nov 14 + +I have reached a state where the interpreter is no longer broken by m17n. +The most difficult bugs were because of the default constructor of rxStringSize. +By assigning 0 (a good practice for me), I had nasty bugs in the parser. +Solved by leaving the attribute uninitialized... +Remember : + +RexxSource::sayNew + RexxObject *_expression = this->expression(TERM_EOC); + RexxInstruction *newObject = new_instruction(SAY, Say); <-- location is copied from this->clause by RexxSource::sourceNewObject + new ((void *)newObject) RexxInstructionSay(_expression); <-- boom ! location is overwritten by default constructor of rxStringSize + +inline RexxBuffer *new_buffer(sizeB_t s) { return new (size_v(s)) RexxBuffer; } <-- bufferSize and dataLength were always 0 ! +void *RexxBuffer::operator new(size_t size, size_t _length) + newBuffer->bufferSize = _length; <-- initialized here, *before* the execution of default constructor + newBuffer->dataLength = _length; <-- same problem + + +Now, the next step is probably to change the signature of the methods in StringUtil, +to pass a IRexxString parameter, instead of a couple (char*, size_t) which are the +internal attributes stringData and length. + + +=============================================================================== +2010 oct 10 + +rexx.h +Defined strong types to detect misuse between 'size in bytes' and 'size in chars'. +When changing the sources for m17n, I activate the strong types. +Otherwise I use the weak types. +See rxStringSize. + + +=============================================================================== +2010 sept 24 + +Started a review of the NetRexx specification, in unicode/_readme.odt. +The goal is to see how the issues reported by Rick are covered by NetRexx. + + +=============================================================================== +2010 sept 20 + +Fixed the build of m17n under Linux. +Had to rename all the *.c files to *.cpp, because .c source files are not correctly +built by Makefile.am. + + +Note about Parrot : +The charset/encoding merge has been moved in Parrot's trunk. +I will probably apply this merge. + + +=============================================================================== 2010 sep 05 Found a bug, fixed in sandbox, to fix in trunk. Modified: sandbox/jlf/trunk/Makefile.am =================================================================== --- sandbox/jlf/trunk/Makefile.am 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/Makefile.am 2010-11-14 22:18:47 UTC (rev 6388) @@ -68,6 +68,9 @@ build_behaviour_dir = $(build_interpreter_dir)/behaviour build_classes_dir = $(build_interpreter_dir)/classes build_classes_support_dir = $(build_interpreter_dir)/classes/support +build_m17n_dir = $(build_interpreter_dir)/classes/support/m17n +build_m17n_charset_dir = $(build_interpreter_dir)/classes/support/m17n/charset +build_m17n_encoding_dir = $(build_interpreter_dir)/classes/support/m17n/encoding build_concurrency_dir = $(build_interpreter_dir)/concurrency build_execution_dir = $(build_interpreter_dir)/execution build_expression_dir = $(build_interpreter_dir)/expression @@ -214,6 +217,22 @@ $(build_classes_support_dir)/RexxHashTable.hpp \ $(build_classes_support_dir)/RexxListTable.hpp \ $(build_classes_support_dir)/StringUtil.hpp +m17nHeaders = $(build_m17n_dir)/m17n_cclass.h \ + $(build_m17n_dir)/m17n_charset.h \ + $(build_m17n_dir)/m17n_encoding.h \ + $(build_m17n_dir)/m17n_string.h \ + $(build_m17n_dir)/m17n_string_funcs.h \ + $(build_m17n_dir)/m17n_unicode.h +m17nCharsetHeaders = $(build_m17n_charset_dir)/m17n_charset_ascii.h \ + $(build_m17n_charset_dir)/m17n_charset_binary.h \ + $(build_m17n_charset_dir)/m17n_charset_iso-8859-1.h \ + $(build_m17n_charset_dir)/m17n_charset_tables.h \ + $(build_m17n_charset_dir)/m17n_charset_unicode.h +m17nEncodingHeaders = $(build_m17n_encoding_dir)/m17n_encoding_fixed_8.h \ + $(build_m17n_encoding_dir)/m17n_encoding_ucs2.h \ + $(build_m17n_encoding_dir)/m17n_encoding_ucs4.h \ + $(build_m17n_encoding_dir)/m17n_encoding_utf8.h \ + $(build_m17n_encoding_dir)/m17n_encoding_utf16.h concurrencyHeaders = $(build_concurrency_dir)/ActivationApiContexts.hpp \ $(build_concurrency_dir)/ActivationFrame.hpp \ $(build_concurrency_dir)/ActivityDispatcher.hpp \ @@ -516,6 +535,19 @@ $(build_classes_support_dir)/RexxHashTable.cpp \ $(build_classes_support_dir)/RexxListTable.cpp \ $(build_classes_support_dir)/StringUtil.cpp +m17n_sources = $(build_m17n_dir)/m17n_api.cpp \ + $(build_m17n_dir)/m17n_charset.cpp \ + $(build_m17n_dir)/m17n_encoding.cpp +m17n_charset_sources = $(build_m17n_charset_dir)/m17n_charset_ascii.cpp \ + $(build_m17n_charset_dir)/m17n_charset_binary.cpp \ + $(build_m17n_charset_dir)/m17n_charset_iso-8859-1.cpp \ + $(build_m17n_charset_dir)/m17n_charset_tables.cpp \ + $(build_m17n_charset_dir)/m17n_charset_unicode.cpp +m17n_encoding_sources = $(build_m17n_encoding_dir)/m17n_encoding_fixed_8.cpp \ + $(build_m17n_encoding_dir)/m17n_encoding_ucs2.cpp \ + $(build_m17n_encoding_dir)/m17n_encoding_ucs4.cpp \ + $(build_m17n_encoding_dir)/m17n_encoding_utf8.cpp \ + $(build_m17n_encoding_dir)/m17n_encoding_utf16.cpp classes_sources = $(build_classes_dir)/ArrayClass.cpp \ $(build_classes_dir)/BufferClass.cpp \ $(build_classes_dir)/ClassClass.cpp \ @@ -682,6 +714,9 @@ $(build_streamlibrary_dir)/FileNative.cpp librexx_la_SOURCES = $(classes_sources) \ $(classes_support_sources) \ + $(m17n_sources) \ + $(m17n_charset_sources) \ + $(m17n_encoding_sources) \ $(interpreter_api_sources) \ $(behaviour_sources) \ $(execution_sources) \ @@ -718,6 +753,9 @@ -I$(build_instructions_dir) \ -I$(build_classes_dir) \ -I$(build_classes_support_dir) \ + -I$(build_m17n_dir) \ + -I$(build_m17n_charset_dir) \ + -I$(build_m17n_encoding_dir) \ -I$(build_runtime_dir) \ -I$(build_parser_dir) \ -I$(build_messages_dir) \ Modified: sandbox/jlf/trunk/api/rexx.h =================================================================== --- sandbox/jlf/trunk/api/rexx.h 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/api/rexx.h 2010-11-14 22:18:47 UTC (rev 6388) @@ -223,9 +223,227 @@ typedef size_t stringsize_t; // a Rexx string size typedef ssize_t sstringsize_t; // a Rexx signed string size, which allows to pass -1 as default value -typedef ssize_t wholenumber_t; // a Rexx whole number +typedef size_t uwholenumber_t; // a Rexx whole number (unsigned) +typedef ssize_t wholenumber_t; // a Rexx whole number (signed) typedef size_t logical_t; // a Rexx logical (1 or 0) value +typedef ssize_t codepoint_t; // a Rexx signed codepoint, which allows to pass -1 as default value or return -1 when error +#define STRONG_TYPES +#ifndef STRONG_TYPES + +// Convert helpers (cast), to provide same services for weak and strong types +#define size_v(X) size_t(X) +#define ssize_v(X) ssize_t(X) +#define stringsize_v(X) stringsize_t(X) +#define sstringsize_v(X) sstringsize_t(X) + +// Weak type for unsigned size in chars +typedef stringsize_t stringsizeC_t; +typedef stringsizeC_t sizeC_t; // Often size_t is used instead of stringsize_t --> create a similar name +#define stringsizeC_v(X) stringsizeC_t(X) +#define sizeC_v(X) sizeC_t(X) + +// Weak type for signed size in chars +typedef sstringsize_t sstringsizeC_t; +typedef sstringsizeC_t ssizeC_t; +#define sstringsizeC_v(X) sstringsizeC_t(X) +#define ssizeC_v(X) ssizeC_t(X) + +// Weak type for unsigned string's size in bytes +typedef stringsize_t stringsizeB_t; +typedef stringsizeB_t sizeB_t; +#define stringsizeB_v(X) stringsizeB_t(X) +#define sizeB_v(X) sizeB_t(X) + +// Weak type for signed string's size in bytes +typedef sstringsize_t sstringsizeB_t; +typedef sstringsizeB_t ssizeB_t; +#define sstringsizeB_v(X) sstringsizeB_t(X) +#define ssizeB_v(X) ssizeB_t(X) + +#else + +// Temporary strong types to detect misuse between 'size in bytes' and 'size in chars' + +// Borrowed from Boost enable_if.hpp +// I use it to declare specialized constructors, depending on the strong type currently built +template <bool B, class T = void> struct enable_if_c { typedef T type; }; +template <class T> struct enable_if_c<false, T> {}; + +// D is a discriminant wich is used to create different types for the same type T : +// 'unsigned size in bytes' and 'unsigned size in chars' are both of type stringsize_t. +// But I want two different types to let the compiler complain when I pass an 'unsigned size in bytes' +// to a method wich expects an 'unsigned size in chars'. +enum Discriminant {stringsizeC, sstringsizeC, stringsizeB, sstringsizeB}; + +// T is supposed to be size_t or ssize_t. +// That's why I add overloadings with int, to support constants like 0 or 1 or ... (whose implicit type is int, not size_t or ssize_t) +// That really removes errors of kind "ambiguous..." +template <typename T, int D> +class rxStringSize +{ +public: + static const int ident=D; + static rxStringSize value(T s) { return rxStringSize<T, D>(s); } +public: + rxStringSize() /* : size(0) */ {} // Must NOT assign 0 because some constructors are sometimes called directly, and this assignement overrides some values already assigned... Strange practice, but... + rxStringSize(T t) : size(t) {} + rxStringSize(int t) : size(t) {} + rxStringSize(const rxStringSize<T, D> &s) : size(s.size) {} + // signed size and unsigned size are compatible (signed size is used to allow default argument -1) + template <typename T1> rxStringSize(T1 &s, typename enable_if_c< D == sstringsizeC && T1::ident == stringsizeC >::type *dummy=0) : size(s.value()) {} + template <typename T1> rxStringSize(T1 &s, typename enable_if_c< D == sstringsizeB && T1::ident == stringsizeB >::type *dummy=0) : size(s.value()) {} + template <typename T1> rxStringSize(T1 &s, typename enable_if_c< D == stringsizeC && T1::ident == sstringsizeC >::type *dummy=0) : size(s.value()) {} + template <typename T1> rxStringSize(T1 &s, typename enable_if_c< D == stringsizeB && T1::ident == sstringsizeB >::type *dummy=0) : size(s.value()) {} + //operator T() { return size; } + T value() const { return size; } + + rxStringSize<T, D> &operator =(const rxStringSize<T, D> &other) { size = other.size; return *this; } + rxStringSize<T, D> &operator =(const T &other) { size = other; return *this; } + + rxStringSize<T, D> &operator +=(const rxStringSize<T, D> &other) { size += other.size; return *this; } + rxStringSize<T, D> &operator +=(const T &other) { size += other; return *this; } + + rxStringSize<T, D> &operator -=(const rxStringSize<T, D> &other) { size -= other.size; return *this; } + rxStringSize<T, D> &operator -=(const T &other) { size -= other; return *this; } + + rxStringSize<T, D> &operator *=(const rxStringSize<T, D> &other) { size *= other.size; return *this; } + rxStringSize<T, D> &operator *=(const T &other) { size *= other; return *this; } + + rxStringSize<T, D> &operator >>=(const rxStringSize<T, D> &other) { size >>= other.size; return *this; } + rxStringSize<T, D> &operator >>=(const T &other) { size >>= other; return *this; } + + // prefix + rxStringSize<T, D> &operator ++() { ++size; return *this; } + rxStringSize<T, D> &operator --() { --size; return *this; } + + // suffix + rxStringSize<T, D> operator ++(int) { return size++; } + rxStringSize<T, D> operator --(int) { return size--; } +protected: + T size; +}; + +template <typename T, int D> bool operator ==(T t, const rxStringSize<T, D> &s) { return t == s.value(); } +template <typename T, int D> bool operator ==(int t, const rxStringSize<T, D> &s) { return t == s.value(); } +template <typename T, int D> bool operator ==(const rxStringSize<T, D> &s, T t) { return s.value() == t; } +template <typename T, int D> bool operator ==(const rxStringSize<T, D> &s, int t) { return s.value() == t; } +template <typename T, int D> bool operator ==(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return s1.value() == s2.value(); } + +template <typename T, int D> bool operator !=(T t, const rxStringSize<T, D> &s) { return t != s.value(); } +template <typename T, int D> bool operator !=(int t, const rxStringSize<T, D> &s) { return t != s.value(); } +template <typename T, int D> bool operator !=(const rxStringSize<T, D> &s, T t) { return s.value() != t; } +template <typename T, int D> bool operator !=(const rxStringSize<T, D> &s, int t) { return s.value() != t; } +template <typename T, int D> bool operator !=(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return s1.value() != s2.value(); } + +template <typename T, int D> bool operator <(T t, const rxStringSize<T, D> &s) { return t < s.value(); } +template <typename T, int D> bool operator <(int t, const rxStringSize<T, D> &s) { return t < (ssize_t)s.value(); } +template <typename T, int D> bool operator <(const rxStringSize<T, D> &s, T t) { return s.value() < t; } +template <typename T, int D> bool operator <(const rxStringSize<T, D> &s, int t) { return (ssize_t)s.value() < t; } +template <typename T, int D> bool operator <(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return s1.value() < s2.value(); } + +template <typename T, int D> bool operator <=(T t, const rxStringSize<T, D> &s) { return t <= s.value(); } +template <typename T, int D> bool operator <=(int t, const rxStringSize<T, D> &s) { return t <= (ssize_t)s.value(); } +template <typename T, int D> bool operator <=(const rxStringSize<T, D> &s, T t) { return s.value() <= t; } +template <typename T, int D> bool operator <=(const rxStringSize<T, D> &s, int t) { return (ssize_t)s.value() <= t; } +template <typename T, int D> bool operator <=(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return s1.value() <= s2.value(); } + +template <typename T, int D> bool operator >(T t, const rxStringSize<T, D> &s) { return t > s.value(); } +template <typename T, int D> bool operator >(int t, const rxStringSize<T, D> &s) { return t > (ssize_t)s.value(); } +template <typename T, int D> bool operator >(const rxStringSize<T, D> &s, T t) { return s.value() > t; } +template <typename T, int D> bool operator >(const rxStringSize<T, D> &s, int t) { return (ssize_t)s.value() > t; } +template <typename T, int D> bool operator >(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return s1.value() > s2.value(); } + +template <typename T, int D> bool operator >=(T t, const rxStringSize<T, D> &s) { return t >= s.value(); } +template <typename T, int D> bool operator >=(int t, const rxStringSize<T, D> &s) { return t >= (ssize_t)s.value(); } +template <typename T, int D> bool operator >=(const rxStringSize<T, D> &s, T t) { return s.value() >= t; } +template <typename T, int D> bool operator >=(const rxStringSize<T, D> &s, int t) { return (ssize_t)s.value() >= t; } +template <typename T, int D> bool operator >=(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return s1.value() >= s2.value(); } + +template <typename T, int D> rxStringSize<T, D> operator +(T t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t + s.value()); } +template <typename T, int D> rxStringSize<T, D> operator +(int t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t + s.value()); } +template <typename T, int D> rxStringSize<T, D> operator +(const rxStringSize<T, D> &s, T t) { return rxStringSize<T, D>::value(s.value() + t); } +template <typename T, int D> rxStringSize<T, D> operator +(const rxStringSize<T, D> &s, int t) { return rxStringSize<T, D>::value(s.value() + t); } +template <typename T, int D> rxStringSize<T, D> operator +(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return rxStringSize<T, D>::value(s1.value() + s2.value()); } + +template <typename T, int D> rxStringSize<T, D> operator -(T t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t - s.value()); } +template <typename T, int D> rxStringSize<T, D> operator -(int t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t - s.value()); } +template <typename T, int D> rxStringSize<T, D> operator -(const rxStringSize<T, D> &s, T t) { return rxStringSize<T, D>::value(s.value() - t); } +template <typename T, int D> rxStringSize<T, D> operator -(const rxStringSize<T, D> &s, int t) { return rxStringSize<T, D>::value(s.value() - t); } +template <typename T, int D> rxStringSize<T, D> operator -(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return rxStringSize<T, D>::value(s1.value() - s2.value()); } + +template <typename T, int D> rxStringSize<T, D> operator *(T t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t * s.value()); } +template <typename T, int D> rxStringSize<T, D> operator *(int t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t * s.value()); } +template <typename T, int D> rxStringSize<T, D> operator *(const rxStringSize<T, D> &s, T t) { return rxStringSize<T, D>::value(s.value() * t); } +template <typename T, int D> rxStringSize<T, D> operator *(const rxStringSize<T, D> &s, int t) { return rxStringSize<T, D>::value(s.value() * t); } +template <typename T, int D> rxStringSize<T, D> operator *(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return rxStringSize<T, D>::value(s1.value() * s2.value()); } + +template <typename T, int D> rxStringSize<T, D> operator /(T t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t / s.value()); } +template <typename T, int D> rxStringSize<T, D> operator /(int t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t / s.value()); } +template <typename T, int D> rxStringSize<T, D> operator /(const rxStringSize<T, D> &s, T t) { return rxStringSize<T, D>::value(s.value() / t); } +template <typename T, int D> rxStringSize<T, D> operator /(const rxStringSize<T, D> &s, int t) { return rxStringSize<T, D>::value(s.value() / t); } +template <typename T, int D> rxStringSize<T, D> operator /(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return rxStringSize<T, D>::value(s1.value() / s2.value()); } + +template <typename T, int D> rxStringSize<T, D> operator %(T t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t % s.value()); } +template <typename T, int D> rxStringSize<T, D> operator %(int t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t % s.value()); } +template <typename T, int D> rxStringSize<T, D> operator %(const rxStringSize<T, D> &s, T t) { return rxStringSize<T, D>::value(s.value() % t); } +template <typename T, int D> rxStringSize<T, D> operator %(const rxStringSize<T, D> &s, int t) { return rxStringSize<T, D>::value(s.value() % t); } +template <typename T, int D> rxStringSize<T, D> operator %(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return rxStringSize<T, D>::value(s1.value() % s2.value()); } + +template <typename T, int D> rxStringSize<T, D> operator &(T t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t & s.value()); } +template <typename T, int D> rxStringSize<T, D> operator &(int t, const rxStringSize<T, D> &s) { return rxStringSize<T, D>::value(t & s.value()); } +template <typename T, int D> rxStringSize<T, D> operator &(const rxStringSize<T, D> &s, T t) { return rxStringSize<T, D>::value(s.value() & t); } +template <typename T, int D> rxStringSize<T, D> operator &(const rxStringSize<T, D> &s, int t) { return rxStringSize<T, D>::value(s.value() & t); } +template <typename T, int D> rxStringSize<T, D> operator &(const rxStringSize<T, D> &s1, const rxStringSize<T, D> &s2) { return rxStringSize<T, D>::value(s1.value() & s2.value()); } + +// Convert helpers (cast), to provide same services for weak and strong types +#define size_v(X) size_t((X).value()) +#define ssize_v(X) ssize_t((X).value()) +#define stringsize_v(X) stringsize_t((X).value()) +#define sstringsize_v(X) sstringsize_t((X).value()) + +// Strong type for unsigned size in chars +typedef rxStringSize<stringsize_t, stringsizeC> stringsizeC_t; +typedef stringsizeC_t sizeC_t; // Often size_t is used instead of stringsize_t --> create a similar name for the strong type +#define stringsizeC_v(X) stringsizeC_t::value(X) +#define sizeC_v(X) sizeC_t::value(X) + +// Strong type for signed size in chars +typedef rxStringSize<sstringsize_t, sstringsizeC> sstringsizeC_t; +typedef sstringsizeC_t ssizeC_t; +#define sstringsizeC_v(X) sstringsizeC_t::value(X) +#define ssizeC_v(X) ssizeC_t::value(X) + +// Strong type for unsigned string's size in bytes +typedef rxStringSize<stringsize_t, stringsizeB> stringsizeB_t; +typedef stringsizeB_t sizeB_t; +#define stringsizeB_v(X) stringsizeB_t::value(X) +#define sizeB_v(X) sizeB_t::value(X) + +// Strong type for signed string's size in bytes +typedef rxStringSize<sstringsize_t, sstringsizeB> sstringsizeB_t; +typedef sstringsizeB_t ssizeB_t; +#define sstringsizeB_v(X) sstringsizeB_t::value(X) +#define ssizeB_v(X) ssizeB_t::value(X) + +inline char *&operator +=(char *&str, sizeB_t s) { str += s.value(); return str; } +inline const char *&operator +=(const char *&str, sizeB_t s) { str += s.value(); return str; } + +inline char *operator +(char *str, sizeB_t s) { return str + s.value(); } +inline const char *operator +(const char *str, sizeB_t s) { return str + s.value(); } + +inline char *operator -(char *str, sizeB_t s) { return str - s.value(); } +inline const char *operator -(const char *str, sizeB_t s) { return str - s.value(); } + +inline int memcmp(const void *s1, const void *s2, sizeB_t n) { return memcmp(s1, s2, size_v(n)); } +inline void *memcpy(void *dest, const void *src, sizeB_t n) { return memcpy(dest, src, size_v(n)); } +inline void *memmove(void *dest, const void *src, sizeB_t n) { return memmove(dest, src, size_v(n)); } +inline void *memset(void *s, int c, sizeB_t n) { return memset(s, c, size_v(n)); } +inline const void *memchr(const void *s, int c, sizeB_t n) { return memchr(s, c, size_v(n)); } + +#endif + + // a synonym for readability #define RexxEntry REXXENTRY Modified: sandbox/jlf/trunk/common/Utilities.cpp =================================================================== --- sandbox/jlf/trunk/common/Utilities.cpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/common/Utilities.cpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -52,7 +52,7 @@ const char *Utilities::locateCharacter( const char *string, /* search string */ const char *set, /* reference set */ - size_t length ) /* size of string */ + sizeB_t length ) /* size of string */ /*********************************************************************/ /* Function: Find first occurence of set member in memory */ /*********************************************************************/ @@ -169,7 +169,7 @@ * * @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 *Utilities::strnchr(const char *data, sizeB_t n, char ch) { const char *endPtr = data + n; while (data < endPtr && *data != '\0') Modified: sandbox/jlf/trunk/common/Utilities.hpp =================================================================== --- sandbox/jlf/trunk/common/Utilities.hpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/common/Utilities.hpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -40,7 +40,9 @@ #ifndef Included_Utilities #define Included_Utilities +#include <rexx.h> #include <sys/types.h> +#include <stdarg.h> class Utilities { @@ -49,8 +51,8 @@ static int memicmp(const void *opt1, const void *opt2, size_t len); static void strupper(char *str); static void strlower(char *str); - static const char *strnchr(const char *, size_t n, char ch); - static const char *locateCharacter(const char *s, const char *set, size_t l); + static const char *strnchr(const char *, sizeB_t n, char ch); + static const char *locateCharacter(const char *s, const char *set, sizeB_t l); static int vsnprintf(char *buffer, size_t count, const char *format, va_list args); static int snprintf(char *buffer, size_t count, const char *format, ...); }; Modified: sandbox/jlf/trunk/interpreter/api/ThreadContextStubs.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/api/ThreadContextStubs.cpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/interpreter/api/ThreadContextStubs.cpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -999,7 +999,7 @@ try { RexxString *temp = (RexxString *)s; - return temp->copyData(o - 1, (char *)r, l); + return size_v(temp->copyData(o - 1, (char *)r, l)); // todo m17n : propagate strong type ? } catch (RexxNativeActivation *) { @@ -1013,7 +1013,7 @@ try { RexxString *temp = (RexxString *)s; - return temp->getLength(); + return size_v(temp->getBLength()); // todo m17n : replace StringLength by StringBLength and StringCLength } catch (RexxNativeActivation *) { @@ -1040,7 +1040,7 @@ ApiContext context(c); try { - return (RexxStringObject)context.ret(new_string(s, (stringsize_t)l)); + return (RexxStringObject)context.ret(new_string(s, l)); } catch (RexxNativeActivation *) { @@ -1107,7 +1107,7 @@ ApiContext context(c); try { - return (RexxBufferStringObject)context.ret(raw_string((stringsize_t)l)); + return (RexxBufferStringObject)context.ret(raw_string(l)); } catch (RexxNativeActivation *) { @@ -1121,7 +1121,7 @@ try { RexxString *temp = (RexxString *)s; - return temp->getLength(); + return size_v(temp->getBLength()); // todo m17n : replace BufferStringLength by BufferStringBLength and BufferStringCLength } catch (RexxNativeActivation *) { @@ -1276,7 +1276,7 @@ ApiContext context(c); try { - RexxString *str = new_string(s, (stringsize_t)l); + RexxString *str = new_string(s, l); return ((RexxArray *)a)->append(str); } catch (RexxNativeActivation *) @@ -1423,7 +1423,7 @@ ApiContext context(c); try { - return ((RexxBuffer *)b)->getDataLength(); + return size_v(((RexxBuffer *)b)->getDataLength()); } catch (RexxNativeActivation *) { Modified: sandbox/jlf/trunk/interpreter/classes/BufferClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/BufferClass.cpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/interpreter/classes/BufferClass.cpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -61,7 +61,7 @@ RexxBuffer *RexxBuffer::expand( - size_t l) /* minimum space needed */ + sizeB_t l) /* minimum space needed */ /******************************************************************************/ /* Function: Create a larger buffer and copy existing data into it */ /******************************************************************************/ @@ -97,6 +97,16 @@ /* Get new object */ RexxBuffer *newBuffer = (RexxBuffer *) new_object(size + _length, T_Buffer); /* Initialize this new buffer */ + // JLF remember : this is problematic !!!! + // This operator is called by : + // inline RexxBuffer *new_buffer(sizeB_t s) { return new (size_v(s)) RexxBuffer; } + // The attributes are initialized BEFORE the constructor is called (is it a good practice ??? for me, no !). + // When I use a strong type for sizeB_t, then then constructors of bufferSize and dataLength are called + // by the default constructor RexxBuffer() which itself calls RexxBufferBase(). + // Consequence : the assignments below are overwritten by the default constructor of sizeB_t which stores 0. + // The good practice is to initialize the attributes from the constructor, not from the new operator. + // I keep the following lines, but I also add a new constructor RexxBuffer(sizeB_t _length) and RexxBufferBase(sizeB_t _length) + // [JLF] I had the same problem in the parser, but more difficult to fix... So I decided to no longer assign 0. And I removed the new constructors described above. newBuffer->bufferSize = _length; /* set the length of the buffer */ newBuffer->dataLength = _length; // by default, the data length and size are the same newBuffer->setHasNoReferences(); /* this has no references */ Modified: sandbox/jlf/trunk/interpreter/classes/BufferClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/BufferClass.hpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/interpreter/classes/BufferClass.hpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -50,37 +50,37 @@ inline RexxBufferBase() {;}; - inline size_t getDataLength() { return this->dataLength; } - inline size_t getBufferSize() { return this->bufferSize; } - inline void setDataLength(size_t l) { this->dataLength = l; } + inline sizeB_t getDataLength() { return this->dataLength; } + inline sizeB_t getBufferSize() { return this->bufferSize; } + inline void setDataLength(sizeB_t l) { this->dataLength = l; } virtual char *getData() = 0; - inline void copyData(size_t offset, const char *string, size_t l) { memcpy(this->getData() + offset, string, l); } + inline void copyData(sizeB_t offset, const char *string, sizeB_t l) { memcpy(this->getData() + offset, string, l); } inline void copyData(CONSTRXSTRING &r) { copyData(0, r.strptr, r.strlength); } inline void copyData(RXSTRING &r) { copyData(0, r.strptr, r.strlength); } - inline void openGap(size_t offset, size_t _size, size_t tailSize) + inline void openGap(sizeB_t offset, sizeB_t _size, sizeB_t tailSize) { memmove(getData() + offset + _size, getData() + offset, tailSize); } - inline void closeGap(size_t offset, size_t _size, size_t tailSize) + inline void closeGap(sizeB_t offset, sizeB_t _size, sizeB_t tailSize) { memmove(getData() + offset, getData() + offset + _size, tailSize); } - inline void adjustGap(size_t offset, size_t _size, size_t _newSize) + inline void adjustGap(sizeB_t offset, sizeB_t _size, sizeB_t _newSize) { // We have _size bytes to replace by _newSize bytes // 0 1 2 3 4 5 6 7 8 9 offset = 3, XX to be replaced by YYY // a b c X X f g _size = 2 // a b c Y Y Y f g _newSize = 3 - size_t offset_from = offset + _size; // offset of the 1st byte to move + sizeB_t offset_from = offset + _size; // offset of the 1st byte to move if (offset_from < getDataLength()) { - size_t offset_to = offset + _newSize; // destination offset of the 1st byte to move - size_t tailSize = getDataLength() - offset_from; + sizeB_t offset_to = offset + _newSize; // destination offset of the 1st byte to move + sizeB_t tailSize = getDataLength() - offset_from; memmove(getData() + offset_to, getData() + offset_from, tailSize); } } - inline void setData(size_t offset, char character, size_t l) + inline void setData(sizeB_t offset, char character, sizeB_t l) { memset(getData() + offset, character, l); } @@ -92,9 +92,9 @@ // to ensure appropriate data alignment. Fortunately, because the sizes of all of the // fields doubles when going to 64-bit, this single padding item is sufficient to // get everything lined up on all platforms. - size_t reserved; - size_t bufferSize; // size of the buffer - size_t dataLength; // length of the buffer data (freqently the same) + sizeB_t reserved; + sizeB_t bufferSize; // size of the buffer + sizeB_t dataLength; // length of the buffer data (freqently the same) }; @@ -110,7 +110,7 @@ inline RexxBuffer() {;} inline RexxBuffer(RESTORETYPE restoreType) { ; } - RexxBuffer *expand(size_t); + RexxBuffer *expand(sizeB_t); RexxObject *newRexx(RexxObject **args, size_t argc); virtual char *getData() { return data; } @@ -123,7 +123,7 @@ }; - inline RexxBuffer *new_buffer(size_t s) { return new (s) RexxBuffer; } + inline RexxBuffer *new_buffer(sizeB_t s) { return new (size_v(s)) RexxBuffer; } inline RexxBuffer *new_buffer(CONSTRXSTRING &r) { RexxBuffer *b = new_buffer(r.strlength); @@ -138,7 +138,7 @@ return b; } - inline RexxBuffer *new_buffer(const char *data, size_t length) + inline RexxBuffer *new_buffer(const char *data, sizeB_t length) { RexxBuffer *b = new_buffer(length); b->copyData(0, data, length); Modified: sandbox/jlf/trunk/interpreter/classes/DirectoryClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/DirectoryClass.cpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/interpreter/classes/DirectoryClass.cpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -465,9 +465,9 @@ RexxString *message_value = stringArgument(msgname, ARG_ONE); requiredArgument(arguments, ARG_TWO); /* need an argument array */ /* get the length */ - stringsize_t message_length = message_value->getLength(); + stringsizeC_t message_length = message_value->getCLength(); /* assignment form of access? */ - if (message_length > 0 && message_value->getChar(message_length - 1) == '=') + if (message_length > 0 && message_value->getCharC(message_length - 1) == '=') { /* get this as an array */ arguments = (RexxArray *)REQUEST_ARRAY(arguments); @@ -480,7 +480,7 @@ reportException(Error_Incorrect_method_noarray, IntegerTwo); } /* extract the name part of the msg */ - message_value = (RexxString *)message_value->extract(0, message_length - 1); + message_value = (RexxString *)message_value->extractC(0, message_length - 1); /* do this as an assignment */ return this->setEntry(message_value, arguments->get(1)); } Modified: sandbox/jlf/trunk/interpreter/classes/IntegerClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/IntegerClass.cpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/interpreter/classes/IntegerClass.cpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -193,7 +193,7 @@ { /* copying directly from an existing string rep is faster */ /* than formatting a new value and copying. */ - tail->append(stringrep->getStringData(), stringrep->getLength()); + tail->append(stringrep->getStringData(), size_v(stringrep->getBLength())); return; } char stringBuffer[32]; /* integer formatting buffer */ Modified: sandbox/jlf/trunk/interpreter/classes/IntegerClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/IntegerClass.hpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/interpreter/classes/IntegerClass.hpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -191,4 +191,6 @@ inline RexxInteger *new_integer(wholenumber_t v) { return TheIntegerClass->newCache(v); } +inline RexxInteger *new_integer(sizeB_t v) { return new_integer(size_v(v)); } +inline RexxInteger *new_integer(sizeC_t v) { return new_integer(size_v(v)); } #endif Modified: sandbox/jlf/trunk/interpreter/classes/MessageClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MessageClass.cpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/interpreter/classes/MessageClass.cpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -539,7 +539,7 @@ /* Convert it into a string. */ optionString = stringArgument(optionString, ARG_THREE); /* char and make it lower case */ - char option = tolower(optionString->getChar(0)); + char option = tolower(optionString->getCharC(0)); if (option == 'a') /* args passed as an array? */ { /* are there less than 4 required */ Modified: sandbox/jlf/trunk/interpreter/classes/MethodClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MethodClass.cpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/interpreter/classes/MethodClass.cpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -847,7 +847,7 @@ name = stringArgument(name, "name"); descriptor = stringArgument(descriptor, "descriptor"); /* convert external into words */ - RexxArray *_words = StringUtil::words(descriptor->getStringData(), descriptor->getLength()); + RexxArray *_words = StringUtil::words(descriptor->getStringData(), descriptor->getBLength()); ProtectedObject p(_words); // "LIBRARY libbar [foo]" if (((RexxString *)(_words->get(1)))->strCompare(CHAR_LIBRARY)) Modified: sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp 2010-11-12 20:31:38 UTC (rev 6387) +++ sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp 2010-11-14 22:18:47 UTC (rev 6388) @@ -69,6 +69,7 @@ #define DEFAULT_BUFFER_LENGTH 256 +// in behaviour RexxMutableBuffer *RexxMutableBufferClass::newRexx(RexxObject **args, size_t argc) /******************************************************************************/ /* Function: Allocate (and initialize) a string object */ @@ -76,8 +77,8 @@ { RexxString *string; RexxMutableBuffer *newBuffer; /* new mutable buffer object */ - size_t bufferLength = DEFAULT_BUFFER_LENGTH; - size_t defaultSize; + sizeB_t bufferLength = DEFAULT_BUFFER_LENGTH; + sizeB_t defaultSize; if (argc >= 1) { if (args[0] != NULL) @@ -139,19 +140,19 @@ dataBLength = 0; dataCLength = 0; - CHARSET *charset = NULL; - if (charsetName != NULL) charset = m17n_find_charset(charsetName, true); // true : raise exception if unknown - if (charset == NULL) charset = m17n_default_charset(); - ENCODING *encoding = charset->preferred_encoding; - this->setCharset(charset); - this->setEncoding(encoding); + CHARSET *_charset = NULL; + if (charsetName != NULL) _charset = m17n_find_charset(charsetName, true); // true : raise exception if unknown + if (_charset == NULL) _charset = m17n_default_charset(); + ENCODING *_encoding = _charset->preferred_encoding; + this->setCharset(_charset); + this->setEncoding(_encoding); } /** * Constructor with explicitly set charset and encoding. */ -RexxMutableBuffer::RexxMutableBuffer(CHARSET *charset, ENCODING *encoding) +RexxMutableBuffer::RexxMutableBuffer(CHARSET *_charset, ENCODING *_encoding) { bufferLength = DEFAULT_BUFFER_LENGTH; /* save the length of the buffer */ defaultSize = bufferLength; /* store the default buffer size */ @@ -163,8 +164,8 @@ this->setBLength(0); this->setCLength(0); - this->setCharset(charset ? charset : m17n_default_charset()); - this->setEncoding(encoding ? encoding : charset->preferred_encoding); + this->setCharset(_charset ? _charset : m17n_default_charset()); + this->setEncoding(_encoding ? _encoding : _charset->preferred_encoding); } @@ -174,7 +175,7 @@ * @param l Initial length. * @param d The explicit default size. */ -RexxMutableBuffer::RexxMutableBuffer(size_t l, size_t d, const char *charsetName) +RexxMutableBuffer::RexxMutableBuffer(sizeB_t l, sizeB_t d, const char *charsetName) { bufferLength = l; /* save the length of the buffer */ defaultSize = d; /* store the default buffer size */ @@ -185,12 +186,12 @@ this->setBLength(0); this->setCLength(0); - CHARSET *charset = NULL; - if (charsetName != NULL) charset = m17n_find_charset(charsetName, true); // true : raise exception if unknown - if (charset == NULL) charset = m17n_default_charset(); - ENCODING *encoding = charset->preferred_encoding; - this->setCharset(charset); - this->setEncoding(encoding); + CHARSET *_charset = NULL; + if (charsetName != NULL) _charset = m17n_find_charset(charsetName, true); // true : raise exception if unknown + if (_charset == NULL) _charset = m17n_default_charset(); + ENCODING *_encoding = _charset->preferred_encoding; + this->setCharset(_charset); + this->setEncoding(_encoding); } @@ -200,7 +201,7 @@ * @param l Initial length. * @param d The explicit default size. */ -RexxMutableBuffer::RexxMutableBuffer(size_t l, size_t d, CHARSET *charset, ENCODING *encoding) +RexxMutableBuffer::RexxMutableBuffer(sizeB_t l, sizeB_t d, CHARSET *_charset, ENCODING *_encoding) { bufferLength = l; /* save the length of the buffer */ defaultSize = d; /* store the default buffer size */ @@ -211,8 +212,8 @@ this->setBLength(0); this->setCLength(0); - this->setCharset(charset ? charset : m17n_default_charset()); - this->setEncoding(encoding ? encoding : charset->preferred_encoding); + this->setCharset(_charset ? _charset : m17n_default_charset()); + this->setEncoding(_encoding ? _encoding : _charset->preferred_encoding); } @@ -299,12 +300,12 @@ return newObj; } -void RexxMutableBuffer::ensureCapacity(size_t addedLength) +void RexxMutableBuffer::ensureCapacity(sizeB_t addedLength) /******************************************************************************/ /* Function: append to the mutable buffer */ /******************************************************************************/ { - size_t resultLength = this->dataBLength + addedLength; + sizeB_t resultLength = this->dataBLength + addedLength; if (resultLength > bufferLength) { /* need to enlarge? */ @@ -324,17 +325,26 @@ } +void RexxMutableBuffer::ensureCapacity(sizeC_t addedLength) +{ + sizeB_t resultLength = this->dataBLength + (size_v(addedLength) * this->getEncoding()->max_bytes_per_codepoint); + this->ensureCapacity(resultLength); +} + + /** * Return the length of the data in the buffer currently. * * @return The current length, as an Integer object. */ +// in behaviour RexxObject *RexxMutableBuffer::lengthRexx() { - return new_integer(getLength()); + return new_integer(getCLength()); } +// in behaviour RexxMutableBuffer *RexxMutableBuffer::append(RexxObject *obj) /******************************************************************************/ /* Function: append to the mutable buffer */ @@ -352,7 +362,7 @@ } -RexxMutableBuffer *RexxMutableBuffer::appendCstring(const char *data, size_t blength) +RexxMutableBuffer *RexxMutableBuffer::appendCstring(const char *_data, sizeB_t blength) /******************************************************************************/ /* Function: append to the mutable buffer */ /******************************************************************************/ @@ -360,13 +370,14 @@ // make sure we have enough room ensureCapacity(blength); - this->data->copyData(dataBLength, data, blength); + this->data->copyData(dataBLength, _data, blength); this->setBLength(this->dataBLength + blength); - this->setCLength(this->dataCLength + this->getEncoding()->codepoints(data, blength)); + this->setCLength(this->dataCLength + this->getEncoding()->codepoints(_data, blength)); return this; } +// in behaviour RexxMutableBuffer *RexxMutableBuffer::insert(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad) /******************************************************************************/ /* Function: insert string at given position */ @@ -376,18 +387,18 @@ RexxString * string = stringArgument(str, ARG_ONE); // we're using optional length because 0 is valid for insert. - size_t begin = optionalNonNegative(pos, 0, ARG_TWO); - size_t insertLength = optionalLengthArgument(len, string->getLength(), ARG_THREE); + sizeC_t begin = optionalNonNegative(pos, 0, ARG_TWO); + sizeC_t insertLength = optionalLengthArgument(len, string->getCLength(), ARG_THREE); - char padChar = optionalPadArgument(pad, ' ', ARG_FOUR); + codepoint_t padChar = optionalPadArgument(pad, ' ', ARG_FOUR); - size_t copyLength = Numerics::minVal(insertLength, string->getLength()); - size_t padLength = insertLength - copyLength; + sizeC_t copyLength = Numerics::minVal(insertLength, string->getCLength()); + sizeC_t padLength = insertLength - copyLength; // if inserting within the current bounds, we only need to add the length // if inserting beyond the end, we need to make sure we add space for the gap too - if (begin < dataBLength) + if (begin < dataCLength) { // if inserting a zero length string, this is simple! if (insertLength == 0) @@ -398,76 +409,80 @@ } else { - ensureCapacity(insertLength + (begin - dataBLength)); + ensureCapacity(insertLength + (begin - dataCLength)); } /* create space in the buffer */ - if (begin < dataBLength) + if (begin < dataCLength) { - openGap(begin, insertLength, dataBLength - begin); + openGap(size_v(begin), size_v(insertLength), size_v(dataCLength - begin)); // todo m17n } - else if (begin > this->dataBLength) + else if (begin > this->dataCLength) { /* pad before insertion */ - setData(dataBLength, padChar, begin - dataBLength); + setData(size_v(dataCLength), padChar, size_v(begin - dataCLength)); // todo m17n } /* insert string contents */ - copyData(begin, string->getStringData(), copyLength); + copyData(size_v(begin), string->getStringData(), size_v(copyLength)); // todo m17n // do we need data padding? if (padLength > 0) { - setData(begin + string->getLength(), padChar, padLength); + setData(size_v(begin + string->getCLength()), padChar, size_v(padLength)); // todo m17n } // inserting after the end? the resulting length is measured from the insertion point - if (begin > this->dataBLength) + if (begin > this->dataCLength) { - this->setBLength(begin + insertLength); + this->setBLength(size_v(begin + insertLength)); // todo m17n + this->setCLength(begin + insertLength); } else { // just add in the inserted length - this->setBLength(this->dataBLength + insertLength); + this->setBLength(size_v(this->dataCLength + insertLength)); // todo m17n + this->setCLength(this->dataCLength + insertLength); } return this; } +// in behaviour RexxMutableBuffer *RexxMutableBuffer::overlay(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad) /******************************************************************************/ /* Function: replace characters in buffer contents */ /******************************************************************************/ { RexxString *string = stringArgument(str, ARG_ONE); - size_t begin = optionalPositionArgument(pos, 1, ARG_TWO) - 1; - size_t replaceLength = optionalLengthArgument(len, string->getLength(), ARG_THREE); + sizeC_t begin = optionalPositionArgument(pos, 1, ARG_TWO) - 1; + sizeC_t replaceLength = optionalLengthArgument(len, string->getCLength(), ARG_THREE); - char padChar = optionalPadArgument(pad, ' ', ARG_FOUR); + codepoint_t padChar = optionalPadArgument(pad, ' ', ARG_FOUR); // make sure we have room for this ensureCapacity(begin + replaceLength); // is our start position beyond the current data end? - if (begin > dataBLength) + if (begin > dataCLength) { // add padding to the gap - setData(dataBLength, padChar, begin - dataBLength); + setData(size_v(dataCLength), padChar, size_v(begin - dataCLength)); } // now overlay the string data - copyData(begin, string->getStringData(), Numerics::minVal(replaceLength, string->getLength())); + copyData(size_v(begin), string->getStringData(), size_v(Numerics::minVal(replaceLength, string->getCLength()))); // todo m17n // do we need additional padding? - if (replaceLength > string->getLength()) + if (replaceLength > string->getCLength()) { // pad the section after the overlay - setData(begin + string->getLength(), padChar, replaceLength - string->getLength()); + setData(size_v(begin + string->getCLength()), padChar, size_v(replaceLength - string->getCLength())); // todo m17n } // did this add to the size? - if (begin + replaceLength > dataBLength) + if (begin + replaceLength > dataCLength) { //adjust upward - this->setBLength(begin + replaceLength); + this->setBLength(size_v(begin + replaceLength)); // todo m17n + this->setCLength(begin + replaceLength); } return this; } @@ -491,26 +506,27 @@ * * @return The target mutablebuffer object. */ +// in behaviour RexxMutableBuffer *RexxMutableBuffer::replaceAt(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad) { RexxString *string = stringArgument(str, ARG_ONE); - size_t begin = positionArgument(pos, ARG_TWO) - 1; - size_t newLength = string->getLength(); - size_t replaceLength = optionalLengthArgument(len, newLength, ARG_THREE); + sizeC_t begin = positionArgument(pos, ARG_TWO) - 1; + sizeC_t newLength = string->getCLength(); + sizeC_t replaceLength = optionalLengthArgument(len, newLength, ARG_THREE); - char padChar = optionalPadArgument(pad, ' ', ARG_FOUR); - size_t finalLength; + codepoint_t padChar = optionalPadArgument(pad, ' ', ARG_FOUR); + sizeC_t finalLength; // will this extend beyond the end of the string, we require // space for the position + the replacement string length - if (begin + newLength > dataBLength) + if (begin + newLength > dataCLength) { finalLength = begin + newLength; } // we could be replacing a substring that runs over the // end of the start...in that case, the result with be // the same as above - else if (begin + replaceLength > dataBLength) + else if (begin + replaceLength > dataCLength) { finalLength = begin + newLength; } @@ -518,7 +534,7 @@ { // we need to add the delta between the excised string and the inserted // re... [truncated message content] |
From: <jfa...@us...> - 2010-11-14 23:54:21
|
Revision: 6389 http://oorexx.svn.sourceforge.net/oorexx/?rev=6389&view=rev Author: jfaucher Date: 2010-11-14 23:54:11 +0000 (Sun, 14 Nov 2010) Log Message: ----------- internals : debug edited with xxe, quite fun to use. http://oorexx.svn.sourceforge.net/viewvc/oorexx/sandbox/jlf/internals/xxe.png Added Paths: ----------- sandbox/jlf/internals/ sandbox/jlf/internals/debug.xml sandbox/jlf/internals/xxe.png Added: sandbox/jlf/internals/debug.xml =================================================================== --- sandbox/jlf/internals/debug.xml (rev 0) +++ sandbox/jlf/internals/debug.xml 2010-11-14 23:54:11 UTC (rev 6389) @@ -0,0 +1,132 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" +"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"> +<chapter> + <title>Debug</title> + + <section> + <title>Trace</title> + + <para>Reference : <ulink + url="http://newsgroups.derkeiler.com/Archive/Comp/comp.lang.rexx/2008-07/msg00079.html">comp.lang.rexx</ulink></para> + + <para>You can turn rexx tracing on by setting the RXTRACE environment + variable to ON. This can be handy if you use external subroutines, or + <code>::include</code> libraries. If you find yourself about to call such an + external routine (while tracing your own code) then you can enter:</para> + + <programlisting><![CDATA[Call Value 'RXTRACE','ON','ENVIRONMENT']]></programlisting> + + <para>and see what the external routine does.</para> + </section> + + <section> + <title>Debugging from command line</title> + + <para>Assuming you have visual studio and you have a Rexx command that + creates the problem, just type</para> + + <programlisting><![CDATA[devenv /debugexe rexx <your parameter>]]></programlisting> + + <para>Hit F5 to run, and it should stop at the location of the trap.</para> + </section> + + <section> + <title>A particularly useful breakpoint...</title> + + <para>Reference : <ulink + url="http://sourceforge.net/mailarchive/forum.php?thread_name=33bd05330704090326k1b5c62a8k1e5ac52a0674ad3b%40mail.gmail.com&forum_name=oorexx-devel">oorexx-devel</ulink></para> + + <para>If you're ever working on something and you get a Rexx error message, + you can find out exactly where the failure is coming from by setting a + breakpoint on <code>RexxActivity::raiseException()</code>in file + <filename>interpreter\concurrency\RexxActivity.cpp</filename>. All Rexx + error messages end up here, so once you are here, you can display the stack + trace to find out exactly where the error is getting raised from.</para> + </section> + + <section> + <title>How to determine the source location</title> + + <para>Reference : <ulink + url="http://sourceforge.net/mailarchive/forum.php?thread_name=4B83023E.5090507%40safedatausa.com&forum_name=oorexx-devel">oorexx-devel</ulink></para> + + <para>If your program crashes, you can determine which line in which file + was executed.</para> + + <para>Go back down the stack, until you reach the + <code>RexxActivation::run()</code> call. Expand the <code>this</code> + variable. You are looking for the value + <code>this->sourceObject->programName->stringData</code>, which + should be the name of the program that is currently running.</para> + + <para>Move up to the next frame in the stack. It should be a + RexxInstructionXXX. Expand the <code>this</code> variable until you find the + <code>instructionLocation</code> variable. The <code>startLine</code> field + contains the line number currently executed.</para> + </section> + + <section> + <title>Advanced debugging</title> + + <para>Reference : <ulink + url="http://sourceforge.net/mailarchive/forum.php?forum_name=oorexx-devel&max_rows=25&style=nested&viewmonth=200906&viewday=2">oorexx-devel</ulink></para> + + <para>Sometimes, you need to put a breakpoint in a DLL which is not yet + loaded. The case described here is a DLL loaded by Java.</para> + + <section> + <title>Without modification of source</title> + + <para>Start <productname>Java</productname> in the debugger. You'll need + to specify the actual java executable, not whatever is in + <filename>C:\Windows\System32\java</filename>. You do this with the + command:</para> + + <programlisting><![CDATA[devenv /debugexe "C:\Program Files\...\java.exe" MyClass]]></programlisting> + + <para>Once in the debugger, set a breakpoint in your dll module using the + breakpoint menu and a fully qualified breakpoint location. For example, to + set a breakpoint on the AttachThread() API routine in oorexx, specify the + breakpoing as:</para> + + <programlisting><![CDATA[{,InterpreterInstanceStubs.cpp,rexx.dll} @63 +]]></programlisting> + + <para>The @63 is the source file line number. Since you qualified this + using the rexx.dll, it will handle the breakpoint even though rexx.dll is + dynamically loaded. Once this is loaded, then all of the symbols are + available and normal means can be used to set break points. </para> + </section> + + <section> + <title>With modification of source</title> + + <para>This procedure is taken from <ulink + url="<http://ccollomb.free.fr/blog/?p=30>"><http://ccollomb.free.fr/blog/?p=30></ulink>, + which explains different ways of how to insert statements in one's code to + trigger the debugger.</para> + + <para>Define this macro:</para> + + <programlisting><![CDATA[#define BREAK_HERE_SINGLESTEP() __asm __emit 0xF1]]></programlisting> + + <para>and later in the code use it wherever you want to start to debug in + single step mode, enter:</para> + + <programlisting><![CDATA[BREAK_HERE_SINGLESTEP();]]></programlisting> + + <para>This macro has the stated benefit, that it goes right into single + stepping mode, without firing up the exception dialog. If, for some + reasons, the breakpoint is not activated, then you can modify the macro to + use one of these other ways to set a breakpoint:</para> + + <programlisting><![CDATA[__debugbreak(); +DebugBreak(); +_CrtDbgBreak(); +__asm int 3; +__asm __emit 0xCC; +__asm __emit 0xCD; __asm __emit 0×03;]]></programlisting> + </section> + </section> +</chapter> Added: sandbox/jlf/internals/xxe.png =================================================================== (Binary files differ) Property changes on: sandbox/jlf/internals/xxe.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-12-19 20:40:06
|
Revision: 6513 http://oorexx.svn.sourceforge.net/oorexx/?rev=6513&view=rev Author: jfaucher Date: 2010-12-19 20:39:56 +0000 (Sun, 19 Dec 2010) Log Message: ----------- merge 6189-6500 from main/trunk Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/CONTRIBUTORS sandbox/jlf/trunk/Makefile.am sandbox/jlf/trunk/NOTICE sandbox/jlf/trunk/api/oorexxapi.h sandbox/jlf/trunk/configure.ac sandbox/jlf/trunk/extensions/csvStream/csvStream.cls sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.cpp sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.h sandbox/jlf/trunk/extensions/platform/windows/oodialog/ControlDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/Menu.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/rexxutil/platform/unix/rexxutil.cpp sandbox/jlf/trunk/extensions/rxsock/mime.cls sandbox/jlf/trunk/interpreter/RexxClasses/StreamClasses.orx sandbox/jlf/trunk/interpreter/api/InterpreterAPI.cpp sandbox/jlf/trunk/interpreter/behaviour/RexxBehaviour.hpp sandbox/jlf/trunk/interpreter/classes/ArrayClass.cpp sandbox/jlf/trunk/interpreter/classes/ArrayClass.hpp sandbox/jlf/trunk/interpreter/classes/IntegerClass.cpp sandbox/jlf/trunk/interpreter/classes/IntegerClass.hpp sandbox/jlf/trunk/interpreter/classes/NumberStringClass.cpp sandbox/jlf/trunk/interpreter/classes/NumberStringClass.hpp sandbox/jlf/trunk/interpreter/classes/StackClass.hpp sandbox/jlf/trunk/interpreter/classes/StemClass.cpp sandbox/jlf/trunk/interpreter/classes/StemClass.hpp sandbox/jlf/trunk/interpreter/classes/support/RexxListTable.hpp sandbox/jlf/trunk/interpreter/execution/CPPCode.cpp sandbox/jlf/trunk/interpreter/execution/RexxActivation.cpp sandbox/jlf/trunk/interpreter/execution/RexxActivation.hpp sandbox/jlf/trunk/interpreter/execution/RexxVariableDictionary.cpp sandbox/jlf/trunk/interpreter/expression/ExpressionLogical.hpp sandbox/jlf/trunk/interpreter/expression/ExpressionMessage.hpp sandbox/jlf/trunk/interpreter/expression/ExpressionVariable.cpp sandbox/jlf/trunk/interpreter/memory/RexxEnvelope.cpp sandbox/jlf/trunk/interpreter/memory/RexxEnvelope.hpp sandbox/jlf/trunk/interpreter/memory/RexxMemory.hpp sandbox/jlf/trunk/interpreter/memory/Setup.cpp sandbox/jlf/trunk/interpreter/platform/unix/ExternalFunctions.cpp sandbox/jlf/trunk/interpreter/platform/unix/SysFileSystem.cpp sandbox/jlf/trunk/interpreter/runtime/NativeMethods.h sandbox/jlf/trunk/interpreter/streamLibrary/StreamNative.cpp sandbox/jlf/trunk/makeorx.bat sandbox/jlf/trunk/orxdb.bat sandbox/jlf/trunk/platform/unix/debian/postinst.in sandbox/jlf/trunk/platform/unix/debian/postrm sandbox/jlf/trunk/platform/unix/debian/prerm sandbox/jlf/trunk/platform/unix/oorexx-config.in sandbox/jlf/trunk/platform/unix/oorexx.spec.in sandbox/jlf/trunk/platform/windows/install/oorexx.nsi sandbox/jlf/trunk/readme.version sandbox/jlf/trunk/samples/Makefile.am sandbox/jlf/trunk/samples/rexxcps.rex sandbox/jlf/trunk/samples/windows/Makefile.am sandbox/jlf/trunk/samples/windows/ole/Makefile.am sandbox/jlf/trunk/samples/windows/ole/wmi/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/PropertySheetDemo.rex sandbox/jlf/trunk/samples/windows/oodialog/examples/ReadMe.txt sandbox/jlf/trunk/samples/windows/oodialog/examples/fileNameDialog_demo.rex sandbox/jlf/trunk/samples/windows/oodialog/examples/publicRoutines_demo.rex sandbox/jlf/trunk/samples/windows/oodialog/oobandit.rex sandbox/jlf/trunk/samples/windows/oodialog/rc/PropertySheetDemo.rc sandbox/jlf/trunk/utilities/rxqueue/platform/unix/rxqueue.cpp sandbox/jlf/trunk/utilities/rxqueue/platform/windows/rxqueue.cpp Added Paths: ----------- sandbox/jlf/trunk/RPM_build_notes.txt sandbox/jlf/trunk/samples/native.api/ sandbox/jlf/trunk/samples/native.api/Makefile.am sandbox/jlf/trunk/samples/native.api/ReadMe.txt sandbox/jlf/trunk/samples/native.api/call.example/ sandbox/jlf/trunk/samples/native.api/call.example/HelloWorld.rex sandbox/jlf/trunk/samples/native.api/call.example/Makefile.am sandbox/jlf/trunk/samples/native.api/call.example/Makefile.linux sandbox/jlf/trunk/samples/native.api/call.example/Makefile.windows sandbox/jlf/trunk/samples/native.api/call.example/ReadMe.txt sandbox/jlf/trunk/samples/native.api/call.example/backward.fnc sandbox/jlf/trunk/samples/native.api/call.example/runRexxProgram.cpp sandbox/jlf/trunk/samples/native.api/call.example/stackOverflow.cpp sandbox/jlf/trunk/samples/native.api/call.example/tooRecursiveTrapped.rex sandbox/jlf/trunk/samples/native.api/call.example/tooRecursiveUnhandled.rex sandbox/jlf/trunk/samples/windows/0ReadMe.first sandbox/jlf/trunk/samples/windows/ole/ReadMe.first sandbox/jlf/trunk/samples/windows/oodialog/TabDemo.rex sandbox/jlf/trunk/samples/windows/oodialog/examples/columnClickListView.rex sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/ sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/help.txt sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/icons.bmp sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/oleinfo.rc sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/oleinfo.rex sandbox/jlf/trunk/samples/windows/oodialog/rc/TabDemo.h sandbox/jlf/trunk/samples/windows/oodialog/sysinfo/ sandbox/jlf/trunk/samples/windows/oodialog/sysinfo/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/sysinfo/sysinfo.rc sandbox/jlf/trunk/samples/windows/oodialog/sysinfo/sysinfo.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/ sandbox/jlf/trunk/samples/windows/oodialog/winsystem/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/winsystem/deskicon.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/desktop.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/displayAnyMenu.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/displayWindowTree.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/eventlog.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/getTheWindow.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/menuCalc.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/menuNotepad.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/quickCalc.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/quickShowAllMenus.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/registry.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/usewmgr.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/winSystemDlgs.h sandbox/jlf/trunk/samples/windows/oodialog/winsystem/winSystemDlgs.rc sandbox/jlf/trunk/samples/windows/oodialog/winsystem/windowsSystem.frm sandbox/jlf/trunk/samples/windows/oodialog/winsystem/writeWithNotepad.rex Removed Paths: ------------- sandbox/jlf/trunk/samples/native.api/Makefile.am sandbox/jlf/trunk/samples/native.api/ReadMe.txt sandbox/jlf/trunk/samples/native.api/call.example/ sandbox/jlf/trunk/samples/native.api/call.example/HelloWorld.rex sandbox/jlf/trunk/samples/native.api/call.example/Makefile.am sandbox/jlf/trunk/samples/native.api/call.example/Makefile.linux sandbox/jlf/trunk/samples/native.api/call.example/Makefile.windows sandbox/jlf/trunk/samples/native.api/call.example/ReadMe.txt sandbox/jlf/trunk/samples/native.api/call.example/backward.fnc sandbox/jlf/trunk/samples/native.api/call.example/runRexxProgram.cpp sandbox/jlf/trunk/samples/native.api/call.example/stackOverflow.cpp sandbox/jlf/trunk/samples/native.api/call.example/tooRecursiveTrapped.rex sandbox/jlf/trunk/samples/native.api/call.example/tooRecursiveUnhandled.rex sandbox/jlf/trunk/samples/windows/ole/oleinfo/ sandbox/jlf/trunk/samples/windows/ole/wmi/sysinfo/ sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/help.txt sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/icons.bmp sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/oleinfo.rc sandbox/jlf/trunk/samples/windows/oodialog/oleinfo/oleinfo.rex sandbox/jlf/trunk/samples/windows/oodialog/sysinfo/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/sysinfo/sysinfo.rc sandbox/jlf/trunk/samples/windows/oodialog/sysinfo/sysinfo.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/Makefile.am sandbox/jlf/trunk/samples/windows/oodialog/winsystem/deskicon.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/desktop.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/displayAnyMenu.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/displayWindowTree.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/eventlog.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/getTheWindow.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/menuCalc.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/menuNotepad.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/quickCalc.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/quickShowAllMenus.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/registry.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/usewmgr.rex sandbox/jlf/trunk/samples/windows/oodialog/winsystem/winSystemDlgs.h sandbox/jlf/trunk/samples/windows/oodialog/winsystem/winSystemDlgs.rc sandbox/jlf/trunk/samples/windows/oodialog/winsystem/windowsSystem.frm sandbox/jlf/trunk/samples/windows/oodialog/winsystem/writeWithNotepad.rex sandbox/jlf/trunk/samples/windows/winsystem/ Property Changed: ---------------- sandbox/jlf/trunk/ sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp sandbox/jlf/trunk/extensions/rxsock/mime.cls sandbox/jlf/trunk/extensions/rxsock/smtp.cls sandbox/jlf/trunk/extensions/rxsock/streamsocket.cls Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/_diary.txt 2010-12-19 20:39:56 UTC (rev 6513) @@ -488,3 +488,4 @@ merge 5988-6048 from main/trunk merge 6048-6142 from main/trunk merge 6142-6189 from main/trunk +merge 6189-6500 from main/trunk \ No newline at end of file Property changes on: sandbox/jlf/trunk ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk:5812-6189 + /main/branches/4.0beta/trunk:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/branches/4.1.0/trunk:6303,6318,6426-6428 /main/trunk:5812-6500 Modified: sandbox/jlf/trunk/CONTRIBUTORS =================================================================== --- sandbox/jlf/trunk/CONTRIBUTORS 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/CONTRIBUTORS 2010-12-19 20:39:56 UTC (rev 6513) @@ -15,4 +15,5 @@ David Ruggles Rainer Tammer Sahananda (Jon) Wolfers +Vladimir Zabrodsky Modified: sandbox/jlf/trunk/Makefile.am =================================================================== --- sandbox/jlf/trunk/Makefile.am 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/Makefile.am 2010-12-19 20:39:56 UTC (rev 6513) @@ -40,7 +40,7 @@ MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure config.guess config.sub \ depcomp install-sh ltmain.sh missing mkinstalldirs config.h.in \ - compile @REXXCAT@ rexx.img \ + compile @REXXCAT@ rexx.img ylwrap \ stamp-h.in cscope.files cscope.out $(distdir).tar.gz DIST_SUBDIRS = samples @@ -1152,14 +1152,17 @@ ./rexx $(build_os_platform_dir)/makepkg.rex @PACKAGETYPE@ $(ORX_MAJOR).$(ORX_MINOR).$(ORX_MOD_LVL) $(target) $(prefix) $(DESTDIR) rpm: dist - rm -fr $(top_srcdir)/rpm - mkdir rpm - mkdir rpm/BUILD - mkdir rpm/RPMS - mkdir rpm/SOURCES - mkdir rpm/SPECS - mkdir rpm/SRPMS - rpmbuild -ba $(build_os_platform_dir)/oorexx.spec < /dev/null; + - rm -rf ~/rpmbuild + - mkdir ~/rpmbuild + - mkdir ~/rpmbuild/BUILD + - mkdir ~/rpmbuild/BUILDROOT + - mkdir ~/rpmbuild/RPMS + - mkdir ~/rpmbuild/SOURCES + - mkdir ~/rpmbuild/SPECS + - mkdir ~/rpmbuild/SRPMS + cp ooRexx*.tar.gz ~/rpmbuild/SOURCES + cp platform/unix/oorexx.spec ~/rpmbuild/SPECS + rpmbuild -ba --buildroot ~/rpmbuild/BUILDROOT $(build_os_platform_dir)/oorexx.spec < /dev/null; deb: rm -fr $(top_srcdir)/debian Modified: sandbox/jlf/trunk/NOTICE =================================================================== --- sandbox/jlf/trunk/NOTICE 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/NOTICE 2010-12-19 20:39:56 UTC (rev 6513) @@ -1,17 +1,17 @@ Open Object Rexx Interpreter (oorexx) -Copyright (c) 2004-2008 The Rexx Language Association. All rights reserved. +Copyright (c) 2004-2010 The Rexx Language Association. All rights reserved. Portions Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. Open Object Rexx Documentation (oorexx-docs) -Copyright (c) 2004-2008 The Rexx Language Association. All rights reserved. +Copyright (c) 2004-2010 The Rexx Language Association. All rights reserved. Portions Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. Open Object Rexx Test Suite (oorexxunit) -Copyright (c) 2006-2008 The Rexx Language Association. All rights reserved. +Copyright (c) 2006-2010 The Rexx Language Association. All rights reserved. Open Object Rexx Build Utilities (oorexx-buildutils) -Copyright (c) 2006-2008 The Rexx Language Association. All rights reserved. +Copyright (c) 2006-2010 The Rexx Language Association. All rights reserved. Open Object Rexx and ooRexx are trademarks of the the Rexx Language Association (http://www.rexxla.org/). Copied: sandbox/jlf/trunk/RPM_build_notes.txt (from rev 6500, main/trunk/RPM_build_notes.txt) =================================================================== --- sandbox/jlf/trunk/RPM_build_notes.txt (rev 0) +++ sandbox/jlf/trunk/RPM_build_notes.txt 2010-12-19 20:39:56 UTC (rev 6513) @@ -0,0 +1,47 @@ + Notes on Building an ooRexx RPM + =============================== + +The configure script, makefile and RPM spec file are all set up to build the +ooRexx RPM off the user's HOME subdirectory in a subdirectory named rpmbuild. + + ~/rpmbuild + +The RPM build tree will be created in that location. + + ~/rpmbuild/BUILD + ~/rpmbuild/BUILDROOT + ~/rpmbuild/SOURCES + ~/rpmbuild/SRPMS + ~/rpmbuild/RPMS + +The build process first attempts to remove the entire ~/rpmbuild tree if it +exists. It then recreates the tree before the rpmbuild command is actually +executed. The result RPM(s) will be placed in this tree and this tree will +be used for all build steps. + +On some RPM-based systems there is an additional step that has to be performed +prior to executing the rpmbuild command. You need to create the file .rpmmacros +in your home subdirectory and place the following in it: + + %_topdir /home/dashley/rpmbuild + +The above is just an example. You need to replace the /home/dashley +string with your HOME subdirectory. DO NOT attempt to use the tilde (~) +to specify your HOME subdirectory as the tilde will not be expanded +to your HOME subdirectory. The .rpmmacros file may or may not be needed +but it is safer to go ahead and create one. You will know that you need it +if you get an error at the very end of the build and it complains that you +have no access to the target build tree. + +You should also be aware that RPMs may not be portable accross all Linux +RPM-based distributions. This is particurally true when you are trying to +install on an older distribution that does not fully comply with the Linux +Filesystem Standard. + +If these steps do not work for you please open a Bug Report on the ooRexx +SourceForge web site. Be sure to include any error messages that are +available to help us debug the problem. + +David Ashley +ooRexx Development Team + Modified: sandbox/jlf/trunk/api/oorexxapi.h =================================================================== --- sandbox/jlf/trunk/api/oorexxapi.h 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/api/oorexxapi.h 2010-12-19 20:39:56 UTC (rev 6513) @@ -212,10 +212,9 @@ #define REXX_PACKAGE_API_NO 20081030 // The interpreter version gets defined using two digits for major, minor, and revision. #define REXX_INTERPRETER_4_0_0 0x00040000 -#define REXX_INTERPRETER_4_0_0 0x00040000 #define REXX_INTERPRETER_4_0_1 0x00040001 #define REXX_INTERPRETER_4_1_0 0x00040100 -#define REXX_INTERPRETER_4_2_0 0x00040100 +#define REXX_INTERPRETER_4_2_0 0x00040200 #define REXX_CURRENT_INTERPRETER_VERSION REXX_INTERPRETER_4_2_0 #define NO_VERSION_YET NULL Modified: sandbox/jlf/trunk/configure.ac =================================================================== --- sandbox/jlf/trunk/configure.ac 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/configure.ac 2010-12-19 20:39:56 UTC (rev 6513) @@ -35,15 +35,8 @@ dnl Process this file with autoconf to produce a configure script AC_INIT(oorexx, 4.2.0) -AC_PREFIX_DEFAULT(/opt/ooRexx) +AC_PREFIX_DEFAULT(/usr) -dnl This is to fix a problem with distribution prior to Fedora 7. Fedora 7 -dnl requires the share/man location, not just man. Prior distributions didn't -dnl care that the share was left out but Fedora 7 absolutely requires it. So to -dnl make things portable we redefine mandir to the correct value so that all -dnl older distributions are happy. -mandir="\$(prefix)/share/man" - PACKAGE=ooRexx VERSION=4.2.0 @@ -430,6 +423,8 @@ platform/unix/debian/postinst rexxapi/server/platform/unix/rxapid samples/Makefile + samples/native.api/Makefile + samples/native.api/call.example/Makefile samples/unix/Makefile samples/unix/api/Makefile samples/unix/api/callrexx/Makefile @@ -450,23 +445,23 @@ samples/windows/ole/adsi/Makefile samples/windows/ole/apps/Makefile samples/windows/ole/methinfo/Makefile - samples/windows/ole/oleinfo/Makefile samples/windows/ole/wmi/Makefile - samples/windows/ole/wmi/sysinfo/Makefile samples/windows/oodialog/Makefile samples/windows/oodialog/bmp/Makefile samples/windows/oodialog/controls/Makefile samples/windows/oodialog/examples/Makefile samples/windows/oodialog/examples/resources/Makefile + samples/windows/oodialog/oleinfo/Makefile samples/windows/oodialog/ooRexxTry/Makefile samples/windows/oodialog/ooRexxTry/doc/Makefile samples/windows/oodialog/rc/Makefile samples/windows/oodialog/res/Makefile samples/windows/oodialog/simple/Makefile + samples/windows/oodialog/sysinfo/Makefile samples/windows/oodialog/tutorial/Makefile samples/windows/oodialog/wav/Makefile + samples/windows/oodialog/winsystem/Makefile samples/windows/rexutils/Makefile - samples/windows/winsystem/Makefile samples/windows/wsh/Makefile xsl.sh platform/unix/oorexx-config Modified: sandbox/jlf/trunk/extensions/csvStream/csvStream.cls =================================================================== --- sandbox/jlf/trunk/extensions/csvStream/csvStream.cls 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/csvStream/csvStream.cls 2010-12-19 20:39:56 UTC (rev 6513) @@ -12,6 +12,9 @@ /* 1.06 21Dec07 SN As ooRexx 3.2 has lineend constant - remove discovery *//*{1.06}*/ /* 1.07 21Apr08 SN provide stripoption for CSVLineIn *//*{1.07}*/ /* 1.08 23Mar09 SN Bugfix - gratitude to Bill Shipman *//*{1.08}*/ +/* 1.09 13Dec10 SN Bugfix - headers should be ignored for write replace *//*{1.09}*/ +/* SN Allow Directory as input collection *//*{1.09}*/ +/* SN Stream closes itself on uninit if necesary */ /* */ /* ========================================================================= */ @@ -60,12 +63,15 @@ ::Attribute originalRawHeaders private -- for comparison ::Attribute headerLineAbsent private -- headersexist but absent ::Attribute OpenArgs private -- args to open method +::Attribute CSVStreamOpen? private -- is the stream open? +::Attribute CSVState private -- if not nil overrides stream state ::Attribute values -- table for headered i/o ::Attribute rawText -- copy of last line read ::Attribute skipHeaders -- switch can be set before open ::Attribute lineEnd -- string used for line terminations ::Attribute Delimiter -- separates CSV fields /*{1.02}*/ ::Attribute Qualifier -- Surrounds literals /*{1.02}*/ +::Attribute LastDataError -- if bad data detected, what where ::Attribute StripOption get -- optional stripping on lineIn /*{1.07}*/ ::Attribute StripOption set /*{1.07}*/ expose stripOption /*{1.07}*/ @@ -91,6 +97,9 @@ self~openArgs = .nil /*{1.05}*/ self~stripOption = 'N' /*{1.07}*/ self~stripChar = ' ' /*{1.07}*/ +self~CSVStreamOpen? = .false +self~lastDataError = .nil +self~CSVState = .nil self~init:super(parms) /* let stream class initialise */ @@ -103,10 +112,15 @@ self~openArgs = args~translate /* Close needs to know open basis */ -if self~fileHasHeaders = .true /* read the headers into a table */ +if self~openargs~wordpos('REPLACE') > 0 /*{1.09}*/ +then ignoreCurrentHeaders? = .true /*{1.09}*/ +else ignoreCurrentHeaders? = .false /*{1.09}*/ + +if self~fileHasHeaders = .true /* read the headers into a table *//*{1.04}*/ then do self~headers = .csvStreamHeader~new /* blank in case no headers */ - if self~open:super('read') = 'READY:' + if ignoreCurrentHeaders? = .false, /*{1.09}*/ + , self~open:super('read') = 'READY:' then do if self~chars > 0 then do @@ -128,6 +142,7 @@ end /* DO */ forward class (super) continue /* open the file */ +self~CSVStreamOpen? = .true if (args~word(1)~translate \= 'WRITE') , /* move read pointer past headers */ & (self~fileHasHeaders = .true ) , @@ -172,13 +187,26 @@ i = 0 /*{1.05}*/ do forever /*{1.05}*/ i = i + 1 /*{1.05}*/ - if i > textLength then leave /*{1.05}*/ + if i > textLength + then do + if fieldText \= '' + then do + self~csvState = 'ERROR' + self~LastDataError = 'Bad CSV data field' fieldno '- unmatched qualifier ('||blip||')' + end /* DO */ + leave /*{1.05}*/ + end /*{1.05}*/ select when text~matchChar(i,qualifier) /*{1.05}*/ then do inLiteral = \inLiteral /*{1.05}*/ fieldText = fieldText || qualifier /*{1.05}*/ + if \fieldText~matchChar(1,qualifier) + then do + self~csvState = 'ERROR' + self~LastDataError = 'Bad CSV data field' fieldno '- qualifier ('||blip||') present but is not first character' + end end /* DO */ when (text~matchchar(i,delimiter) , /*{1.05}*/ @@ -198,6 +226,12 @@ literalFields~put(fieldNo) end /* Do */ + if fieldText~countstr(blip) // 2 \= 0 + then do + self~csvState = 'ERROR' + self~LastDataError = 'Bad CSV data field' fieldno '- unmatched qualifier ('||blip||') found' + end /* DO */ + /* '"' are represented in text as '""' */ fieldText = fieldText~changeStr(blipBlip,blip) /*{1.02}*/ @@ -253,17 +287,20 @@ self~close return end /* DO */ +else if self~openArgs = .nil + then self~open /*{1.05}*/ parse upper value data~class~string with . dataCollectionType . /*{1.04}*/ select /*{1.04}*/ /* if we have been passed a table or stem, convert it to an array */ when (self~fileHasHeaders = .true ), - & .set~of('TABLE','STEM')~hasIndex(dataCollectionType) /*{1.04}*/ + & .set~of('TABLE','STEM','DIRECTORY')~hasIndex(dataCollectionType) /*{1.09}*/ then do dataArray = .array~new do name over data if (name = 0) & (dataCollectionType = 'STEM') then iterate /*{1.04}*/ + column = 0 do i = 1 to self~headers~last if self~headers~field(i)~name = name @@ -272,12 +309,14 @@ leave end /* DO */ end /* DO */ + if column = 0 /* unregistered column */ then do column = self~headers~last + 1 self~headers~field(column)~name = name end /* DO */ dataArray[column] = data[name] /*{1.04}*/ + end /* DO */ data = dataArray end /* DO */ @@ -339,6 +378,8 @@ self~close:super +self~CSVStreamOpen? = .false /* let uninit know it does not need to close */ + if self~fileHasHeaders then do /* maintain headers */ headerText = '' /* prepare header line */ @@ -370,6 +411,23 @@ end /* DO */ /* ------------------------------------------------------------------------- */ +::method state +/* ------------------------------------------------------------------------- */ +/* the CSVStream can contribute towards this stream having an error condition*/ + + if self~csvState = .nil + then Return self~state:super + else Return self~csvState + +/* ------------------------------------------------------------------------- */ +::method description +/* ------------------------------------------------------------------------- */ + + if self~csvState = .nil + then Return self~description:super + else return self~csvState||':'||self~lastDataError + +/* ------------------------------------------------------------------------- */ ::method getHeaders /* ------------------------------------------------------------------------- */ return self~Headers~copy @@ -384,6 +442,13 @@ self~Headers = newHeaders~copy +/* ------------------------------------------------------------------------- */ +::method uninit +/* ------------------------------------------------------------------------- */ +/* if the CSVstream has not been closed - close it */ + +if self~CSVStreamOpen? then self~close + /* ========================================================================= */ ::class CsvStreamHeader /* ========================================================================= */ Modified: sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.cpp 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.cpp 2010-12-19 20:39:56 UTC (rev 6513) @@ -139,7 +139,7 @@ * * @return Process id */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysSetsid) { pid_t pid; @@ -158,7 +158,7 @@ * * @return Session id */ -RexxRoutine1(RexxObjectPtr, +RexxRoutine1(RexxObjectPtr, SysGetsid, int, pid) { @@ -176,7 +176,7 @@ * * @return 0 or -1 */ -RexxRoutine1(RexxObjectPtr, +RexxRoutine1(RexxObjectPtr, SysSetuid, int, uid) { @@ -192,7 +192,7 @@ * * @return uid */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysGetuid) { @@ -209,7 +209,7 @@ * * @return 0 or -1 */ -RexxRoutine1(RexxObjectPtr, +RexxRoutine1(RexxObjectPtr, SysSeteuid, int, uid) { @@ -225,7 +225,7 @@ * * @return uid */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysGeteuid) { @@ -242,7 +242,7 @@ * * @return 0 or -1 */ -RexxRoutine1(RexxObjectPtr, +RexxRoutine1(RexxObjectPtr, SysSetgid, int, gid) { @@ -258,7 +258,7 @@ * * @return 0 or -1 */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysGetgid) { @@ -275,7 +275,7 @@ * * @return 0 or -1 */ -RexxRoutine1(RexxObjectPtr, +RexxRoutine1(RexxObjectPtr, SysSetegid, int, gid) { @@ -291,7 +291,7 @@ * * @return 0 or -1 */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysGetegid) { @@ -306,7 +306,7 @@ * * @return 0 or -1 */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysSetpgrp) { @@ -321,7 +321,7 @@ * * @return 0 or -1 */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysGetpgrp) { @@ -340,7 +340,7 @@ * * @return 0 or -1 */ -RexxRoutine2(RexxObjectPtr, +RexxRoutine2(RexxObjectPtr, SysSetpgid, int, pid1, int, pid2) @@ -359,7 +359,7 @@ * * @return The pid. */ -RexxRoutine1(RexxObjectPtr, +RexxRoutine1(RexxObjectPtr, SysGetpgid, int, pid) { @@ -375,7 +375,7 @@ * * @return pid */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysGetpid) { pid_t pid = getpid(); @@ -390,7 +390,7 @@ * * @return pid */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysGetppid) { pid_t pid = getppid(); @@ -405,7 +405,7 @@ * * @return tid */ -RexxRoutine0(RexxObjectPtr, +RexxRoutine0(RexxObjectPtr, SysGettid) { pthread_t tid = pthread_self(); @@ -424,7 +424,7 @@ * * @return int error code */ -RexxRoutine2(int, +RexxRoutine2(int, SysSymlink, CSTRING, path1, CSTRING, path2) @@ -444,7 +444,7 @@ * * @return int error code */ -RexxRoutine2(int, +RexxRoutine2(int, SysLink, CSTRING, path1, CSTRING, path2) @@ -462,7 +462,7 @@ * * @return int error code */ -RexxRoutine1(int, +RexxRoutine1(int, SysUnlink, CSTRING, path1) { @@ -477,13 +477,13 @@ * * @param path1 The file path. * - * @param uid The new userid. + * @param uid The new userid. * * @param gid The new groupid. * * @return int error code */ -RexxRoutine3(int, +RexxRoutine3(int, SysChown, CSTRING, path1, int, uid, @@ -500,13 +500,13 @@ * * @param path1 The file path. * - * @param uid The new userid. + * @param uid The new userid. * * @param gid The new groupid. * * @return int error code */ -RexxRoutine3(int, +RexxRoutine3(int, SysLchown, CSTRING, path1, int, uid, @@ -525,7 +525,7 @@ * * @return int error code */ -RexxRoutine1(int, +RexxRoutine1(int, SysChroot, CSTRING, path1) { @@ -542,7 +542,7 @@ * * @return the old umansk value */ -RexxRoutine1(int, +RexxRoutine1(int, SysUmask, int, nmask) { @@ -795,7 +795,7 @@ else if (S_IFSOCK & mystat.st_mode == S_IFSOCK) { strcpy(buf, "s"); } - else strcpy(buf, "-"); + else strcpy(buf, "-"); // 2 - user read if (S_IRUSR & mystat.st_mode) { strcat(buf, "r"); @@ -941,6 +941,7 @@ } +#if !defined (AIX) && !defined (__APPLE__) /** * Method: SysEuidaccess * @@ -960,8 +961,8 @@ return euidaccess(file, option); } +#endif - /** * Method: SysGetservbyname * @@ -1154,7 +1155,7 @@ { ssize_t sz; char *buf, *name; - + sz = listxattr(fname, NULL, 0); if (sz == -1) { return (RexxObjectPtr)context->NewStringFromAsciiz("\0"); @@ -1190,8 +1191,8 @@ CSTRING, fname, CSTRING, name) { - + return removexattr(fname, name); } #endif @@ -1207,8 +1208,8 @@ RexxRoutine0(int, SysGetsizeofptr) { - + return sizeof(void *) * 8; } @@ -1373,7 +1374,7 @@ * * Get the errno value. * - * @return hostname. + * @return errno. */ RexxRoutine0(int, SysGeterrno) @@ -1549,7 +1550,7 @@ * @return Encrypted string. */ RexxRoutine2(RexxObjectPtr, - SysCrypt, + SysCrypt, CSTRING, str, CSTRING, salt) { @@ -1582,7 +1583,7 @@ * @return 0 or -1. */ RexxRoutine2(int, - SysMkdir, + SysMkdir, CSTRING, dir, int, mode) { @@ -1600,7 +1601,7 @@ * @return 0 or -1. */ RexxRoutine1(int, - SysRmdir, + SysRmdir, CSTRING, dir) { return rmdir(dir); @@ -1617,7 +1618,7 @@ * @return RexxArrayObject. */ RexxRoutine1(RexxObjectPtr, - SysGetdirlist, + SysGetdirlist, CSTRING, dir) { RexxArrayObject arr = context->NewArray(5); @@ -1626,10 +1627,10 @@ dirptr = opendir(dir); if (dirptr != NULL) { - direntry = readdir(dirptr); + direntry = readdir(dirptr); while (direntry != NULL) { context->ArrayAppendString(arr, direntry->d_name, strlen(direntry->d_name)); - direntry = readdir(dirptr); + direntry = readdir(dirptr); } closedir(dirptr); } @@ -1645,7 +1646,7 @@ * @return RexxStringObject. */ RexxRoutine0(RexxObjectPtr, - SysGettzname1) + SysGettzname1) { tzset(); @@ -1661,7 +1662,7 @@ * @return RexxStringObject. */ RexxRoutine0(RexxObjectPtr, - SysGettzname2) + SysGettzname2) { tzset(); @@ -1708,7 +1709,9 @@ REXX_TYPED_ROUTINE(SysGetgrgid, SysGetgrgid), REXX_TYPED_ROUTINE(SysStat, SysStat), REXX_TYPED_ROUTINE(SysAccess, SysAccess), +#if !defined (AIX) && !defined (__APPLE__) REXX_TYPED_ROUTINE(SysEuidaccess, SysEuidaccess), +#endif REXX_TYPED_ROUTINE(SysGetservbyname, SysGetservbyname), REXX_TYPED_ROUTINE(SysGetservbyport, SysGetservbyport), REXX_TYPED_ROUTINE(SysWordexp, SysWordexp), Modified: sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.h =================================================================== --- sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.h 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/unix/rxunixsys/rxunixsys.h 2010-12-19 20:39:56 UTC (rev 6513) @@ -60,7 +60,9 @@ #include <time.h> #include <netdb.h> #include <wordexp.h> +#if !defined(AIX) #include <alloca.h> +#endif #include <pthread.h> #include <errno.h> #include <dirent.h> @@ -70,11 +72,14 @@ #include <attr/xattr.h> #endif - /*----------------------------------------------------------------------------*/ /* Definitions */ /*----------------------------------------------------------------------------*/ +#if defined(__APPLE__) && defined(__MACH__) +# define stat64 stat +# define HOST_NAME_MAX _POSIX_HOST_NAME_MAX +#endif /*----------------------------------------------------------------------------*/ /* Global variables */ Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/anibuttn.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/anibuttn.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/AnimatedButton.cls:5812-6500 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/BaseDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/basedlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/BaseDialog.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/basedlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/BaseDialog.cls:5812-6500 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/catdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/catdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls:5812-6500 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ControlDialog.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2010-12-19 20:39:56 UTC (rev 6513) @@ -75,6 +75,7 @@ ::attribute ownerDialog get external "LIBRARY oodialog chld_getOwnerDialog" ::attribute ownerDialog set external "LIBRARY oodialog chld_setOwnerDialog" +::attribute initializing ::class 'ResControlDialog' public subclass ResDialog inherit ControlDialog @@ -93,6 +94,7 @@ if self~startChildDialog(self~basePtr, 0) == 0 then return 0 self~initDialog + self~initializing = .false; return self~dlgHandle @@ -101,6 +103,8 @@ ::method init use strict arg rcFile, idDlg, initData. = .nil, includeFile = "", options = "", expected = 200, ownerDlg = .nil + self~initializing = .true + newArgs = .array~new(5) if arg(3, 'E') then newArgs[1] = arg(3) if arg(4, 'E') then newArgs[2] = arg(4) Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/msgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/msgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DeprecatedClasses.cls:5812-6500 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2010-12-19 20:39:56 UTC (rev 6513) @@ -165,6 +165,17 @@ ::constant WM_PASTE "0x0302" ::constant WM_CLEAR "0x0303" +::attribute passwordChar set + use strict arg char + ch = char~c2d + if self~isSingleLine, ch > 0, ch < 256 then self~sendWinIntMsg(self~EM_SETPASSWORDCHAR, ch, 0) + +::attribute passwordChar get + if \ self~isSingleLine then return "" + char = self~sendWinIntMsg(self~EM_GETPASSWORDCHAR, 0, 0) + if char \= 0 then return char~d2c + else return "" + ::method isSingleLine external "LIBRARY oodialog e_isSingleLine" ::method selection external "LIBRARY oodialog e_selection" ::method selected @@ -280,17 +291,8 @@ else ndx -= 1 return self~sendWinIntMsg(self~EM_LINEFROMCHAR, ndx, 0) + 1 -::method "passwordChar=" - use strict arg char - ch = char~c2d - if self~isSingleLine, ch > 0, ch < 256 then self~sendWinIntMsg(self~EM_SETPASSWORDCHAR, ch, 0) - -::method passwordChar - char = self~sendWinIntMsg(self~EM_GETPASSWORDCHAR, 0, 0) - if char \= 0 then return char~d2c - else return "" - ::method firstVisibleLine + use strict arg return self~sendWinIntMsg(self~EM_GETFIRSTVISIBLELINE, 0, 0) + 1 ::method setReadOnly Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogControls.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/advctrl.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogControls.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/advctrl.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogControls.cls:5812-6500 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dlgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dlgext.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls:5812-6500 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dyndlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/dyndlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls:5812-6500 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/Menu.cls =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/Menu.cls 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/Menu.cls 2010-12-19 20:39:56 UTC (rev 6513) @@ -65,9 +65,6 @@ ::method isCommandItem external "LIBRARY oodialog menu_isCommandItem" ::method isSeparator external "LIBRARY oodialog menu_isSeparator" -/** getHandle() - * Need to also doc this method which is really just an alias for self~hMenu. - */ ::method getHandle external "LIBRARY oodialog menu_getHMenu" ::method getMenuHandle external "LIBRARY oodialog menu_getMenuHandle" ::method releaseMenuHandle external "LIBRARY oodialog menu_releaseMenuHandle" Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/plbdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/plbdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PlainBaseDialog.cls:5812-6500 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/PropertySheet.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/propsht.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/propsht.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls:5812-6500 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ResDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/resdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/ResDialog.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/resdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/ResDialog.cls:5812-6500 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/UserDialog.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/userdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UserDialog.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/userdlg.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UserDialog.cls:5812-6500 Property changes on: sandbox/jlf/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls ___________________________________________________________________ Modified: svn:mergeinfo - /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/oodutils.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls:5812-6189 + /main/branches/4.0beta/trunk/extensions/platform/windows/oodialog/oodutils.cls:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls:5812-6500 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2010-12-19 20:39:56 UTC (rev 6513) @@ -1339,11 +1339,17 @@ * @remarks This method is not meant to be documented to the user, it is * intended to be used internally only. */ -RexxMethod6(RexxObjectPtr, wb_sendWinHandle2Msg, CSTRING, wm_msg, intptr_t, wParam, POINTERSTRING, lParam, +RexxMethod6(RexxObjectPtr, wb_sendWinHandle2Msg, CSTRING, wm_msg, intptr_t, wParam, RexxObjectPtr, lParam, OPTIONAL_POINTERSTRING, _hwnd, NAME, method, CSELF, pCSelf) { - LRESULT lr = sendWinMsg(context, wm_msg, (WPARAM)wParam, (LPARAM)lParam, (HWND)_hwnd, (pCWindowBase)pCSelf); + void *handle; + if ( ! oodObj2handle(context, lParam, &handle, 3) ) + { + return NULLOBJECT; + } + LRESULT lr = sendWinMsg(context, wm_msg, (WPARAM)wParam, (LPARAM)handle, (HWND)_hwnd, (pCWindowBase)pCSelf); + if ( strlen(method) == 17 ) { return context->Intptr((intptr_t)lr); Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2010-12-19 20:39:56 UTC (rev 6513) @@ -86,7 +86,9 @@ #define WM_USER_CREATEPROPSHEET_DLG WM_USER + 0x060C #define OODDLL "oodialog.dll" -#define DLLVER 2130 +#define OOD_LVL_MAJOR 4 +#define OOD_LVL_MINOR 2 +#define OOD_LVL_BIT 0 /* Flags for the get icon functions. Indicates the source of the icon. */ #define ICON_FILE 0x00000001 Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2010-12-19 20:39:56 UTC (rev 6513) @@ -881,7 +881,7 @@ CSTRING str = c->ObjectToStringValue(obj); size_t len = strlen(str); - if ( (len == 0 || len == 2) || (len == 1 && *str != '0') || toupper(str[1]) != 'X' ) + if ( (len == 0 || len == 2) || (len == 1 && *str != '0') || (len != 1 && toupper(str[1]) != 'X') ) { goto raise_condition; } @@ -982,6 +982,25 @@ } /** + * Tests if a string is a pointer string. + * + * Pointer strings are strings representing a pointer, handle, etc.. I.e. in + * "0xdd" format. But, this really just tests for hexidecimal format. + * + * @param string The string to test. + * + * @return True or false + */ +bool isPointerString(const char *string) +{ + if ( string != NULL && strlen(string) > 2 ) + { + return *string == '0' && toupper(string[1]) == 'X' && isxdigit(string[2]); + } + return false; +} + +/** * Converts a string in hexadecimal format (starts with 0x) to its pointer-sized * value. * Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2010-12-19 20:39:56 UTC (rev 6513) @@ -87,6 +87,7 @@ extern int32_t delDialog(pCPlainBaseDialog, RexxThreadContext *c); extern BOOL getDialogIcons(pCPlainBaseDialog, INT, UINT, PHANDLE, PHANDLE); extern bool isYes(const char *s); +extern bool isPointerString(const char *string); extern void * string2pointer(const char *string); extern void * string2pointer(RexxMethodContext *c, RexxStringObject string); extern void * string2pointer(RexxThreadContext *c, RexxObjectPtr ptr); @@ -174,8 +175,11 @@ extern void setFontAttrib(RexxThreadContext *c, pCPlainBaseDialog pcpbd); // These functions are defined in oodPropertySheet.cpp -void abortPropertySheet(pCPropertySheetDialog pcpsd, HWND hDlg, DlgProcErrType t); +extern void abortPropertySheet(pCPropertySheetDialog pcpsd, HWND hDlg, DlgProcErrType t); +// These functions are defined in oodViewControls.cpp +extern bool isInReportView(HWND hList); + // Shared button stuff. typedef enum {push, check, radio, group, owner, notButton} BUTTONTYPE, *PBUTTONTYPE; typedef enum {def, autoCheck, threeState, autoThreeState, noSubtype } BUTTONSUBTYPE, *PBUTTONSUBTYPE; Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2010-12-19 20:39:56 UTC (rev 6513) @@ -1361,7 +1361,7 @@ inline bool isIntResource(CSTRING bmp) { - if ( atoi(bmp) || bmp[0] == '0' || bmp[0] == '\0' ) + if ( ! isPointerString(bmp) && (atoi(bmp) || bmp[0] == '0' || bmp[0] == '\0') ) { return true; } @@ -1958,7 +1958,8 @@ * @remarks Note that the dialog does not need to yet be created for some * variations of this method. But if any of the bitmap CSTRINGs are a * number, so that the bitmap is to be loaded from a resource DLL, - * then the dialog does need to be created. + * then the dialog does need to be created. We want to raise the no + * windows dialog exception, *only* for that one condition. * * These old bitmap methods are too error-prone. */ Modified: sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp =================================================================== --- sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2010-12-19 19:25:18 UTC (rev 6512) +++ sandbox/jlf/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2010-12-19 20:39:56 UTC (rev 6513) @@ -1262,7 +1262,51 @@ return ReplyFalse; } +/** + * Helper function to deterimine a list view item's index using a hit test. + * + * @param hwnd Handle of the list view. + * @param pIA Pointer to an item activate structure. + * + * @remarks This function should only be used when the list view is in report + * mode. If the subitem hit test does not produce an item index, we + * only look for a y position that falls within the bounding rectangle + * of the a visible item. + * + * We start with the top visible index and look at each item on the + * page. The count per page only includes fully visible items, so we + * also check for a last, partially visible item. + */ +static void getItemIndexFromHitPoint(LPNMITEMACTIVATE pIA, HWND hwnd) +{ + LVHITTESTINFO lvhti = {0}; + lvhti.pt.x = pIA->ptAction.x; + lvhti.pt.y = pIA->ptAction.y; + lvhti.flags = LVHT_ONITEM; + ListView_SubItemHitTestEx(hwnd, &lvhti); + pIA->iItem = lvhti.iItem; + + if ( pIA->iItem == -1 ) + { + int topIndex = ListView_GetTopIndex(hwnd); + int count = ListView_GetCountPerPage(hwnd); + RECT r; + + for ( int i = topIndex; i <= count; i++) + { + if ( ListView_GetItemRect(hwnd, i, &r, LVIR_BOUNDS) ) + { + if ( lvhti.pt.y >= r.top && lvhti.pt.y < r.bottom ) + { + pIA->iItem = i; + break; + } + } + } + } +} + MsgReplyType processLVN(RexxThreadContext *c, CSTRING methodName, uint32_t tag, uint32_t code, LPARAM lParam, pCPlainBaseDialog pcpbd) { char tmpBuffer[20]; @@ -1291,6 +1335,33 @@ tmpBuffer[0] == '\0' ? strcpy(tmpBuffer, "ALT") : strcat(tmpBuffer, " ALT"); } + // The user can click on an item in a list view, or on the + // background of the list view. For report mode only, the user can + // also click on a subitem of the item. When the click is on the + // background, the item index and column index will be sent to the + // Rexx method as -1. + // + // In report mode, if the list view has the extended full row select + // stylye, everything works as expected. But, without that style, + // if the user clicks anywhere on the row outside of the item icon + // and item text, the OS does not report the item index. This looks + // odd to the user. For this case we go to some extra trouble to + // get the correct item index. + if ( pIA->iItem == -1 && pIA->iSubItem != -1 ) + { + HWND hwnd = pIA->hdr.hwndFrom; + if ( isInReportView(hwnd) ) + { + getItemIndexFromHitPoint(pIA, hwnd); + } + else + { + // iSubItem is always 0 when not in report mode, but -1 is + // more consistent. + pIA->iSubIt... [truncated message content] |
From: <jfa...@us...> - 2011-02-02 07:52:57
|
Revision: 6683 http://oorexx.svn.sourceforge.net/oorexx/?rev=6683&view=rev Author: jfaucher Date: 2011-02-02 07:52:50 +0000 (Wed, 02 Feb 2011) Log Message: ----------- The recent discussion about subwords brought me a much simpler implementation of mapword : string~space~makearray(" ") does exactly what I need... Modified Paths: -------------- sandbox/jlf/samples/extension/functional.rex sandbox/jlf/unicode/ooRexx/ooRexxTry.rex Modified: sandbox/jlf/samples/extension/functional.rex =================================================================== --- sandbox/jlf/samples/extension/functional.rex 2011-02-02 01:27:04 UTC (rev 6682) +++ sandbox/jlf/samples/extension/functional.rex 2011-02-02 07:52:50 UTC (rev 6683) @@ -35,8 +35,8 @@ ::method doer use strict arg context=.nil parse var self word1 rest - -- When the source string contains a single word, it's a message name - if rest == "" then do + -- When the source string contains a single word without '(', it's a message name + if rest == "" & word1~pos("(") == 0 then do if context <> .nil then raise syntax 93.963 -- Context not supported return .MessageNameSender~new(self) end @@ -107,8 +107,8 @@ if \inplace then r = self~copy string = r~string r~delete(1) - do i = 1 to string~length - self~append(doer~do(string~subchar(i))) + do char over string~makearray("") + r~append(doer~do(char)) end return r ::method mapword @@ -118,25 +118,8 @@ if \inplace then r = self~copy string = r~string r~delete(1) - first = .true - -- Don't use the method "word(n)" since it will be very inefficient for long strings - pos = 1 - c = string~subchar(pos) - do forever - do while c == " " - pos += 1 - c = string~subchar(pos) - end - if c == "" then leave - start = pos - do while c <> " " & c <> "" - pos += 1 - c = string~subchar(pos) - end - word = string~substr(start, pos - start) - if \first then self~append(" ") - self~append(doer~do(word)) - first = .false + do word over string~space~makearray(" ") + r~append(doer~do(word)) end return r Modified: sandbox/jlf/unicode/ooRexx/ooRexxTry.rex =================================================================== --- sandbox/jlf/unicode/ooRexx/ooRexxTry.rex 2011-02-02 01:27:04 UTC (rev 6682) +++ sandbox/jlf/unicode/ooRexx/ooRexxTry.rex 2011-02-02 07:52:50 UTC (rev 6683) @@ -56,6 +56,7 @@ */ parse arg isDefault + parse source . . myPath .local~useDefault = .false if isDefault~translate = 'DEFAULT' then .local~useDefault = .true @@ -68,7 +69,7 @@ call LoadEnvironment -- Set up the environment to work with .platform~initialize - call LoadOptionalComponents + call LoadOptionalComponents .File~new(myPath)~parent code = .oort_dialog~new() -- Create the dialog if code~initCode \= 0 then do @@ -87,6 +88,7 @@ -- Load optional packages/libraries -- Remember : don't implement that as a procedure or routine or method ! LoadOptionalComponents: + use strict arg scriptDirectory if .platform~is("windows") then do call loadPackage("oodialog.cls") call loadPackage("winsystm.cls") @@ -102,8 +104,8 @@ call loadPackage("BSF.CLS") call loadPackage("UNO.CLS") call loadPackage("rgf_util2.rex") -- http://wi.wu.ac.at/rgf/rexx/orx20/rgf_util2.rex - call loadPackage("../../samples/extension/functional.rex") - call loadPackage("../../samples/rgf_util2/wrappers.rex") + call loadPackage(scriptDirectory"/../../samples/extension/functional.rex") + call loadPackage(scriptDirectory"/../../samples/rgf_util2/wrappers.rex") return @@ -115,6 +117,7 @@ .context~package~loadPackage(filename) return .true loadPackageError: + say "loadPackage KO for" filename return .false This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2011-02-24 08:09:38
|
Revision: 6802 http://oorexx.svn.sourceforge.net/oorexx/?rev=6802&view=rev Author: jfaucher Date: 2011-02-24 08:09:29 +0000 (Thu, 24 Feb 2011) Log Message: ----------- merge 6500-6784 from main/trunk/api main/trunk/extension/hostemu main/trunk/interpreter main/trunk/platform main/trunk/rexxapi Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/api/oorexxerrors.h sandbox/jlf/trunk/api/platform/windows/rexxapitypes.h sandbox/jlf/trunk/extensions/hostemu/platform/unix/hostemu.cpp sandbox/jlf/trunk/interpreter/classes/ArrayClass.cpp sandbox/jlf/trunk/interpreter/classes/ArrayClass.hpp sandbox/jlf/trunk/interpreter/classes/ExceptionClass.cpp sandbox/jlf/trunk/interpreter/classes/MethodClass.hpp sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp sandbox/jlf/trunk/interpreter/classes/RelationClass.cpp sandbox/jlf/trunk/interpreter/classes/RelationClass.hpp sandbox/jlf/trunk/interpreter/classes/StringClass.hpp sandbox/jlf/trunk/interpreter/classes/StringClassWord.cpp sandbox/jlf/trunk/interpreter/classes/support/RexxHashTable.cpp sandbox/jlf/trunk/interpreter/classes/support/RexxHashTable.hpp sandbox/jlf/trunk/interpreter/classes/support/StringUtil.cpp sandbox/jlf/trunk/interpreter/classes/support/StringUtil.hpp sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.hpp sandbox/jlf/trunk/interpreter/execution/CPPCode.cpp sandbox/jlf/trunk/interpreter/execution/RexxActivation.cpp sandbox/jlf/trunk/interpreter/execution/RexxActivation.hpp sandbox/jlf/trunk/interpreter/execution/RexxLocalVariables.cpp sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.hpp sandbox/jlf/trunk/interpreter/execution/RexxVariable.hpp sandbox/jlf/trunk/interpreter/memory/Setup.cpp sandbox/jlf/trunk/interpreter/messages/DocErrorMessages.sgml sandbox/jlf/trunk/interpreter/messages/RexxErrorCodes.h sandbox/jlf/trunk/interpreter/messages/RexxMessageNumbers.h sandbox/jlf/trunk/interpreter/messages/RexxMessageTable.h sandbox/jlf/trunk/interpreter/messages/rexxmsg.xml sandbox/jlf/trunk/interpreter/parser/Scanner.cpp sandbox/jlf/trunk/interpreter/platform/windows/winmsgtb.rc sandbox/jlf/trunk/platform/unix/debian/postinst.in sandbox/jlf/trunk/platform/unix/debian/prerm sandbox/jlf/trunk/platform/unix/oorexx.spec.in sandbox/jlf/trunk/platform/windows/install/oorexx.nsi sandbox/jlf/trunk/rexxapi/server/QueueManager.cpp sandbox/jlf/trunk/rexxapi/server/QueueManager.hpp Property Changed: ---------------- sandbox/jlf/trunk/api/ sandbox/jlf/trunk/extensions/hostemu/ sandbox/jlf/trunk/interpreter/ sandbox/jlf/trunk/platform/ sandbox/jlf/trunk/rexxapi/ Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/_diary.txt 2011-02-24 08:09:29 UTC (rev 6802) @@ -488,4 +488,14 @@ merge 5988-6048 from main/trunk merge 6048-6142 from main/trunk merge 6142-6189 from main/trunk -merge 6189-6500 from main/trunk \ No newline at end of file +merge 6189-6500 from main/trunk +merge 6500-6784 from + main/trunk/api + main/trunk/extension/hostemu + main/trunk/interpreter + main/trunk/platform + main/trunk/rexxapi + +Remember todo : + merge 6500-xxxx from main/trunk/extensions/platform/windows/oodialog + merge 6500-xxxx from main/trunk/samples \ No newline at end of file Property changes on: sandbox/jlf/trunk/api ___________________________________________________________________ Added: svn:mergeinfo + /main/branches/4.0beta/trunk/api:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/branches/4.1.0/trunk/api:6303,6318,6426-6428 /main/trunk/api:5812-6784 Modified: sandbox/jlf/trunk/api/oorexxerrors.h =================================================================== --- sandbox/jlf/trunk/api/oorexxerrors.h 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/api/oorexxerrors.h 2011-02-24 08:09:29 UTC (rev 6802) @@ -512,6 +512,7 @@ #define Rexx_Error_Incorrect_method_signature 93968 #define Rexx_Error_Incorrect_method_nostem 93969 #define Rexx_Error_Unsupported_copy_method 93970 +#define Rexx_Error_Incorrect_method_multi_dimension 93971 #define Rexx_Error_No_method 97000 #define Rexx_Error_No_method_name 97001 #define Rexx_Error_No_method_user_defined 97900 Modified: sandbox/jlf/trunk/api/platform/windows/rexxapitypes.h =================================================================== --- sandbox/jlf/trunk/api/platform/windows/rexxapitypes.h 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/api/platform/windows/rexxapitypes.h 2011-02-24 08:09:29 UTC (rev 6802) @@ -50,6 +50,15 @@ #undef __REXX64__ #endif +#ifdef NATIVE_INTYPES +/* If the plattform and compiler supports the +* C9X 'proposed' standard for interger types, +* use the provided inttypes.h +* otherwise use our own defintions of the same types +*/ + +#include <inttypes.h> +#else // portable ANSI types typedef short int16_t; typedef unsigned short uint16_t; @@ -59,6 +68,7 @@ typedef unsigned char uint8_t; typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; +#endif typedef DWORD thread_id_t; typedef DWORD process_id_t; Property changes on: sandbox/jlf/trunk/extensions/hostemu ___________________________________________________________________ Added: svn:mergeinfo + /main/branches/4.0beta/trunk/extensions/hostemu:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/branches/4.1.0/trunk/extensions/hostemu:6303,6318,6426-6428 /main/trunk/extensions/hostemu:5812-6784 Modified: sandbox/jlf/trunk/extensions/hostemu/platform/unix/hostemu.cpp =================================================================== --- sandbox/jlf/trunk/extensions/hostemu/platform/unix/hostemu.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/extensions/hostemu/platform/unix/hostemu.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -318,14 +318,16 @@ } memset(pll, '\0', sizeof (LL)); strcpy(pll -> FileName, ExecIO_Options.aFilename); - pll -> pFile = fopen(pll -> FileName, "r+"); - /* try to open an existing file */ - if (pll -> pFile == NULL) { - /* no existing file, so open a new file */ + if (ExecIO_Options.fRW) { + /* DISKW */ pll -> pFile = fopen(pll -> FileName, "w+"); } - if (pll -> pFile == NULL) { - /* nothing could be opened so return an error */ + else { + /* DISKR */ + pll -> pFile = fopen(pll -> FileName, "r+"); + } + if ((pll -> pFile == NULL)) { + /* file could be opened so return an error */ free(pll); rc = 20; *flags = RXSUBCOM_FAILURE; Property changes on: sandbox/jlf/trunk/interpreter ___________________________________________________________________ Added: svn:mergeinfo + /main/branches/4.0beta/trunk/interpreter:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/branches/4.1.0/trunk/interpreter:6303,6318,6426-6428 /main/trunk/interpreter:5812-6784 Modified: sandbox/jlf/trunk/interpreter/classes/ArrayClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/ArrayClass.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/ArrayClass.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -285,6 +285,50 @@ /** + * Open a gap in the array by shifting each element to the right + * starting at the given index. + * + * @param index The index of the first item to shift. + * + * @param elements The number of elements to shift. + */ +void RexxArray::openGap(size_t index, size_t elements) +{ + size_t newIndex = index + elements; + size_t lastIndex = lastElement; // where we start moving from + // make sure we have space + ensureSpace(lastIndex); + // open from the back... + for (size_t i = lastIndex; i >= index; i--) + { + // copy the element to the new position and null out the old slot + put(get(i), i + elements); + put(OREF_NULL, i); + } +} + +/** + * Close a gap in the array item. + * + * @param index The gap to close. + * @param elements + */ +void RexxArray::closeGap(size_t index, size_t elements) +{ + // cap the number of elements we're shifting. + elements = Numerics::maxVal(elements, lastElement - index + 1); + size_t firstIndex = index + elements; + for (size_t i = 0; i < elements; i++) + { + put(get(firstIndex + i), index + i); + put(OREF_NULL, firstIndex + i); + } + // adjust the last element position + lastElement -= elements; +} + + +/** * Append an item after the last item in the array. * * @param value The value to append. Modified: sandbox/jlf/trunk/interpreter/classes/ArrayClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/ArrayClass.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/ArrayClass.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -215,6 +215,9 @@ void merge(BaseSortComparator &comparator, RexxArray *working, size_t left, size_t mid, size_t right); static void arraycopy(RexxArray *source, size_t start, RexxArray *target, size_t index, size_t count); size_t find(BaseSortComparator &comparator, RexxObject *val, int bnd, size_t left, size_t right); + void openGap(size_t index, size_t elements); + void closeGap(size_t index, size_t elements); + static const size_t MAX_FIXEDARRAY_SIZE; Modified: sandbox/jlf/trunk/interpreter/classes/ExceptionClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/ExceptionClass.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/ExceptionClass.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -278,6 +278,13 @@ } +/** + * Get a condition directory object from an exception. + * Primarily for compatibility with previous releases. + * + * @return A directory instance containing the exception information + * transformed into directory entries. + */ RexxDirectory *ExceptionClass::getCondition() { if (condition == OREF_NULL) Modified: sandbox/jlf/trunk/interpreter/classes/MethodClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MethodClass.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/MethodClass.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -90,6 +90,7 @@ RexxArray *source(); RexxClass *findClass(RexxString *className); BaseExecutable *setSourceObject(RexxSource *s); + RexxString *getName() { return executableName; } protected: RexxString *executableName; // the created name of this routine Modified: sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -1497,6 +1497,26 @@ /** + * Returns an array of all words contained in the given range + * of the string, using the same extraction rules used + * for subWord() and word(). + * + * @param position The optional starting position. If not provided, extraction + * starts with the first word. + * @param plength The number of words to extract. If omitted, will extract + * from the starting postion to the end of the string. + * + * @return An array containing the extracted words. If no words are + * available within the given range, this returns an empty + * array. + */ +RexxArray *RexxMutableBuffer::subWords(RexxInteger *position, RexxInteger *plength) +{ + return StringUtil::subWords(getStringData(), getBLength(), position, plength); +} + + +/** * Extract a given word from a mutable buffer. * * @param position The target word position. Modified: sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/MutableBufferClass.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -112,6 +112,7 @@ RexxInteger *caselessMatchChar(RexxInteger *position_, RexxString *matchSet); // in behaviour RexxInteger *verify(RexxString *, RexxString *, RexxInteger *, RexxInteger *); // in behaviour RexxString *subWord(RexxInteger *, RexxInteger *); // in behaviour + RexxArray *subWords(RexxInteger *, RexxInteger *); // in behaviour RexxString *word(RexxInteger *); // in behaviour RexxInteger *wordIndex(RexxInteger *); // in behaviour RexxInteger *wordLength(RexxInteger *); // in behaviour Modified: sandbox/jlf/trunk/interpreter/classes/RelationClass.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/RelationClass.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/RelationClass.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -190,6 +190,22 @@ } +/** + * Remove all items with a given index. + * + * @param _index The index to remove. + * + * @return An array of all removed items. Returns an empty array + * if the index is not found. + */ +RexxObject *RexxRelation::removeAll(RexxObject *_index) +{ + requiredArgument(_index, ARG_ONE); /* make sure we have an index */ + /* just get from the hash table */ + return this->contents->removeAll(_index); +} + + RexxObject *RexxRelation::put( RexxObject *_value, /* new value to add */ RexxObject *_index) /* index for insertion */ Modified: sandbox/jlf/trunk/interpreter/classes/RelationClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/RelationClass.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/RelationClass.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -58,6 +58,7 @@ RexxObject *hasItem(RexxObject *, RexxObject *); RexxObject *allAt(RexxObject *); RexxObject *allIndex(RexxObject *); + RexxObject *removeAll(RexxObject *); RexxObject *itemsRexx(RexxObject *); RexxSupplier *supplier(RexxObject *); RexxObject *removeItem(RexxObject *, RexxObject *); Modified: sandbox/jlf/trunk/interpreter/classes/StringClass.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/StringClass.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/StringClass.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -255,6 +255,7 @@ RexxString *delWord(RexxInteger *, RexxInteger *); // in behaviour RexxString *space(RexxInteger *, RexxString *); // in behaviour RexxString *subWord(RexxInteger *, RexxInteger *); // in behaviour + RexxArray *subWords(RexxInteger *, RexxInteger *); // in behaviour RexxString *word(RexxInteger *); // in behaviour RexxInteger *wordIndex(RexxInteger *); // in behaviour RexxInteger *wordLength(RexxInteger *); // in behaviour @@ -379,6 +380,7 @@ inline void toRxstring(CONSTRXSTRING &r) { r.strptr = getStringData(); r.strlength = size_v(getBLength()); } // no encoding support, so better to use blength inline void toRxstring(RXSTRING &r) { r.strptr = getWritableData(); r.strlength = size_v(getBLength()); } void copyToRxstring(RXSTRING &r); + inline bool endsWith(codepoint_t c) { return getCLength() > 0 && this->getCharC(this->getCLength() - 1) == c; } RexxNumberString *createNumberString(); Modified: sandbox/jlf/trunk/interpreter/classes/StringClassWord.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/StringClassWord.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/StringClassWord.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -232,6 +232,26 @@ } +/** + * Returns an array of all words contained in the given range + * of the string, using the same extraction rules used + * for subWord() and word(). + * + * @param position The optional starting position. If not provided, extraction + * starts with the first word. + * @param plength The number of words to extract. If omitted, will extract + * from the starting postion to the end of the string. + * + * @return An array containing the extracted words. If no words are + * available within the given range, this returns an empty + * array. + */ +RexxArray *RexxString::subWords(RexxInteger *position, RexxInteger *plength) +{ + return StringUtil::subWords(getStringData(), getBLength(), position, plength); +} + + /* the WORD function */ /******************************************************************************/ /* Arguments: which word we want. */ Modified: sandbox/jlf/trunk/interpreter/classes/support/RexxHashTable.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/support/RexxHashTable.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/support/RexxHashTable.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -324,6 +324,87 @@ return OREF_NULL; /* removed item not found */ } + +/** + * Remove all elements with a given index from a hashtable, + * returning an array of all items. + * + * @param _index The target index. + * + * @return An array of all matching items. + */ +RexxObject *RexxHashTable::removeAll(RexxObject *_index) +{ + // get a count of matching items + size_t count = countAll(_index); + HashLink position = hashIndex(_index); /* calculate the hash slot */ + RexxArray *result = new_array(count); /* get proper size result array */ + // only copy if we have something to remove + if (count > 0) + { + size_t i = 1; /* start at the first element */ + HashLink previous = NO_LINK; /* no previous slot yet */ + do + { /* while more items in chain */ + /* copy the value into our array */ + result->put(this->entries[position].value,i++); + /* if got a match */ + if (EQUAL_VALUE(_index, this->entries[position].index)) + { + /* get the next pointer */ + HashLink _next = this->entries[position].next; + if (_next == NO_MORE) + { /* end of the chain? */ + /* clear this slot entry */ + OrefSet(this,this->entries[position].index,OREF_NULL); + OrefSet(this,this->entries[position].value,OREF_NULL); + if (previous != NO_LINK) /* if not the first of the chain */ + { + /* IH: In this special case we delete an item from the overhead and + therefore might have to increase the free counter, otherwise + hash table will be extended unnecessarily !!! */ + if (position > this->free) + { + this->free = position; + } + /* break the link */ + this->entries[previous].next = NO_MORE; + } + return result; // we've hit the end of the chain, we're done + } /* non-terminal chain element */ + else + { + /* close up the link */ + this->entries[position].next = this->entries[_next].next; + /* copy value and index to current */ + OrefSet(this,this->entries[position].index,this->entries[_next].index); + OrefSet(this,this->entries[position].value,this->entries[_next].value); + /* clear the next entry */ + OrefSet(this,this->entries[_next].index,OREF_NULL); + OrefSet(this,this->entries[_next].value,OREF_NULL); + /* set to "pristine" condition */ + this->entries[_next].next = NO_MORE; + if (this->free < _next) /* new-low water mark? */ + { + this->free = _next; /* reset to this point */ + } + + // NOTE: We don't update either previous or position because we'll + // be looking at the same link again + } + } + else + { + // remember the previous position and step to the next one + previous = position; + position = this->entries[position].next; + } + /* step to the next link */ + } while (position != NO_MORE); + } + return result; /* return the result array */ +} + RexxObject *RexxHashTable::primitiveRemove( RexxObject *_index) /* index to remove */ /******************************************************************************/ Modified: sandbox/jlf/trunk/interpreter/classes/support/RexxHashTable.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/support/RexxHashTable.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/support/RexxHashTable.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -90,6 +90,7 @@ RexxObject *mergeItem(RexxObject *value, RexxObject *index); RexxHashTable *add(RexxObject *value, RexxObject *key); RexxObject *remove(RexxObject *key); + RexxObject *removeAll(RexxObject *key); RexxArray *getAll(RexxObject *key); size_t countAll(RexxObject *key); RexxObject *get(RexxObject *key); Modified: sandbox/jlf/trunk/interpreter/classes/support/StringUtil.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/support/StringUtil.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/support/StringUtil.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -1568,6 +1568,65 @@ /** + * Do a wordList operation on a buffer of data + * + * @param data The start of the data buffer. + * @param length The length of the buffer + * @param position The starting word position. + * @param plength the count of words to return. + * + * @return The array containing the indicated subwords. + */ +RexxArray *StringUtil::subWords(const char *data, sizeB_t length, RexxInteger *position, RexxInteger *plength) +{ + /* convert position to binary */ + size_t wordPos = optionalPositionArgument(position, 1, ARG_ONE); + // get num of words to extract. The default is a "very large number + size_t count = optionalLengthArgument(plength, Numerics::MAX_WHOLENUMBER, ARG_TWO); + + // handle cases that will always result an empty array + if (length == 0 || count == 0) + { + return new_array((size_t)0); + } + + const char *nextSite = NULL; + const char *word = data; + /* get the first word */ + sizeB_t wordLength = nextWord(&word, &length, &nextSite); + while (--wordPos > 0 && wordLength != 0) + { /* loop until we reach target */ + word = nextSite; /* copy the start pointer */ + /* get the next word */ + wordLength = nextWord(&word, &length, &nextSite); + } + // we terminated because there was no word found before we reached the + // count position + if (wordPos != 0) + { + return new_array((size_t)0); // again, an empty array + } + + // we make this size zero so the size and the items count will match + RexxArray *result = new_array((size_t)0); + ProtectedObject p(result); + + const char *wordStart = word; /* save start position */ + /* loop until we reach tArget */ + while (count-- > 0 && wordLength != 0) + { + // add to the result array + result->append(new_string(word, wordLength)); + word = nextSite; /* copy the start pointer */ + /* get the next word */ + wordLength = nextWord(&word, &length, &nextSite); + } + + return result; // return the populated array +} + + +/** * Extract a word from a buffer * * @param data The data pointer Modified: sandbox/jlf/trunk/interpreter/classes/support/StringUtil.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/classes/support/StringUtil.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/classes/support/StringUtil.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -84,6 +84,7 @@ static size_t memPos(const char *string, sizeB_t length, char target); static RexxInteger *verify(const char *data, sizeB_t stringLen, RexxString *ref, RexxString *option, RexxInteger *_start, RexxInteger *range); static RexxString *subWord(const char *data, sizeB_t length, RexxInteger *position, RexxInteger *plength); + static RexxArray *subWords(const char *data, sizeB_t length, RexxInteger *position, RexxInteger *plength); static RexxString *word(const char *data, sizeB_t length, RexxInteger *position); static RexxInteger *wordIndex(const char *data, sizeB_t length, RexxInteger *position); static RexxInteger *wordLength(const char *data, sizeB_t length, RexxInteger *position); Modified: sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -846,14 +846,7 @@ if (primary != errcode) /* have a secondary message to issue?*/ { /* retrieve the secondary message */ - RexxString *message = SystemInterpreter::getMessageText(errcode); - if (message == OREF_NULL) /* no corresponding message */ - { - /* this is an error */ - reportException(Error_Execution_error_condition, code); - } - /* do required substitutions */ - message = messageSubstitution(message, additional); + RexxString *message = buildMessage(errcode, additional); /* replace the original message text */ exobj->put(message, OREF_NAME_MESSAGE); } @@ -976,7 +969,30 @@ return stackFrames; } +/** + * Build a message and perform the indicated substitutions. + * + * @param messageCode + * The target message code + * @param substitutions + * An array of substitution values + * + * @return The message with the substitution values inserted. + */ +RexxString *RexxActivity::buildMessage(wholenumber_t messageCode, RexxArray *substitutions) +{ + /* retrieve the secondary message */ + RexxString *message = SystemInterpreter::getMessageText(messageCode); + if (message == OREF_NULL) /* no corresponding message */ + { + /* this is an error */ + reportException(Error_Execution_error_condition, messageCode); + } + /* do required substitutions */ + return messageSubstitution(message, substitutions); +} + RexxString *RexxActivity::messageSubstitution( RexxString *message, /* REXX error message */ RexxArray *additional ) /* substitution information */ Modified: sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -91,6 +91,7 @@ TRACE_PREFIX_MESSAGE , TRACE_PREFIX_ARGUMENT , TRACE_PREFIX_ASSIGNMENT, + TRACE_PREFIX_INVOCATION, }; @@ -167,6 +168,7 @@ void raisePropagate(RexxDirectory *); RexxObject *display(RexxDirectory *); RexxObject *displayDebug(RexxDirectory *); + RexxString *buildMessage(wholenumber_t, RexxArray *); RexxString *messageSubstitution(RexxString *, RexxArray *); void live(size_t); void liveGeneral(int reason); Modified: sandbox/jlf/trunk/interpreter/execution/CPPCode.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/CPPCode.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/execution/CPPCode.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -822,6 +822,7 @@ CPPM(RexxString::delWord), CPPM(RexxString::space), CPPM(RexxString::subWord), +CPPM(RexxString::subWords), CPPM(RexxString::word), CPPM(RexxString::wordIndex), CPPM(RexxString::wordLength), @@ -910,6 +911,7 @@ CPPM(RexxMutableBuffer::caselessMatchChar), CPPM(RexxMutableBuffer::verify), CPPM(RexxMutableBuffer::subWord), +CPPM(RexxMutableBuffer::subWords), CPPM(RexxMutableBuffer::word), CPPM(RexxMutableBuffer::wordIndex), CPPM(RexxMutableBuffer::wordLength), @@ -950,6 +952,7 @@ CPPM(RexxRelation::put), /* Relation methods */ CPPM(RexxRelation::removeItemRexx), +CPPM(RexxRelation::removeAll), CPPM(RexxRelation::allIndex), CPPM(RexxRelation::itemsRexx), CPPM(RexxRelation::supplier), Modified: sandbox/jlf/trunk/interpreter/execution/RexxActivation.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/RexxActivation.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/execution/RexxActivation.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -76,6 +76,7 @@ #include "ActivationFrame.hpp" #include "StackFrameClass.hpp" #include "InterpreterInstance.hpp" +#include "PackageClass.hpp" /* max instructions without a yield */ #define MAX_INSTRUCTIONS 100 @@ -487,6 +488,11 @@ } this->execution_state = ACTIVE; /* we are now actively processing */ + if (tracingAll() && isMethodOrRoutine()) + { + traceEntry(); + } + while (true) // loop until we get a terminating condition { try @@ -3099,6 +3105,7 @@ ">M>", /* TRACE_PREFIX_MESSAGE */ ">A>", /* TRACE_PREFIX_ARGUMENT */ ">=>", /* TRACE_PREFIX_ASSIGNMENT */ + ">I>", /* TRACE_PREFIX_INVOCATION */ }; /* extra space required to format a */ @@ -3120,7 +3127,45 @@ // over head for adding quotes #define QUOTES_OVERHEAD 2 +/** + * Trace program entry for a method or routine + */ +void RexxActivation::traceEntry() +{ + // since we're advertising the entry location up front, we want to disable + // the normal trace-turn on notice. We'll get one or the other, but not + // both + this->settings.flags |= source_traced; + RexxArray *info = OREF_NULL; + + if (isMethod()) + { + info = new_array(getMessageName(), scope, getPackage()->getName()); + } + else + { + info = new_array(getExecutable()->getName(), getPackage()->getName()); + } + ProtectedObject p(info); + + RexxString *message = activity->buildMessage(isRoutine() ? Message_Translations_routine_invocation : Message_Translations_method_invocation, info); + p = message; + + /* get a string large enough to */ + sizeB_t outBlength = message->getBLength() + INSTRUCTION_OVERHEAD; + RexxString *buffer = raw_string(outBlength); /* get an output string */ + /* insert the leading blanks */ + buffer->set(0, ' ', INSTRUCTION_OVERHEAD); + /* add the trace prefix */ + buffer->put(PREFIX_OFFSET, trace_prefix_table[TRACE_PREFIX_INVOCATION], PREFIX_LENGTH); + /* copy the string value */ + buffer->put(INSTRUCTION_OVERHEAD, message->getStringData(), message->getBLength()); + /* write out the line */ + activity->traceOutput(this, buffer); +} + + void RexxActivation::traceValue( /* trace an intermediate value */ RexxObject * value, /* value to trace */ int prefix ) /* traced result type */ Modified: sandbox/jlf/trunk/interpreter/execution/RexxActivation.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/RexxActivation.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/execution/RexxActivation.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -203,6 +203,7 @@ inline bool isProgramLevelCall() { return (activation_context & PROGRAM_LEVEL_CALL) != 0; } inline bool isInternalLevelCall() { return (activation_context & INTERNAL_LEVEL_CALL) != 0; } inline bool isProgramOrMethod() { return (activation_context & PROGRAM_OR_METHOD) != 0; } + inline bool isMethodOrRoutine() { return isMethod() || isRoutine(); } RexxObject *run(RexxObject *_receiver, RexxString *msgname, RexxObject **_arglist, size_t _argcount, RexxInstruction * start, ProtectedObject &resultObj); @@ -261,6 +262,7 @@ void traceOperatorValue(int prefix, const char *tag, RexxObject *value); void traceSourceString(); void traceClause(RexxInstruction *, int); + void traceEntry(); void resetElapsed(); RexxString * formatTrace(RexxInstruction *, RexxSource *); RexxString * getTraceBack(); Modified: sandbox/jlf/trunk/interpreter/execution/RexxLocalVariables.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/RexxLocalVariables.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/execution/RexxLocalVariables.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -52,16 +52,19 @@ /* Function: Normal garbage collection live marking */ /******************************************************************************/ { - RexxVariable **entry; /* marked stack entry */ - RexxVariable **top; - - /* loop through the stack entries */ - for (entry = locals, top = entry + size; entry < top; entry++) - { - memory_mark(*entry); /* marking each one */ - } - - memory_mark(dictionary); /* also mark any created vdict */ + // We can only mark if full initialized + if (locals != NULL) + { + RexxVariable **entry; /* marked stack entry */ + RexxVariable **top; + + /* loop through the stack entries */ + for (entry = locals, top = entry + size; entry < top; entry++) + { + memory_mark(*entry); /* marking each one */ + } + } + memory_mark(dictionary); /* also mark any created vdict */ } void RexxLocalVariables::liveGeneral(int reason) @@ -69,15 +72,19 @@ /* Function: Generalized object marking */ /******************************************************************************/ { - RexxVariable **entry; /* marked stack entry */ - RexxVariable **top; + // We can only mark if full initialized + if (locals != NULL) + { + RexxVariable **entry; /* marked stack entry */ + RexxVariable **top; - /* loop through the stack entries */ - for (entry = locals, top = entry + size; entry < top; entry++) - { - memory_mark_general(*entry); /* marking each one */ - } - memory_mark_general(dictionary); /* also mark any created vdict */ + /* loop through the stack entries */ + for (entry = locals, top = entry + size; entry < top; entry++) + { + memory_mark_general(*entry); /* marking each one */ + } + } + memory_mark_general(dictionary); /* also mark any created vdict */ } Modified: sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -2291,14 +2291,17 @@ for (;;) /* loop until we get something */ { - stemVar = nextStem(); /* see if we're processing a stem variable */ - if (stemVar != OREF_NULL) /* were we in the middle of processing a stem? */ + variable = nextStem(); /* see if we're processing a stem variable */ + if (variable != OREF_NULL) /* were we in the middle of processing a stem? */ { + stemVar = (RexxStem *)variable->getVariableValue(); compound = stemVar->nextVariable(this); if (compound != OREF_NULL) /* if we still have elements here */ { - /* create a full stem name */ - *name = compound->createCompoundName(stemVar->getName()); + // create a full stem name + // NOTE: We're using the stem name from the variable, not the + // stem OBJECT we're iterating over. + *name = compound->createCompoundName(variable->getName()); /* get the value */ *value = compound->getVariableValue(); return true; @@ -2321,10 +2324,10 @@ /* get the value */ RexxObject *variable_value = variable->getVariableValue(); /* found a stem item? */ - if (isOfClass(Stem, variable_value)) + if (variable->isStem()) { - /* we are not on a stem */ - setNextStem((RexxStem *)variable_value); + /* we are now on a stem */ + setNextStem(variable); setCompoundElement(((RexxStem *)variable_value)->first()); /* set up an iterator for the stem */ } Modified: sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/execution/RexxNativeActivation.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -119,7 +119,7 @@ inline bool getVpavailable() {return this->vpavailable;} inline RexxString *getMessageName() {return this->msgname;} inline size_t nextVariable() {return this->nextvariable;} - inline RexxStem *nextStem() {return this->nextstem;} + inline RexxVariable *nextStem() {return this->nextstem;} RexxObject *getContextStem(RexxString *name); RexxObject *getContextVariable(const char *name); void dropContextVariable(const char *name); @@ -136,7 +136,7 @@ inline RexxCompoundElement *compoundElement() {return this->compoundelement; } inline void setNextVariable(size_t value) {this->nextvariable = value;} inline void setNextCurrent(RexxVariableDictionary *vdict) {this->nextcurrent = vdict;} - inline void setNextStem(RexxStem *stemVar) {this->nextstem = stemVar;} + inline void setNextStem(RexxVariable *stemVar) {this->nextstem = stemVar;} inline void setCompoundElement(RexxCompoundElement *element) {this->compoundelement = element;} inline RexxObject *getSelf() { return receiver; } inline RexxActivity *getActivity() { return activity; } @@ -210,7 +210,7 @@ size_t nextvariable; /* next variable to retrieve */ RexxVariableDictionary *nextcurrent; /* current processed vdict */ RexxCompoundElement *compoundelement;/* current compound variable value */ - RexxStem * nextstem; /* our working stem variable */ + RexxVariable *nextstem; /* our working stem variable */ size_t argcount; /* size of the argument list */ bool vpavailable; /* Variable pool access flag */ int object_scope; /* reserve/release state of variables*/ Modified: sandbox/jlf/trunk/interpreter/execution/RexxVariable.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/RexxVariable.hpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/execution/RexxVariable.hpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -44,6 +44,8 @@ #ifndef Included_RexxVariable #define Included_RexxVariable +#include "StringClass.hpp" + class RexxVariable : public RexxInternalObject { public: inline void *operator new(size_t size, void *ptr) { return ptr; } @@ -86,6 +88,7 @@ inline RexxVariable *getNext() { return (RexxVariable *)variableValue; } inline void cache(RexxVariable *next) { reset(OREF_NULL); variableValue = (RexxObject *)next; } inline bool isLocal(RexxActivation *act) { return act == creator; } + inline bool isStem() { return variable_name->endsWith('.'); } static RexxVariable *newInstance(RexxString *name); Modified: sandbox/jlf/trunk/interpreter/memory/Setup.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/memory/Setup.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/memory/Setup.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -748,6 +748,7 @@ defineKernelMethod(CHAR_ALLINDEXES , TheRelationBehaviour, CPPM(RexxHashTableCollection::allIndexes), 0); defineKernelMethod(CHAR_EMPTY , TheRelationBehaviour, CPPM(RexxHashTableCollection::empty), 0); defineKernelMethod(CHAR_ISEMPTY , TheRelationBehaviour, CPPM(RexxHashTableCollection::isEmpty), 0); + defineKernelMethod("REMOVEALL" , TheRelationBehaviour, CPPM(RexxRelation::removeAll), 1); /* set the scope of the methods to */ /* this classes oref */ @@ -843,6 +844,7 @@ defineKernelMethod(CHAR_DELWORD ,TheStringBehaviour, CPPM(RexxString::delWord), 2); defineKernelMethod(CHAR_SPACE ,TheStringBehaviour, CPPM(RexxString::space), 2); defineKernelMethod(CHAR_SUBWORD ,TheStringBehaviour, CPPM(RexxString::subWord), 2); + defineKernelMethod("SUBWORDS" ,TheStringBehaviour, CPPM(RexxString::subWords), 2); defineKernelMethod(CHAR_TRUNC ,TheStringBehaviour, CPPM(RexxString::trunc), 1); defineKernelMethod(CHAR_WORD ,TheStringBehaviour, CPPM(RexxString::word), 1); defineKernelMethod(CHAR_WORDINDEX ,TheStringBehaviour, CPPM(RexxString::wordIndex), 1); @@ -977,6 +979,7 @@ defineKernelMethod(CHAR_CASELESSMATCHCHAR ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::caselessMatchChar), 2); defineKernelMethod(CHAR_VERIFY ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::verify), 4); defineKernelMethod(CHAR_SUBWORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::subWord), 2); + defineKernelMethod("SUBWORDS" ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::subWords), 2); defineKernelMethod(CHAR_WORD ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::word), 1); defineKernelMethod(CHAR_WORDINDEX ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordIndex), 1); defineKernelMethod(CHAR_WORDLENGTH ,TheMutableBufferBehaviour, CPPM(RexxMutableBuffer::wordLength), 1); Modified: sandbox/jlf/trunk/interpreter/messages/DocErrorMessages.sgml =================================================================== --- sandbox/jlf/trunk/interpreter/messages/DocErrorMessages.sgml 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/messages/DocErrorMessages.sgml 2011-02-24 08:09:29 UTC (rev 6802) @@ -3197,6 +3197,12 @@ </para> </listitem> </varlistentry> +<varlistentry> +<term>971</term> +<listitem> +<para>Method argument <emphasis role="italic">argument</emphasis> cannot have more than a single dimension</para> +</listitem> +</varlistentry> </variablelist> </section> <section id="ERR97"> Modified: sandbox/jlf/trunk/interpreter/messages/RexxErrorCodes.h =================================================================== --- sandbox/jlf/trunk/interpreter/messages/RexxErrorCodes.h 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/messages/RexxErrorCodes.h 2011-02-24 08:09:29 UTC (rev 6802) @@ -512,6 +512,7 @@ #define Error_Incorrect_method_signature 93968 #define Error_Incorrect_method_nostem 93969 #define Error_Unsupported_copy_method 93970 +#define Error_Incorrect_method_multi_dimension 93971 #define Error_No_method 97000 #define Error_No_method_name 97001 #define Error_No_method_user_defined 97900 @@ -587,6 +588,11 @@ #define Error_Translation_duplicate_attribute 99931 #define Error_Translation_duplicate_constant 99932 #define Error_at_line 101000 +#define Message_Translations_error 101001 +#define Message_Translations_running 101002 +#define Message_Translations_line 101003 +#define Message_Translations_debug_error 101004 +#define Message_Translations_debug_prompt 101005 #define Message_Translations_January 101006 #define Message_Translations_February 101007 #define Message_Translations_March 101008 @@ -599,11 +605,8 @@ #define Message_Translations_October 101015 #define Message_Translations_November 101016 #define Message_Translations_December 101017 -#define Message_Translations_debug_prompt 101005 -#define Message_Translations_debug_error 101004 -#define Message_Translations_error 101001 -#define Message_Translations_running 101002 -#define Message_Translations_line 101003 +#define Message_Translations_routine_invocation 101018 +#define Message_Translations_method_invocation 101019 #define Error_RXSUBC_general 999000 #define Error_RXSUBC_register 999001 #define Error_RXSUBC_drop 999002 Modified: sandbox/jlf/trunk/interpreter/messages/RexxMessageNumbers.h =================================================================== --- sandbox/jlf/trunk/interpreter/messages/RexxMessageNumbers.h 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/messages/RexxMessageNumbers.h 2011-02-24 08:09:29 UTC (rev 6802) @@ -622,6 +622,9 @@ #define Error_Execution_invalid_thread_msg 716 #define Error_Invalid_expression_parse_msg 717 #define Error_Invalid_expression_call_msg 718 +#define Message_Translations_routine_invocation_msg 719 +#define Message_Translations_method_invocation_msg 720 +#define Error_Incorrect_method_multi_dimension_msg 721 #endif Modified: sandbox/jlf/trunk/interpreter/messages/RexxMessageTable.h =================================================================== --- sandbox/jlf/trunk/interpreter/messages/RexxMessageTable.h 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/messages/RexxMessageTable.h 2011-02-24 08:09:29 UTC (rev 6802) @@ -515,6 +515,7 @@ MINOR(Error_Incorrect_method_signature) MINOR(Error_Incorrect_method_nostem) MINOR(Error_Unsupported_copy_method) + MINOR(Error_Incorrect_method_multi_dimension) MAJOR(Error_No_method) MINOR(Error_No_method_name) MINOR(Error_No_method_user_defined) @@ -590,6 +591,11 @@ MINOR(Error_Translation_duplicate_attribute) MINOR(Error_Translation_duplicate_constant) MAJOR(Error_at_line) + MINOR(Message_Translations_error) + MINOR(Message_Translations_running) + MINOR(Message_Translations_line) + MINOR(Message_Translations_debug_error) + MINOR(Message_Translations_debug_prompt) MINOR(Message_Translations_January) MINOR(Message_Translations_February) MINOR(Message_Translations_March) @@ -602,11 +608,8 @@ MINOR(Message_Translations_October) MINOR(Message_Translations_November) MINOR(Message_Translations_December) - MINOR(Message_Translations_debug_prompt) - MINOR(Message_Translations_debug_error) - MINOR(Message_Translations_error) - MINOR(Message_Translations_running) - MINOR(Message_Translations_line) + MINOR(Message_Translations_routine_invocation) + MINOR(Message_Translations_method_invocation) MAJOR(Table_end) /* make sure table is ended */ }; Modified: sandbox/jlf/trunk/interpreter/messages/rexxmsg.xml =================================================================== --- sandbox/jlf/trunk/interpreter/messages/rexxmsg.xml 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/messages/rexxmsg.xml 2011-02-24 08:09:29 UTC (rev 6802) @@ -4391,6 +4391,15 @@ <SymbolicName>Error_Unsupported_copy_method</SymbolicName> <Text>COPY method is not supported for object <Sub position="1" name="object"/></Text> </SubMessage> + <SubMessage> + <Code>93</Code> + <Subcode>971</Subcode> + <MessageNumber>721</MessageNumber> + <Component>Rexx</Component> + <Severity>Warning</Severity> + <SymbolicName>Error_Incorrect_method_multi_dimension</SymbolicName> + <Text>Method argument <Sub position="1" name="argument"/> cannot have more than a single dimension</Text> + </SubMessage> </Subcodes> </Message> <Message> @@ -5079,6 +5088,51 @@ <Subcodes> <SubMessage> <Code>101</Code> + <Subcode>001</Subcode> + <MessageNumber>524</MessageNumber> + <Component>Translation</Component> + <Severity>Warning</Severity> + <SymbolicName>Message_Translations_error</SymbolicName> + <Text>Error</Text> + </SubMessage> + <SubMessage> + <Code>101</Code> + <Subcode>002</Subcode> + <MessageNumber>525</MessageNumber> + <Component>Translation</Component> + <Severity>Warning</Severity> + <SymbolicName>Message_Translations_running</SymbolicName> + <Text>running</Text> + </SubMessage> + <SubMessage> + <Code>101</Code> + <Subcode>003</Subcode> + <MessageNumber>526</MessageNumber> + <Component>Translation</Component> + <Severity>Warning</Severity> + <SymbolicName>Message_Translations_line</SymbolicName> + <Text>line</Text> + </SubMessage> + <SubMessage> + <Code>101</Code> + <Subcode>004</Subcode> + <MessageNumber>126</MessageNumber> + <Component>Translation</Component> + <Severity>Warning</Severity> + <SymbolicName>Message_Translations_debug_error</SymbolicName> + <Text>+++ Interactive trace. Error</Text> + </SubMessage> + <SubMessage> + <Code>101</Code> + <Subcode>005</Subcode> + <MessageNumber>114</MessageNumber> + <Component>Translation</Component> + <Severity>Info</Severity> + <SymbolicName>Message_Translations_debug_prompt</SymbolicName> + <Text>+++ Interactive trace. <q>Trace Off</q> to end debug, ENTER to Continue. +++</Text> + </SubMessage> + <SubMessage> + <Code>101</Code> <Subcode>006</Subcode> <MessageNumber>102</MessageNumber> <Component>Translation</Component> @@ -5187,49 +5241,22 @@ </SubMessage> <SubMessage> <Code>101</Code> - <Subcode>005</Subcode> - <MessageNumber>114</MessageNumber> + <Subcode>018</Subcode> + <MessageNumber>719</MessageNumber> <Component>Translation</Component> <Severity>Info</Severity> - <SymbolicName>Message_Translations_debug_prompt</SymbolicName> - <Text>+++ Interactive trace. <q>Trace Off</q> to end debug, ENTER to Continue. +++</Text> + <SymbolicName>Message_Translations_routine_invocation</SymbolicName> + <Text>Routine <Sub position="1" name="routine"/> in package <Sub position="2" name="package"/></Text> </SubMessage> <SubMessage> <Code>101</Code> - <Subcode>004</Subcode> - <MessageNumber>126</MessageNumber> + <Subcode>019</Subcode> + <MessageNumber>720</MessageNumber> <Component>Translation</Component> - <Severity>Warning</Severity> - <SymbolicName>Message_Translations_debug_error</SymbolicName> - <Text>+++ Interactive trace. Error</Text> + <Severity>Info</Severity> + <SymbolicName>Message_Translations_method_invocation</SymbolicName> + <Text>Method <Sub position="1" name="method"/> with scope <q><Sub position="2" name="class"/></q> in package <Sub position="3" name="package"/></Text> </SubMessage> - <SubMessage> - <Code>101</Code> - <Subcode>001</Subcode> - <MessageNumber>524</MessageNumber> - <Component>Translation</Component> - <Severity>Warning</Severity> - <SymbolicName>Message_Translations_error</SymbolicName> - <Text>Error</Text> - </SubMessage> - <SubMessage> - <Code>101</Code> - <Subcode>002</Subcode> - <MessageNumber>525</MessageNumber> - <Component>Translation</Component> - <Severity>Warning</Severity> - <SymbolicName>Message_Translations_running</SymbolicName> - <Text>running</Text> - </SubMessage> - <SubMessage> - <Code>101</Code> - <Subcode>003</Subcode> - <MessageNumber>526</MessageNumber> - <Component>Translation</Component> - <Severity>Warning</Severity> - <SymbolicName>Message_Translations_line</SymbolicName> - <Text>line</Text> - </SubMessage> </Subcodes> </Message> <Message> Modified: sandbox/jlf/trunk/interpreter/parser/Scanner.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/parser/Scanner.cpp 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/parser/Scanner.cpp 2011-02-24 08:09:29 UTC (rev 6802) @@ -746,7 +746,7 @@ state = EXP_E; /* remember we've had the 'E' form */ } /* non-digit? */ - else if (inch < '0' && inch > '9') + else if (inch < '0' || inch > '9') { state = EXP_EXCLUDED; /* no longer scanning a number */ } Modified: sandbox/jlf/trunk/interpreter/platform/windows/winmsgtb.rc =================================================================== --- sandbox/jlf/trunk/interpreter/platform/windows/winmsgtb.rc 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/interpreter/platform/windows/winmsgtb.rc 2011-02-24 08:09:29 UTC (rev 6802) @@ -622,6 +622,9 @@ Error_Execution_invalid_thread "Execution thread does not match API thread context." Error_Invalid_expression_parse "Missing expression following ( of parse template" Error_Invalid_expression_call "Missing expression for calculated CALL name" + Message_Translations_routine_invocation "Routine &1 in package &2" + Message_Translations_method_invocation "Method &1 with scope ""&2"" in package &3" + Error_Incorrect_method_multi_dimension "Method argument &1 cannot have more than a single dimension" END Property changes on: sandbox/jlf/trunk/platform ___________________________________________________________________ Added: svn:mergeinfo + /main/branches/4.0beta/trunk/platform:4348-4349,4443,4454-4458,4524-4525,4568,4572,4576,4589,4636,4659,4844,4899,4907,4929 /main/branches/4.1.0/trunk/platform:6303,6318,6426-6428 /main/trunk/platform:5812-6784 Modified: sandbox/jlf/trunk/platform/unix/debian/postinst.in =================================================================== --- sandbox/jlf/trunk/platform/unix/debian/postinst.in 2011-02-24 04:18:14 UTC (rev 6801) +++ sandbox/jlf/trunk/platform/unix/debian/postinst.in 2011-02-24 08:09:29 UTC (rev 6802) @@ -46,59 +46,43 @@ orx_prefix=@prefix@ # Debian doesn't use lib64, so this is the same for 32-bit or 64-bit -lib_dir=${orx_prefix}/lib +lib_dir=${orx_prefix}/lib/ooRexx bin_dir=${orx_prefix}/bin data_dir=${orx_prefix}/share/ooRexx # On debian, we may not need to add links for the private libraries the # interpreter uses, they should be found automatically. However, on some Linux # distributions we do need all the links. So, just add all of them. -ln -sf ${lib_dir}/ooRexx/librexx.so ${lib_dir}/librexx.so -ln -sf ${lib_dir}/ooRexx/librexx.so ${lib_dir}/librexx.so.@ORX_SUBST_CURRENT@ -ln -sf ${lib_dir}/ooRexx/librexx.so ${lib_dir}/librexx.so.${orx_libversion} -ln -sf ${lib_dir}/ooRexx/librexx.la ${lib_dir}/librexx.la -ln -sf ${lib_dir}/ooRexx/librexxapi.so ${lib_dir}/librexxapi.so -ln -sf ${lib_dir}/ooRexx/librexxapi.so ${lib_dir}/librexxap... [truncated message content] |
From: <jfa...@us...> - 2011-02-24 19:23:27
|
Revision: 6803 http://oorexx.svn.sourceforge.net/oorexx/?rev=6803&view=rev Author: jfaucher Date: 2011-02-24 19:23:20 +0000 (Thu, 24 Feb 2011) Log Message: ----------- Added thread id, activation id and lock flag in the lines printed by trace. If you redirect stderr to a file, and open the file with (say) Excel, then you can filter by thread/activation. Modified Paths: -------------- sandbox/jlf/_diary.txt sandbox/jlf/trunk/common/platform/unix/SysSemaphore.hpp sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp sandbox/jlf/trunk/interpreter/execution/RexxActivation.hpp Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2011-02-24 08:09:29 UTC (rev 6802) +++ sandbox/jlf/_diary.txt 2011-02-24 19:23:20 UTC (rev 6803) @@ -41,6 +41,45 @@ =============================================================================== +2011 feb 24 + +Added thread id, activation id and lock flag in the lines printed by trace. +Should help to analyze the traces of a multithreaded script. + +Not sure yet to have covered all the cases, since I modified only this method : +RexxActivity::traceOutput +But looks good on my first tests. + +The extract below illustrates quite well the problem of interleaved traces. +See after the reply, two threads are running concurrently. + +coroutine~start -- guarded +coroutine~resume -- unguarded + +0000ccac 7efcae78 * >I> Method START with scope "The COROUTINE class" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls +...<snip>... +0000ccac 7efcae78 * 92 *-* status = .Coroutine~suspended +0000ccac 7efcae78 * >E> .COROUTINE => "The COROUTINE class" +0000ccac 7efcae78 * >M> "SUSPENDED" => "1" +0000ccac 7efcae78 * >>> "1" +0000ccac 7efcae78 * >=> STATUS <= "1" +0000ccac 7efcae78 * 93 *-* guard off +0000ccac 7efcae78 94 *-* reply self +0000ccac 7efcae78 >V> SELF => "a COROUTINE" +0000ccac 7efcae78 >>> "a COROUTINE" +0000c8dc 7efcae78 >I> Method START with scope "The COROUTINE class" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls +0000ccac 7efd0968 >I> Method RESUME with scope "The COROUTINE class" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls +0000c8dc 7efcae78 95 *-* signal on any +0000ccac 7efd0968 162 *-* expose status yieldValue +0000c8dc 7efcae78 96 *-* guard on when status <> .Coroutine~suspended +0000ccac 7efd0968 163 *-* if status == .Coroutine~notStarted +0000c8dc 7efcae78 * >V> STATUS => "1" +0000ccac 7efd0968 >V> STATUS => "1" + +If you redirect the stderr to a file, and open it with Excel, then you can filter by thread and/or by activation. + + +=============================================================================== 2010 nov 14 I have reached a state where the interpreter is no longer broken by m17n. Modified: sandbox/jlf/trunk/common/platform/unix/SysSemaphore.hpp =================================================================== --- sandbox/jlf/trunk/common/platform/unix/SysSemaphore.hpp 2011-02-24 08:09:29 UTC (rev 6802) +++ sandbox/jlf/trunk/common/platform/unix/SysSemaphore.hpp 2011-02-24 19:23:20 UTC (rev 6803) @@ -51,6 +51,8 @@ #include "rexx.h" #include "SysDebug.hpp" +inline unsigned int SysCurrentThreadId() { return (unsigned int)pthread_self(); } + class SysSemaphore { public: SysSemaphore(const char *variable) : semVariable(variable), postedCount(0), created(false) { } Modified: sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp =================================================================== --- sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp 2011-02-24 08:09:29 UTC (rev 6802) +++ sandbox/jlf/trunk/common/platform/windows/SysSemaphore.hpp 2011-02-24 19:23:20 UTC (rev 6803) @@ -52,6 +52,7 @@ #include <stdio.h> inline void waitHandle(HANDLE s); +inline unsigned int SysCurrentThreadId() { return (unsigned int)GetCurrentThreadId(); } class SysSemaphore { public: Modified: sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp =================================================================== --- sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp 2011-02-24 08:09:29 UTC (rev 6802) +++ sandbox/jlf/trunk/interpreter/concurrency/RexxActivity.cpp 2011-02-24 19:23:20 UTC (rev 6803) @@ -2788,6 +2788,16 @@ { line = line->stringTrace(); /* get traceable form of this */ /* if exit declines the call */ + + // Add thread id, activation id and lock flag. + // Should help to analyze the traces of a multithreaded script... + char buffer[100]; + Utilities::snprintf(buffer, sizeof buffer - 1, "%8.8x %8.8x %c ", + SysCurrentThreadId(), + (unsigned int)activation, + (activation && activation->isObjectScopeLocked()) ? '*' : ' '); + line = line->concatToCstring(buffer); + if (this->callTraceExit(activation, line)) { /* get the default output stream */ Modified: sandbox/jlf/trunk/interpreter/execution/RexxActivation.hpp =================================================================== --- sandbox/jlf/trunk/interpreter/execution/RexxActivation.hpp 2011-02-24 08:09:29 UTC (rev 6802) +++ sandbox/jlf/trunk/interpreter/execution/RexxActivation.hpp 2011-02-24 19:23:20 UTC (rev 6803) @@ -407,6 +407,7 @@ inline bool isForwarded() { return (this->settings.flags&forwarded) != 0; } inline bool isGuarded() { return (this->settings.flags&guarded_method) != 0; } inline void setGuarded() { this->settings.flags |= guarded_method; } + inline bool isObjectScopeLocked() { return this->object_scope == SCOPE_RESERVED; } inline bool isExternalTraceOn() { return (this->settings.flags&trace_on) != 0; } inline void setExternalTraceOn() { this->settings.flags |= trace_on; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2011-02-28 13:32:39
|
Revision: 6808 http://oorexx.svn.sourceforge.net/oorexx/?rev=6808&view=rev Author: jfaucher Date: 2011-02-28 13:32:30 +0000 (Mon, 28 Feb 2011) Log Message: ----------- new : samples\trace\tracer.rex - to replace hexadecimal pointers by symbolic id (T1, A1) - to generate CSV from a trace output. Modified Paths: -------------- sandbox/jlf/_diary.txt Added Paths: ----------- sandbox/jlf/samples/trace/ sandbox/jlf/samples/trace/_readme.txt sandbox/jlf/samples/trace/example_coroutine/ sandbox/jlf/samples/trace/example_coroutine/coroutine_trace_csv.ods sandbox/jlf/samples/trace/example_coroutine/coroutine_trace_csv.txt sandbox/jlf/samples/trace/example_coroutine/coroutine_trace_hr.txt sandbox/jlf/samples/trace/example_coroutine/coroutine_trace_raw.txt sandbox/jlf/samples/trace/example_oophil/ sandbox/jlf/samples/trace/example_oophil/oophil_trace_csv.ods sandbox/jlf/samples/trace/tracer.rex Modified: sandbox/jlf/_diary.txt =================================================================== --- sandbox/jlf/_diary.txt 2011-02-27 23:14:43 UTC (rev 6807) +++ sandbox/jlf/_diary.txt 2011-02-28 13:32:30 UTC (rev 6808) @@ -41,6 +41,21 @@ =============================================================================== +2011 feb 27 + +Implemented the script samples\trace\tracer.rex. +This script lets : +- replace hexadecimal values by more human-readable values like T1, A1. +- generate a CSV file, for further analysis with your favorite tool. + +Can be used as a pipe filter (reads from stdin) : +rexx my_traced_script.rex 2>&1 | rexx tracer + +or can read from a file : +rexx tracer -csv my_trace_file.txt + + +=============================================================================== 2011 feb 24 Added thread id, activation id and lock flag in the lines printed by trace. Added: sandbox/jlf/samples/trace/_readme.txt =================================================================== --- sandbox/jlf/samples/trace/_readme.txt (rev 0) +++ sandbox/jlf/samples/trace/_readme.txt 2011-02-28 13:32:30 UTC (rev 6808) @@ -0,0 +1,29 @@ +The interpreter has been modified to add thread id, activation id and lock flag in the lines printed by trace. +But the thread id and activation id are pointers written in hexadecimal, which is not very easy to read. +The script tracer.rex lets : +- replace hexadecimal values by more human-readable values like T1, A1. +- generate a CSV file, for further analysis with your favorite tool. + + +For illustration purpose, I added the directive +::options trace i +in oophil.rex, and ran it with default values. + +oophil_trace_raw.txt +Generated by : rexx "C:\Program Files\ooRexx\samples\oodialog\oophil.rex" > out.txt 2>&1 + +The script tracer.rex lets replace such hexadecimal values by more human-readable values like T1, A1. +oophil_trace_hr.txt +Generated by : rexx tracer oophil_trace_raw.txt > oophil_trace_hr.txt + +The script tracer.rex lets generate a CSV file, for further analysis with your favorite tool. +oophil_trace_csv.txt +Generated by : rexx tracer -csv oophil_trace_raw.txt > oophil_trace_csv.txt + +CSV columns : thread activation lock kind scope executable line prefix source package raw +The 'raw' column contains the lines that are not regular trace output (you can filter out those lines with option -filter). +When a cell has no value, then "." is stored (an empty cell may bring filtering problems). + + +You can import the CSV file in Excel or OpenOffice. +See : oophil_trace_csv.ods (truncated to 65536 rows, the trace is made of 94414 lines) Property changes on: sandbox/jlf/samples/trace/_readme.txt ___________________________________________________________________ Added: svn:eol-style + LF Added: sandbox/jlf/samples/trace/example_coroutine/coroutine_trace_csv.ods =================================================================== (Binary files differ) Property changes on: sandbox/jlf/samples/trace/example_coroutine/coroutine_trace_csv.ods ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: sandbox/jlf/samples/trace/example_coroutine/coroutine_trace_csv.txt =================================================================== --- sandbox/jlf/samples/trace/example_coroutine/coroutine_trace_csv.txt (rev 0) +++ sandbox/jlf/samples/trace/example_coroutine/coroutine_trace_csv.txt 2011-02-28 13:32:30 UTC (rev 6808) @@ -0,0 +1,1540 @@ +thread,activation,lock,kind,scope,executable,line,prefix,source,package,raw +"T1","A1","*","method","The COROUTINE class","INIT"," ",">I>","Method INIT with scope ""The COROUTINE class"" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A1","*","method","The COROUTINE class","INIT"," 61","*-*","self~table = .IdentityTable~new","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A1","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A1","*","method","The COROUTINE class","INIT"," ",">E>"," .IDENTITYTABLE => ""The IdentityTable class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A1","*","method","The COROUTINE class","INIT"," ",">M>"," ""NEW"" => ""an IdentityTable""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A1","*","method","The COROUTINE class","INIT"," ",">A>"," ""an IdentityTable""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A1","*","method","The COROUTINE class","INIT"," ",">>>"," ""an IdentityTable""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A2"," ","routine","","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls"," ",">I>","Routine D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +".",".",".",".",".",".",".",".",".",".","A coroutine implemented by a one-liner routine" +"T1","A3","*","method","The COROUTINE class","INIT"," ",">I>","Method INIT with scope ""The COROUTINE class"" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 83","*-*","use strict arg action=""main"", ...","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""say ""running coroutine"" ; return 1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">=>"," ACTION <= ""say ""running coroutine"" ; return 1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 85","*-*","self~routine = .nil","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">A>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 86","*-*","self~message = .nil","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">A>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 87","*-*","self~doer = .nil","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">A>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 88","*-*","self~object = .nil","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">A>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 90","*-*","self~doer = action~doer","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">V>"," ACTION => ""say ""running coroutine"" ; return 1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">M>"," ""DOER"" => ""a Routine""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">A>"," ""a Routine""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""a Routine""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 91","*-*","if self~doer~isA(.Routine) ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">M>"," ""DOER"" => ""a Routine""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">E>"," .ROUTINE => ""The Routine class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">A>"," ""The Routine class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">M>"," ""ISA"" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 91","*-*"," then","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 91","*-*"," use strict arg action=""main"", start = .true","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""say ""running coroutine"" ; return 1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">=>"," ACTION <= ""say ""running coroutine"" ; return 1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">=>"," START <= ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 94","*-*","self~status = .Coroutine~notStarted","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">M>"," ""NOTSTARTED"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">A>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," 95","*-*","if start ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">V>"," START => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A3","*","method","The COROUTINE class","INIT"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">I>","Method START with scope ""The COROUTINE class"" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," 105","*-*","expose status","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," 106","*-*","use strict arg -- no arg","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," 107","*-*","if status <> .Coroutine~notStarted ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">V>"," STATUS => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">M>"," ""NOTSTARTED"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">O>"," ""<>"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," 108","*-*",".Coroutine~table~put(self, self)","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">M>"," ""TABLE"" => ""an IdentityTable""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">A>"," ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">A>"," ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," 109","*-*","status = .Coroutine~suspended","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">M>"," ""SUSPENDED"" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," ",">=>"," STATUS <= ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4","*","method","The COROUTINE class","START"," 110","*-*","guard off","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4"," ","method","The COROUTINE class","START"," 111","*-*","reply self","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4"," ","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A4"," ","method","The COROUTINE class","START"," ",">>>"," ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">I>","Method START with scope ""The COROUTINE class"" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">I>","Method RESUME with scope ""The COROUTINE class"" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," 112","*-*","signal on any ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," 190","*-*","expose status yieldValue","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," 113","*-*","guard on when status <> .Coroutine~suspended","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," 191","*-*","if status == .Coroutine~notStarted ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">V>"," STATUS => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">V>"," STATUS => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">M>"," ""SUSPENDED"" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">M>"," ""NOTSTARTED"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">O>"," ""<>"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">O>"," ""=="" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," 192","*-*","if status == .Coroutine~killed ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">V>"," STATUS => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">M>"," ""KILLED"" => ""4""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">O>"," ""=="" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," 193","*-*","if status == .Coroutine~completed ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">V>"," STATUS => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">M>"," ""COMPLETED"" => ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">O>"," ""=="" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," 194","*-*","self~arguments = arg(1, ""a"")","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">L>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">A>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">L>"," ""a""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">A>"," ""a""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">F>"," ARG => ""an Array""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">A>"," ""an Array""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">>>"," ""an Array""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," 195","*-*","status = .Coroutine~running","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">M>"," ""RUNNING"" => ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">>>"," ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">V>"," STATUS => ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," ",">=>"," STATUS <= ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5"," ","method","The COROUTINE class","RESUME"," 196","*-*","guard on when status <> .Coroutine~running","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">M>"," ""SUSPENDED"" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">O>"," ""<>"" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 114","*-*","if status == .Coroutine~running ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">V>"," STATUS => ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">M>"," ""RUNNING"" => ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">O>"," ""=="" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 114","*-*"," then","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 114","*-*"," do","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 117","*-*"," self~arguments~append(self)","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">M>"," ""ARGUMENTS"" => ""an Array""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">A>"," ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 118","*-*"," guard off","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," 119","*-*"," select","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">V>"," STATUS => ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," 121","*-*"," when self~routine <> .nil ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">M>"," ""RUNNING"" => ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">O>"," ""<>"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">M>"," ""ROUTINE"" => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">O>"," ""<>"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," 122","*-*"," when self~message <> .nil ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">M>"," ""MESSAGE"" => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">O>"," ""<>"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," 123","*-*"," otherwise","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," 123","*-*"," self~doer~doWith(self~arguments)","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">M>"," ""DOER"" => ""a Routine""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">M>"," ""ARGUMENTS"" => ""an Array""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," ",">A>"," ""an Array""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +".",".",".",".",".",".",".",".",".",".","running coroutine" +"T2","A4"," ","method","The COROUTINE class","START"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," 124","*-*"," end","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4"," ","method","The COROUTINE class","START"," 125","*-*"," guard on","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 126","*-*"," if var(""result"") ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">L>"," ""result""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">A>"," ""result""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">F>"," VAR => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 126","*-*"," then","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 126","*-*"," self~yieldLast(result)","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">V>"," RESULT => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">A>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">I>","Method YIELDLAST with scope ""The COROUTINE class"" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," 181","*-*","expose status yieldValue","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," 182","*-*","drop yieldValue","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," 183","*-*","if status == .Coroutine~killed ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">V>"," STATUS => ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">M>"," ""KILLED"" => ""4""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">O>"," ""=="" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," 184","*-*","if arg() <> 0 ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">F>"," ARG => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">L>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">O>"," ""<>"" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," 184","*-*"," then","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," 184","*-*"," use strict arg yieldValue -- yieldValue will be returned to the coroutine's client by 'resume'","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A6","*","method","The COROUTINE class","YIELDLAST"," ",">=>"," YIELDVALUE <= ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 128","*-*"," status = .Coroutine~completed","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">M>"," ""COMPLETED"" => ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">>>"," ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">=>"," STATUS <= ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 129","*-*"," end","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 130","*-*",".Coroutine~table~remove(self)","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">M>"," ""TABLE"" => ""an IdentityTable""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">A>"," ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," ",">>>"," ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T2","A4","*","method","The COROUTINE class","START"," 131","*-*","return","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">V>"," STATUS => ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">M>"," ""RUNNING"" => ""2""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">O>"," ""<>"" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," 197","*-*","if status == .Coroutine~killed ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">V>"," STATUS => ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">M>"," ""KILLED"" => ""4""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">O>"," ""=="" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," 198","*-*","if var(""yieldValue"") ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">L>"," ""yieldValue""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">A>"," ""yieldValue""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">F>"," VAR => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," 198","*-*"," then","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," 198","*-*"," return yieldValue","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">V>"," YIELDVALUE => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A5","*","method","The COROUTINE class","RESUME"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +".",".",".",".",".",".",".",".",".",".","1" +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">I>","Method RESUME with scope ""The COROUTINE class"" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," 190","*-*","expose status yieldValue","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," 191","*-*","if status == .Coroutine~notStarted ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">V>"," STATUS => ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">M>"," ""NOTSTARTED"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">O>"," ""=="" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," 192","*-*","if status == .Coroutine~killed ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">V>"," STATUS => ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">M>"," ""KILLED"" => ""4""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">O>"," ""=="" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," 193","*-*","if status == .Coroutine~completed ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">V>"," STATUS => ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">M>"," ""COMPLETED"" => ""3""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">O>"," ""=="" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," 193","*-*"," then","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A7"," ","method","The COROUTINE class","RESUME"," 193","*-*"," return -- raise syntax 93.900 array (""Coroutine is completed"")","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +".",".",".",".",".",".",".",".",".",".","Message ""RESUME"" did not return a result" +".",".",".",".",".",".",".",".",".",".","" +".",".",".",".",".",".",".",".",".",".","A coroutine implemented by a one-liner routine, used as a generator" +"T1","A8","*","method","The COROUTINE class","INIT"," ",">I>","Method INIT with scope ""The COROUTINE class"" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 83","*-*","use strict arg action=""main"", ...","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""use strict arg coroutine ; do i = 1 to 10 ; coroutine~yield(i) ; end""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">=>"," ACTION <= ""use strict arg coroutine ; do i = 1 to 10 ; coroutine~yield(i) ; end""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 85","*-*","self~routine = .nil","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">A>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 86","*-*","self~message = .nil","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">A>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 87","*-*","self~doer = .nil","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">A>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 88","*-*","self~object = .nil","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">E>"," .NIL => ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">A>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""The NIL object""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 90","*-*","self~doer = action~doer","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," ACTION => ""use strict arg coroutine ; do i = 1 to 10 ; coroutine~yield(i) ; end""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">M>"," ""DOER"" => ""a Routine""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">A>"," ""a Routine""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""a Routine""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 91","*-*","if self~doer~isA(.Routine) ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">M>"," ""DOER"" => ""a Routine""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">E>"," .ROUTINE => ""The Routine class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">A>"," ""The Routine class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">M>"," ""ISA"" => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 91","*-*"," then","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 91","*-*"," use strict arg action=""main"", start = .true","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""use strict arg coroutine ; do i = 1 to 10 ; coroutine~yield(i) ; end""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">=>"," ACTION <= ""use strict arg coroutine ; do i = 1 to 10 ; coroutine~yield(i) ; end""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">E>"," .TRUE => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">=>"," START <= ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 94","*-*","self~status = .Coroutine~notStarted","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">E>"," .COROUTINE => ""The COROUTINE class""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">M>"," ""NOTSTARTED"" => ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">A>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""0""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 95","*-*","if start ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," START => ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">>>"," ""1""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 95","*-*"," then","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," 95","*-*"," self~start","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A8","*","method","The COROUTINE class","INIT"," ",">V>"," SELF => ""a COROUTINE""","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A9","*","method","The COROUTINE class","START"," ",">I>","Method START with scope ""The COROUTINE class"" in package D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A9","*","method","The COROUTINE class","START"," 105","*-*","expose status","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A9","*","method","The COROUTINE class","START"," 106","*-*","use strict arg -- no arg","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A9","*","method","The COROUTINE class","START"," 107","*-*","if status <> .Coroutine~notStarted ","D:\local\Rexx\ooRexx\svn\sandbox\jlf\samples\generator\coroutine.cls","." +"T1","A9","... [truncated message content] |