1
0
mirror of https://github.com/adtools/clib2.git synced 2025-12-08 14:59:05 +00:00

1 Commits

Author SHA1 Message Date
Olaf Barthel
d27cfef46b This commit was manufactured by cvs2svn to create tag 'V1_202'.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/tags/V1_202@15174 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2007-01-16 08:52:31 +00:00
56 changed files with 181 additions and 1715 deletions

View File

@@ -1,19 +1,11 @@
# #
# $Id: GNUmakefile.68k,v 1.106 2008-04-16 07:38:10 obarthel Exp $ # $Id: GNUmakefile.68k,v 1.101 2007-01-06 10:09:48 obarthel Exp $
# #
# :ts=8 # :ts=8
# #
############################################################################## ##############################################################################
############################################
# find out the HOST operating system
# on which this makefile is run (default to AmigaOS)
HOST ?= $(shell uname)
ifeq ($(HOST),)
HOST = AmigaOS
endif
CC = gcc CC = gcc
AR = ar -q AR = ar -q
RANLIB = ranlib RANLIB = ranlib
@@ -22,16 +14,6 @@ DELETE = delete all quiet
MAKEDIR = makedir MAKEDIR = makedir
MAKE = $(MAKE_COMMAND) -f GNUmakefile.68k MAKE = $(MAKE_COMMAND) -f GNUmakefile.68k
# override certain things for non-native builds
ifneq ($(HOST), AmigaOS)
CC = m68k-amigaos-gcc
AR = m68k-amigaos-ar -q
RANLIB = m68k-amigaos-ranlib
COPY = cp
DELETE = rm -rf
MAKEDIR = mkdir -p
endif
############################################################################## ##############################################################################
ifeq (,$(TYPE)) ifeq (,$(TYPE))
@@ -68,11 +50,11 @@ $(LIBUNIX_OBJS)/%.o : %.c
$(LIBM_OBJS)/%.o : %.c $(LIBM_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):m]" @echo "Compiling $< [$(TYPE):m]"
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) -msoft-float -DIEEE_FLOATING_POINT_SUPPORT $< @$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT $<
$(LIBM881_OBJS)/%.o : %.c $(LIBM881_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):m881]" @echo "Compiling $< [$(TYPE):m881]"
@$(CC) -o $(LIBM881_OBJS)/$*.o -c $(CFLAGS) -m68881 -DM68881_FLOATING_POINT_SUPPORT $< @$(CC) -o $(LIBM881_OBJS)/$*.o -c $(CFLAGS) -DM68881_FLOATING_POINT_SUPPORT -m68881 $<
$(LIBNET_OBJS)/%.o : %.c $(LIBNET_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):net]" @echo "Compiling $< [$(TYPE):net]"
@@ -127,14 +109,13 @@ INCLUDES = -Iinclude -I. -Inetinclude
#OPTIONS = -fno-builtin -fno-common -DNDEBUG -D__THREAD_SAFE #OPTIONS = -fno-builtin -fno-common -DNDEBUG -D__THREAD_SAFE
#OPTIONS = -fno-builtin -fno-common -D__MEM_DEBUG #OPTIONS = -fno-builtin -fno-common -D__MEM_DEBUG
#OPTIONS = -fno-builtin -fno-common -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG #OPTIONS = -fno-builtin -fno-common -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG
#OPTIMIZE = -O3 -fomit-frame-pointer -funroll-loops -finline-functions OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
#OPTIMIZE = -O2 -fomit-frame-pointer #OPTIMIZE = -O2 -fomit-frame-pointer
#DEBUG = -g #DEBUG = -g
CFLAGS = \ CFLAGS = \
$(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) \ $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) \
$(CODE_FLAGS) $(INCLUDES) $(CODE_TYPE) $(CODE_FLAGS) $(CODE_TYPE) $(INCLUDES)
############################################################################## ##############################################################################

View File

@@ -1,5 +1,5 @@
# #
# $Id: GNUmakefile.os4,v 1.116 2008-11-06 14:44:07 obarthel Exp $ # $Id: GNUmakefile.os4,v 1.111 2007-01-06 10:09:48 obarthel Exp $
# #
# :ts=8 # :ts=8
# #
@@ -26,15 +26,10 @@ NET_INCLUDE := netinclude
CC := ppc-amigaos-gcc CC := ppc-amigaos-gcc
AR := ppc-amigaos-ar -q AR := ppc-amigaos-ar -q
RANLIB := ppc-amigaos-ranlib RANLIB := ppc-amigaos-ranlib
COPY := cp -p COPY := cp -a
DELETE := rm -rf DELETE := rm -rf
MAKEDIR := mkdir -p MAKEDIR := mkdir -p
LOG_COMMAND := 2>&1 | tee -a compiler.log LOG_COMMAND := 2>&1 | tee -a compiler.log
# You may need to request a specific compiler version in order to
# build the baserel versions of the library. At this time of
# writing (2008-11-06) GCC 4.0.4 and below support the -mbaserel
# feature, but more recent versions, including GCC 4.2.4, do not.
#COMPILER_VERSION := -V4.0.2
# The following are for the native OS4 compiler; note that the # The following are for the native OS4 compiler; note that the
# LOG_COMMAND should not be enabled unless you have a shell # LOG_COMMAND should not be enabled unless you have a shell
@@ -47,7 +42,6 @@ LOG_COMMAND := 2>&1 | tee -a compiler.log
#COPY := copy #COPY := copy
#DELETE := delete all quiet force #DELETE := delete all quiet force
#MAKEDIR := makedir all force #MAKEDIR := makedir all force
#COMPILER_VERSION := -V4.0.2
#LOG_COMMAND := *>< | tee >>compiler.log #LOG_COMMAND := *>< | tee >>compiler.log
############################################################################## ##############################################################################
@@ -59,14 +53,14 @@ WARNINGS := \
# -Wconversion -Wshadow # -Wconversion -Wshadow
INCLUDES := -Iinclude -I. -I$(SDK_INCLUDE) INCLUDES := -Iinclude -I. -I$(SDK_INCLUDE)
OPTIONS := -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-common -std=gnu99 -mcrt=clib2 OPTIONS := -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-common -std=gnu99
OPTIMIZE := -DNDEBUG -O3 OPTIMIZE := -DNDEBUG -O3
#DEBUG := -ggdb #DEBUG := -ggdb
#MEMDEBUG := -D__USE_MEM_TREES -D__MEM_DEBUG #MEMDEBUG := -D__USE_MEM_TREES -D__MEM_DEBUG
CFLAGS := $(COMPILER_VERSION) $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(MEMDEBUG) $(OPTIONS) $(INCLUDES) CFLAGS := $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(MEMDEBUG) $(OPTIONS) $(INCLUDES)
AFLAGS := $(COMPILER_VERSION) -Wa,-mregnames AFLAGS := -Wa,-mregnames
LARGEDATA := -msdata=data LARGEDATA := -msdata=data
SOFTFLOAT := -msdata=data -msoft-float SOFTFLOAT := -msdata=data -msoft-float
@@ -218,19 +212,19 @@ lib.threadsafe/baserel/%.o : %.c
############################################################################## ##############################################################################
define COMPILE define COMPILE
-$(MAKEDIR) $(@D) $(MAKEDIR) $(@D)
echo "Compiling $< [$(@D)]" echo "Compiling $< [$(@D)]"
$(CC) $(CFLAGS) -o $@ -c $< $(LOG_COMMAND) $(CC) -o $@ -c $(CFLAGS) $< $(LOG_COMMAND)
endef endef
define ASSEMBLE define ASSEMBLE
-$(MAKEDIR) $(@D) $(MAKEDIR) $(@D)
echo "Assembling $< [$(@D)]" echo "Assembling $< [$(@D)]"
$(CC) $(AFLAGS) -o $@ -c $< $(LOG_COMMAND) $(CC) -o $@ -c $(AFLAGS) $< $(LOG_COMMAND)
endef endef
define MAKELIB define MAKELIB
-$(MAKEDIR) $@ $(MAKEDIR) $@
$(DELETE) $@ $(DELETE) $@
echo "Making $@" echo "Making $@"
$(AR) $@ $^ $(LOG_COMMAND) $(AR) $@ $^ $(LOG_COMMAND)

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 205 #define REVISION 202
#define DATE "21.8.2010" #define DATE "16.1.2007"
#define VERS "amiga.lib 1.205" #define VERS "amiga.lib 1.202"
#define VSTRING "amiga.lib 1.205 (21.8.2010)\r\n" #define VSTRING "amiga.lib 1.202 (16.1.2007)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.205 (21.8.2010)" #define VERSTAG "\0$VER: amiga.lib 1.202 (16.1.2007)"

View File

