From 6578b303f70eb32a41dc0a49b27eb471df603ddf Mon Sep 17 00:00:00 2001 From: Olaf Barthel Date: Tue, 11 Mar 2008 13:26:18 +0000 Subject: [PATCH] - Added local inline function definitions for the two rexxsyslib.library V45 API functions, rather than omitting support for them in the 68k build. git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15182 87f5fb63-7c3d-0410-a384-fd976d0f7a62 --- library/amiga_rexxvars.c | 64 ++++++++++++++++++++++++++++++++++------ library/changes | 5 ++-- 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/library/amiga_rexxvars.c b/library/amiga_rexxvars.c index e098458..2aa6bc3 100644 --- a/library/amiga_rexxvars.c +++ b/library/amiga_rexxvars.c @@ -1,5 +1,5 @@ /* - * $Id: amiga_rexxvars.c,v 1.11 2008-03-11 07:37:31 damato Exp $ + * $Id: amiga_rexxvars.c,v 1.12 2008-03-11 13:26:18 obarthel Exp $ * * :ts=4 * @@ -58,6 +58,60 @@ /****************************************************************************/ +/* This side-steps issues with very old inline header files, predating the + OS 3.5 SDK, when the library is built for the 68k platform. */ +#if defined(__GNUC__) && !defined(__amigaos4__) + +#define __GetRexxVarFromMsg(name, buffer, message) ({ \ + STRPTR _GetRexxVarFromMsg_name = (name); \ + STRPTR _GetRexxVarFromMsg_buffer = (buffer); \ + struct RexxMsg * _GetRexxVarFromMsg_message = (message); \ + LONG _GetRexxVarFromMsg__re = \ + ({ \ + register struct RxsLib * const __GetRexxVarFromMsg__bn __asm("a6") = (struct RxsLib *) (RexxSysBase);\ + register LONG __GetRexxVarFromMsg__re __asm("d0"); \ + register STRPTR __GetRexxVarFromMsg_name __asm("a0") = (_GetRexxVarFromMsg_name); \ + register STRPTR __GetRexxVarFromMsg_buffer __asm("a1") = (_GetRexxVarFromMsg_buffer); \ + register struct RexxMsg * __GetRexxVarFromMsg_message __asm("a2") = (_GetRexxVarFromMsg_message); \ + __asm volatile ("jsr a6@(-492:W)" \ + : "=r"(__GetRexxVarFromMsg__re) \ + : "r"(__GetRexxVarFromMsg__bn), "r"(__GetRexxVarFromMsg_name), "r"(__GetRexxVarFromMsg_buffer), "r"(__GetRexxVarFromMsg_message) \ + : "d1", "a0", "a1", "fp0", "fp1", "cc", "memory"); \ + __GetRexxVarFromMsg__re; \ + }); \ + _GetRexxVarFromMsg__re; \ +}) + +#undef GetRexxVarFromMsg +#define GetRexxVarFromMsg(name, buffer, message) __GetRexxVarFromMsg(name, buffer, message) + +#define __SetRexxVarFromMsg(name, value, message) ({ \ + STRPTR _SetRexxVarFromMsg_name = (name); \ + STRPTR _SetRexxVarFromMsg_value = (value); \ + struct RexxMsg * _SetRexxVarFromMsg_message = (message); \ + LONG _SetRexxVarFromMsg__re = \ + ({ \ + register struct RxsLib * const __SetRexxVarFromMsg__bn __asm("a6") = (struct RxsLib *) (RexxSysBase);\ + register LONG __SetRexxVarFromMsg__re __asm("d0"); \ + register STRPTR __SetRexxVarFromMsg_name __asm("a0") = (_SetRexxVarFromMsg_name); \ + register STRPTR __SetRexxVarFromMsg_value __asm("a1") = (_SetRexxVarFromMsg_value); \ + register struct RexxMsg * __SetRexxVarFromMsg_message __asm("a2") = (_SetRexxVarFromMsg_message); \ + __asm volatile ("jsr a6@(-498:W)" \ + : "=r"(__SetRexxVarFromMsg__re) \ + : "r"(__SetRexxVarFromMsg__bn), "r"(__SetRexxVarFromMsg_name), "r"(__SetRexxVarFromMsg_value), "r"(__SetRexxVarFromMsg_message) \ + : "d1", "a0", "a1", "fp0", "fp1", "cc", "memory"); \ + __SetRexxVarFromMsg__re; \ + }); \ + _SetRexxVarFromMsg__re; \ +}) + +#undef SetRexxVarFromMsg +#define SetRexxVarFromMsg(name, value, message) __SetRexxVarFromMsg(name, value, message) + +#endif /* __GNUC__ && !__amigaos4__ */ + +/****************************************************************************/ + static struct Library * RexxSysBase; /****************************************************************************/ @@ -163,7 +217,6 @@ GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer) static TEXT buffer[256]; LONG result; -#if defined(__amigaos4__) /* The following uses a function which was added to rexxsyslib.library V45. We therefore have a minimum library version requirement. */ if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg(message)) @@ -174,9 +227,6 @@ GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer) /* The 256 character limit isn't good. This should be done differently. */ result = GetRexxVarFromMsg(variable_name,buffer,message); -#else - result = ERR10_015; /* function not found */ -#endif if(result != 0) goto out; @@ -197,7 +247,6 @@ SetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR value,ULONG lengt { LONG result; -#if defined(__amigaos4__) /* The following uses a function which was added to rexxsyslib.library V45. We therefore have a minimum library version requirement. */ if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg(message)) @@ -207,9 +256,6 @@ SetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR value,ULONG lengt } result = SetRexxVarFromMsg(variable_name,value,message); -#else - result = ERR10_015; /* function not found */ -#endif out: diff --git a/library/changes b/library/changes index 72bcef7..4864d26 100644 --- a/library/changes +++ b/library/changes @@ -4,14 +4,15 @@ trouble while performing the conversion. - [tboeckel]: when compiling amiga_rexxvars.c for m68k/OS3 the GetRexxVarFromMsg() - and SetRexxVarFromMsg() will not be used and therefore not cause linkage errors - with our libamiga.a stubs anymore. + and SetRexxVarFromMsg() can no longer cause linkage errors if the header files + predate the SDK for OS 3.5. - [jlangner]: the log() and log10() functions always returned -inf() even if the arguments was within the valid range for a log() function. Using DBL_EPSILON as the threshold was not correct as EPSILON is 2.2204460492503131E-16 whereas values like 1E-200 are still valid double values for a log(). + c.lib 1.202 (16.1.2007) - Added llrint() function contributed by Henning Nielsen Lund. Thank you