@@ -1 +1 @@
205 202

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: amiga_argarrayinit.c,v 1.7 2008-09-30 14:09:00 obarthel Exp $ * $Id: amiga_argarrayinit.c,v 1.6 2006-09-22 09:02:51 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -52,14 +52,6 @@
/****************************************************************************/ /****************************************************************************/
#ifdef __amigaos4__
#define MEMORY_TYPE MEMF_PRIVATE
#else
#define MEMORY_TYPE MEMF_ANY
#endif /* __amigaos4__ */
/****************************************************************************/
const unsigned char ** CXLIB_argarray; const unsigned char ** CXLIB_argarray;
struct DiskObject * CXLIB_disko; struct DiskObject * CXLIB_disko;
@@ -78,7 +70,7 @@ ArgArrayInit(LONG argc, CONST_STRPTR * argv)
if(argc == 1) if(argc == 1)
goto out; /* skip command name */ goto out; /* skip command name */
CXLIB_argarray = (const unsigned char **)AllocVec(sizeof(char *) * argc,MEMORY_TYPE|MEMF_CLEAR); CXLIB_argarray = (const unsigned char **)AllocVec(sizeof(char *) * argc,MEMF_ANY|MEMF_CLEAR);
if(CXLIB_argarray == NULL) if(CXLIB_argarray == NULL)
goto out; goto out;

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: amiga_rexxvars.c,v 1.19 2008-04-18 10:11:59 obarthel Exp $ * $Id: amiga_rexxvars.c,v 1.10 2006-09-25 18:19:44 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -53,12 +53,6 @@
/****************************************************************************/ /****************************************************************************/
/* This is used by the stub function prototypes. The ARexx header files
do not define it, though. */
struct Environment;
/****************************************************************************/
#define __NOLIBBASE__ #define __NOLIBBASE__
#include <proto/rexxsyslib.h> #include <proto/rexxsyslib.h>
@@ -76,7 +70,7 @@ static struct RexxSysIFace * IRexxSys;
BOOL CheckRexxMsg(struct RexxMsg *message); BOOL CheckRexxMsg(struct RexxMsg *message);
LONG GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer); LONG GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer);
LONG SetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR value,LONG length); LONG SetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR value,ULONG length);
/****************************************************************************/ /****************************************************************************/
@@ -148,7 +142,7 @@ CheckRexxMsg(struct RexxMsg *message)
if(message->rm_TaskBlock == NULL) if(message->rm_TaskBlock == NULL)
goto out; goto out;
if(NOT IsRexxMsg(message)) if(NOT IsRexxMsg((struct Message *)message))
goto out; goto out;
result = TRUE; result = TRUE;
@@ -160,583 +154,56 @@ CheckRexxMsg(struct RexxMsg *message)
/****************************************************************************/ /****************************************************************************/
#if defined(__amigaos4__) /* The following function works in about like the original, except that it's
not reentrant, does not fill in a pointer to the variable itself and
/****************************************************************************/ requires rexxsyslib.library V45. */
LONG
#include <exec/emulation.h> GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer)
/****************************************************************************/
STATIC VOID
_FreeSpace(struct Environment * env,APTR mem,LONG size)
{ {
STATIC CONST UWORD code[] = { 0x4EAE,0xFF88,0x4E75 }; /* jsr -120(a6) ; rts */ static TEXT buffer[256];
EmulateTags(code,
ET_RegisterA0,env,
ET_RegisterA1,mem,
ET_RegisterD0,size,
ET_RegisterA6,RexxSysBase,
TAG_END);
}
STATIC APTR
_GetSpace(struct Environment * env,LONG size)
{
STATIC CONST UWORD code[] = { 0x4EAE,0xFF8E,0x4E75 }; /* jsr -114(a6) ; rts */
APTR result;
result = (APTR)EmulateTags(code,
ET_RegisterA0,env,
ET_RegisterD0,size,
ET_RegisterA6,RexxSysBase,
TAG_END);
return(result);
}
STATIC LONG
_IsSymbol(STRPTR name,LONG * symbol_length_ptr)
{
STATIC CONST UWORD code[] = { 0x4EAE,0xFF9A,0x2481,0x4E75 }; /* jsr -102(a6) ; move.l d1,(a2) ; rts */
LONG result; LONG result;
result = (LONG)EmulateTags(code, /* The following uses a function which was added to rexxsyslib.library V45.
ET_RegisterA0,name, We therefore have a minimum library version requirement. */
ET_RegisterA2,symbol_length_ptr, if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg((struct Message *)message))
ET_RegisterA6,RexxSysBase,
TAG_END);
return(result);
}
STATIC VOID
_CurrentEnv(struct RexxTask *task,struct Environment ** environment_ptr)
{
STATIC CONST UWORD code[] = { 0x4EAE,0xFF94,0x2488,0x4E75 }; /* jsr -108(a6) ; move.l a0,(a2) ; rts */
EmulateTags(code,
ET_RegisterA0,task,
ET_RegisterA2,environment_ptr,
ET_RegisterA6,RexxSysBase,
TAG_END);
}
STATIC struct Node *
_FetchValue(struct Environment * env,struct NexxStr * stem,struct NexxStr * compound,struct Node *symbol_table_node,LONG * is_literal_ptr,struct NexxStr ** value_ptr)
{
STATIC CONST UWORD code[] = { 0x4EAE,0xFFB8,0x2488,0x2681,0x4E75 }; /* jsr -72(a6) ; move.l a0,(a2) ; move.l d1,(a3) ; rts */
struct Node * result;
result = (struct Node *)EmulateTags(code,
ET_RegisterA0,env,
ET_RegisterA1,stem,
ET_RegisterD0,compound,
ET_RegisterD1,symbol_table_node,
ET_RegisterA2,is_literal_ptr,
ET_RegisterA3,value_ptr,
ET_RegisterA6,RexxSysBase,
TAG_END);
return(result);
}
STATIC struct Node *
_EnterSymbol(struct Environment * env,struct NexxStr * stem,struct NexxStr * compound)
{
STATIC CONST UWORD code[] = { 0x4EAE,0xFFBE,0x4E75 }; /* jsr -66(a6) ; rts */
struct Node * result;
result = (struct Node *)EmulateTags(code,
ET_RegisterA0,env,
ET_RegisterA1,stem,
ET_RegisterD0,compound,
ET_RegisterA6,RexxSysBase,
TAG_END);
return(result);
}
STATIC VOID
_SetValue(struct Environment * env,struct NexxStr * value,struct Node * symbol_table_node)
{
STATIC CONST UWORD code[] = { 0x4EAE,0xFFAC,0x4E75 }; /* jsr -84(a6) ; rts */
struct Node * result;
result = (struct Node *)EmulateTags(code,
ET_RegisterA0,env,
ET_RegisterA1,value,
ET_RegisterD0,symbol_table_node,
ET_RegisterA6,RexxSysBase,
TAG_END);
}
STATIC ULONG
_StrcpyN(STRPTR destination,STRPTR source,LONG length)
{
STATIC CONST UWORD code[] = { 0x4EAE,0xFEF2,0x4E75 }; /* jsr -270(a6) ; rts */
ULONG result;
result = (ULONG)EmulateTags(code,
ET_RegisterA0,destination,
ET_RegisterA1,source,
ET_RegisterD0,length,
ET_RegisterA6,RexxSysBase,
TAG_END);
return(result);
}
/****************************************************************************/
#elif defined(__GNUC__) && !defined(__amigaos4__)
/****************************************************************************/
/* A selection of lovingly hand-crafted 68k stub functions which call
into rexxsyslib.library LVOs that still used to be documented back
in 1987. */
/****************************************************************************/
#if defined(SMALL_DATA)
#define A4(x) "a4@(" #x ":W)"
#elif defined(SMALL_DATA32)
#define A4(x) "a4@(" #x ":L)"
#else
#define A4(x) #x
#endif /* SMALL_DATA */
/****************************************************************************/
/* struct Environment * a0,APTR block a1,LONG d0 */
asm("
.text
.even
.globl __FreeSpace
__FreeSpace:
moveal sp@(4),a0
moveal sp@(8),a1
movel sp@(12),d0
movel a6,sp@-
moveal "A4(_RexxSysBase)",a6
jsr a6@(-120)
moveal sp@+,a6
rts
");
/****************************************************************************/
/* struct Environment * a0,LONG d0 : APTR d0 */
asm("
.text
.even
.globl __GetSpace
__GetSpace:
moveal sp@(4),a0
movel sp@(8),d0
movel a6,sp@-
moveal "A4(_RexxSysBase)",a6
jsr a6@(-114)
moveal sp@+,a6
rts
");
/****************************************************************************/
/* STRPTR a0 : LONG d0, LONG d1 */
asm("
.text
.even
.globl __IsSymbol
__IsSymbol:
moveal sp@(4),a0
movel a6,sp@-
moveal "A4(_RexxSysBase)",a6
jsr a6@(-102)
moveal sp@+,a6
moveal sp@(8),a1
movel d1,a1@
rts
");
/****************************************************************************/
/* struct RexxTask * a0 : struct Environment * a0 */
asm("
.text
.even
.globl __CurrentEnv
__CurrentEnv:
moveal sp@(4),a0
movel a6,sp@-
moveal "A4(_RexxSysBase)",a6
jsr a6@(-108)
moveal sp@+,a6
moveal sp@(8),a1
movel a0,a1@
rts
");
/****************************************************************************/
/* struct Environment * a0,struct NexxStr * a1,struct NexxStr * d0,struct Node * d1 : struct NexxStr * a0, LONG d1 */
asm("
.text
.even
.globl __FetchValue
__FetchValue:
moveal sp@(4),a0
moveal sp@(8),a1
movel sp@(12),d0
movel sp@(16),d1
movel a6,sp@-
moveal "A4(_RexxSysBase)",a6
jsr a6@(-72)
moveal sp@+,a6
moveal sp@(20),a1
movel a0,a1@
moveal sp@(24),a1
movel d1,a1@
rts
");
/****************************************************************************/
/* struct Environment a0, struct NexxStr *a1, struct NexxStr * d0 : struct Node * d0 */
asm("
.text
.even
.globl __EnterSymbol
__EnterSymbol:
moveal sp@(4),a0
moveal sp@(8),a1
movel sp@(12),d0
movel a6,sp@-
moveal "A4(_RexxSysBase)",a6
jsr a6@(-66)
moveal sp@+,a6
rts
");
/****************************************************************************/
/* struct Environment *a0, struct NexxStr *a1, struct Node * d0 */
asm("
.text
.even
.globl __SetValue
__SetValue:
moveal sp@(4),a0
moveal sp@(8),a1
movel sp@(12),d0
movel a6,sp@-
moveal "A4(_RexxSysBase)",a6
jsr a6@(-84)
moveal sp@+,a6
rts
");
/****************************************************************************/
/* STRPTR a0,STRPTR a1,LONG d0 : ULONG d0 */
asm("
.text
.even
.globl __StrcpyN
__StrcpyN:
moveal sp@(4),a0
moveal sp@(8),a1
movel sp@(12),d0
movel a6,sp@-
moveal "A4(_RexxSysBase)",a6
jsr a6@(-270)
moveal sp@+,a6
rts
");
/****************************************************************************/
/* Function prototypes for the 68k stubs. */
extern VOID _FreeSpace(struct Environment * env,APTR mem,LONG size);
extern APTR _GetSpace(struct Environment * env,LONG size);
extern LONG _IsSymbol(STRPTR name,LONG * symbol_length_ptr);
extern VOID _CurrentEnv(struct RexxTask *task,struct Environment ** environment_ptr);
extern struct Node * _FetchValue(struct Environment * env,struct NexxStr * stem,struct NexxStr * compound,struct Node *symbol_table_node,LONG * is_literal_ptr,struct NexxStr ** value_ptr);
extern struct Node * _EnterSymbol(struct Environment * env,struct NexxStr * stem,struct NexxStr * compound);
extern VOID _SetValue(struct Environment * env,struct NexxStr * value,struct Node * symbol_table_node);
extern ULONG _StrcpyN(STRPTR destination,STRPTR source,LONG length);
/****************************************************************************/
#endif /* __GNUC__ && !__amigaos4__ */
/****************************************************************************/
/* Releases a string structure, if it's not owned at the time. */
STATIC VOID
FreeString(struct Environment * environment,struct NexxStr * ns)
{
/* Not currently owned? */
if(!(ns->ns_Flags & NSF_KEEP))
_FreeSpace(environment,ns,sizeof(*ns) + ns->ns_Length + 1);
}
/****************************************************************************/
/* Allocates and initializes a string structure. */
STATIC struct NexxStr *
MakeString(struct Environment * environment,STRPTR value,LONG length)
{
struct NexxStr * result = NULL;
struct NexxStr * ns;
/* Allocate memory for the NexxStr and the NUL-terminated string itself. */
ns = _GetSpace(environment,sizeof(*ns) + length + 1);
if(ns == NULL)
goto out;
/* Fill in the NexxStr structure, copy the string and remember the hash value for it. */
ns->ns_Ivalue = 0;
ns->ns_Length = length;
ns->ns_Flags = NSF_STRING;
ns->ns_Hash = _StrcpyN((STRPTR)ns->ns_Buff,value,length);
/* Copying the string did not NUL-terminate it. */
ns->ns_Buff[length] = '\0';
result = ns;
out:
return(result);
}
/****************************************************************************/
/* Classifies a symbol and returns the stem and compound parts. */
STATIC LONG
TypeString(STRPTR variable_name,struct Environment * environment,struct NexxStr ** compound_ptr,struct NexxStr ** stem_ptr)
{
struct NexxStr * compound;
struct NexxStr * stem = NULL;
LONG error = ERR10_003; /* no memory available */
LONG stem_length;
LONG symbol_length;
STRPTR dot;
(*compound_ptr) = NULL;
(*stem_ptr) = NULL;
/* The 'compound' part is the entire variable name, including all dots and
what's in between them. */
compound = MakeString(environment,variable_name,strlen(variable_name));
if(compound == NULL)
goto out;
/* Find the first dot in the variable name. Everything in front of it
and including the dot constitutes the 'stem' part. If there is no dot
in the name, then the 'compound' and 'stem' parts are identical. */
dot = memchr(compound->ns_Buff,'.',compound->ns_Length);
if(dot != NULL)
stem_length = ((char *)dot - (char *)compound->ns_Buff) + 1;
else
stem_length = compound->ns_Length;
/* Make a copy of the 'stem' part. */
stem = MakeString(environment,variable_name,stem_length);
if(stem == NULL)
goto out;
/* Figure out if this is a symbol after all. */
_IsSymbol((STRPTR)stem->ns_Buff,&symbol_length);
/* The entire name must match the stem part. */
if(symbol_length != stem->ns_Length)
{ {
error = ERR10_040; /* invalid variable name */ result = ERR10_010; /* invalid message packet */
goto out; goto out;
} }
(*compound_ptr) = compound; /* The 256 character limit isn't good. This should be done differently. */
(*stem_ptr) = stem; result = GetRexxVarFromMsg(variable_name,buffer,message);
if(result != 0)
goto out;
error = 0; (*buffer_pointer) = buffer;
out: out:
if(error != 0) return(result);
{
if(compound != NULL)
FreeString(environment,compound);
if(stem != NULL)
FreeString(environment,stem);
}
return(error);
} }
/****************************************************************************/ /****************************************************************************/
/* Retrieves the value of a variable from the current storage environment. */ /* The following function works in about like the original, except that it
ignores the length parameter (the value needs to be a NUL-terminated string)
and requires rexxsyslib.library V45. */
LONG LONG
GetRexxVar(struct RexxMsg *context,STRPTR variable_name,STRPTR * return_value) SetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR value,ULONG length)
{ {
struct Environment * environment; LONG result;
struct NexxStr * ns;
struct NexxStr * compound_string;
struct NexxStr * stem_string;
LONG is_literal;
LONG error;
(*return_value) = NULL; /* The following uses a function which was added to rexxsyslib.library V45.
We therefore have a minimum library version requirement. */
if(!CheckRexxMsg(context)) if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg((struct Message *)message))
{ {
error = ERR10_010; /* invalid message packet */ result = ERR10_010; /* invalid message packet */
goto out; goto out;
} }
/* Find the current storage environment. */ result = SetRexxVarFromMsg(variable_name,value,message);
_CurrentEnv(context->rm_TaskBlock,&environment);
/* Create the stem and component parts. */ out:
error = TypeString(variable_name,environment,&compound_string,&stem_string);
if(error != 0)
goto out;
/* Look up the value. NOTE: _FetchValue() will free the two 'struct NexxStr *' provided. */ return(result);
_FetchValue(environment,stem_string,compound_string,NULL,&is_literal,&ns);
/* If this is not a literal, return a pointer to the string. */
if(!is_literal)
(*return_value) = (STRPTR)ns->ns_Buff;
error = 0;
out:
return(error);
}
/****************************************************************************/
/* Assigns a value to a variable in the current storage environment. */
LONG
SetRexxVar(struct RexxMsg *context,STRPTR variable_name,STRPTR value,LONG length)
{
struct Environment * environment;
struct NexxStr * compound_string;
struct NexxStr * stem_string;
struct Node * symbol_table_node;
struct NexxStr *value_string;
LONG error;
/* Make sure the value string is not too long */
if(length > 65535)
{
error = ERR10_009; /* symbol or string too long */
goto out;
}
if(!CheckRexxMsg(context))
{
error = ERR10_010; /* invalid message packet */
goto out;
}
/* Find the current storage environment. */
_CurrentEnv(context->rm_TaskBlock,&environment);
/* Create the stem and compound parts */
error = TypeString(variable_name,environment,&compound_string,&stem_string);
if(error != 0)
goto out;
/* Locate or create the symbol node. NOTE: _EnterSymbol() will put the two 'struct NexxStr *' into
the symbol table. It is not nececessary to free them. */
symbol_table_node = _EnterSymbol(environment,stem_string,compound_string);
if(symbol_table_node == NULL)
{
error = ERR10_003; /* no memory available */
goto out;
}
/* Create the value string. */
value_string = MakeString(environment,value,length);
if(value_string == NULL)
{
error = ERR10_003; /* no memory available */
goto out;
}
/* Install the value string. */
_SetValue(environment,value_string,symbol_table_node);
error = 0;
out:
return(error);
} }

View File

@@ -13,9 +13,9 @@ rm -rf $dir_name
# Create the directory, copy all the libraries, header files # Create the directory, copy all the libraries, header files
# and release note files inside. # and release note files inside.
mkdir $dir_name mkdir $dir_name
cp -pR lib $dir_name cp -a lib $dir_name
cp -pR lib.threadsafe $dir_name cp -a lib.threadsafe $dir_name
cp -pR include $dir_name cp -a include $dir_name
cp changes $dir_name cp changes $dir_name
# Delete the CVS data from the include directory # Delete the CVS data from the include directory

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 205 #define REVISION 202
#define DATE "21.8.2010" #define DATE "16.1.2007"
#define VERS "c.lib 1.205" #define VERS "c.lib 1.202"
#define VSTRING "c.lib 1.205 (21.8.2010)\r\n" #define VSTRING "c.lib 1.202 (16.1.2007)\r\n"
#define VERSTAG "\0$VER: c.lib 1.205 (21.8.2010)" #define VERSTAG "\0$VER: c.lib 1.202 (16.1.2007)"

View File

@@ -1 +1 @@
205 202

View File

@@ -1,86 +1,3 @@
c.lib 1.205 (21.8.2010)
- Added dlclose(), dlerror(), dlopen() and dlsym() functions, which are
available only under OS4. There is a variant of dlopen() in libunix.a
which will perform a path name conversion. Note that these functions
will not work in the thread-safe variant of the library because it
would be unwise to tinker with the currently running program's binary.
- Added support for ELF shared objects and libraries. This is implemented through
constructor/destructor functions, which means that you can use this
functionality even in Amiga Exec style shared libraries, with the proper
library initialization code to invoke the constructor/destructor functions
for you.
- Updated uname() to recognize AmigaOS 4.1.
- The translation from Unix to Amiga path names did not properly process
multiple occurences of "/./" in the path name. Thanks go to Steven Solie
for finding the issue.
- The detection of "/./" and "/../" patterns in Unix path names to be
translated into Amiga path names did not test if it was overrunning
the end of the string.
- If strcmp(), strncmp() and memcmp() detect a pair of different
characters, then the function result must be calculated as if the
characters were of type "unsigned char". This is a requirement
according to the ISO 'C' (1994) standard. Thanks go to Georg Steger
for finding the issue.
- The definitions for INT_MIN, INT_MAX and UINT_MAX in <limits.h> no
longer use long integer types, as prompted by Steven Solie.
c.lib 1.204 (11.11.2008)
- The memory allocated by malloc() and friends is now of type MEMF_PRIVATE
under OS4 and beyond. The AmigaOS 2.x/3.x compatible code will still
use MEMF_ANY in the same situation, though. Other uses of MEMF_ANY have
been replaced as well where MEMF_PRIVATE would have made better sense.
- I/O buffers allocated are now aligned according to the CPU cache line size,
if the operating system can supply such detailed information.
- unsetenv() now returns a status value.
- Corrected the function prototype for wcspbrk().
- Added function prototypes for mbrtowc_l(), wcscoll_l(), wcscspn() and wcsrchr().
c.lib 1.203 (28.4.2008)
- Added 68k stubs to amiga_rexxvars.c for the OS4 build to use. The new code now
works just about exactly like the amiga.lib RVI code used to do, which means
that there is no artificial length limit for the number of characters a string
retrieved may have, and the code is largely reentrant.
- To work around a bug in the Roadshow TCP/IP stack (since fixed), the waitselect()
function now substitutes a 10 microsecond timeout for a zero length timeout.
- isatty() no longer crashes if passed a socket rather than a file.
- Rewrote the GetRexxVar()/SetRexxVar() functions (mostly) in 'C', using available
code as a reference. The 68k stubs currently only work for the 68k version of
the library, and a solution for the OS4 build still needs to be found. The code
is currently untested, but it should be complete.
- The printf() family now ignores argument specifications, as in "%2$d %1$d",
which are used for localization on some platforms. This is a non-standard
feature and the way clib2 treats it for now is just intended to avoid
trouble while performing the conversion.
- [tboeckel]: when compiling amiga_rexxvars.c for m68k/OS3 the GetRexxVarFromMsg()
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) c.lib 1.202 (16.1.2007)
- Added llrint() function contributed by Henning Nielsen Lund. Thank you - Added llrint() function contributed by Henning Nielsen Lund. Thank you

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: crtbegin.c,v 1.13 2010-08-21 11:37:03 obarthel Exp $ * $Id: crtbegin.c,v 1.11 2006-09-22 09:02:51 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -35,14 +35,9 @@ void _fini(void);
void void
_init(void) _init(void)
{ {
extern void shared_obj_init(void);
int num_ctors,i; int num_ctors,i;
int j; int j;
/* The shared objects need to be set up before any local
constructors are invoked. */
shared_obj_init();
for(i = 1, num_ctors = 0 ; __CTOR_LIST__[i] != NULL ; i++) for(i = 1, num_ctors = 0 ; __CTOR_LIST__[i] != NULL ; i++)
num_ctors++; num_ctors++;
@@ -55,7 +50,6 @@ _init(void)
void void
_fini(void) _fini(void)
{ {
extern void shared_obj_exit(void);
int num_dtors,i; int num_dtors,i;
static int j; static int j;
@@ -64,10 +58,6 @@ _fini(void)
while(j++ < num_dtors) while(j++ < num_dtors)
__DTOR_LIST__[j](); __DTOR_LIST__[j]();
/* The shared objects need to be cleaned up after all local
destructors have been invoked. */
shared_obj_exit();
} }
/****************************************************************************/ /****************************************************************************/

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 205 #define REVISION 202
#define DATE "21.8.2010" #define DATE "16.1.2007"
#define VERS "debug.lib 1.205" #define VERS "debug.lib 1.202"
#define VSTRING "debug.lib 1.205 (21.8.2010)\r\n" #define VSTRING "debug.lib 1.202 (16.1.2007)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.205 (21.8.2010)" #define VERSTAG "\0$VER: debug.lib 1.202 (16.1.2007)"

View File

@@ -1 +1 @@
205 202

View File

@@ -1,87 +0,0 @@
/*
* $Id: dlfcn.h,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* 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.
*
* - Neither the name of Olaf Barthel nor the names of 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.
*
*****************************************************************************
*
* Documentation and source code for this library, and the most recent library
* build are available from <http://sourceforge.net/projects/clib2>.
*
*****************************************************************************
*/
#ifndef _DLFCN_H
#define _DLFCN_H
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
/* We only support a subset of the flags available on Unix systems. */
#define RTLD_LAZY 1
#define RTLD_NOW 2
#define RTLD_LOCAL 4
#define RTLD_GLOBAL 8
#define RTLD_DEFAULT ((void *)0)
/****************************************************************************/
extern int dlclose(void * __handle);
extern const char * dlerror(void);
extern void * dlopen(const char * __path_name,int __mode);
extern void * dlsym(void * __handle,const char * __symbol_name);
/****************************************************************************/
#endif /* __amigaos4__ */
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */
/****************************************************************************/
#endif /* _DLFCN_H */

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: limits.h,v 1.12 2010-08-20 15:33:36 obarthel Exp $ * $Id: limits.h,v 1.11 2006-01-08 12:06:14 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -78,9 +78,9 @@
/****************************************************************************/ /****************************************************************************/
#define INT_MIN (-2147483647 - 1) #define INT_MIN (-2147483647L - 1)
#define INT_MAX 2147483647 #define INT_MAX 2147483647L
#define UINT_MAX 4294967295U #define UINT_MAX 4294967295UL
/****************************************************************************/ /****************************************************************************/
@@ -109,7 +109,7 @@
/****************************************************************************/ /****************************************************************************/
#define SSIZE_MAX LONG_MAX #define SSIZE_MAX 2147483647L
/****************************************************************************/ /****************************************************************************/

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib.h,v 1.19 2008-04-30 14:34:03 obarthel Exp $ * $Id: stdlib.h,v 1.18 2006-11-13 09:51:53 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -195,7 +195,7 @@ extern int rand_r(unsigned int * seed);
extern int setenv(const char *name, const char *value, int overwrite); extern int setenv(const char *name, const char *value, int overwrite);
extern int putenv(const char *string); extern int putenv(const char *string);
extern int unsetenv(const char *name); extern void unsetenv(const char *name);
extern char * mktemp(char * name_template); extern char * mktemp(char * name_template);
extern int mkstemp(char *name_template); extern int mkstemp(char *name_template);
extern char * mkdtemp(char *name_template); extern char * mkdtemp(char *name_template);

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: wchar.h,v 1.8 2008-04-30 14:34:03 obarthel Exp $ * $Id: wchar.h,v 1.7 2006-01-08 12:06:14 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -97,7 +97,7 @@ extern wchar_t * wcsncpy(wchar_t *dest, const wchar_t *src, size_t n);
extern size_t wcslen(const wchar_t *s); extern size_t wcslen(const wchar_t *s);
extern wchar_t * wcschr(const wchar_t *s, wchar_t c); extern wchar_t * wcschr(const wchar_t *s, wchar_t c);
extern size_t wcsspn(const wchar_t *s, const wchar_t *set); extern size_t wcsspn(const wchar_t *s, const wchar_t *set);
extern wchar_t *wcspbrk(const wchar_t *s, const wchar_t *set); extern wchar_t wcspbrk(const wchar_t *s, const wchar_t *set);
extern wchar_t *wcstok(wchar_t *str, const wchar_t *set); extern wchar_t *wcstok(wchar_t *str, const wchar_t *set);
extern wchar_t *wcsstr(const wchar_t *src, const wchar_t *sub); extern wchar_t *wcsstr(const wchar_t *src, const wchar_t *sub);
@@ -179,11 +179,6 @@ extern size_t wcsftime(wchar_t *s, size_t maxsize, const wchar_t *format, const
extern long long wcstoll(const wchar_t *str, wchar_t **ptr, int base); extern long long wcstoll(const wchar_t *str, wchar_t **ptr, int base);
extern unsigned long long wcstoull(const wchar_t *str, wchar_t **ptr, int base); extern unsigned long long wcstoull(const wchar_t *str, wchar_t **ptr, int base);
extern size_t mbrtowc_l(wchar_t *restrict pwc, const char *restrict s, size_t n, mbstate_t *restrict ps, locale_t loc);
extern int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t loc);
extern size_t wcscspn(const wchar_t *ws1, const wchar_t *ws2);
extern wchar_t * wcsrchr(const wchar_t *ws, wchar_t wc);
#endif /* __STDC_VERSION__ && __STDC_VERSION__ >= 199901L */ #endif /* __STDC_VERSION__ && __STDC_VERSION__ >= 199901L */
/****************************************************************************/ /****************************************************************************/

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: wctype.h,v 1.8 2008-04-30 14:41:28 obarthel Exp $ * $Id: wctype.h,v 1.7 2006-01-08 12:06:14 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -68,7 +68,7 @@ extern int iswdigit(wint_t c);
extern int iswxdigit(wint_t c); extern int iswxdigit(wint_t c);
extern int iswgraph(wint_t c); extern int iswgraph(wint_t c);
extern int iswpunct(wint_t c); extern int iswpunc(wint_t c);
extern int iswprint(wint_t c); extern int iswprint(wint_t c);
extern int iswlower(wint_t c); extern int iswlower(wint_t c);

View File

@@ -1,5 +1,5 @@
# #
# $Id: libc.gmk,v 1.8 2010-08-21 11:37:03 obarthel Exp $ # $Id: libc.gmk,v 1.4 2006-11-16 14:39:23 obarthel Exp $
# #
# :ts=8 # :ts=8
# #
@@ -205,10 +205,6 @@ C_LIB := \
stdlib_div.o \ stdlib_div.o \
stdlib_divsi3.o \ stdlib_divsi3.o \
stdlib_divsi4.o \ stdlib_divsi4.o \
stdlib_dlclose.o \
stdlib_dlerror.o \
stdlib_dlopen.o \
stdlib_dlsym.o \
stdlib_dosbase.o \ stdlib_dosbase.o \
stdlib_exit.o \ stdlib_exit.o \
stdlib_free.o \ stdlib_free.o \
@@ -252,7 +248,6 @@ C_LIB := \
stdlib_setjmp.o \ stdlib_setjmp.o \
stdlib_set_errno.o \ stdlib_set_errno.o \
stdlib_set_process_window.o \ stdlib_set_process_window.o \
stdlib_shared_objs.o \
stdlib_shell_escape.o \ stdlib_shell_escape.o \
stdlib_showerror.o \ stdlib_showerror.o \
stdlib_srand.o \ stdlib_srand.o \

View File

@@ -1,5 +1,5 @@
# #
# $Id: libunix.gmk,v 1.4 2010-08-21 10:59:34 obarthel Exp $ # $Id: libunix.gmk,v 1.3 2006-11-13 09:25:28 obarthel Exp $
# #
# :ts=8 # :ts=8
# #
@@ -57,7 +57,6 @@ UNIX_LIB := \
stdlib_alloca_cleanup.o \ stdlib_alloca_cleanup.o \
stdlib_alloca_trap.o \ stdlib_alloca_trap.o \
stdlib_arg.o \ stdlib_arg.o \
stdlib_dlopen.o \
stdlib_expand_wildcard.o \ stdlib_expand_wildcard.o \
stdlib_expand_wildcard_check.o \ stdlib_expand_wildcard_check.o \
stdlib_getmemstats.o \ stdlib_getmemstats.o \

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 205 #define REVISION 202
#define DATE "21.8.2010" #define DATE "16.1.2007"
#define VERS "m.lib 1.205" #define VERS "m.lib 1.202"
#define VSTRING "m.lib 1.205 (21.8.2010)\r\n" #define VSTRING "m.lib 1.202 (16.1.2007)\r\n"
#define VERSTAG "\0$VER: m.lib 1.205 (21.8.2010)" #define VERSTAG "\0$VER: m.lib 1.202 (16.1.2007)"

View File

@@ -1 +1 @@
205 202

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 205 #define REVISION 202
#define DATE "21.8.2010" #define DATE "16.1.2007"
#define VERS "m881.lib 1.205" #define VERS "m881.lib 1.202"
#define VSTRING "m881.lib 1.205 (21.8.2010)\r\n" #define VSTRING "m881.lib 1.202 (16.1.2007)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.205 (21.8.2010)" #define VERSTAG "\0$VER: m881.lib 1.202 (16.1.2007)"

View File

@@ -1 +1 @@
205 202

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: math_log.c,v 1.10 2007-11-08 11:23:53 damato Exp $ * $Id: math_log.c,v 1.9 2006-01-08 12:04:23 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -244,7 +244,7 @@ log(double x)
{ {
double result; double result;
if(x > 0) if(x > DBL_EPSILON)
{ {
result = __log(x); result = __log(x);
} }

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: math_log10.c,v 1.9 2007-11-08 11:23:53 damato Exp $ * $Id: math_log10.c,v 1.8 2006-01-08 12:04:23 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -186,7 +186,7 @@ log10(double x)
{ {
double result; double result;
if(x > 0) if(x > DBL_EPSILON)
{ {
result = __log10(x); result = __log10(x);
} }

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: mount_convertinfo.c,v 1.7 2008-04-16 07:38:10 obarthel Exp $ * $Id: mount_convertinfo.c,v 1.6 2006-01-08 12:04:24 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -42,20 +42,6 @@
/****************************************************************************/ /****************************************************************************/
#ifndef ID_BUSY_DISK
#define ID_BUSY_DISK (0x42555359L) /* 'BUSY' */
#endif /* ID_LONGNAME_DOS_DISK */
#ifndef ID_LONGNAME_DOS_DISK
#define ID_LONGNAME_DOS_DISK (0x444F5306L) /* 'DOS\6' */
#endif /* ID_LONGNAME_DOS_DISK */
#ifndef ID_LONGNAME_FFS_DISK
#define ID_LONGNAME_FFS_DISK (0x444F5307L) /* 'DOS\7' */
#endif /* ID_LONGNAME_FFS_DISK */
/****************************************************************************/
void void
__convert_info_to_statfs(struct InfoData * id,struct statfs * f) __convert_info_to_statfs(struct InfoData * id,struct statfs * f)
{ {

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 205 #define REVISION 202
#define DATE "21.8.2010" #define DATE "16.1.2007"
#define VERS "net.lib 1.205" #define VERS "net.lib 1.202"
#define VSTRING "net.lib 1.205 (21.8.2010)\r\n" #define VSTRING "net.lib 1.202 (16.1.2007)\r\n"
#define VERSTAG "\0$VER: net.lib 1.205 (21.8.2010)" #define VERSTAG "\0$VER: net.lib 1.202 (16.1.2007)"

View File

@@ -1 +1 @@
205 202

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: socket_wait_select.c,v 1.4 2008-04-16 07:53:40 obarthel Exp $ * $Id: socket_wait_select.c,v 1.3 2006-04-10 15:08:10 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -44,22 +44,8 @@
int int
waitselect(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct timeval *timeout,unsigned long * signal_mask) waitselect(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct timeval *timeout,unsigned long * signal_mask)
{ {
struct timeval other_timeout;
int result; int result;
/* This is a workaround for a bug in the Roadshow TCP/IP stack which has been
fixed long ago: if a signal is received, as given in the 'signal_mask'
parameter, the WaitSelect() function may not detect it if the timeout
is zero. */
if(signal_mask != NULL && timeout != NULL && timeout->tv_secs == 0 && timeout->tv_micro == 0)
{
/* Substitute a ten microsecond timeout. */
other_timeout.tv_secs = 0;
other_timeout.tv_micro = 10000;
timeout = &other_timeout;
}
result = __select(num_fds,read_fds,write_fds,except_fds,timeout,signal_mask); result = __select(num_fds,read_fds,write_fds,except_fds,timeout,signal_mask);
return(result); return(result);

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_file_init.c,v 1.13 2008-09-04 12:07:58 obarthel Exp $ * $Id: stdio_file_init.c,v 1.12 2006-11-16 14:39:23 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -76,11 +76,6 @@ struct WBStartup * NOCOMMON __WBenchMsg;
/****************************************************************************/ /****************************************************************************/
/* CPU cache line size; used to align I/O buffers for best performance. */
ULONG __cache_line_size = 32;
/****************************************************************************/
FILE_DESTRUCTOR(workbench_exit) FILE_DESTRUCTOR(workbench_exit)
{ {
ENTER(); ENTER();
@@ -220,24 +215,6 @@ FILE_CONSTRUCTOR(stdio_file_init)
ENTER(); ENTER();
/* Figure out the proper address alignment for the memory we are
going to use for disk I/O. The default is 32 bytes, which should
be OK for most cases. If possible, ask the operating system for
its preferred alignment size. */
#if defined(__amigaos4__)
{
if(SysBase->lib_Version >= 50)
{
uint32 physical_alignment = 0;
GetCPUInfoTags(GCIT_CacheLineSize,&physical_alignment,TAG_DONE);
if(__cache_line_size < physical_alignment)
__cache_line_size = physical_alignment;
}
}
#endif /* __amigaos4__ */
/* If we were invoked from Workbench, set up the standard I/O streams. */ /* If we were invoked from Workbench, set up the standard I/O streams. */
if(__WBenchMsg != NULL) if(__WBenchMsg != NULL)
{ {
@@ -278,7 +255,7 @@ FILE_CONSTRUCTOR(stdio_file_init)
PROFILE_ON(); PROFILE_ON();
/* Allocate a little more memory than necessary. */ /* Allocate a little more memory than necessary. */
buffer = malloc(BUFSIZ + (__cache_line_size - 1)); buffer = malloc(BUFSIZ + (CACHE_LINE_SIZE-1));
if(buffer == NULL) if(buffer == NULL)
goto out; goto out;
@@ -323,7 +300,7 @@ FILE_CONSTRUCTOR(stdio_file_init)
#endif /* __THREAD_SAFE */ #endif /* __THREAD_SAFE */
/* Align the buffer start address to a cache line boundary. */ /* Align the buffer start address to a cache line boundary. */
aligned_buffer = (char *)((ULONG)(buffer + (__cache_line_size-1)) & ~(__cache_line_size-1)); aligned_buffer = (char *)((ULONG)(buffer + (CACHE_LINE_SIZE-1)) & ~(CACHE_LINE_SIZE-1));
__initialize_fd(__fd[i],__fd_hook_entry,default_file,fd_flags,fd_lock); __initialize_fd(__fd[i],__fd_hook_entry,default_file,fd_flags,fd_lock);

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_grow_file.c,v 1.8 2008-09-04 12:07:58 obarthel Exp $ * $Id: stdio_grow_file.c,v 1.7 2006-11-16 14:39:23 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -90,7 +90,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
/* Allocate a little more memory than required to allow for /* Allocate a little more memory than required to allow for
* the buffer to be aligned to a cache line boundary. * the buffer to be aligned to a cache line boundary.
*/ */
buffer = malloc((size_t)buffer_size + (__cache_line_size-1)); buffer = malloc((size_t)buffer_size + (CACHE_LINE_SIZE-1));
if(buffer == NULL) if(buffer == NULL)
{ {
SHOWMSG("not enough memory for write buffer"); SHOWMSG("not enough memory for write buffer");
@@ -100,7 +100,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
} }
/* Align the buffer to a cache line boundary. */ /* Align the buffer to a cache line boundary. */
aligned_buffer = (unsigned char *)(((ULONG)(buffer + (__cache_line_size-1))) & ~(__cache_line_size-1)); aligned_buffer = (unsigned char *)(((ULONG)(buffer + (CACHE_LINE_SIZE-1))) & ~(CACHE_LINE_SIZE-1));
memset(aligned_buffer,0,(size_t)buffer_size); memset(aligned_buffer,0,(size_t)buffer_size);

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_headers.h,v 1.31 2008-09-04 12:07:58 obarthel Exp $ * $Id: stdio_headers.h,v 1.30 2006-11-16 14:39:23 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -156,6 +156,18 @@ struct iob;
/****************************************************************************/ /****************************************************************************/
/* CPU cache line size; used for alignment purposes with some data structures.
This should be determined dynamically rather than preset here. For the
68040/68060 the cache line size is 16 bytes, for the PowerPC G4 it's
32 bytes and 128 bytes (gross!) for the PowerPC G5. */
#if defined(__PPC__)
#define CACHE_LINE_SIZE 32UL
#else
#define CACHE_LINE_SIZE 16UL
#endif /* __PPC__ */
/****************************************************************************/
/* The directory entry type a socket is identified with (in a FileInfoBlock). */ /* The directory entry type a socket is identified with (in a FileInfoBlock). */
#define ST_SOCKET (31082002) #define ST_SOCKET (31082002)
@@ -387,11 +399,6 @@ extern BOOL NOCOMMON __no_standard_io;
/****************************************************************************/ /****************************************************************************/
/* CPU cache line size; used to align I/O buffers for best performance. */
extern ULONG __cache_line_size;
/****************************************************************************/
/*extern int __iob_write_buffer_is_full(struct iob * file);*/ /*extern int __iob_write_buffer_is_full(struct iob * file);*/
#define __iob_write_buffer_is_full(file) \ #define __iob_write_buffer_is_full(file) \

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_openiob.c,v 1.15 2008-09-04 12:07:58 obarthel Exp $ * $Id: stdio_openiob.c,v 1.14 2006-01-08 12:04:24 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -133,7 +133,7 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
SHOWMSG("allocating file buffer"); SHOWMSG("allocating file buffer");
/* Allocate a little more memory than necessary. */ /* Allocate a little more memory than necessary. */
buffer = malloc(BUFSIZ + (__cache_line_size-1)); buffer = malloc(BUFSIZ + (CACHE_LINE_SIZE-1));
if(buffer == NULL) if(buffer == NULL)
{ {
SHOWMSG("that didn't work"); SHOWMSG("that didn't work");
@@ -143,7 +143,7 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
} }
/* Align the buffer start address to a cache line boundary. */ /* Align the buffer start address to a cache line boundary. */
aligned_buffer = (char *)((ULONG)(buffer + (__cache_line_size-1)) & ~(__cache_line_size-1)); aligned_buffer = (char *)((ULONG)(buffer + (CACHE_LINE_SIZE-1)) & ~(CACHE_LINE_SIZE-1));
if(file_descriptor < 0) if(file_descriptor < 0)
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_popen.c,v 1.10 2008-05-07 09:33:55 obarthel Exp $ * $Id: stdio_popen.c,v 1.9 2006-01-08 12:04:24 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -154,9 +154,7 @@ popen(const char *command, const char *type)
goto out; goto out;
} }
/* The current PIPE: device only supports unidirectional connections. Worse: even if /* The current PIPE: device only supports unidirectional connections. */
a PIPE: device with bidirectional connection support were available, we would
be unable to detect this property. */
if((type[1] == '+') || (type[1] != '\0' && type[2] == '+')) if((type[1] == '+') || (type[1] != '\0' && type[2] == '+'))
{ {
D(("unsupported access mode '%s'",type)); D(("unsupported access mode '%s'",type));

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_setvbuf.c,v 1.11 2008-09-04 12:07:58 obarthel Exp $ * $Id: stdio_setvbuf.c,v 1.10 2006-09-22 09:02:51 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -123,7 +123,7 @@ setvbuf(FILE *stream,char *buf,int bufmode,size_t size)
if(size > 0 && buf == NULL) if(size > 0 && buf == NULL)
{ {
/* Allocate a little more memory than necessary. */ /* Allocate a little more memory than necessary. */
new_buffer = malloc(size + (__cache_line_size-1)); new_buffer = malloc(size + (CACHE_LINE_SIZE-1));
if(new_buffer == NULL) if(new_buffer == NULL)
{ {
__set_errno(ENOBUFS); __set_errno(ENOBUFS);
@@ -170,7 +170,7 @@ setvbuf(FILE *stream,char *buf,int bufmode,size_t size)
file->iob_CustomBuffer = new_buffer; file->iob_CustomBuffer = new_buffer;
/* Align the buffer start address to a cache line boundary. */ /* Align the buffer start address to a cache line boundary. */
new_buffer = (char *)((ULONG)(new_buffer + (__cache_line_size-1)) & ~(__cache_line_size-1)); new_buffer = (char *)((ULONG)(new_buffer + (CACHE_LINE_SIZE-1)) & ~(CACHE_LINE_SIZE-1));
} }
} }

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_vfprintf.c,v 1.26 2008-03-10 15:28:11 obarthel Exp $ * $Id: stdio_vfprintf.c,v 1.25 2006-11-13 09:32:28 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -143,12 +143,8 @@ vfprintf(FILE * stream,const char * format, va_list arg)
int output_len; int output_len;
const char *prefix; const char *prefix;
char prefix_buffer[8]; char prefix_buffer[8];
int argument_digits;
int argument_number;
int argument_index;
int result = EOF; int result = EOF;
int len = 0; int len = 0;
int i;
int c; int c;
#if defined(FLOATING_POINT_SUPPORT) #if defined(FLOATING_POINT_SUPPORT)
@@ -207,36 +203,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
continue; continue;
} }
/* If a string of digits, terminated by a '$' character appears here,
it indicates which argument should be accessed. We evaluate this
data but for now will ignore it altogether. */
argument_index = argument_number = argument_digits = 0;
for(i = 0 ; format[i] != '\0' ; i++)
{
if(format[i] == '$')
{
if(argument_digits > 0)
{
argument_index = argument_number;
format = &format[i+1];
}
break;
}
else if ('0' <= format[i] && format[i] <= '9')
{
argument_number = (10 * argument_number) + (format[i] - '0');
argument_digits++;
}
else
{
break;
}
}
format_flags = 0; format_flags = 0;
fill_character = ' '; fill_character = ' ';
@@ -806,6 +772,7 @@ vfprintf(FILE * stream,const char * format, va_list arg)
int max_digits = -1; int max_digits = -1;
int exponent = 0; int exponent = 0;
int digit; int digit;
int i;
/* This takes care of the sign. */ /* This takes care of the sign. */
if(v < 0.0) if(v < 0.0)
@@ -1385,6 +1352,8 @@ vfprintf(FILE * stream,const char * format, va_list arg)
} }
else else
{ {
int i;
output_len = precision; output_len = precision;
for(i = 0 ; i < precision ; i++) for(i = 0 ; i < precision ; i++)
@@ -1563,6 +1532,8 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(FLAG_IS_SET(format_flags,FORMATF_LeftJustified)) if(FLAG_IS_SET(format_flags,FORMATF_LeftJustified))
{ {
int i;
if(prefix != NULL) if(prefix != NULL)
{ {
for(i = 0 ; prefix[i] != '\0' ; i++) for(i = 0 ; prefix[i] != '\0' ; i++)
@@ -1619,6 +1590,8 @@ vfprintf(FILE * stream,const char * format, va_list arg)
} }
else else
{ {
int i;
/* If we have to add the prefix later, make sure that /* If we have to add the prefix later, make sure that
we don't add too many fill characters in front of we don't add too many fill characters in front of
it now. */ it now. */
@@ -1671,6 +1644,7 @@ vfprintf(FILE * stream,const char * format, va_list arg)
} }
} }
for(i = 0 ; i < output_len ; i++) for(i = 0 ; i < output_len ; i++)
{ {
if(__putc(output_buffer[i],stream,buffer_mode) == EOF) if(__putc(output_buffer[i],stream,buffer_mode) == EOF)

View File

@@ -1,86 +0,0 @@
/*
* $Id: stdlib_dlclose.c,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* 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.
*
* - Neither the name of Olaf Barthel nor the names of 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 _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
#include <dlfcn.h>
/****************************************************************************/
#include <libraries/elf.h>
#include <proto/elf.h>
/****************************************************************************/
extern struct ElfIFace * __IElf;
extern Elf32_Handle __dl_elf_handle;
extern Elf32_Error __elf_error_code;
/****************************************************************************/
int dlclose(void * handle)
{
int result = -1;
if(__dl_elf_handle != NULL)
{
struct ElfIFace * IElf = __IElf;
Elf32_Error error;
error = DLClose(__dl_elf_handle,handle);
if(error != ELF32_NO_ERROR)
{
__elf_error_code = error;
goto out;
}
}
result = 0;
out:
return(result);
}
/****************************************************************************/
#endif /* __amigaos4__ */

View File

@@ -1,132 +0,0 @@
/*
* $Id: stdlib_dlerror.c,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* 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.
*
* - Neither the name of Olaf Barthel nor the names of 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 _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
#include <dlfcn.h>
/****************************************************************************/
#include <libraries/elf.h>
/****************************************************************************/
extern Elf32_Error __elf_error_code;
/****************************************************************************/
const char * dlerror(void)
{
const char * result;
switch(__elf_error_code)
{
case ELF32_NO_ERROR:
result = NULL;
break;
case ELF32_OUT_OF_MEMORY:
result = "out of memory";
break;
case ELF32_INVALID_HANDLE:
result = "invalid handle";
break;
case ELF32_NO_MORE_RELOCS:
result = "no more relocs";
break;
case ELF32_SECTION_NOT_LOADED:
result = "section not loaded";
break;
case ELF32_UNKNOWN_RELOC:
result = "unknown reloc";
break;
case ELF32_READ_ERROR:
result = "read error";
break;
case ELF32_INVALID_SDA_BASE:
result = "invalid SDA base";
break;
case ELF32_SYMBOL_NOT_FOUND:
result = "symbol not found";
break;
case ELF32_INVALID_NAME:
result = "invalid name";
break;
case ELF32_REQUIRED_OBJECT_MISSING:
result = "required object missing";
break;
default:
result = "unknown error";
break;
}
/* Calling dlerror() will clear the error code. */
__elf_error_code = ELF32_NO_ERROR;
return(result);
}
/****************************************************************************/
#endif /* __amigaos4__ */

View File

@@ -1,112 +0,0 @@
/*
* $Id: stdlib_dlopen.c,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* 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.
*
* - Neither the name of Olaf Barthel nor the names of 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 _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
#include <dlfcn.h>
/****************************************************************************/
#include <libraries/elf.h>
#include <proto/elf.h>
/****************************************************************************/
extern struct ElfIFace * __IElf;
extern Elf32_Handle __dl_elf_handle;
/****************************************************************************/
void * dlopen(const char * path_name,int mode)
{
#if defined(UNIX_PATH_SEMANTICS)
struct name_translation_info path_name_nti;
#endif /* UNIX_PATH_SEMANTICS */
void * result = NULL;
#if defined(UNIX_PATH_SEMANTICS)
{
if(__unix_path_semantics)
{
if(path_name[0] == '\0')
{
SHOWMSG("no name given");
__set_errno(ENOENT);
goto out;
}
if(__translate_unix_to_amiga_path_name(&path_name,&path_name_nti) != 0)
goto out;
if(path_name_nti.is_root)
{
__set_errno(EACCES);
goto out;
}
}
}
#endif /* UNIX_PATH_SEMANTICS */
if(__dl_elf_handle != NULL)
{
struct ElfIFace * IElf = __IElf;
uint32 flags = 0;
if(mode & RTLD_LOCAL)
flags = ELF32_RTLD_LOCAL;
if(mode & RTLD_GLOBAL)
flags = ELF32_RTLD_GLOBAL;
result = DLOpen(__dl_elf_handle,path_name,flags);
}
out:
return(result);
}
/****************************************************************************/
#endif /* __amigaos4__ */

View File

@@ -1,87 +0,0 @@
/*
* $Id: stdlib_dlsym.c,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* 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.
*
* - Neither the name of Olaf Barthel nor the names of 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 _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
#include <dlfcn.h>
/****************************************************************************/
#include <libraries/elf.h>
#include <proto/elf.h>
/****************************************************************************/
extern struct ElfIFace * __IElf;
extern Elf32_Handle __dl_elf_handle;
extern Elf32_Error __elf_error_code;
/****************************************************************************/
void * dlsym(void * handle,const char * symbol_name)
{
void * result = NULL;
if(__dl_elf_handle != NULL)
{
struct ElfIFace * IElf = __IElf;
APTR symbol_data = NULL;
Elf32_Error error;
error = DLSym(__dl_elf_handle,handle,symbol_name,&symbol_data);
if(error != ELF32_NO_ERROR)
{
__elf_error_code = error;
goto out;
}
result = symbol_data;
}
out:
return(result);
}
/****************************************************************************/
#endif /* __amigaos4__ */

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib_main.c,v 1.34 2008-09-30 14:09:00 obarthel Exp $ * $Id: stdlib_main.c,v 1.33 2006-09-25 14:51:15 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -61,16 +61,6 @@
/****************************************************************************/ /****************************************************************************/
/* On OS4 memory of type MEMF_ANY may not be paged out. Where this is desirable
MEMF_PRIVATE should be used instead. */
#ifdef __amigaos4__
#define MEMORY_TYPE MEMF_PRIVATE
#else
#define MEMORY_TYPE MEMF_ANY
#endif /* __amigaos4__ */
/****************************************************************************/
extern int main(int arg_c,char ** arg_v); extern int main(int arg_c,char ** arg_v);
/****************************************************************************/ /****************************************************************************/
@@ -117,7 +107,7 @@ call_main(void)
struct Process * this_process = (struct Process *)FindTask(NULL); struct Process * this_process = (struct Process *)FindTask(NULL);
UBYTE * arg_str = GetArgStr(); UBYTE * arg_str = GetArgStr();
size_t arg_str_len = strlen(arg_str); size_t arg_str_len = strlen(arg_str);
UBYTE * arg_str_copy = AllocVec(arg_str_len+1,MEMF_PRIVATE); UBYTE * arg_str_copy = AllocVec(arg_str_len+1,MEMF_ANY);
UBYTE current_dir_name[256]; UBYTE current_dir_name[256];
if(arg_str_copy != NULL && NameFromLock(this_process->pr_CurrentDir,current_dir_name,sizeof(current_dir_name))) if(arg_str_copy != NULL && NameFromLock(this_process->pr_CurrentDir,current_dir_name,sizeof(current_dir_name)))

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib_malloc.c,v 1.20 2008-09-30 14:09:00 obarthel Exp $ * $Id: stdlib_malloc.c,v 1.19 2006-01-08 12:04:25 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -143,21 +143,9 @@ __allocate_memory(size_t size,BOOL never_free,const char * UNUSED unused_file,in
#endif /* __MEM_DEBUG */ #endif /* __MEM_DEBUG */
if(__memory_pool != NULL) if(__memory_pool != NULL)
{
mn = AllocPooled(__memory_pool,allocation_size); mn = AllocPooled(__memory_pool,allocation_size);
}
else else
{ mn = AllocMem(allocation_size,MEMF_ANY);
#if defined(__amigaos4__)
{
mn = AllocMem(allocation_size,MEMF_PRIVATE);
}
#else
{
mn = AllocMem(allocation_size,MEMF_ANY);
}
#endif /* __amigaos4__ */
}
if(mn == NULL) if(mn == NULL)
{ {
@@ -413,7 +401,7 @@ STDLIB_CONSTRUCTOR(stdlib_memory_init)
#if defined(__amigaos4__) #if defined(__amigaos4__)
{ {
__memory_pool = CreatePool(MEMF_PRIVATE,(ULONG)__default_pool_size,(ULONG)__default_puddle_size); __memory_pool = CreatePool(MEMF_ANY,(ULONG)__default_pool_size,(ULONG)__default_puddle_size);
} }
#else #else
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib_program_name.c,v 1.3 2008-09-30 14:09:00 obarthel Exp $ * $Id: stdlib_program_name.c,v 1.2 2006-01-08 12:04:26 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -49,14 +49,6 @@
/****************************************************************************/ /****************************************************************************/
#ifdef __amigaos4__
#define MEMORY_TYPE MEMF_PRIVATE
#else
#define MEMORY_TYPE MEMF_ANY
#endif /* __amigaos4__ */
/****************************************************************************/
static BOOL free_program_name; static BOOL free_program_name;
/****************************************************************************/ /****************************************************************************/
@@ -91,7 +83,7 @@ STDLIB_CONSTRUCTOR(stdlib_program_name_init)
const size_t program_name_size = 256; const size_t program_name_size = 256;
/* Make a copy of the current command name string. */ /* Make a copy of the current command name string. */
__program_name = AllocVec((ULONG)program_name_size,MEMORY_TYPE); __program_name = AllocVec((ULONG)program_name_size,MEMF_ANY);
if(__program_name == NULL) if(__program_name == NULL)
goto out; goto out;

View File

@@ -1,192 +0,0 @@
/*
* $Id: stdlib_shared_objs.c,v 1.1 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* 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.
*
* - Neither the name of Olaf Barthel nor the names of 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.
*/
#if defined(__amigaos4__)
/****************************************************************************/
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
#include <libraries/elf.h>
#include <proto/elf.h>
/****************************************************************************/
/* These are used to initialize the shared objects linked to this binary,
and for the dlopen(), dlclose() and dlsym() functions. */
struct Library * __ElfBase;
struct ElfIFace * __IElf;
/* This is used with the dlopen(), dlclose() and dlsym() functions. */
Elf32_Handle __dl_elf_handle;
/****************************************************************************/
/* This is used to initialize the shared objects only. */
static Elf32_Handle elf_handle;
/****************************************************************************/
void shared_obj_init(void);
void shared_obj_exit(void);
/****************************************************************************/
static VOID close_elf_library(void)
{
if(__IElf != NULL)
{
DropInterface((struct Interface *)__IElf);
__IElf = NULL;
}
if(__ElfBase != NULL)
{
CloseLibrary(__ElfBase);
__ElfBase = NULL;
}
}
/****************************************************************************/
static BOOL open_elf_library(void)
{
BOOL success = FALSE;
/* We need elf.library V52.2 or higher. */
__ElfBase = OpenLibrary("elf.library",0);
if(__ElfBase == NULL || (__ElfBase->lib_Version < 52) || (__ElfBase->lib_Version == 52 && __ElfBase->lib_Revision < 2))
goto out;
__IElf = (struct ElfIFace *)GetInterface(__ElfBase,"main",1,NULL);
if(__IElf == NULL)
goto out;
success = TRUE;
out:
return(success);
}
/****************************************************************************/
void shared_obj_exit(void)
{
struct ElfIFace * IElf = __IElf;
#ifndef __THREAD_SAFE
{
/* Release this program's Elf handle, if we grabbed it below. */
if(__dl_elf_handle != NULL)
{
CloseElfTags(__dl_elf_handle,
CET_ReClose,TRUE,
TAG_DONE);
__dl_elf_handle = NULL;
}
}
#endif /* __THREAD_SAFE */
/* If we got what we wanted, trigger the destructors,
etc. in the shared objects linked to this binary. */
if(elf_handle != NULL)
{
InitSHLibs(elf_handle,FALSE);
elf_handle = NULL;
}
close_elf_library();
}
/****************************************************************************/
void shared_obj_init(void)
{
if(open_elf_library())
{
struct ElfIFace * IElf = __IElf;
BPTR segment_list;
/* Try to find the Elf handle associated with this
program's segment list. */
segment_list = GetProcSegList(NULL,GPSLF_CLI | GPSLF_SEG);
if(segment_list != ZERO)
{
if(GetSegListInfoTags(segment_list,
GSLI_ElfHandle,&elf_handle,
TAG_DONE) == 1)
{
if(elf_handle != NULL)
{
/* Trigger the constructors, etc. in the shared objects
linked to this binary. */
InitSHLibs(elf_handle,TRUE);
}
}
}
/* Next: try to grab the Elf handle associated with the currently
running process. This is not thread-safe! */
#ifndef __THREAD_SAFE
{
segment_list = GetProcSegList(NULL,GPSLF_RUN);
if(segment_list != ZERO)
{
Elf32_Handle handle = NULL;
if(GetSegListInfoTags(segment_list,
GSLI_ElfHandle,&handle,
TAG_DONE) == 1)
{
if(handle != NULL)
{
__dl_elf_handle = OpenElfTags(
OET_ElfHandle,handle,
TAG_DONE);
}
}
}
}
#endif /* __THREAD_SAFE */
}
}
/****************************************************************************/
#endif /*__amigaos4__ */

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib_unsetenv.c,v 1.10 2008-04-30 16:32:49 obarthel Exp $ * $Id: stdlib_unsetenv.c,v 1.8 2006-09-25 14:51:15 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -43,12 +43,6 @@
/****************************************************************************/ /****************************************************************************/
#ifndef _STDIO_HEADERS_H
#include "stdio_headers.h"
#endif /* _STDIO_HEADERS_H */
/****************************************************************************/
#ifndef _STDLIB_MEMORY_H #ifndef _STDLIB_MEMORY_H
#include "stdlib_memory.h" #include "stdlib_memory.h"
#endif /* _STDLIB_MEMORY_H */ #endif /* _STDLIB_MEMORY_H */
@@ -59,12 +53,10 @@
/****************************************************************************/ /****************************************************************************/
int void
unsetenv(const char *name) unsetenv(const char *name)
{ {
char * name_copy = NULL; char * name_copy = NULL;
int result = -1;
LONG status;
size_t i; size_t i;
if(__check_abort_enabled) if(__check_abort_enabled)
@@ -99,21 +91,11 @@ unsetenv(const char *name)
} }
PROFILE_OFF(); PROFILE_OFF();
status = DeleteVar((STRPTR)name,0); DeleteVar((STRPTR)name,0);
PROFILE_ON(); PROFILE_ON();
if(status == DOSFALSE)
{
__set_errno(__translate_access_io_error_to_errno(IoErr()));
goto out;
}
result = 0;
out: out:
if(name_copy != NULL) if(name_copy != NULL)
free(name_copy); free(name_copy);
return(result);
} }

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: string_memcmp.c,v 1.8 2010-08-20 15:33:36 obarthel Exp $ * $Id: string_memcmp.c,v 1.7 2006-01-08 12:04:26 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -135,14 +135,7 @@ __memcmp(const char *m1,const char *m2,size_t len)
{ {
if((*m1) != (*m2)) if((*m1) != (*m2))
{ {
int b1,b2; result = (*m1) - (*m2);
/* The comparison must be performed as if the
bytes were unsigned characters. */
b1 = *(unsigned char *)m1;
b2 = *(unsigned char *)m2;
result = b1 - b2;
break; break;
} }
@@ -192,12 +185,7 @@ memcmp(const void *ptr1, const void *ptr2, size_t len)
{ {
if((*m1) != (*m2)) if((*m1) != (*m2))
{ {
int b1,b2; result = (*m1) - (*m2);
b1 = *(unsigned char *)m1;
b2 = *(unsigned char *)m2;
result = b1 - b2;
break; break;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: string_strcmp.c,v 1.5 2010-08-20 15:33:36 obarthel Exp $ * $Id: string_strcmp.c,v 1.4 2006-01-08 12:04:27 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -62,8 +62,6 @@ strcmp(const char *s1, const char * s2)
if(s1 != s2) if(s1 != s2)
{ {
int c1,c2;
while((*s1) == (*s2)) while((*s1) == (*s2))
{ {
if((*s1) == '\0') if((*s1) == '\0')
@@ -73,12 +71,7 @@ strcmp(const char *s1, const char * s2)
s2++; s2++;
} }
/* The comparison must be performed as if the result = (*s1) - (*s2);
characters were unsigned characters. */
c1 = *(unsigned char *)s1;
c2 = *(unsigned char *)s2;
result = c1 - c2;
} }
out: out:

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: string_strncmp.c,v 1.5 2010-08-20 15:33:36 obarthel Exp $ * $Id: string_strncmp.c,v 1.4 2006-01-08 12:04:27 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -78,14 +78,7 @@ strncmp(const char *s1, const char *s2, size_t n)
} }
else else
{ {
int c1,c2; result = (*s1) - (*s2);
/* The comparison must be performed as if the
characters were unsigned characters. */
c1 = *(unsigned char *)s1;
c2 = *(unsigned char *)s2;
result = c1 - c2;
break; break;
} }
} }

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: systeminfo_sysinfo.c,v 1.6 2010-08-20 15:33:36 obarthel Exp $ * $Id: systeminfo_sysinfo.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -141,7 +141,7 @@ sysinfo(int cmd,char *buf,long buflen)
GetCPUInfoTags(GCIT_VectorUnit,&vecu,TAG_DONE); GetCPUInfoTags(GCIT_VectorUnit,&vecu,TAG_DONE);
if(vecu == VECTORTYPE_ALTIVEC || vecu == 2 /* VECTORTYPE_VMX == 2 */) /* AltiVec and VMX are the same. */ if(vecu == VECTORTYPE_ALTIVEC || vecu == VECTORTYPE_VMX) /* AltiVec and VMX are the same. */
s = "ppc+altivec ppc common"; s = "ppc+altivec ppc common";
else else
s = "ppc common"; s = "ppc common";

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: unistd_common_pathconf.c,v 1.4 2008-04-16 07:38:10 obarthel Exp $ * $Id: unistd_common_pathconf.c,v 1.3 2006-09-21 09:24:20 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -55,18 +55,6 @@
#define ID_RAWCON (0x52415700L) /* 'RAW\0' */ #define ID_RAWCON (0x52415700L) /* 'RAW\0' */
#endif /* ID_RAWCON */ #endif /* ID_RAWCON */
#ifndef ID_BUSY_DISK
#define ID_BUSY_DISK (0x42555359L) /* 'BUSY' */
#endif /* ID_LONGNAME_DOS_DISK */
#ifndef ID_LONGNAME_DOS_DISK
#define ID_LONGNAME_DOS_DISK (0x444F5306L) /* 'DOS\6' */
#endif /* ID_LONGNAME_DOS_DISK */
#ifndef ID_LONGNAME_FFS_DISK
#define ID_LONGNAME_FFS_DISK (0x444F5307L) /* 'DOS\7' */
#endif /* ID_LONGNAME_FFS_DISK */
/****************************************************************************/ /****************************************************************************/
struct fs_info struct fs_info

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: unistd_isatty.c,v 1.10 2008-04-16 07:46:05 obarthel Exp $ * $Id: unistd_isatty.c,v 1.9 2006-11-16 14:39:23 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -67,12 +67,6 @@ isatty(int file_descriptor)
goto out; goto out;
} }
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
{
__set_errno(ENOTTY);
goto out;
}
__fd_lock(fd); __fd_lock(fd);
result = 1; result = 1;

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: unistd_translateu2a.c,v 1.12 2010-08-20 15:33:36 obarthel Exp $ * $Id: unistd_translateu2a.c,v 1.11 2006-10-03 16:36:47 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -50,7 +50,6 @@
* ././foo * ././foo
* foo/./baz * foo/./baz
* foo/./bar/./baz * foo/./bar/./baz
* foo/./././bar
* foo/. * foo/.
* /. * /.
* /tmp * /tmp
@@ -261,7 +260,7 @@ __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translati
D(("name = '%s' (line %ld)",name,__LINE__)); D(("name = '%s' (line %ld)",name,__LINE__));
} }
/* Ditch all embedded '/./' ('foo/./bar' -> 'foo/bar', 'foo/././bar' -> 'foo/bar'). */ /* Ditch all embedded '/./' ('foo/./bar' -> 'foo/bar'). */
if(len > 2) if(len > 2)
{ {
BOOL have_slash_dot_slash = FALSE; BOOL have_slash_dot_slash = FALSE;
@@ -279,11 +278,10 @@ __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translati
{ {
for(i = j = 0 ; i < len ; i++) for(i = j = 0 ; i < len ; i++)
{ {
while(i < len - 2 && name[i] == '/' && name[i + 1] == '.' && name[i + 2] == '/') replace[j++] = name[i];
if(name[i] == '/' && name[i + 1] == '.' && name[i + 2] == '/')
i += 2; i += 2;
if(i < len)
replace[j++] = name[i];
} }
len = j; len = j;
@@ -476,10 +474,10 @@ __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translati
{ {
for(i = j = 0 ; i < len ; i++) for(i = j = 0 ; i < len ; i++)
{ {
if(i < len - 3 && name[i] == '/' && name[i + 1] == '.' && name[i + 2] == '.' && name[i + 3] == '/')
i += 2;
replace[j++] = name[i]; replace[j++] = name[i];
if(name[i] == '/' && name[i + 1] == '.' && name[i + 2] == '.' && name[i + 3] == '/')
i += 2;
} }
len = j; len = j;

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 205 #define REVISION 202
#define DATE "21.8.2010" #define DATE "16.1.2007"
#define VERS "unix.lib 1.205" #define VERS "unix.lib 1.202"
#define VSTRING "unix.lib 1.205 (21.8.2010)\r\n" #define VSTRING "unix.lib 1.202 (16.1.2007)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.205 (21.8.2010)" #define VERSTAG "\0$VER: unix.lib 1.202 (16.1.2007)"

View File

@@ -1 +1 @@
205 202

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: utsname_uname.c,v 1.8 2010-08-20 15:33:36 obarthel Exp $ * $Id: utsname_uname.c,v 1.7 2006-11-13 09:25:28 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -135,9 +135,7 @@ uname(struct utsname *info)
* 45.3 3.9-BB2 * 45.3 3.9-BB2
*/ */
if (Version == 53) if (46 <= Version && Version <= 52)
version_string = "4.1";
else if (46 <= Version && Version <= 52)
version_string = "4.0"; version_string = "4.0";
else if (Version == 45) else if (Version == 45)
version_string = "3.9"; version_string = "3.9";