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

49 Commits

Author SHA1 Message Date
Olaf Barthel
6af7dae39b This commit was manufactured by cvs2svn to create tag 'V1_183'.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/tags/V1_183@14770 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-13 12:55:40 +00:00
Olaf Barthel
e22a226640 c.lib 1.183 (13.11.2004)
- Cleaned up the OS4 build makefile, losing redundant libraries,
  adding more startup object code and ultimatively making the whole
  rebuild logic work again: if code changes and dependencies are
  set up correctly, it will now get rebuilt. Previously, such
  changes went unnoticed and you had to rebuild the entire library
  from scratch.

- Added stubs for CreatePort(), DeletePort(), CreateTask(), DeleteTask()
  and NewList() which have equivalents in exec.library V50 but for which
  it might be useful if ported code didn't have to reference these
  explicitly.

- mktemp() was broken in libunix.a with Unix path semantics enabled.
  This was because the name template was translated and translated
  back again, overwriting the translation buffer. This, funny enough,
  broke Samba's printing feature. Fixed by translating the name only
  before each test for "uniqueness" is made. The new code also handles
  empty "" templates gracefully, which was a problem with both the
  "standard" and the Unix path semantics flavour.

  Why is it that I find bugs like this always after having just
  released another library update?


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14769 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-13 12:55:39 +00:00
Olaf Barthel
3c1df9b1db - mktemp() was broken in libunix.a with Unix path semantics enabled.
This was because the name template was translated and translated
  back again, overwriting the translation buffer. This, funny enough,
  broke Samba's printing feature. Fixed by translating the name only
  before each test for "uniqueness" is made. The new code also handles
  empty "" templates gracefully, which was a problem with both the
  "standard" and the Unix path semantics flavour.

  Why is it that I find bugs like this always after having just
  released another library update?


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14768 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-10 17:45:40 +00:00
Olaf Barthel
655ea577d2 - Modified the amiga.lib Ext/StdIO functions to work well with
the updated system header files.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14767 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-10 14:55:30 +00:00
Olaf Barthel
99e6856c11 c.lib 1.182 (8.11.2004)
- Changed the error abort condition for the %s conversion of the
  scanf() family. It now matches the abort conditions for all other
  conversions and no longer ignores whether any other parameters were
  converted before. This was a quirk in the older implementation.

- The scanf() family now accepts %E and %G in place of %f and %X in
  place of %x.

- Simplified the common code that fopen(), freopen() and fdopen()
  share and which has to figure out by looking at a file access
  mode specification which parameters should be used.

- Dropped error detection in the scanf() family. The EOF has to be
  good enough. Also, ungetc() failure still leads to error handling.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14765 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-08 17:57:52 +00:00
Olaf Barthel
b252f90d66 - Added a few more scanf() tests.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14764 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-08 17:56:32 +00:00
Olaf Barthel
1ed26d0a60 - The __open_iob() function can be made simpler still.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14763 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-03 15:39:04 +00:00
Olaf Barthel
4dd74de299 - Changed the error abort condition for the %s conversion of the
scanf() family. It now matches the abort conditions for all other
  conversions and no longer ignores whether any other parameters were
  converted before. This was a quirk in the older implementation.

- The scanf() family now accepts %E and %G in place of %f and %X in
  place of %x.

- Simplified the common code that fopen(), freopen() and fdopen()
  share and which has to figure out by looking at a file access
  mode specification which parameters should be used.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14762 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-03 15:35:56 +00:00
Olaf Barthel
3b5a4a32a4 c.lib 1.181 (26.10.2004)
- The scanf() family now always returns the number of assignments made
  unless an error occured or an EOF was hit during conversion before the
  first assignment could be made.

- strtok() did not terminate properly if the last token in the string
  did not end with a separator character but with a '\0' byte. Fixed.

- The directory scanning functions opendir/closedir did not get the global
  directory data tracking data structure initialized which later led to
  Enforcer hits and maybe trashed memory. Fixed.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14761 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-26 16:25:04 +00:00
Olaf Barthel
7f7ca50d06 - strtok() did not terminate properly if the last token in the string
did not end with a separator character but with a '\0' byte. Fixed.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14760 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-25 19:53:15 +00:00
Olaf Barthel
0ed8ef67ed - Added the strtok_test program.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14759 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-25 19:50:33 +00:00
Olaf Barthel
267bdc4be6 - The directory scanning functions opendir/closedir did not get the global
directory data tracking data structure initialized which later led to
  Enforcer hits and maybe trashed memory. Fixed.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14758 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-24 20:03:42 +00:00
Olaf Barthel
a7bac89279 c.lib 1.180 (23.10.2004)
- The printf() family now produces no output at all for %e, %f and %g if the
  floating point support code is disabled. Previously, a minimum field width
  specification could take effect, printing a series of 0 or blank space
  characters where no output should have been produced.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14756 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-23 16:38:18 +00:00
Olaf Barthel
95f0617964 - Updated the release notes file to match the contents of the changes file.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14754 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-22 15:57:38 +00:00
Olaf Barthel
4b3dbd3546 - Updated the scanf() test to check if the fixes for the scanf() family
regarding '%x' and leading zeroes in strings to be parsed are really
  working.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14753 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-22 15:55:53 +00:00
Olaf Barthel
b8663a4240 c.lib 1.179 (22.10.2004)
- The scanf() family no longer assumes that a leading '0' indicates that the
  following digits form an octal number if the conversion type has been
  specified as already '%x' already.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14752 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-22 10:57:53 +00:00
Olaf Barthel
aa3ccda8de c.lib 1.178 (7.10.2004)
- The OS4 version had floating point math support code enabled in all
  libraries and not just "libm.a". Fixed.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14750 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-07 14:58:03 +00:00
Thomas Frieden
8062f49f1c Fixes for compiler errors with soft-float
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14749 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-07 11:03:46 +00:00
Olaf Barthel
1310865c33 - Floating point support code generation was enabled for the entire PowerPC
library, and not just for "libm.a". Fixed.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14748 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-07 09:20:44 +00:00
Olaf Barthel
2ed76311fd - Updated the release notes file.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14747 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-02 15:59:40 +00:00
Olaf Barthel
3f19d52557 - Fixed the stack swapping function which, for reasons unknown, ceased to work.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14746 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-02 15:56:13 +00:00
Olaf Barthel
7038751f6b - Updated the .cvsignore file to ignore the _rev.i and _rev.s files.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14745 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-10-01 15:56:54 +00:00
Olaf Barthel
5d9e4c07a6 - The start time used by clock() is now initialized by a constructor
function.

- NOTE THAT ALL THE CHANGES WITH REGARD TO USE OF DESTRUCTOR AND
  CONSTRUCTOR FUNCTIONS REQUIRE A COMPLETE REBUILD OF THE LIBRARY! IF
  YOU DO NOT DO THIS, THE CONSTRUCTOR/DESTRUCTOR FUNCTIONS MAY NOT
  GET CALLED.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14744 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 19:57:58 +00:00
Olaf Barthel
f49a45f6a8 - The socket exit code now calls the common stdio function which
flushes and shuts down all buffered and unbuffered files.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14743 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 17:03:57 +00:00
Olaf Barthel
fef99a0181 - Reversed the 'unsigned long' -> 'ULONG' change in the constructor
handling code. It is not necessary.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14742 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 16:54:54 +00:00
Olaf Barthel
17a0e794c5 - Added an OS4 specific build makefile.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14741 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 14:37:10 +00:00
Olaf Barthel
64f39b51ae - Modified the socket functions which now take parameters to constant
pointers.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14740 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 14:31:57 +00:00
Olaf Barthel
a7e0bc8e16 - Fixed fabs() for PowerPC soft-float support; previously, the function
definitions would clash.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14739 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 14:30:03 +00:00
Olaf Barthel
14595cc0a8 - unistd_timer.c was missing...
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14738 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 14:21:34 +00:00
Olaf Barthel
8555296691 c.lib 1.177 (29.9.2004)
- Moved the locale initialization/cleanup code into constructors
  and destructors.

- The socket cleanup function is now a destructor.

- The math cleanup function is now a destructor.

- The wildcard cleanup function is now a destructor.

- The stdio cleanup function is now a destructor.

- The stack extension cleanup function is now a destructor.

- The code that cleans up after the program's current directory
  was changed is now a destructor function.

- Moved the initialization/cleanup code for unlink() into constructors
  and destructors.

- Moved the initialization/cleanup code for usergroup.library into
  constructors and destructors.

- Added usleep(), and created wrapper code that both sleep() and
  usleep() can use.

- Added strtoll() and strtoull(), with further changes to <limits.h>
  and <stdlib.h>.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14737 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 14:17:46 +00:00
Olaf Barthel
53bb602493 - Added usleep(), and created wrapper code that both sleep() and
usleep() can use.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14736 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 12:10:35 +00:00
Olaf Barthel
a048eadf09 - The timeval definition should work with OS 3.1 compatible header files again.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14735 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-29 10:15:57 +00:00
Thomas Frieden
51e20cee1d Bumped revision
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14733 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-27 15:11:20 +00:00
Thomas Frieden
618af18519 Compiling with soft-float now ommits storing the FPU registers
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14732 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-27 15:07:20 +00:00
Thomas Frieden
0cbc101798 Some adjustments so that the function is available even in non-FPU code
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14731 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-27 15:06:19 +00:00
Thomas Frieden
5d508c6e6d Added soft-float and small data targets
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14730 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-27 15:04:51 +00:00
Olaf Barthel
a4b138e406 - Added strtoll() and strtoull(), with further changes to <limits.h>
and <stdlib.h>.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14729 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-20 17:16:07 +00:00
Olaf Barthel
7d21a272cc - Changed the stack layout used for the StackSwap() call.
- Cleaned up the commented-out sections that deal with the SAS/C
  profiling code.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14728 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-18 09:03:30 +00:00
Olaf Barthel
7ae8399e43 - Fixed the broken umask() function definition for GCC 68k and SAS/C: it
does have a return value...


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14727 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-16 08:45:03 +00:00
Jens Maus
0d101fd928 - added .cvsignore file to make sure autogenerated files/dirs are not
added to the repository


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14726 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-10 09:06:37 +00:00
Olaf Barthel
6a2db55fc2 - Added the test program for the sprintf() buffer flush bug, courtesy of
Jens Langner.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14725 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-10 07:41:13 +00:00
Olaf Barthel
6214bc2067 c.lib 1.175 (10.9.2004)
- <stdarg.h> now tries to use the compiler supplied, machine specific
  <stdarg.h> file and also includes the OS4-specifc <sys/amigaos-va.h>
  file, if necessary.

- Added another test to <sys/time.h> to check if the "timeval" definition is
  already in place. If it is, <exec/types.h> will not be included.

- <sys/time.h> can be made to define the timeval data structure locally if
  the __USE_CLIB2_TIMEVAL preprocessor symbol is defined. In this case no
  <exec/types.h> or <devices/timer.h> file will be read.

- The sprintf() family did not properly handle empty strings as format
  specifications. This would result in a necessary buffer flush action
  getting skipped, which consequently did not put the string termination
  character into the output buffer.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14723 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-10 07:39:20 +00:00
Olaf Barthel
4a4c8b2ef9 - Moved the POSIX<->Amiga timeval member variable definitions again.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14722 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-09 10:56:24 +00:00
Olaf Barthel
f3c4ee68cd - Broke down the tests for the __TIMEVAL_ALREADY_DEFINED and DEVICES_TIMER_H
symbols into two lines.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14721 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-09 08:30:31 +00:00
Olaf Barthel
0848048029 - <stdarg.h> now tries to use the compiler supplied, machine specific
<stdarg.h> file and also includes the OS4-specifc <sys/amigaos-va.h>
  file, if necessary.

- Added another test to <sys/time.h> to check if the "timeval" definition is
  already in place. If it is, <exec/types.h> will not be included.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14720 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-09-09 08:25:31 +00:00
Olaf Barthel
dfd3dc3170 - Replaced the rint() and rintf() functions with the fdlibm code.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14719 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-08-27 13:49:17 +00:00
Olaf Barthel
5d705f3c30 c.lib 1.174 (27.8.2004)
- The parameters of atan2() were swapped. Fixed.

- Merged fdlibm 5.3 changes with __kernel_tan(), __exp() and __pow()
  functions.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14718 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-08-27 11:40:49 +00:00
Olaf Barthel
51f1dacdfa c.lib 1.173 (25.8.2004)
- The <assert.h> header file was missing the C++ 'extern "C" { .. }'
  declarations.

- Added a new function __get_default_file() which allows direct access
  to the low level file handle/socket descriptor associated with a
  file descriptor.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14716 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-08-25 15:27:28 +00:00
Olaf Barthel
56e788a268 - Removed the USE_64_BIT_INTS definition from the GCC-68k makefile.
Apparently, the 64 bit integer math still doesn't work right in the
  plain 68k libgcc.a.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14715 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-08-23 13:47:32 +00:00
98 changed files with 2226 additions and 1048 deletions

View File

@@ -1,5 +1,5 @@
#
# $Id: GNUmakefile.68k,v 1.6 2004-08-16 09:33:11 obarthel Exp $
# $Id: GNUmakefile.68k,v 1.14 2004-11-13 12:55:39 obarthel Exp $
#
# :ts=8
#
@@ -9,7 +9,7 @@
CC = gcc
AR = ar -q
RANLIB = ranlib
COPY = copy clone
COPY = copy clone buf=0
DELETE = delete all quiet
MAKEDIR = makedir
MAKE = make -f GNUmakefile.68k
@@ -40,7 +40,7 @@ endif
.c.o:
@echo "Compiling $<"
@$(CC) -c $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT $<
@$(CC) -c $(CFLAGS) $<
$(LIBC_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):c]"
@@ -103,9 +103,9 @@ WARNINGS = \
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
INCLUDES = -Iinclude -I. -Inetinclude
OPTIONS = -DUSE_64_BIT_INTS -DNDEBUG -fno-builtin -DNO_INLINE_STDARG
#OPTIONS = -DUSE_64_BIT_INTS -D__MEM_DEBUG -fno-builtin
#OPTIONS = -DUSE_64_BIT_INTS -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
OPTIONS = -DNDEBUG -fno-builtin -DNO_INLINE_STDARG
#OPTIONS = -D__MEM_DEBUG -fno-builtin
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
OPTIMIZE = -O
#OPTIMIZE = -O2 -fomit-frame-pointer
#DEBUG = -g2
@@ -144,9 +144,9 @@ C_LIB = \
fcntl_open.o \
fcntl_read.o \
fcntl_write.o \
fcntl_get_default_file.o \
libgen_basename.o \
libgen_dirname.o \
locale_data.o \
locale_init_exit.o \
locale_localeconv.o \
locale_setlocale.o \
@@ -306,6 +306,8 @@ C_LIB = \
stdlib_startup.o \
stdlib_strtol.o \
stdlib_strtoul.o \
stdlib_strtoll.o \
stdlib_strtoull.o \
stdlib_swapstack.o \
stdlib_sysbase.o \
stdlib_system.o \
@@ -315,7 +317,6 @@ C_LIB = \
stdlib_udivsi4.o \
stdlib_umodsi3.o \
stdlib_unsetenv.o \
stdlib_usergroup.o \
stdlib_wildcard_expand.o \
strings_strcasecmp.o \
strings_strncasecmp.o \
@@ -361,9 +362,9 @@ C_LIB = \
time_time.o \
unistd_access.o \
unistd_chdir.o \
unistd_chdir_exit.o \
unistd_chown.o \
unistd_currentpathname.o \
unistd_data.o \
unistd_dup.o \
unistd_dup2.o \
unistd_fchown.o \
@@ -381,8 +382,11 @@ C_LIB = \
unistd_realpath.o \
unistd_sleep.o \
unistd_symlink.o \
unistd_timer.o \
unistd_time_delay.o \
unistd_truncate.o \
unistd_unlink.o \
unistd_usleep.o \
utime_utime.o
UNIX_LIB = \
@@ -395,6 +399,7 @@ UNIX_LIB = \
fcntl_creat.o \
fcntl_fcntl.o \
fcntl_open.o \
fcntl_get_default_file.o \
mount_convertinfo.o \
mount_statfs.o \
stat_chmod.o \
@@ -420,6 +425,7 @@ UNIX_LIB = \
stdlib_system.o \
unistd_access.o \
unistd_chdir.o \
unistd_chdir_exit.o \
unistd_chown.o \
unistd_getcwd.o \
unistd_lchown.o \
@@ -481,7 +487,6 @@ MATH_LIB = \
stdio_vasprintf.o \
stdio_vfprintf.o \
stdio_vfscanf.o \
stdio_vfscanf.o \
stdio_vprintf.o \
stdio_vsnprintf.o \
stdio_vsprintf.o \
@@ -682,7 +687,6 @@ LIBS_68K := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libu
$(LIBNET_OBJS)/libnet.a $(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
$(LIBM_OBJS)/libm.a
LIBS_020 := $(LIBM881_OBJS)/libm881.a $(LIBS_68K)
#LIBS_020 := $(LIBS_68K)
##############################################################################
@@ -708,8 +712,8 @@ all: \
lib/mainnb.o \
lib/mainb.o \
lib/mainb32.o \
lib/libm.a \
lib/libm020/libm.a \
lib/libm.a \
lib/libb/libm.a \
lib/libb/libm020/libm.a \
lib/libb32/libm020/libm.a

View File

@@ -1,5 +1,5 @@
#
# $Id: GNUmakefile.os4,v 1.5 2004-08-16 09:33:11 obarthel Exp $
# $Id: GNUmakefile.os4,v 1.13 2004-11-13 12:55:39 obarthel Exp $
#
# :ts=8
#
@@ -35,7 +35,6 @@ ifeq (,$(TYPE))
LIBC_OBJS = libc_objs
LIBUNIX_OBJS = libunix_objs
LIBM_OBJS = libm_objs
LIBSTACK_OBJS = libstack_objs
LIBNET_OBJS = libnet_objs
LIBDEBUG_OBJS = libdebug_objs
LIBAMIGA_OBJS = libamiga_objs
@@ -43,7 +42,6 @@ else
LIBC_OBJS = $(TYPE)/libc_objs
LIBUNIX_OBJS = $(TYPE)/libunix_objs
LIBM_OBJS = $(TYPE)/libm_objs
LIBSTACK_OBJS = $(TYPE)/libstack_objs
LIBNET_OBJS = $(TYPE)/libnet_objs
LIBDEBUG_OBJS = $(TYPE)/libdebug_objs
LIBAMIGA_OBJS = $(TYPE)/libamiga_objs
@@ -51,9 +49,10 @@ endif
##############################################################################
# General build rules for all object files and the individual libraries
%.o : %.c
@echo "Compiling $<"
@$(CC) -c $(CFLAGS) -DPPC_FLOATING_POINT_SUPPORT $<
@$(CC) -c $(CFLAGS) $<
$(LIBC_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):c]"
@@ -65,11 +64,7 @@ $(LIBUNIX_OBJS)/%.o : %.c
$(LIBM_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):m]"
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) -DPPC_FLOATING_POINT_SUPPORT $<
$(LIBSTACK_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):stack]"
@$(CC) -o $(LIBSTACK_OBJS)/$*.o -c $(CFLAGS) $<
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) $(FLOAT_TYPE) $<
$(LIBNET_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):net]"
@@ -85,12 +80,20 @@ $(LIBAMIGA_OBJS)/%.o : %.c
##############################################################################
# Build options for the individual libraries
ifeq (small_data,$(TYPE))
CODE_TYPE := -msdata=sysv -DSMALL_DATA
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
endif
ifeq (large_data,$(TYPE))
CODE_TYPE := -msdata=data
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
endif
ifeq (large_data_softfloat,$(TYPE))
CODE_TYPE := -msdata=data -msoft-float
FLOAT_TYPE :=
endif
##############################################################################
@@ -101,13 +104,14 @@ WARNINGS = \
INCLUDES = -Iinclude -I. -I$(SDK_INCLUDE)
OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -fno-builtin -D__USE_INLINE__ -Wa,-mregnames
OPTIMIZE = -O3 -fomit-frame-pointer -funroll-loops
OPTIMIZE = -O -fomit-frame-pointer -funroll-loops
#DEBUG = -g
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDES)
##############################################################################
# All objects files which make up libc.a
C_LIB = \
c.lib_rev.o \
ctype_isalnum.o \
@@ -127,9 +131,9 @@ C_LIB = \
ctype_table.o \
dirent_closedir.o \
dirent_data.o \
dirent_rewinddir.o \
dirent_opendir.o \
dirent_readdir.o \
dirent_rewinddir.o \
errno_data.o \
fcntl_close.o \
fcntl_creat.o \
@@ -138,9 +142,9 @@ C_LIB = \
fcntl_open.o \
fcntl_read.o \
fcntl_write.o \
fcntl_get_default_file.o \
libgen_basename.o \
libgen_dirname.o \
locale_data.o \
locale_init_exit.o \
locale_localeconv.o \
locale_setlocale.o \
@@ -248,39 +252,36 @@ C_LIB = \
stdlib_atol.o \
stdlib_bsearch.o \
stdlib_calloc.o \
stdlib_checkdetach.o \
stdlib_constructor.o \
stdlib_constructor_begin.o \
stdlib_constructor_end.o \
stdlib_data.o \
stdlib_default_pool_size.o \
stdlib_default_puddle_size.o \
stdlib_destructor.o \
stdlib_detach.o \
stdlib_disablerequesters.o \
stdlib_div.o \
stdlib_modsi3.o \
stdlib_divsi3.o \
stdlib_divsi4.o \
stdlib_umodsi3.o \
stdlib_udivsi3.o \
stdlib_udivsi4.o \
stdlib_dosbase.o \
stdlib_exit.o \
stdlib_free.o \
stdlib_getdefstacksize.o \
stdlib_getenv.o \
stdlib_getsp.o \
stdlib_init_exit.o \
stdlib_isresident.o \
stdlib_labs.o \
stdlib_ldiv.o \
stdlib_getdefstacksize.o \
stdlib_stackargbytes.o \
stdlib_stack_usage.o \
stdlib_checkdetach.o \
stdlib_detach.o \
stdlib_isresident.o \
stdlib_sysbase.o \
stdlib_dosbase.o \
stdlib_machine_test.o \
stdlib_malloc.o \
stdlib_math.o \
stdlib_mkdtemp.o \
stdlib_mkstemp.o \
stdlib_mktemp.o \
stdlib_modsi3.o \
stdlib_mulsi3.o \
stdlib_never_free.o \
stdlib_putenv.o \
@@ -294,19 +295,26 @@ C_LIB = \
stdlib_showerror.o \
stdlib_socket.o \
stdlib_srand.o \
stdlib_stackargbytes.o \
stdlib_stackcheck.o \
stdlib_stackoverflow.o \
stdlib_stacksafezone.o \
stdlib_stacksize.o \
stdlib_stack_usage.o \
stdlib_startup.o \
stdlib_strtol.o \
stdlib_strtoul.o \
stdlib_strtoll.o \
stdlib_strtoull.o \
stdlib_swapstack.o \
stdlib_sysbase.o \
stdlib_system.o \
stdlib_termination_message.o \
stdlib_threshold.o \
stdlib_udivsi3.o \
stdlib_udivsi4.o \
stdlib_umodsi3.o \
stdlib_unsetenv.o \
stdlib_usergroup.o \
stdlib_wildcard_expand.o \
strings_strcasecmp.o \
strings_strncasecmp.o \
@@ -352,9 +360,9 @@ C_LIB = \
time_time.o \
unistd_access.o \
unistd_chdir.o \
unistd_chdir_exit.o \
unistd_chown.o \
unistd_currentpathname.o \
unistd_data.o \
unistd_dup.o \
unistd_dup2.o \
unistd_fchown.o \
@@ -372,21 +380,25 @@ C_LIB = \
unistd_realpath.o \
unistd_sleep.o \
unistd_symlink.o \
unistd_timer.o \
unistd_time_delay.o \
unistd_truncate.o \
unistd_unlink.o \
unistd_usleep.o \
utime_utime.o
# All objects files which make up libunix.a
UNIX_LIB = \
unix.lib_rev.o \
dirent_closedir.o \
dirent_data.o \
dirent_rewinddir.o \
dirent_opendir.o \
dirent_readdir.o \
dirent_rewinddir.o \
fcntl_creat.o \
fcntl_fcntl.o \
fcntl_open.o \
fcntl_get_default_file.o \
mount_convertinfo.o \
mount_statfs.o \
stat_chmod.o \
@@ -396,12 +408,12 @@ UNIX_LIB = \
stat_rmdir.o \
stat_stat.o \
stdio_fdhookentry.o \
stdio_init_exit.o \
stdio_locksemaphorename.o \
stdio_openiob.o \
stdio_fflush.o \
stdio_fopen.o \
stdio_fopen.o \
stdio_init_exit.o \
stdio_locksemaphorename.o \
stdio_openiob.o \
stdio_popen.o \
stdio_remove.o \
stdio_rename.o \
@@ -412,6 +424,7 @@ UNIX_LIB = \
stdlib_system.o \
unistd_access.o \
unistd_chdir.o \
unistd_chdir_exit.o \
unistd_chown.o \
unistd_getcwd.o \
unistd_lchown.o \
@@ -430,6 +443,7 @@ UNIX_LIB = \
unistd_wildcard_expand.o \
utime_utime.o
# All objects files which make up libm.a
MATH_LIB = \
math_acos.o \
math_asin.o \
@@ -479,7 +493,6 @@ MATH_LIB = \
stdio_vasprintf.o \
stdio_vfprintf.o \
stdio_vfscanf.o \
stdio_vfscanf.o \
stdio_vprintf.o \
stdio_vsnprintf.o \
stdio_vsprintf.o \
@@ -488,48 +501,7 @@ MATH_LIB = \
stdlib_strtod.o \
time_difftime.o
MATH_LIB_IEEE = \
m.lib_rev.o \
$(MATH_LIB) \
math_adddf3.o \
math_addsf3.o \
math_divdf3.o \
math_divsf3.o \
math_eqdf2.o \
math_eqsf2.o \
math_extendsfdf2.o \
math_fixdfsi.o \
math_fixsfsi.o \
math_fixunsdfsi.o \
math_fixunssfsi.o \
math_floatsidf.o \
math_floatsisf.o \
math_gedf2.o \
math_gesf2.o \
math_gtdf2.o \
math_gtsf2.o \
math_ledf2.o \
math_lesf2.o \
math_ltdf2.o \
math_ltsf2.o \
math_muldf3.o \
math_mulsf3.o \
math_nedf2.o \
math_negdf2.o \
math_negsf2.o \
math_nesf2.o \
math_subdf3.o \
math_subsf3.o \
math_truncdfsf2.o
STACK_LIB = \
stack.lib_rev.o \
stdlib_setjmp.o \
stdlib_stackextension.o \
stdlib_stackminframe.o \
stdlib_stackoverflow.o \
stdlib_stacksafezone.o
# All objects files which make up libnet.a
NET_LIB = \
net.lib_rev.o \
socket_accept.o \
@@ -573,6 +545,7 @@ NET_LIB = \
socket_socket.o \
socket_hook_entry.o \
socket_hstrerror.o \
stat_umask.o \
usergroup_crypt.o \
usergroup_data.o \
usergroup_endgrent.o \
@@ -601,13 +574,12 @@ NET_LIB = \
usergroup_setregid.o \
usergroup_setreuid.o \
usergroup_setsid.o \
usergroup_setuid.o \
stat_umask.o
usergroup_setuid.o
# All objects files which make up libdebug.a
DEBUG_LIB = \
debug.lib_rev.o \
debug.o \
debug_level.o \
debug_cmpstrexec.o \
debug_kcmpstr.o \
debug_kdofmt.o \
@@ -633,8 +605,10 @@ DEBUG_LIB = \
debug_kputstr1.o \
debug_kputstr2.o \
debug_kvprintf1.o \
debug_kvprintf2.o
debug_kvprintf2.o \
debug_level.o
# All objects files which make up libamiga.a
AMIGA_LIB = \
amiga.lib_rev.o \
amiga_acrypt.o \
@@ -643,10 +617,17 @@ AMIGA_LIB = \
amiga_argarrayinit.o \
amiga_argint.o \
amiga_argstring.o \
amiga_beginio.o \
amiga_callhooka.o \
amiga_coercemethod.o \
amiga_createextio.o \
amiga_createport.o \
amiga_createstdio.o \
amiga_createtask.o \
amiga_deleteextio.o \
amiga_deleteport.o \
amiga_deletestdio.o \
amiga_deletetask.o \
amiga_domethod.o \
amiga_dosupermethod.o \
amiga_dotimer.o \
@@ -654,6 +635,7 @@ AMIGA_LIB = \
amiga_freeievents.o \
amiga_hotkey.o \
amiga_invertstring.o \
amiga_newlist.o \
amiga_rangerand.o \
amiga_remtof.o \
amiga_setsuperattrs.o \
@@ -662,41 +644,52 @@ AMIGA_LIB = \
##############################################################################
LIBS := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libunix.a \
$(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
$(LIBM_OBJS)/libm.a $(LIBNET_OBJS)/libnet.a
# The libraries to be built, prefixed by the respective path names
LIBS := \
$(LIBC_OBJS)/libc.a \
$(LIBUNIX_OBJS)/libunix.a \
$(LIBDEBUG_OBJS)/libdebug.a \
$(LIBAMIGA_OBJS)/libamiga.a \
$(LIBM_OBJS)/libm.a \
$(LIBNET_OBJS)/libnet.a
##############################################################################
# The startup object files to be built
STARTUPS := bcrt0.o bcrtbegin.o bcrtend.o crt0.o crtbegin.o crtend.o mainb.o mainnb.o
##############################################################################
STARTUPS := crt0.o crtbegin.o crtend.o mainnb.o
##############################################################################
# This is the first target: it creates the necessary directories, then proceeds
# to build the startup object files and finally the libraries
all: \
lib \
lib/soft-float \
lib/small-data \
small_data \
large_data \
large_data_softfloat \
lib/bcrt0.o \
lib/bcrtbegin.o \
lib/bcrtend.o \
lib/crt0.o \
lib/crtbegin.o \
lib/crtend.o \
lib/mainb.o \
lib/mainnb.o \
lib/libm.a
copy:
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
lib/libm.a \
lib/small-data/libm.a \
lib/soft-float/libm.a
##############################################################################
# Delete all object files and libraries
clean:
-$(DELETE) $(TYPE) $(STARTUPS) \
$(LIBC_OBJS) $(LIBUNIX_OBJS) $(LIBM_OBJS) $(LIBSTACK_OBJS) $(LIBNET_OBJS) $(LIBDEBUG_OBJS) $(LIBAMIGA_OBJS)
realclean:
$(MAKE) clean
-$(DELETE) lib small_data large_data
-$(DELETE) $(STARTUPS) lib small_data large_data large_data_softfloat
##############################################################################
# Update the version numbers bound to the individual libraries
version:
cp c.lib_rev.rev amiga.lib_rev.rev
cp c.lib_rev.rev debug.lib_rev.rev
@@ -716,33 +709,74 @@ version:
##############################################################################
# Tag all files with a certain version number
cvs-tag:
cvs -q tag V1_`cat c.lib_rev.rev`
##############################################################################
kitchen_sink: $(TYPE) $(LIBS) $(STARTUPS)
##############################################################################
ifneq (,$(TYPE))
$(TYPE):
$(MAKEDIR) $@
endif
# This target first creates a directory to store the object files in, then
# proceeds to build the libraries from the code. It is invoked by the
# individual library build targets below.
all_libraries: $(TYPE) $(LIBS)
##############################################################################
# These create the required subdirectories to store object files and
# libraries in
lib:
-$(MAKEDIR) $@
lib/libm.a: lib
$(MAKE) TYPE=large_data kitchen_sink
lib/small-data: lib
-$(MAKEDIR) $@
lib/soft-float: lib
-$(MAKEDIR) $@
small_data:
-$(MAKEDIR) $@
large_data:
-$(MAKEDIR) $@
large_data_softfloat:
-$(MAKEDIR) $@
##############################################################################
# Dependencies for libm.a (large data variant with hardware floating point code
# support): this actually ends up building all the libraries rather than just
# libm.a
lib/libm.a: large_data large_data/libm.a
large_data/libm.a:
$(MAKE) TYPE=large_data all_libraries
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
lib/small-data/libm.a: lib lib/small-data
$(MAKE) TYPE=small_data kitchen_sink
##############################################################################
# Dependencies for libm.a (large data variant with software floating point code
# support): this actually ends up building all the libraries rather than just
# libm.a
lib/soft-float/libm.a: large_data_softfloat large_data_softfloat/libm.a
large_data_softfloat/libm.a:
$(MAKE) TYPE=large_data_softfloat all_libraries
$(COPY) $(foreach file,$(LIBS),large_data_softfloat/$(file)) lib/soft-float
##############################################################################
# Dependencies for libm.a (small data variant): this actually ends up building all
# the libraries rather than just libm.a
lib/small-data/libm.a: small_data small_data/libm.a
small_data/libm.a:
$(MAKE) TYPE=small_data all_libraries
$(COPY) $(foreach file,$(LIBS),small_data/$(file)) lib/small-data
##############################################################################
# Rules to build and move the startup code
lib/crt0.o : lib crt0.o
$(COPY) crt0.o lib
@@ -758,24 +792,46 @@ lib/mainnb.o : lib mainnb.o
lib/mainb.o : lib mainb.o
$(COPY) mainb.o lib
lib/bcrt0.o : lib bcrt0.o
$(COPY) bcrt0.o lib
lib/bcrtbegin.o : lib bcrtbegin.o
$(COPY) bcrtbegin.o lib
lib/bcrtend.o : lib bcrtend.o
$(COPY) bcrtend.o lib
##############################################################################
$(LIBAMIGA_OBJS)/amiga_hookentry.o : amiga_hookentry.c
# Individual dependencies which tell make to build the object files from
# 'C' source files rather than the assembly language source files of the
# same name (e.g. stdlib_getsp.c instead of stdlib_getsp.asm).
$(LIBC_OBJS)/stdlib_getsp.o : stdlib_getsp.c
$(LIBC_OBJS)/stdlib_swapstack.o : stdlib_swapstack.c
$(LIBC_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
$(LIBSTACK_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
##############################################################################
# Build rules for version information that goes into each library
$(LIBC_OBJS)/c.lib_rev.o : c.lib_rev.c c.lib_rev.h
$(LIBUNIX_OBJS)/unix.lib_rev.o : unix.lib_rev.c unix.lib_rev.h
$(LIBM_OBJS)/m.lib_rev.o : m.lib_rev.c m.lib_rev.h
$(LIBNET_OBJS)/net.lib_rev.o : net.lib_rev.c net.lib_rev.h
$(LIBDEBUG_OBJS)/debug.lib_rev.o : debug.lib_rev.c debug.lib_rev.h
$(LIBAMIGA_OBJS)/amiga.lib_rev.o : amiga.lib_rev.c amiga.lib_rev.h
##############################################################################
$(LIBC_OBJS)/stdlib_stacksize.o : stdlib_stacksize.c stdlib_gcc_help.h
$(LIBC_OBJS)/stdlib_shell_escape.o : stdlib_shell_escape.c stdlib_gcc_help.h
# Build rules for the debug version of the library which has special
# memory allocation debugging code, controlled by the contents of
# the stdlib_mem_debug.h file.
$(LIBC_OBJS)/stdlib_alloca.o : stdlib_alloca.c stdlib_mem_debug.h
$(LIBC_OBJS)/stdlib_calloc.o : stdlib_calloc.c stdlib_mem_debug.h
@@ -792,6 +848,7 @@ $(LIBC_OBJS)/stdlib_red_black.o : stdlib_red_black.c stdlib_mem_debug.h
##############################################################################
# Individual build rules for libc.a
$(LIBC_OBJS) :
$(MAKEDIR) $@
@@ -802,6 +859,7 @@ $(LIBC_OBJS)/libc.a : $(LIBC_OBJS) $(foreach file,$(C_LIB),$(LIBC_OBJS)/$(file))
##############################################################################
# Individual build rules for libunix.a
$(LIBUNIX_OBJS) :
$(MAKEDIR) $@
@@ -812,26 +870,18 @@ $(LIBUNIX_OBJS)/libunix.a : $(LIBUNIX_OBJS) $(foreach file,$(UNIX_LIB),$(LIBUNIX
##############################################################################
# Individual build rules for libm.a
$(LIBM_OBJS) :
$(MAKEDIR) $@
$(LIBM_OBJS)/libm.a : $(LIBM_OBJS) $(foreach file,$(MATH_LIB_IEEE),$(LIBM_OBJS)/$(file))
$(LIBM_OBJS)/libm.a : $(LIBM_OBJS) $(foreach file,$(MATH_LIB),$(LIBM_OBJS)/$(file))
-$(DELETE) $@
@$(AR) $@ $(foreach file,$(MATH_LIB_IEEE),$(LIBM_OBJS)/$(file))
$(RANLIB) $@
##############################################################################
$(LIBSTACK_OBJS) :
$(MAKEDIR) $@
$(LIBSTACK_OBJS)/libstack.a : $(LIBSTACK_OBJS) $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
-$(DELETE) $@
@$(AR) $@ $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
@$(AR) $@ $(foreach file,$(MATH_LIB),$(LIBM_OBJS)/$(file))
$(RANLIB) $@
##############################################################################
# Individual build rules for libnet.a
$(LIBNET_OBJS) :
$(MAKEDIR) $@
@@ -842,6 +892,7 @@ $(LIBNET_OBJS)/libnet.a : $(LIBNET_OBJS) $(foreach file,$(NET_LIB),$(LIBNET_OBJS
##############################################################################
# Individual build rules for libdebug.a
$(LIBDEBUG_OBJS) :
$(MAKEDIR) $@
@@ -852,6 +903,7 @@ $(LIBDEBUG_OBJS)/libdebug.a : $(LIBDEBUG_OBJS) $(foreach file,$(DEBUG_LIB),$(LIB
##############################################################################
# Individual build rules for libamiga.a
$(LIBAMIGA_OBJS) :
$(MAKEDIR) $@
@@ -862,6 +914,7 @@ $(LIBAMIGA_OBJS)/libamiga.a : $(LIBAMIGA_OBJS) $(foreach file,$(AMIGA_LIB),$(LIB
##############################################################################
# Individual build rules for the startup code.
crt0.o : crt0.S
@echo "Assembling $<"
@$(CC) -Wa,-mregnames -o crt0.o -c crt0.S
@@ -878,11 +931,8 @@ mainb.o : stdlib_main.c
@echo "Compiling $<"
@$(CC) -o mainb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA stdlib_main.c
##############################################################################
bcrtbegin.o : crtbegin.c
$(CC) -o bcrtbegin.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA crtbegin.c
mkid:
# mkid -v #?.(c|h|asm|i) include/#?.(c|h|asm|i) include/sys/#?.(c|h|asm|i)
mkid *.[ch] include/*.h include/sys/*.h
update:
mkid -v -u
bcrtend.o : crtend.c
$(CC) -o bcrtend.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA crtend.c

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 172
#define DATE "21.8.2004"
#define VERS "amiga.lib 1.172"
#define VSTRING "amiga.lib 1.172 (21.8.2004)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.172 (21.8.2004)"
#define REVISION 183
#define DATE "13.11.2004"
#define VERS "amiga.lib 1.183"
#define VSTRING "amiga.lib 1.183 (13.11.2004)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.183 (13.11.2004)"

View File

@@ -1 +1 @@
172
183

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_beginio.c,v 1.1.1.1 2004-07-26 16:30:17 obarthel Exp $
* $Id: amiga_beginio.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -37,6 +37,14 @@
/****************************************************************************/
#include "debug.h"
/****************************************************************************/
#ifndef __PPC__
/****************************************************************************/
#if defined(__SASC)
VOID __begin_io(struct IORequest * ior);
@@ -64,10 +72,6 @@ VOID __begin_io(struct IORequest * ior);
/****************************************************************************/
#include "debug.h"
/****************************************************************************/
VOID
BeginIO(struct IORequest *ior)
{
@@ -82,3 +86,35 @@ BeginIO(struct IORequest *ior)
LEAVE();
}
/****************************************************************************/
#else
/****************************************************************************/
#include <proto/exec.h>
/****************************************************************************/
#if defined(BeginIO)
#undef BeginIO
#endif /* BeginIO */
/****************************************************************************/
VOID
BeginIO(struct IORequest *ior)
{
ENTER();
assert( ior != NULL && ior->io_Device != NULL );
IExec->BeginIO(ior);
LEAVE();
}
/****************************************************************************/
#endif /* __PPC__ */

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createextio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_createextio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(CreateExtIO)
#undef CreateExtIO
#endif /* CreateExtIO */
/****************************************************************************/
struct IORequest *
CreateExtIO(CONST struct MsgPort * port, LONG io_size)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createport.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_createport.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(CreatePort)
#undef CreatePort
#endif /* CreatePort */
/****************************************************************************/
struct MsgPort *
CreatePort(CONST_STRPTR name, LONG pri)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createstdio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_createstdio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(CreateStdIO)
#undef CreateStdIO
#endif /* CreateStdIO */
/****************************************************************************/
struct IOStdReq *
CreateStdIO(CONST struct MsgPort * port)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createtask.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_createtask.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -31,8 +31,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __PPC__
/****************************************************************************/
#include <exec/libraries.h>
@@ -53,6 +51,10 @@
/****************************************************************************/
#ifndef __PPC__
/****************************************************************************/
/*
* Create a task with given name, priority, and stack size.
* It will use the default exception and trap handlers for now.
@@ -191,4 +193,44 @@ CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
/****************************************************************************/
#else
/****************************************************************************/
#if defined(CreateTask)
#undef CreateTask
#endif /* CreateTask */
/****************************************************************************/
struct Task *
CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
{
struct Task * result = NULL;
ENTER();
SHOWSTRING(name);
SHOWVALUE(pri);
SHOWPOINTER(init_pc);
SHOWVALUE(stack_size);
assert( name != NULL && (-128 <= pri && pri <= 127) && init_pc != NULL && stack_size > 0 );
if(name == NULL || pri < -128 || pri > 127 || init_pc == NULL || stack_size == 0)
{
SHOWMSG("invalid parameters");
goto out;
}
result = IExec->CreateTask(name,pri,init_pc,stack_size,NULL);
out:
RETURN(result);
return(result);
}
/****************************************************************************/
#endif /* __PPC__ */

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deleteextio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_deleteextio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(DeleteExtIO)
#undef DeleteExtIO
#endif /* DeleteExtIO */
/****************************************************************************/
VOID
DeleteExtIO(struct IORequest * io)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deleteport.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
* $Id: amiga_deleteport.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(DeletePort)
#undef DeletePort
#endif /* DeletePort */
/****************************************************************************/
VOID
DeletePort(struct MsgPort * port)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deletestdio.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
* $Id: amiga_deletestdio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(DeleteStdIO)
#undef DeleteStdIO
#endif /* DeleteStdIO */
/****************************************************************************/
VOID
DeleteStdIO(struct IOStdReq * io)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deletetask.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
* $Id: amiga_deletetask.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -41,8 +41,34 @@
/****************************************************************************/
#ifndef __PPC__
/****************************************************************************/
VOID
DeleteTask(struct Task *tc)
{
RemTask(tc);
}
/****************************************************************************/
#else
/****************************************************************************/
#if defined(DeleteTask)
#undef DeleteTask
#endif /* DeleteTask */
/****************************************************************************/
VOID
DeleteTask(struct Task *tc)
{
IExec->DeleteTask(tc);
}
/****************************************************************************/
#endif /* __PPC__ */

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 172
#define DATE "21.8.2004"
#define VERS "c.lib 1.172"
#define VSTRING "c.lib 1.172 (21.8.2004)\r\n"
#define VERSTAG "\0$VER: c.lib 1.172 (21.8.2004)"
#define REVISION 183
#define DATE "13.11.2004"
#define VERS "c.lib 1.183"
#define VSTRING "c.lib 1.183 (13.11.2004)\r\n"
#define VERSTAG "\0$VER: c.lib 1.183 (13.11.2004)"

View File

@@ -1 +1 @@
172
183

View File

@@ -1,3 +1,167 @@
c.lib 1.183 (13.11.2004)
- Cleaned up the OS4 build makefile, losing redundant libraries,
adding more startup object code and ultimatively making the whole
rebuild logic work again: if code changes and dependencies are
set up correctly, it will now get rebuilt. Previously, such
changes went unnoticed and you had to rebuild the entire library
from scratch.
- Added stubs for CreatePort(), DeletePort(), CreateTask(), DeleteTask()
and NewList() which have equivalents in exec.library V50 but for which
it might be useful if ported code didn't have to reference these
explicitly.
- mktemp() was broken in libunix.a with Unix path semantics enabled.
This was because the name template was translated and translated
back again, overwriting the translation buffer. This, funny enough,
broke Samba's printing feature. Fixed by translating the name only
before each test for "uniqueness" is made. The new code also handles
empty "" templates gracefully, which was a problem with both the
"standard" and the Unix path semantics flavour.
Why is it that I find bugs like this always after having just
released another library update?
c.lib 1.182 (8.11.2004)
- Changed the error abort condition for the %s conversion of the
scanf() family. It now matches the abort conditions for all other
conversions and no longer ignores whether any other parameters were
converted before. This was a quirk in the older implementation.
- The scanf() family now accepts %E and %G in place of %f and %X in
place of %x.
- Simplified the common code that fopen(), freopen() and fdopen()
share and which has to figure out by looking at a file access
mode specification which parameters should be used.
- Dropped error detection in the scanf() family. The EOF has to be
good enough. Also, ungetc() failure still leads to error handling.
c.lib 1.181 (26.10.2004)
- The scanf() family now always returns the number of assignments made
unless an error occured or an EOF was hit during conversion before the
first assignment could be made.
- strtok() did not terminate properly if the last token in the string
did not end with a separator character but with a '\0' byte. Fixed.
- The directory scanning functions opendir/closedir did not get the global
directory data tracking data structure initialized which later led to
Enforcer hits and maybe trashed memory. Fixed.
c.lib 1.180 (23.10.2004)
- The printf() family now produces no output at all for %e, %f and %g if the
floating point support code is disabled. Previously, a minimum field width
specification could take effect, printing a series of 0 or blank space
characters where no output should have been produced.
c.lib 1.179 (22.10.2004)
- The scanf() family no longer assumes that a leading '0' indicates that the
following digits form an octal number if the conversion type has been
specified as already '%x' already.
c.lib 1.178 (7.10.2004)
- The OS4 version had floating point math support code enabled in all
libraries and not just "libm.a". Fixed.
c.lib 1.177 (29.9.2004)
- Moved the locale initialization/cleanup code into constructors
and destructors.
- The socket cleanup function is now a destructor.
- The math cleanup function is now a destructor.
- The wildcard cleanup function is now a destructor.
- The stdio cleanup function is now a destructor.
- The stack extension cleanup function is now a destructor.
- The code that cleans up after the program's current directory
was changed is now a destructor function.
- Moved the initialization/cleanup code for unlink() into constructors
and destructors.
- Moved the initialization/cleanup code for usergroup.library into
constructors and destructors.
- Added usleep(), and created wrapper code that both sleep() and
usleep() can use.
- Added strtoll() and strtoull(), with further changes to <limits.h>
and <stdlib.h>.
- The socket exit code now calls the common stdio function which
flushes and shuts down all buffered and unbuffered files.
- Fixed the stack swapping function which, for reasons unknown, ceased
to work...
- The start time used by clock() is now initialized by a constructor
function.
- NOTE THAT ALL THE CHANGES WITH REGARD TO USE OF DESTRUCTOR AND
CONSTRUCTOR FUNCTIONS REQUIRE A COMPLETE REBUILD OF THE LIBRARY! IF
YOU DO NOT DO THIS, THE CONSTRUCTOR/DESTRUCTOR FUNCTIONS MAY NOT
GET CALLED.
c.lib 1.175 (10.9.2004)
- <stdarg.h> now tries to use the compiler supplied, machine specific
<stdarg.h> file and also includes the OS4-specifc <sys/amigaos-va.h>
file, if necessary.
- Added another test to <sys/time.h> to check if the "timeval" definition is
already in place. If it is, <exec/types.h> will not be included.
- <sys/time.h> can be made to define the timeval data structure locally if
the __USE_CLIB2_TIMEVAL preprocessor symbol is defined. In this case no
<exec/types.h> or <devices/timer.h> file will be read.
- The sprintf() family did not properly handle empty strings as format
specifications. This would result in a necessary buffer flush action
getting skipped, which consequently did not put the string termination
character into the output buffer.
c.lib 1.174 (27.8.2004)
- The parameters of atan2() were swapped. Fixed.
- Merged fdlibm 5.3 changes with __kernel_tan(), __exp() and __pow()
functions.
- Replaced the rint() and rintf() functions with the fdlibm code.
c.lib 1.173 (25.8.2004)
- The <assert.h> header file was missing the C++ 'extern "C" { .. }'
declarations.
- Added a new function __get_default_file() which allows direct access
to the low level file handle/socket descriptor associated with a
file descriptor.
c.lib 1.172 (21.8.2004)
- acos() now returns 0 for a domain error.

View File

@@ -1,5 +1,5 @@
/*
* $Id: crtbegin.c,v 1.1.1.1 2004-07-26 16:30:22 obarthel Exp $
* $Id: crtbegin.c,v 1.3 2004-09-29 16:54:54 obarthel Exp $
*
* :ts=4
*

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 172
#define DATE "21.8.2004"
#define VERS "debug.lib 1.172"
#define VSTRING "debug.lib 1.172 (21.8.2004)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.172 (21.8.2004)"
#define REVISION 183
#define DATE "13.11.2004"
#define VERS "debug.lib 1.183"
#define VSTRING "debug.lib 1.183 (13.11.2004)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.183 (13.11.2004)"

View File

@@ -1 +1 @@
172
183

View File

@@ -1,5 +1,5 @@
/*
* $Id: dirent_data.c,v 1.3 2004-08-07 10:24:04 obarthel Exp $
* $Id: dirent_data.c,v 1.4 2004-10-24 20:03:42 obarthel Exp $
*
* :ts=4
*
@@ -38,7 +38,7 @@
/****************************************************************************/
/* Directories being scanned whose locks need to be freed when shutting down. */
struct MinList __directory_list;
struct MinList NOCOMMON __directory_list;
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: dirent_headers.h,v 1.1.1.1 2004-07-26 16:30:30 obarthel Exp $
* $Id: dirent_headers.h,v 1.2 2004-10-24 20:03:42 obarthel Exp $
*
* :ts=4
*
@@ -42,6 +42,12 @@
/****************************************************************************/
#ifndef _MACROS_H
#include "macros.h"
#endif /* _MACROS_H */
/****************************************************************************/
struct DirectoryHandle
{
struct MinNode dh_MinNode;
@@ -56,7 +62,7 @@ struct DirectoryHandle
/****************************************************************************/
extern struct MinList __directory_list;
extern struct MinList NOCOMMON __directory_list;
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: locale_data.c,v 1.1.1.1 2004-07-26 16:30:35 obarthel Exp $
* $Id: fcntl_get_default_file.c,v 1.1 2004-08-25 15:27:27 obarthel Exp $
*
* :ts=4
*
@@ -31,15 +31,39 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _LOCALE_HEADERS_H
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
#ifndef _FCNTL_HEADERS_H
#include "fcntl_headers.h"
#endif /* _FCNTL_HEADERS_H */
/****************************************************************************/
struct Locale * __default_locale;
struct Locale * __locale_table[NUM_LOCALES];
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
char __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
int
__get_default_file(int file_descriptor,long * file_ptr)
{
struct fd * fd;
int result = -1;
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
assert( __fd[file_descriptor] != NULL );
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
assert( file_ptr != NULL );
fd = __get_file_descriptor(file_descriptor);
if(fd == NULL)
{
errno = EBADF;
goto out;
}
(*file_ptr) = (long)fd->fd_DefaultFile;
result = 0;
out:
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: assert.h,v 1.1.1.1 2004-07-26 16:32:49 obarthel Exp $
* $Id: assert.h,v 1.2 2004-08-25 15:27:28 obarthel Exp $
*
* :ts=4
*
@@ -36,6 +36,12 @@
/****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/****************************************************************************/
#ifndef assert
/****************************************************************************/
@@ -67,4 +73,10 @@ extern void __assertion_failure(const char *file_name,int line_number,const char
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */
/****************************************************************************/
#endif /* _ASSERT_H */

View File

@@ -1,5 +1,5 @@
/*
* $Id: dos.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
* $Id: dos.h,v 1.3 2004-08-25 15:27:28 obarthel Exp $
*
* :ts=4
*
@@ -112,6 +112,18 @@ extern void __set_a4(unsigned long value);
/****************************************************************************/
/*
* Obtain the low level 'file' handle or socket ID bound to a file
* descriptor. This function returns 0 for success and non-zero
* otherwise (if, for example, the file descriptor value you
* provided is not valid; errno will be set to the appropriate
* error code, too). Put a pointer to the file handle variable you
* want to be filled in into the second parameter to this function.
*/
extern int __get_default_file(int file_descriptor,long * file_ptr);
/****************************************************************************/
/*
* This will be set to TRUE if the current program was launched from
* the internet superserver ('inetd') or an equivalent facility.

View File

@@ -1,5 +1,5 @@
/*
* $Id: limits.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
* $Id: limits.h,v 1.3 2004-09-20 17:16:07 obarthel Exp $
*
* :ts=4
*
@@ -58,6 +58,12 @@
/****************************************************************************/
#define LLONG_MIN (-0x7fffffffffffffffLL-1)
#define LLONG_MAX 0x7fffffffffffffffLL
#define ULLONG_MAX 0xffffffffffffffffULL
/****************************************************************************/
#define PATH_MAX 1024
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdarg.h,v 1.1.1.1 2004-07-26 16:32:53 obarthel Exp $
* $Id: stdarg.h,v 1.2 2004-09-09 08:25:30 obarthel Exp $
*
* :ts=4
*
@@ -57,12 +57,25 @@ typedef char * va_list;
/****************************************************************************/
#else
/****************************************************************************/
#if defined(__GNUC__)
/* Use the compiler supplied, machine specific <stdarg.h> file. */
#undef _STDARG_H
#include_next "stdarg.h"
#include <sys/amigaos-va.h>
#else
#error "Unknown compiler"
#endif /* __GNUC__ */
/****************************************************************************/
#endif /* __amigaos4__ */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
* $Id: stdio.h,v 1.3 2004-08-25 15:27:28 obarthel Exp $
*
* :ts=4
*
@@ -62,7 +62,7 @@ extern "C" {
* correspond to a real limitation for this 'C' runtime library and is
* included solely for ISO 'C' (1994) compliance.
*/
#define FOPEN_MAX 8
#define FOPEN_MAX 64
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
* $Id: stdlib.h,v 1.3 2004-09-20 17:16:07 obarthel Exp $
*
* :ts=4
*
@@ -151,6 +151,11 @@ extern long atol(const char *str);
/****************************************************************************/
extern long long strtoll(const char *str, char **ptr, int base);
extern unsigned long long strtoull(const char *str, char **ptr, int base);
/****************************************************************************/
#if defined(__GNUC__)
#if defined(alloca)
#undef alloca

View File

@@ -1,5 +1,5 @@
/*
* $Id: time.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
* $Id: time.h,v 1.7 2004-09-29 10:15:57 obarthel Exp $
*
* :ts=4
*
@@ -52,7 +52,7 @@ extern "C" {
structure and try to get by with this definition. Sometimes it works,
sometimes it doesn't. Not sure if there really is a good solution for
this problem... */
#ifndef DEVICES_TIMER_H
#if !defined(__TIMEVAL_ALREADY_DEFINED) && !defined(__USE_CLIB2_TIMEVAL)
/****************************************************************************/
@@ -73,11 +73,26 @@ extern "C" {
/****************************************************************************/
/* This will define the 'struct timeval' */
#ifndef DEVICES_TIMER_H
#include <devices/timer.h>
#endif /* DEVICES_TIMER_H */
/* Assume that the 'struct timeval' definition is now in place. */
#define __TIMEVAL_ALREADY_DEFINED
/****************************************************************************/
#else
#endif /* INCLUDE_VERSION */
/****************************************************************************/
#endif /* !__TIMEVAL_ALREADY_DEFINED && !__USE_CLIB2_TIMEVAL */
/****************************************************************************/
/* If the timeval is still undefined or should be defined locally,
define our own now... */
#if !defined(__TIMEVAL_ALREADY_DEFINED)
/****************************************************************************/
@@ -94,11 +109,7 @@ struct timeval
/****************************************************************************/
#endif /* INCLUDE_VERSION */
/****************************************************************************/
#endif /* DEVICES_TIMER_H */
#endif /* !__TIMEVAL_ALREADY_DEFINED */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: unistd.h,v 1.4 2004-08-07 09:15:33 obarthel Exp $
* $Id: unistd.h,v 1.6 2004-09-29 14:17:46 obarthel Exp $
*
* :ts=4
*
@@ -52,6 +52,13 @@ extern "C" {
/****************************************************************************/
/* Endianness: we assume a big endian memory layout (for 68k and PowerPC). */
#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN 4321
#define BYTE_ORDER BIG_ENDIAN
/****************************************************************************/
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
@@ -87,6 +94,7 @@ extern int symlink(const char * actual_path, const char * symbolic_path);
extern int readlink(const char * path_name, char * buffer, int buffer_size);
extern int chdir(const char * path_name);
extern unsigned int sleep(unsigned int seconds);
extern void usleep(unsigned long microseconds);
extern int getopt(int argc, char * argv[], char *opts);
extern pid_t getpid(void);
extern char *realpath(const char *file_name, char *resolved_name);
@@ -200,28 +208,32 @@ extern int h_errno;
/****************************************************************************/
extern int accept(int sockfd,struct sockaddr *cliaddr,int *addrlen);
typedef int socklen_t;
/****************************************************************************/
extern int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen);
extern int bind(int sockfd,struct sockaddr *name,int namelen);
extern int connect(int sockfd,struct sockaddr *name,int namelen);
extern struct hostent * gethostbyaddr(const char *addr, int len, int type);
extern int connect(int sockfd,struct sockaddr *name,socklen_t namelen);
extern struct hostent * gethostbyaddr(const char *addr, socklen_t len, int type);
extern struct hostent * gethostbyname(const char *name);
extern int gethostname(const char *name, int namelen);
extern struct netent * getnetbyname(const char *name);
extern int getpeername(int sockfd,struct sockaddr *name,int *namelen);
extern int getsockname(int sockfd,struct sockaddr *name,int *namelen);
extern int getsockopt(int sockfd,int level,int optname,void *optval,int *optlen);
extern int getpeername(int sockfd,struct sockaddr *name,socklen_t *namelen);
extern int getsockname(int sockfd,struct sockaddr *name,socklen_t *namelen);
extern int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen);
extern unsigned long inet_addr(const char *addr);
extern char * inet_ntoa(struct in_addr in);
extern int ioctl(int fd,unsigned long request, ... /* char *arg */);
extern int listen(int sockfd,int backlog);
extern int recv(int fd,void *buff,size_t nbytes,int flags);
extern int recvfrom(int sockfd,void *buff,int len,int flags,struct sockaddr *from,int *fromlen);
extern int recvfrom(int sockfd,void *buff,int len,int flags,struct sockaddr *from,socklen_t *fromlen);
extern int recvmsg(int socket,struct msghdr *msg,int flags);
extern int select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct timeval *timeout);
extern int send(int fd,void *buff,size_t nbytes,int flags);
extern int send(int fd,const void *buff,size_t nbytes,int flags);
extern int sendmsg(int socket,struct msghdr *msg,int flags);
extern int sendto(int sockfd,void *buff,int len,int flags,struct sockaddr *to,int tolen);
extern int setsockopt(int sockfd,int level,int optname,void *optval,int optlen);
extern int sendto(int sockfd,const void *buff,int len,int flags,struct sockaddr *to,socklen_t tolen);
extern int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
extern int shutdown(int socket, int how);
extern int socket(int domain,int type,int protocol);
extern long gethostid(void);

View File

@@ -1,5 +1,5 @@
/*
* $Id: locale_headers.h,v 1.1.1.1 2004-07-26 16:30:35 obarthel Exp $
* $Id: locale_headers.h,v 1.2 2004-09-29 19:57:57 obarthel Exp $
*
* :ts=4
*
@@ -69,12 +69,12 @@
/****************************************************************************/
extern struct Locale * __default_locale;
extern struct Locale * __locale_table[NUM_LOCALES];
extern struct Locale * NOCOMMON __default_locale;
extern struct Locale * NOCOMMON __locale_table[NUM_LOCALES];
/****************************************************************************/
extern char __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
extern char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: locale_init_exit.c,v 1.1.1.1 2004-07-26 16:30:35 obarthel Exp $
* $Id: locale_init_exit.c,v 1.3 2004-09-29 19:57:57 obarthel Exp $
*
* :ts=4
*
@@ -41,6 +41,25 @@
/****************************************************************************/
struct Library * NOCOMMON __LocaleBase;
/****************************************************************************/
#if defined(__amigaos4__)
struct LocaleIFace * NOCOMMON __ILocale;
#endif /* __amigaos4__ */
/****************************************************************************/
struct Locale * NOCOMMON __default_locale;
struct Locale * NOCOMMON __locale_table[NUM_LOCALES];
/****************************************************************************/
char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
/****************************************************************************/
void
__close_all_locales(void)
{
@@ -71,8 +90,7 @@ __close_all_locales(void)
/****************************************************************************/
void
__locale_exit(void)
CLIB_DESTRUCTOR(__locale_exit)
{
ENTER();
@@ -107,8 +125,7 @@ __locale_exit(void)
/****************************************************************************/
int
__locale_init(void)
CLIB_CONSTRUCTOR(__locale_init)
{
int i;
@@ -145,5 +162,6 @@ __locale_init(void)
PROFILE_ON();
RETURN(OK);
return(OK);
CONSTRUCTOR_SUCCEED();
}

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 172
#define DATE "21.8.2004"
#define VERS "m.lib 1.172"
#define VSTRING "m.lib 1.172 (21.8.2004)\r\n"
#define VERSTAG "\0$VER: m.lib 1.172 (21.8.2004)"
#define REVISION 183
#define DATE "13.11.2004"
#define VERS "m.lib 1.183"
#define VSTRING "m.lib 1.183 (13.11.2004)\r\n"
#define VERSTAG "\0$VER: m.lib 1.183 (13.11.2004)"

View File

@@ -1 +1 @@
172
183

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 172
#define DATE "21.8.2004"
#define VERS "m881.lib 1.172"
#define VSTRING "m881.lib 1.172 (21.8.2004)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.172 (21.8.2004)"
#define REVISION 183
#define DATE "13.11.2004"
#define VERS "m881.lib 1.183"
#define VSTRING "m881.lib 1.183 (13.11.2004)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.183 (13.11.2004)"

View File

@@ -1 +1 @@
172
183

View File

@@ -1,5 +1,5 @@
/*
* $Id: macros.h,v 1.1.1.1 2004-07-26 16:30:36 obarthel Exp $
* $Id: macros.h,v 1.2 2004-09-29 19:57:57 obarthel Exp $
*
* :ts=4
*
@@ -148,8 +148,10 @@
#ifndef UNUSED
#ifdef __GNUC__
#define UNUSED __attribute__((unused))
#define NOCOMMON __attribute__((nocommon))
#else
#define UNUSED /* UNUSED */
#define NOCOMMON /* NOCOMMON */
#endif
#endif /* UNUSED */

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_atan2.c,v 1.2 2004-08-21 18:57:40 obarthel Exp $
* $Id: math_atan2.c,v 1.3 2004-08-27 11:40:49 obarthel Exp $
*
* :ts=4
*
@@ -63,7 +63,7 @@ extern double __atan(double x);
/****************************************************************************/
INLINE static const double
__atan2(double x,double y)
__atan2(double y,double x)
{
const double pi = 3.14159265358979323846;
const double pi_over_2 = pi / 2.0;
@@ -135,7 +135,7 @@ __atan(double x)
}
INLINE static const double
__atan2(double x,double y)
__atan2(double y,double x)
{
double pi,pi_over_2;
double result;
@@ -210,7 +210,7 @@ pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
INLINE static const double
__atan2(double x,double y)
__atan2(double y,double x)
{
double z;
int k,m,hx,hy,ix,iy;
@@ -319,11 +319,11 @@ __atan2(double x,double y)
/****************************************************************************/
double
atan2(double x,double y)
atan2(double y,double x)
{
double result;
result = __atan2(x,y);
result = __atan2(y,x);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_exp.c,v 1.1.1.1 2004-07-26 16:30:41 obarthel Exp $
* $Id: math_exp.c,v 1.2 2004-08-27 11:40:49 obarthel Exp $
*
* :ts=4
*
@@ -194,7 +194,7 @@ __exp(double x)
}
else
{
k = invln2*x+halF[xsb];
k = (int)(invln2*x+halF[xsb]);
t = k;
hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */
lo = t*ln2LO[0];

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_fabs.c,v 1.1.1.1 2004-07-26 16:30:42 obarthel Exp $
* $Id: math_fabs.c,v 1.4 2004-09-29 14:30:03 obarthel Exp $
*
* :ts=4
*
@@ -126,8 +126,14 @@ __fabs(double x)
/****************************************************************************/
#if defined(__PPC__)
/****************************************************************************/
#if defined(PPC_FLOATING_POINT_SUPPORT)
/****************************************************************************/
INLINE static const double
__fabs(double x)
{
@@ -141,10 +147,35 @@ __fabs(double x)
}
/****************************************************************************/
#else
/****************************************************************************/
INLINE static const double
__fabs(double x)
{
double res;
if(x < 0)
res = (-x);
else
res = x;
return res;
}
/****************************************************************************/
#endif /* PPC_FLOATING_POINT_SUPPORT */
/****************************************************************************/
#endif /* __PPC__ */
/****************************************************************************/
double
fabs(double x)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_headers.h,v 1.3 2004-08-21 18:57:40 obarthel Exp $
* $Id: math_headers.h,v 1.4 2004-08-27 13:49:17 obarthel Exp $
*
* :ts=4
*
@@ -148,6 +148,33 @@ do { \
(d) = sl_u.value; \
} while (0)
/* A union which permits us to convert between a float and a 32 bit
int. */
typedef union
{
float value;
unsigned int word;
} ieee_float_shape_type;
/* Get a 32 bit int from a float. */
#define GET_FLOAT_WORD(i,d) \
do { \
ieee_float_shape_type gf_u; \
gf_u.value = (d); \
(i) = gf_u.word; \
} while (0)
/* Set a float from a 32 bit int. */
#define SET_FLOAT_WORD(d,i) \
do { \
ieee_float_shape_type sf_u; \
sf_u.word = (i); \
(d) = sf_u.value; \
} while (0)
extern double __kernel_cos(double x, double y);
extern double __kernel_sin(double x, double y, int iy);
extern int __rem_pio2(double x, double *y);

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_init_exit.c,v 1.3 2004-08-21 18:57:40 obarthel Exp $
* $Id: math_init_exit.c,v 1.5 2004-09-29 19:57:57 obarthel Exp $
*
* :ts=4
*
@@ -53,9 +53,10 @@
/****************************************************************************/
void
__math_exit(void)
CLIB_DESTRUCTOR(__math_exit)
{
ENTER();
#if defined(IEEE_FLOATING_POINT_SUPPORT)
{
if(MathIeeeSingBasBase != NULL)
@@ -77,6 +78,8 @@ __math_exit(void)
}
}
#endif /* IEEE_FLOATING_POINT_SUPPORT */
LEAVE();
}
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_kernel_tan.c,v 1.1.1.1 2004-07-26 16:30:48 obarthel Exp $
* $Id: math_kernel_tan.c,v 1.2 2004-08-27 11:40:49 obarthel Exp $
*
* :ts=4
*
@@ -82,7 +82,21 @@ double __kernel_tan(double x, double y, int iy)
unsigned int low;
GET_LOW_WORD(low,x);
if(((ix|low)|(iy+1))==0) return one/fabs(x);
else return (iy==1)? x: -one/x;
else {
if (iy == 1)
return x;
else { /* compute -1 / (x+y) carefully */
double a, t;
z = w = x + y;
SET_LOW_WORD(z,0);
v = y - (z - x);
t = a = -one / w;
SET_LOW_WORD(t,0);
s = one + t * z;
return t + a * (s + t * v);
}
}
}
}
if(ix>=0x3FE59428) { /* |x|>=0.6744 */

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_log.c,v 1.1.1.1 2004-07-26 16:30:49 obarthel Exp $
* $Id: math_log.c,v 1.2 2004-09-27 15:06:19 tfrieden Exp $
*
* :ts=4
*
@@ -135,7 +135,7 @@ __log(double x)
/****************************************************************************/
#if defined(PPC_FLOATING_POINT_SUPPORT)
#if defined(__PPC__)
static const double
ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_modf.c,v 1.1.1.1 2004-07-26 16:30:50 obarthel Exp $
* $Id: math_modf.c,v 1.2 2004-09-27 15:06:19 tfrieden Exp $
*
* :ts=4
*
@@ -109,7 +109,7 @@ __modf(double x,double *nptr)
/****************************************************************************/
#if defined(PPC_FLOATING_POINT_SUPPORT)
#if defined(__PPC__)
INLINE static const double
__modf(double x,double *nptr)

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_pow.c,v 1.1.1.1 2004-07-26 16:30:52 obarthel Exp $
* $Id: math_pow.c,v 1.3 2004-09-27 15:06:19 tfrieden Exp $
*
* :ts=4
*
@@ -171,7 +171,7 @@ __pow(double x,double y)
/****************************************************************************/
#if defined(PPC_FLOATING_POINT_SUPPORT)
#if defined(__PPC__)
/****************************************************************************/
@@ -286,11 +286,12 @@ __pow(double x,double y)
}
/* (x<0)**(non-int) is NaN */
/* REDHAT LOCAL: This used to be
if((((hx>>31)+1)|yisint)==0) return (x-x)/(x-x);
but ANSI C says a right shift of a signed negative quantity is
implementation defined. */
if(((((unsigned int)hx>>31)-1)|yisint)==0) return (x-x)/(x-x);
n = ((unsigned int)hx>>31)+1;
if((n|yisint)==0) return (x-x)/(x-x);
s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
if((n|(yisint-1))==0)
s = -one;/* (-ve)**(odd int) */
/* |y| is huge */
if(iy>0x41e00000) { /* if |y| > 2**31 */
@@ -299,11 +300,11 @@ __pow(double x,double y)
if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
}
/* over/underflow if x is not close to one */
if(ix<0x3fefffff) return (hy<0)? huge*huge:tiny*tiny;
if(ix>0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
if(ix<0x3fefffff) return (hy<0)? s*huge*huge:s*tiny*tiny;
if(ix>0x3ff00000) return (hy>0)? s*huge*huge:s*tiny*tiny;
/* now |1-x| is tiny <= 2**-20, suffice to compute
log(x) by x-x^2/2+x^3/3-x^4/4 */
t = ax-1; /* t has 20 trailing zeros */
t = ax-one; /* t has 20 trailing zeros */
w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25));
u = ivln2_h*t; /* ivln2_h has 21 sig. bits */
v = t*ivln2_l-w*ivln2;
@@ -311,7 +312,7 @@ __pow(double x,double y)
SET_LOW_WORD(t1,0);
t2 = v-(t1-u);
} else {
double s2,s_h,s_l,t_h,t_l;
double ss,s2,s_h,s_l,t_h,t_l;
n = 0;
/* take care subnormal number */
if(ix<0x00100000)
@@ -325,11 +326,11 @@ __pow(double x,double y)
else {k=0;n+=1;ix -= 0x00100000;}
SET_HIGH_WORD(ax,ix);
/* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
/* compute ss = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
u = ax-bp[k]; /* bp[0]=1.0, bp[1]=1.5 */
v = one/(ax+bp[k]);
s = u*v;
s_h = s;
ss = u*v;
s_h = ss;
SET_LOW_WORD(s_h,0);
/* t_h=ax+bp[k] High */
t_h = zero;
@@ -337,33 +338,29 @@ __pow(double x,double y)
t_l = ax - (t_h-bp[k]);
s_l = v*((u-s_h*t_h)-s_h*t_l);
/* compute log(ax) */
s2 = s*s;
s2 = ss*ss;
r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
r += s_l*(s_h+s);
r += s_l*(s_h+ss);
s2 = s_h*s_h;
t_h = 3.0+s2+r;
SET_LOW_WORD(t_h,0);
t_l = r-((t_h-3.0)-s2);
/* u+v = s*(1+...) */
/* u+v = ss*(1+...) */
u = s_h*t_h;
v = s_l*t_h+t_l*s;
/* 2/(3log2)*(s+...) */
v = s_l*t_h+t_l*ss;
/* 2/(3log2)*(ss+...) */
p_h = u+v;
SET_LOW_WORD(p_h,0);
p_l = v-(p_h-u);
z_h = cp_h*p_h; /* cp_h+cp_l = 2/(3*log2) */
z_l = cp_l*p_h+p_l*cp+dp_l[k];
/* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
/* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */
t = (double)n;
t1 = (((z_h+z_l)+dp_h[k])+t);
SET_LOW_WORD(t1,0);
t2 = z_l-(((t1-t)-dp_h[k])-z_h);
}
s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
if(((((unsigned int)hx>>31)-1)|(yisint-1))==0)
s = -one;/* (-ve)**(odd int) */
/* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
y1 = y;
SET_LOW_WORD(y1,0);

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_rint.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
* $Id: math_rint.c,v 1.3 2004-08-27 13:49:17 obarthel Exp $
*
* :ts=4
*
@@ -54,6 +54,10 @@
/****************************************************************************/
#if defined(IEEE_FLOATING_POINT_SUPPORT) || defined(M68881_FLOATING_POINT_SUPPORT)
/****************************************************************************/
double
rint(double x)
{
@@ -62,5 +66,71 @@ rint(double x)
/****************************************************************************/
#endif /* FLOATING_POINT_SUPPORT */
#endif /* IEEE_FLOATING_POINT_SUPPORT || M68881_FLOATING_POINT_SUPPORT */
/****************************************************************************/
#if defined(PPC_FLOATING_POINT_SUPPORT)
/****************************************************************************/
static const double
TWO52[2]={
4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
-4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
};
double
rint(double x)
{
int i0,j0,sx;
unsigned i,i1;
double w,t;
GET_HIGH_WORD(i0,x);
sx = (i0>>31)&1;
GET_LOW_WORD(i1,x);
j0 = ((i0>>20)&0x7ff)-0x3ff;
if(j0<20) {
if(j0<0) {
if(((i0&0x7fffffff)|i1)==0) return x;
i1 |= (i0&0x0fffff);
i0 &= 0xfffe0000;
i0 |= ((i1|-i1)>>12)&0x80000;
SET_HIGH_WORD(x,i0);
w = TWO52[sx]+x;
t = w-TWO52[sx];
GET_HIGH_WORD(i0,t);
SET_HIGH_WORD(t,(i0&0x7fffffff)|(sx<<31));
return t;
} else {
i = (0x000fffff)>>j0;
if(((i0&i)|i1)==0) return x; /* x is integral */
i>>=1;
if(((i0&i)|i1)!=0) {
if(j0==19) i1 = 0x40000000; else
i0 = (i0&(~i))|((0x20000)>>j0);
}
}
} else if (j0>51) {
if(j0==0x400) return x+x; /* inf or NaN */
else return x; /* x is integral */
} else {
i = ((unsigned)(0xffffffff))>>(j0-20);
if((i1&i)==0) return x; /* x is integral */
i>>=1;
if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(j0-20));
}
SET_HIGH_WORD(x,i0);
SET_LOW_WORD(x,i1);
w = TWO52[sx]+x;
return w-TWO52[sx];
}
/****************************************************************************/
#endif /* PPC_FLOATING_POINT_SUPPORT */
/****************************************************************************/
#endif /* FLOATING_POINT_SUPPORT */

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_rintf.c,v 1.1 2004-08-07 09:15:32 obarthel Exp $
* $Id: math_rintf.c,v 1.2 2004-08-27 13:49:17 obarthel Exp $
*
* :ts=4
*
@@ -54,6 +54,10 @@
/****************************************************************************/
#if defined(IEEE_FLOATING_POINT_SUPPORT) || defined(M68881_FLOATING_POINT_SUPPORT)
/****************************************************************************/
float
rintf(float x)
{
@@ -62,5 +66,64 @@ rintf(float x)
/****************************************************************************/
#endif /* FLOATING_POINT_SUPPORT */
#endif /* IEEE_FLOATING_POINT_SUPPORT || M68881_FLOATING_POINT_SUPPORT */
/****************************************************************************/
#if defined(PPC_FLOATING_POINT_SUPPORT)
/****************************************************************************/
/* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */
/****************************************************************************/
static const float
TWO23[2]={
8.3886080000e+06, /* 0x4b000000 */
-8.3886080000e+06, /* 0xcb000000 */
};
float
rintf(float x)
{
int i0,j0,sx;
unsigned int i,i1;
float w,t;
GET_FLOAT_WORD(i0,x);
sx = (i0>>31)&1;
j0 = ((i0>>23)&0xff)-0x7f;
if(j0<23) {
if(j0<0) {
if((i0&0x7fffffff)==0) return x;
i1 = (i0&0x07fffff);
i0 &= 0xfff00000;
i0 |= ((i1|-i1)>>9)&0x400000;
SET_FLOAT_WORD(x,i0);
w = TWO23[sx]+x;
t = w-TWO23[sx];
GET_FLOAT_WORD(i0,t);
SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
return t;
} else {
i = (0x007fffff)>>j0;
if((i0&i)==0) return x; /* x is integral */
i>>=1;
if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0);
}
} else {
if(j0==0x80) return x+x; /* inf or NaN */
else return x; /* x is integral */
}
SET_FLOAT_WORD(x,i0);
w = TWO23[sx]+x;
return w-TWO23[sx];
}
/****************************************************************************/
#endif /* PPC_FLOATING_POINT_SUPPORT */
/****************************************************************************/
#endif /* FLOATING_POINT_SUPPORT */

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_sqrt.c,v 1.2 2004-08-21 18:57:40 obarthel Exp $
* $Id: math_sqrt.c,v 1.3 2004-09-27 15:06:19 tfrieden Exp $
*
* :ts=4
*
@@ -135,7 +135,7 @@ __sqrt(double x)
/****************************************************************************/
#if defined(PPC_FLOATING_POINT_SUPPORT)
#ifdef __PPC__
static const double one = 1.0, tiny=1.0e-300;
@@ -236,7 +236,7 @@ __sqrt(double x)
return z;
}
#endif /* PPC_FLOATING_POINT_SUPPORT */
#endif
/****************************************************************************/

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 172
#define DATE "21.8.2004"
#define VERS "net.lib 1.172"
#define VSTRING "net.lib 1.172 (21.8.2004)\r\n"
#define VERSTAG "\0$VER: net.lib 1.172 (21.8.2004)"
#define REVISION 183
#define DATE "13.11.2004"
#define VERS "net.lib 1.183"
#define VSTRING "net.lib 1.183 (13.11.2004)\r\n"
#define VERSTAG "\0$VER: net.lib 1.183 (13.11.2004)"

View File

@@ -1 +1 @@
172
183

View File

@@ -1,15 +1,10 @@
c.lib 1.172 (21.8.2004)
c.lib 1.180 (23.10.2004)
- Changed the values which the acos(), asin(), atan2(), fmod()
and sqrt() functions return when they find that their parameters
are invalid.
- The printf() family now produces no output at all for floating point
numbers (%e, %f and %g) if the floating point support code is disabled.
In previous versions of the library some output (series of 0 or blank
space characters) could still be produced.
- The atan2() function failed to perform a correct parameter check.
c.lib 1.171 (16.8.2004)
- Added hypot()
- vfprintf/vfscanf now support the %lld/%llu (64 bit integer) format
by default
- The scanf() family no longer ignores a conversion request of
type '%x' (hexadecimal) and treats the number to be processed
as in octal notation if that number begins with the digit 0.

View File

@@ -1,5 +1,5 @@
#
# $Id: smakefile,v 1.6 2004-08-16 09:33:12 obarthel Exp $
# $Id: smakefile,v 1.10 2004-09-29 14:17:44 obarthel Exp $
#
# :ts=8
#
@@ -163,14 +163,14 @@ FCNTL_OBJ = \
fcntl_lseek.o \
fcntl_open.o \
fcntl_read.o \
fcntl_write.o
fcntl_write.o \
fcntl_get_default_file.o
LIBGEN_OBJ = \
libgen_basename.o \
libgen_dirname.o
LOCALE_OBJ = \
locale_data.o \
locale_init_exit.o \
locale_localeconv.o \
locale_setlocale.o
@@ -414,6 +414,8 @@ STDLIB_OBJ = \
stdlib_strtod.o \
stdlib_strtol.o \
stdlib_strtoul.o \
stdlib_strtoll.o \
stdlib_strtoull.o \
stdlib_swapstack.o \
stdlib_system.o \
stdlib_unsetenv.o \
@@ -471,9 +473,9 @@ TIME_OBJ = \
UNISTD_OBJ = \
unistd_access.o \
unistd_chdir.o \
unistd_chdir_exit.o \
unistd_chown.o \
unistd_currentpathname.o \
unistd_data.o \
unistd_dup.o \
unistd_dup2.o \
unistd_fchown.o \
@@ -494,12 +496,15 @@ UNISTD_OBJ = \
unistd_sleep.o \
unistd_strip_double_slash.o \
unistd_symlink.o \
unistd_time_delay.o \
unistd_timer.o \
unistd_translatea2u.o \
unistd_translaterel.o \
unistd_translateu2a.o \
unistd_truncate.o \
unistd_unix_path_semantics.o \
unistd_unlink.o
unistd_unlink.o \
unistd_usleep.o
# \
# unistd_wildcard_expand.o

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_init_exit.c,v 1.2 2004-07-28 15:50:45 obarthel Exp $
* $Id: socket_init_exit.c,v 1.4 2004-09-29 17:03:57 obarthel Exp $
*
* :ts=4
*
@@ -84,16 +84,11 @@ extern BOOL __is_daemon;
/****************************************************************************/
extern void __show_error(const char * message);
/****************************************************************************/
extern void __socket_hook_entry(struct Hook * hook,struct fd * fd,struct file_hook_message * message);
/****************************************************************************/
void
__socket_exit(void)
CLIB_DESTRUCTOR(__socket_exit)
{
ENTER();
@@ -116,16 +111,7 @@ __socket_exit(void)
* does not happen, the stdio cleanup function will
* crash (with bells on).
*/
if(__fd != NULL)
{
int i;
for(i = 0 ; i < __num_fd ; i++)
{
if(FLAG_IS_SET(__fd[i]->fd_Flags,FDF_IS_SOCKET) && FLAG_IS_SET(__fd[i]->fd_Flags,FDF_IN_USE))
close(i);
}
}
__close_all_files();
#if defined(__amigaos4__)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_send.c,v 1.1.1.1 2004-07-26 16:31:19 obarthel Exp $
* $Id: socket_send.c,v 1.2 2004-09-29 14:31:57 obarthel Exp $
*
* :ts=4
*
@@ -48,7 +48,7 @@
/****************************************************************************/
int
send(int sockfd,void *buff,size_t nbytes,int flags)
send(int sockfd,const void *buff,size_t nbytes,int flags)
{
struct fd * fd;
int result = -1;

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_sendto.c,v 1.1.1.1 2004-07-26 16:31:20 obarthel Exp $
* $Id: socket_sendto.c,v 1.2 2004-09-29 14:31:57 obarthel Exp $
*
* :ts=4
*
@@ -48,7 +48,7 @@
/****************************************************************************/
int
sendto(int sockfd,void *buff,int len,int flags,struct sockaddr *to,int tolen)
sendto(int sockfd,const void *buff,int len,int flags,struct sockaddr *to,int tolen)
{
struct fd * fd;
int result = -1;

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_setsockopt.c,v 1.1.1.1 2004-07-26 16:31:20 obarthel Exp $
* $Id: socket_setsockopt.c,v 1.2 2004-09-29 14:31:57 obarthel Exp $
*
* :ts=4
*
@@ -48,7 +48,7 @@
/****************************************************************************/
int
setsockopt(int sockfd,int level,int optname,void *optval,int optlen)
setsockopt(int sockfd,int level,int optname,const void *optval,int optlen)
{
struct fd * fd;
int result = -1;

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 172
#define DATE "21.8.2004"
#define VERS "stack.lib 1.172"
#define VSTRING "stack.lib 1.172 (21.8.2004)\r\n"
#define VERSTAG "\0$VER: stack.lib 1.172 (21.8.2004)"
#define REVISION 183
#define DATE "13.11.2004"
#define VERS "stack.lib 1.183"
#define VSTRING "stack.lib 1.183 (13.11.2004)\r\n"
#define VERSTAG "\0$VER: stack.lib 1.183 (13.11.2004)"

View File

@@ -1 +1 @@
172
183

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_init_exit.c,v 1.1.1.1 2004-07-26 16:31:36 obarthel Exp $
* $Id: stdio_init_exit.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -52,7 +52,7 @@
/****************************************************************************/
void
__stdio_exit(void)
__close_all_files(void)
{
int i;
@@ -60,7 +60,7 @@ __stdio_exit(void)
__check_abort_enabled = FALSE;
if(__iob != NULL)
if(__iob != NULL && __num_iob > 0)
{
for(i = 0 ; i < __num_iob ; i++)
{
@@ -72,7 +72,7 @@ __stdio_exit(void)
__iob = NULL;
}
if(__fd != NULL)
if(__fd != NULL && __num_fd > 0)
{
for(i = 0 ; i < __num_fd ; i++)
{
@@ -89,6 +89,17 @@ __stdio_exit(void)
/****************************************************************************/
CLIB_DESTRUCTOR(__stdio_exit)
{
ENTER();
__close_all_files();
LEAVE();
}
/****************************************************************************/
int
__stdio_init(void)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_openiob.c,v 1.1.1.1 2004-07-26 16:31:37 obarthel Exp $
* $Id: stdio_openiob.c,v 1.3 2004-11-03 15:39:04 obarthel Exp $
*
* :ts=4
*
@@ -48,9 +48,7 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
{
ULONG file_flags;
int result = -1;
char actual_mode[8];
int open_mode;
size_t mode_len,len,i;
struct fd * fd = NULL;
STRPTR buffer = NULL;
STRPTR aligned_buffer;
@@ -86,78 +84,49 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
}
}
/* Options can follow the mode string, separated by a comma.
* We don't support any of those.
*/
len = mode_len = strlen(mode);
for(i = 0 ; i < len ; i++)
/* The first character selects the access mode: read, write or append. */
switch(mode[0])
{
if(mode[i] == ',')
{
mode_len = i;
break;
}
}
case 'r':
/* Keep only the first few letters of the mode string. */
if(mode_len > sizeof(actual_mode)-1)
mode_len = sizeof(actual_mode)-1;
memmove(actual_mode,mode,mode_len);
actual_mode[mode_len] = '\0';
SHOWSTRING(actual_mode);
if(strcmp(actual_mode,"r") == SAME || strcmp(actual_mode,"rb") == SAME)
{
SHOWMSG("read-only");
SHOWMSG("read mode");
open_mode = O_RDONLY;
file_flags = IOBF_READ;
}
else if (strcmp(actual_mode,"w") == SAME || strcmp(actual_mode,"wb") == SAME)
{
SHOWMSG("write-only");
break;
case 'w':
SHOWMSG("write mode");
open_mode = O_WRONLY | O_CREAT | O_TRUNC;
file_flags = IOBF_WRITE;
}
else if (strcmp(actual_mode,"a") == SAME || strcmp(actual_mode,"ab") == SAME)
{
SHOWMSG("write-only; append");
break;
case 'a':
SHOWMSG("append mode");
open_mode = O_WRONLY | O_CREAT | O_APPEND;
file_flags = IOBF_WRITE;
}
else if (strcmp(actual_mode,"r+") == SAME || strcmp(actual_mode,"rb+") == SAME || strcmp(actual_mode,"r+b") == SAME)
{
SHOWMSG("read/write; don't overwrite");
break;
open_mode = O_RDWR;
file_flags = IOBF_READ | IOBF_WRITE;
}
else if (strcmp(actual_mode,"w+") == SAME || strcmp(actual_mode,"wb+") == SAME || strcmp(actual_mode,"w+b") == SAME)
{
SHOWMSG("read/write; overwrite");
default:
open_mode = O_RDWR | O_CREAT | O_TRUNC;
file_flags = IOBF_READ | IOBF_WRITE;
}
else if (strcmp(actual_mode,"a+") == SAME || strcmp(actual_mode,"ab+") == SAME || strcmp(actual_mode,"a+b") == SAME)
{
SHOWMSG("read/write; append; don't overwrite");
open_mode = O_RDWR | O_CREAT | O_APPEND;
file_flags = IOBF_READ | IOBF_WRITE;
}
else
{
SHOWMSG("unsupported file open mode");
D(("unsupported file open mode '%lc'",mode[0]));
errno = EINVAL;
goto out;
}
/* If the second or third character is a '+', switch to read/write mode. */
if((mode[1] == '+') || (mode[1] != '\0' && mode[2] == '+'))
{
SHOWMSG("read/write access");
CLEAR_FLAG(open_mode,O_RDONLY);
CLEAR_FLAG(open_mode,O_WRONLY);
SET_FLAG(open_mode,O_RDWR);
}
SHOWMSG("allocating file buffer");
/* Allocate a little more memory than necessary. */
@@ -193,12 +162,21 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
CLEAR_FLAG(fd->fd_Flags,FDF_APPEND);
}
/* Figure out the buffered file access mode by looking at the open mode. */
file_flags = IOBF_IN_USE | IOBF_NO_NUL;
if(FLAG_IS_SET(open_mode,O_RDONLY) || FLAG_IS_SET(open_mode,O_RDWR))
SET_FLAG(file_flags,IOBF_READ);
if(FLAG_IS_SET(open_mode,O_WRONLY) || FLAG_IS_SET(open_mode,O_RDWR))
SET_FLAG(file_flags,IOBF_WRITE);
__initialize_iob(file,(HOOKFUNC)__iob_hook_entry,
buffer,
aligned_buffer,BUFSIZ,
file_descriptor,
slot_number,
IOBF_IN_USE | file_flags | IOBF_NO_NUL);
file_flags);
buffer = NULL;

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_protos.h,v 1.2 2004-08-08 10:55:57 obarthel Exp $
* $Id: stdio_protos.h,v 1.3 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -65,6 +65,11 @@ struct fd;
/****************************************************************************/
/* stdio_init_exit.c */
void __close_all_files(void);
/****************************************************************************/
/* stdio_translateioerror.c */
extern void __translate_io_error_to_errno(LONG io_error,int * errno_ptr);
extern void __translate_access_io_error_to_errno(LONG io_error,int * errno_ptr);

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_puts.c,v 1.1.1.1 2004-07-26 16:31:40 obarthel Exp $
* $Id: stdio_puts.c,v 1.2 2004-09-10 07:39:19 obarthel Exp $
*
* :ts=4
*
@@ -94,7 +94,7 @@ puts(const char *s)
out:
/* Note: if buffering is disabled for this stdout, then we still
/* Note: if buffering is disabled for this stream, then we still
may have buffered data around, queued to be printed right now.
This is intended to improve performance as it takes more effort
to write a single character to a file than to write a bunch. */

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_vfprintf.c,v 1.4 2004-08-14 11:11:01 obarthel Exp $
* $Id: stdio_vfprintf.c,v 1.6 2004-10-23 16:38:18 obarthel Exp $
*
* :ts=4
*
@@ -262,7 +262,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(arg == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -344,7 +343,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(arg == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -566,7 +564,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(arg == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -623,7 +620,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(arg == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -983,15 +979,8 @@ vfprintf(FILE * stream,const char * format, va_list arg)
else
(void)va_arg(arg, double);
#ifndef NDEBUG
{
output_buffer = "*FLOATING POINT NUMBER*";
output_len = strlen(output_buffer);
}
#endif /* NDEBUG */
CLEAR_FLAG(format_flags,FORMATF_ProduceSign);
CLEAR_FLAG(format_flags,FORMATF_ProduceSpace);
minimum_field_width = 0;
format_flags = 0;
}
#endif /* FLOATING_POINT_SUPPORT */
}
@@ -1013,7 +1002,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(arg == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -1168,7 +1156,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(arg == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -1224,7 +1211,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(arg == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -1243,7 +1229,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(short_ptr == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -1268,7 +1253,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(int_ptr == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -1289,7 +1273,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(int_ptr == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -1311,7 +1294,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
if(int_ptr == NULL)
{
errno = EFAULT;
result = EOF;
goto out;
}
}
@@ -1524,7 +1506,7 @@ vfprintf(FILE * stream,const char * format, va_list arg)
may have buffered data around, queued to be printed right now.
This is intended to improve performance as it takes more effort
to write a single character to a file than to write a bunch. */
if(result > 0 && (iob->iob_Flags & IOBF_BUFFER_MODE) == IOBF_BUFFER_MODE_NONE)
if(result != EOF && (iob->iob_Flags & IOBF_BUFFER_MODE) == IOBF_BUFFER_MODE_NONE)
{
if(__iob_write_buffer_is_valid(iob) && __flush_iob_write_buffer(iob) < 0)
result = EOF;

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_vfscanf.c,v 1.2 2004-08-08 10:55:57 obarthel Exp $
* $Id: stdio_vfscanf.c,v 1.6 2004-11-08 17:57:52 obarthel Exp $
*
* :ts=4
*
@@ -105,24 +105,12 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
if(isspace(c))
{
BOOL finished = FALSE;
/* Skip all blank spaces in the stream. */
format++;
while(TRUE)
while((c = __getc(stream)) != EOF)
{
c = __getc(stream);
if(c == EOF)
{
/* Hit the end of the stream. Due to an error? */
if(num_conversions == 0 || ferror(stream))
goto out;
finished = TRUE;
break;
}
else if (isspace(c))
if(isspace(c))
{
total_num_chars_read++;
}
@@ -139,8 +127,17 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
}
}
if(finished)
if(c == EOF)
{
SHOWMSG("end of file");
/* Hit the end of the stream? */
if(num_conversions == 0)
goto out;
/* Finished... */
break;
}
/* Resume scanning. */
continue;
@@ -159,8 +156,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
{
SHOWMSG("end of file");
/* Hit the end of the stream. Due to an error? */
if(num_conversions == 0 || ferror(stream))
/* Hit the end of the stream. */
if(num_conversions == 0)
goto out;
break;
@@ -305,9 +302,11 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
break;
/* It's a floating point number. */
case 'f':
case 'e':
case 'E':
case 'f':
case 'g':
case 'G':
conversion_type = 'f';
format++;
@@ -321,6 +320,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
case 's': /* string */
case 'u': /* unsigned integer */
case 'x': /* unsigned integer in hexadecimal format */
case 'X': /* unsigned integer in hexadecimal format */
case '%': /* the % character */
case '[': /* a range of characters */
@@ -339,21 +339,9 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
conversion_type != 'n' &&
conversion_type != '[')
{
BOOL finished = FALSE;
while(TRUE)
while((c = __getc(stream)) != EOF)
{
c = __getc(stream);
if(c == EOF)
{
/* Hit the end of the stream. Due to an error? */
if(num_conversions == 0 || ferror(stream))
goto out;
finished = TRUE;
break;
}
else if (isspace(c))
if(isspace(c))
{
total_num_chars_read++;
}
@@ -369,9 +357,6 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
break;
}
}
if(finished)
break;
}
num_chars_processed = 0;
@@ -428,8 +413,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
c = __getc(stream);
if(c == EOF)
{
/* Bail out if we hit the end of the stream or an error occured. */
if(num_conversions == 0 || ferror(stream))
/* Bail out if we hit the end of the stream. */
if(num_conversions == 0)
goto out;
break;
@@ -609,7 +594,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
maximum_field_width--;
}
if(c == EOF && ((num_chars_processed == 0 && num_conversions == 0) || ferror(stream)))
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
goto out;
}
@@ -1016,6 +1001,10 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
}
}
/* Chose a base according to the conversion to be
expected. For the 'x' and 'i' we examine the
incoming data rather than commit ourselves to
a peculiar data format now. */
if(conversion_type == 'd' || conversion_type == 'u')
base = 10;
else if (conversion_type == 'o')
@@ -1060,7 +1049,11 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
* '0x' prefix or just a zero.
*/
c = __getc(stream);
if (c == 'x' || c == 'X')
/* This takes care of the '0x' prefix for hexadecimal
numbers ('%x') and also picks the right type of
data for the '%i' type. */
if ((c == 'x' || c == 'X') && (conversion_type == 'x' || conversion_type == 'i'))
{
/* It's the hex prefix. */
base = 16;
@@ -1075,7 +1068,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
if(maximum_field_width > 0)
maximum_field_width--;
}
else if (isdigit(c))
else if (isdigit(c) && (conversion_type == 'i')) /* This could be the octal prefix for the '%i' format. */
{
/* The preceding '0' was part of the
octal prefix. So we don't really know
@@ -1192,7 +1185,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
}
}
if(c == EOF && ((num_chars_processed == 0 && num_conversions == 0) || ferror(stream)))
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
goto out;
}
@@ -1298,8 +1291,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
/* The conversion is considered to have failed if an EOF was
encountered before any non-whitespace characters could be
converted. We also bail out if we hit an error. */
if(c == EOF && (num_chars_processed == 0 || ferror(stream)))
converted. */
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
goto out;
}
@@ -1422,8 +1415,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
{
SHOWMSG("end of file");
/* Hit the end of the stream. Due to an error? */
if(num_conversions == 0 || ferror(stream))
/* Hit the end of the stream. */
if(num_conversions == 0)
goto out;
break;
@@ -1555,7 +1548,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
maximum_field_width--;
}
if(c == EOF && ((num_chars_processed == 0 && num_conversions == 0) || ferror(stream)))
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
goto out;
}
@@ -1569,7 +1562,6 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
}
}
if(num_conversions > 0)
result = num_assignments;
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_constructor_begin.c,v 1.1.1.1 2004-07-26 16:31:52 obarthel Exp $
* $Id: stdlib_constructor_begin.c,v 1.2 2004-09-29 19:57:57 obarthel Exp $
*
* :ts=4
*
@@ -42,80 +42,7 @@
/****************************************************************************/
#if defined(__amigaos4__)
/****************************************************************************/
/*
* Dummy constructor and destructor array. The linker script will put these at the
* very beginning of section ".ctors" and ".dtors". crtend.o contains a similar entry
* with a NULL pointer entry and is put at the end of the sections. This way, the init
* code can find the global constructor/destructor pointers
*/
static void (*__CTOR_LIST__[1]) (void) __attribute__((section(".ctors"))) = { (void *)-1 };
static void (*__DTOR_LIST__[1]) (void) __attribute__((section(".dtors"))) = { (void *)-1 };
/****************************************************************************/
static void
_do_ctors(void)
{
void (**pFuncPtr)(void);
/* Skip the first entry in the list (it's -1 anyway) */
pFuncPtr = __CTOR_LIST__ + 1;
/* Call all constructors in forward order */
while (*pFuncPtr != NULL)
(**pFuncPtr++)();
}
/****************************************************************************/
static void
_do_dtors(void)
{
static ULONG i = ~0UL;
void (**pFuncPtr)(void);
if(i == ~0UL)
{
ULONG j = (ULONG)__DTOR_LIST__[0];
if(j == ~0UL)
{
/* Find the end of the destructors list. */
j = 1;
while(__DTOR_LIST__[j] != NULL)
j++;
/* We're at the NULL entry now. Go back by one. */
j--;
}
i = j;
}
/* If one of the destructors drops into
* exit(), processing will continue with
* the next following destructor.
*/
(void)setjmp(__exit_jmp_buf);
/* Call all destructors in reverse order. */
pFuncPtr = &__DTOR_LIST__[i];
while(i > 0)
{
i--;
(**pFuncPtr--)();
}
}
/****************************************************************************/
#elif defined(__SASC)
#if defined(__SASC)
/****************************************************************************/
@@ -201,11 +128,23 @@ _do_ctors(void)
ULONG nptrs = (ULONG)__CTOR_LIST__[0];
ULONG i;
ENTER();
D(("there are %ld constructors to be called",nptrs));
/* Call all constructors in forward order */
for(i = 0 ; i < nptrs ; i++)
{
D(("calling constructor #%ld, 0x%08lx",i,__CTOR_LIST__[1+i]));
__CTOR_LIST__[1+i]();
}
SHOWMSG("all done.");
LEAVE();
}
/****************************************************************************/
static void
@@ -216,6 +155,10 @@ _do_dtors(void)
ULONG nptrs = (ULONG)__DTOR_LIST__[0];
static ULONG i;
ENTER();
D(("there are %ld destructors to be called",nptrs));
/* If one of the destructors drops into
* exit(), processing will continue with
* the next following destructor.
@@ -224,9 +167,17 @@ _do_dtors(void)
/* Call all destructors in reverse order */
while(i++ < nptrs)
{
D(("calling destructor #%ld, 0x%08lx",i,__DTOR_LIST__[1+nptrs - i]));
__DTOR_LIST__[1+nptrs - i]();
}
SHOWMSG("all done.");
LEAVE();
}
/****************************************************************************/
#endif /*__amigaos4__ */

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_data.c,v 1.1.1.1 2004-07-26 16:31:53 obarthel Exp $
* $Id: stdlib_data.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -85,15 +85,11 @@ ULONG __stk_extensions;
/****************************************************************************/
struct Library * __UtilityBase;
struct Library * __LocaleBase;
/****************************************************************************/
#if defined(__amigaos4__)
struct UtilityIFace * __IUtility;
struct LocaleIFace * __ILocale;
#endif /* __amigaos4__ */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_locale_utility.h,v 1.1.1.1 2004-07-26 16:31:57 obarthel Exp $
* $Id: stdlib_locale_utility.h,v 1.2 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -49,8 +49,14 @@
/****************************************************************************/
extern struct Library * __UtilityBase;
extern struct Library * __LocaleBase;
#ifndef _MACROS_H
#include "macros.h"
#endif /* _MACROS_H */
/****************************************************************************/
extern struct Library * NOCOMMON __UtilityBase;
extern struct Library * NOCOMMON __LocaleBase;
/****************************************************************************/
@@ -58,8 +64,8 @@ extern struct Library * __LocaleBase;
/****************************************************************************/
extern struct UtilityIFace * __IUtility;
extern struct LocaleIFace * __ILocale;
extern struct UtilityIFace NOCOMMON * __IUtility;
extern struct LocaleIFace NOCOMMON * __ILocale;
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_main.c,v 1.1.1.1 2004-07-26 16:31:58 obarthel Exp $
* $Id: stdlib_main.c,v 1.5 2004-10-02 15:56:13 obarthel Exp $
*
* :ts=4
*
@@ -64,7 +64,10 @@ extern int main(int arg_c,char ** arg_v);
/****************************************************************************/
#if 0
/* The SAS/C profiling hooks can be used to track call chains. Neat
trick, but not always necessary. Don't enable this unless you know
what you're doing... */
#if defined(__USE_SAS_PROFILING_FOR_MONITORING)
/****************************************************************************/
@@ -100,7 +103,7 @@ _EPILOG(REG(a0,char * id))
/****************************************************************************/
#endif
#endif /* __USE_SAS_PROFILING_FOR_MONITORING */
/****************************************************************************/
@@ -119,10 +122,7 @@ call_main(void)
__stdio_init,
__machine_test,
__math_init,
__locale_init,
__unistd_init,
__socket_init,
__usergroup_init,
__wildcard_expand_init,
NULL
@@ -135,15 +135,6 @@ call_main(void)
*/
static exit_func_ptr exit_functions[] =
{
__wildcard_expand_exit,
__usergroup_exit,
__socket_exit,
__unistd_exit,
__locale_exit,
__math_exit,
__stdio_exit,
__startup_exit,
__stk_exit,
__stdlib_exit,
NULL
@@ -151,27 +142,51 @@ call_main(void)
static size_t i;
ENTER();
/* This plants the return buffer for _exit(). */
if(setjmp(__exit_jmp_buf) != 0)
goto out;
SHOWMSG("calling init functions");
for(i = 0 ; init_functions[i] != NULL ; i++)
{
D(("calling init function #%ld",i));
if((*init_functions[i])() != OK)
{
SHOWMSG("that didn't work");
goto out;
}
}
SHOWMSG("now invoking the constructors");
/* Go through the constructor list */
_init();
//show_profile_names = TRUE;
SHOWMSG("done.");
/* If the SAS/C profiling code is set up for printing function
call chains, switch it on now. */
#if defined(__USE_SAS_PROFILING_FOR_MONITORING)
{
show_profile_names = TRUE;
}
#endif /* __USE_SAS_PROFILING_FOR_MONITORING */
/* After all these preparations, get this show on the road... */
exit(main((int)__argc,(char **)__argv));
out:
//show_profile_names = FALSE;
/* Switch off function name printing, if it was enabled. */
#if defined(__USE_SAS_PROFILING_FOR_MONITORING)
{
show_profile_names = FALSE;
}
#endif /* __USE_SAS_PROFILING_FOR_MONITORING */
/* If we end up here with the __stack_overflow variable
* set then the stack overflow handler dropped into
@@ -181,6 +196,8 @@ call_main(void)
*/
if(__stack_overflow)
{
SHOWMSG("we have a stack overflow");
/* Dump whatever is waiting to be written to the
* standard I/O streams, and make sure that no
* break signal is about to make things any more
@@ -203,9 +220,15 @@ call_main(void)
/* If necessary, print stack size usage information. */
__stack_usage_exit();
SHOWMSG("invoking the destructors");
/* Go through the destructor list */
_fini();
SHOWMSG("done.");
SHOWMSG("calling the exit functions");
/* Any of the following cleanup routines may call
* _exit() by way of abort() or through a hook
* function. Which is why we redirect the exit
@@ -213,10 +236,13 @@ call_main(void)
*/
for(i = 0 ; exit_functions[i] != NULL ; i++)
{
D(("calling exit function #%ld",i));
if(setjmp(__exit_jmp_buf) == 0)
(*exit_functions[i])();
}
RETURN(__exit_value);
return(__exit_value);
}
@@ -347,9 +373,6 @@ _main(void)
}
#endif /* __amigaos4__ */
/* Remember when this program was started. */
DateStamp(&__start_time);
/* If a callback was provided which can fill us in on which
* minimum stack size should be used, invoke it now and
* store its result in the global __stack_size variable.
@@ -392,33 +415,36 @@ _main(void)
{
struct StackSwapStruct * stk;
unsigned int stack_size;
ULONG lower,upper;
APTR new_stack;
/* Make the stack size a multiple of 16 bytes. */
stack_size = (__stack_size + 15UL) & ~15UL;
/* Make the stack size a multiple of 32 bytes. */
stack_size = 32 + ((__stack_size + 31UL) & ~31UL);
/* We allocate a little more memory so that we can align
the stack to a 128 bit boundary. */
stk = AllocVec(sizeof(*stk) + 15 + stack_size,MEMF_PUBLIC|MEMF_ANY);
/* Allocate the stack swapping data structure
and the stack space separately. */
stk = AllocVec(sizeof(*stk),MEMF_PUBLIC|MEMF_ANY);
if(stk == NULL)
goto out;
/* Align the lower stack bound to a 128 bit boundary, then
fix up the upper bound, which is guaranteed to be on
a 128 bit boundary, too, on account of the stack size
having being rounded to that boundary. */
lower = (((ULONG)(stk+1)) + 15UL) & ~15UL;
upper = lower + stack_size;
new_stack = AllocMem(stack_size,MEMF_PUBLIC|MEMF_ANY);
if(new_stack == NULL)
{
FreeVec(stk);
goto out;
}
stk->stk_Lower = (APTR)lower;
stk->stk_Upper = upper;
stk->stk_Pointer = (APTR)upper;
/* Fill in the lower and upper bounds, then take care of
the stack pointer itself. */
stk->stk_Lower = new_stack;
stk->stk_Upper = (ULONG)(new_stack) + stack_size;
stk->stk_Pointer = (APTR)(stk->stk_Upper - 32);
/* If necessary, set up for stack size usage measurement. */
__stack_usage_init(stk);
return_code = __swap_stack_and_call(stk,(APTR)call_main);
FreeMem(new_stack, stack_size);
FreeVec(stk);
}
else

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_math.c,v 1.1.1.1 2004-07-26 16:31:59 obarthel Exp $
* $Id: stdlib_math.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -41,13 +41,6 @@
/****************************************************************************/
void
__math_exit(void)
{
}
/****************************************************************************/
int
__math_init(void)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_mktemp.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
* $Id: stdlib_mktemp.c,v 1.3 2004-11-10 17:45:40 obarthel Exp $
*
* :ts=4
*
@@ -57,16 +57,19 @@ mktemp(char * name_template)
{
#if defined(UNIX_PATH_SEMANTICS)
struct name_translation_info name_template_nti;
char * original_name_template = NULL;
#endif /* UNIX_PATH_SEMANTICS */
char * test_name;
struct Process * this_process;
APTR old_window_pointer;
char * result = NULL;
int template_offset;
int template_len;
size_t template_offset;
size_t template_len;
size_t name_len;
size_t offset;
time_t now;
ULONG pseudo_random_number;
BPTR lock;
int i;
size_t i;
ENTER();
@@ -74,6 +77,8 @@ mktemp(char * name_template)
assert(name_template != NULL);
this_process = (struct Process *)FindTask(NULL);
#if defined(CHECK_FOR_NULL_POINTERS)
{
if(name_template == NULL)
@@ -89,13 +94,93 @@ mktemp(char * name_template)
if(__check_abort_enabled)
__check_abort();
SHOWSTRING(name_template);
/* So, how long is that name template? */
name_len = strlen(name_template);
if(name_len == 0)
{
SHOWMSG("invalid name template");
errno = EINVAL;
goto out;
}
/* Find out how many trailing 'X' characters there are in
the template. There should be at least 6. We also want
to know where to find the first 'X' and how many of the
'X' characters there are. */
template_offset = 0;
template_len = 0;
for(i = 0 ; i < name_len ; i++)
{
assert( name_len >= (i + 1) );
offset = name_len - (i + 1);
if(name_template[offset] != 'X')
break;
template_offset = offset;
template_len++;
}
SHOWVALUE(template_offset);
SHOWVALUE(template_len);
if(template_len == 0)
{
SHOWMSG("invalid name template");
errno = EINVAL;
goto out;
}
/* Generate a pseudo-random number from the current time and
the address of the current process. */
time(&now);
pseudo_random_number = (ULONG)now + (ULONG)this_process;
/* Fill the template 'X' characters with letters made up by
converting the pseudo-random number. */
for(i = 0 ; i < template_len ; i++)
{
name_template[template_offset + i] = 'A' + (pseudo_random_number % 26);
/* One more letter taken; if we run out of letters,
cook up another pseudo-random number. */
pseudo_random_number = (pseudo_random_number / 26);
if(pseudo_random_number == 0)
{
time(&now);
pseudo_random_number = (ULONG)now;
}
}
SHOWSTRING(name_template);
old_window_pointer = this_process->pr_WindowPtr;
/* Now check if the name we picked is unique. If not, make another name. */
while(TRUE)
{
if(__check_abort_enabled)
__check_abort();
D(("checking '%s'",name_template));
test_name = name_template;
/* If necessary, quickly translate the semantics of the file name
we cooked up above. */
#if defined(UNIX_PATH_SEMANTICS)
{
if(__unix_path_semantics)
{
original_name_template = name_template;
if(__translate_unix_to_amiga_path_name((char const **)&name_template,&name_template_nti) != 0)
if(__translate_unix_to_amiga_path_name((char const **)&test_name,&name_template_nti) != 0)
goto out;
if(name_template_nti.is_root)
@@ -107,62 +192,12 @@ mktemp(char * name_template)
}
#endif /* UNIX_PATH_SEMANTICS */
SHOWSTRING(name_template);
template_offset = -1;
template_len = 0;
for(i = strlen(name_template)-1 ; i >= 0 ; i--)
{
if(name_template[i] == 'X')
{
template_offset = i;
template_len++;
}
else
{
break;
}
}
if(template_offset == -1)
{
SHOWMSG("invalid name template");
errno = EINVAL;
goto out;
}
this_process = (struct Process *)FindTask(NULL);
time(&now);
now += (time_t)this_process;
for(i = 0 ; i < template_len ; i++)
{
name_template[template_offset + i] = 'A' + (now % 26);
now = (now / 26);
if(now == 0)
time(&now);
}
old_window_pointer = this_process->pr_WindowPtr;
while(TRUE)
{
if(__check_abort_enabled)
__check_abort();
D(("checking '%s'",name_template));
/* Turn off DOS error requesters. */
this_process->pr_WindowPtr = (APTR)-1;
/* Does this object exist already? */
PROFILE_OFF();
lock = Lock(name_template,SHARED_LOCK);
lock = Lock(test_name,SHARED_LOCK);
PROFILE_ON();
/* Restore DOS requesters. */
@@ -191,8 +226,7 @@ mktemp(char * name_template)
PROFILE_ON();
/* Change one letter; if that 'overflows', start
* over with 'A' and move on to the next position.
*/
over with 'A' and move on to the next position. */
for(i = 0 ; i < template_len ; i++)
{
name_template[template_offset + i]++;
@@ -205,20 +239,6 @@ mktemp(char * name_template)
SHOWSTRING(name_template);
#if defined(UNIX_PATH_SEMANTICS)
{
if(__unix_path_semantics)
{
if(__translate_amiga_to_unix_path_name((char const **)&name_template,&name_template_nti) != 0)
goto out;
strcpy(original_name_template,name_template);
}
}
#endif /* UNIX_PATH_SEMANTICS */
SHOWSTRING(name_template);
out:
RETURN(result);

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_protos.h,v 1.1.1.1 2004-07-26 16:32:02 obarthel Exp $
* $Id: stdlib_protos.h,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -60,7 +60,6 @@ struct MemoryTree;
/* math_init_exit.c */
extern int __math_init(void);
extern void __math_exit(void);
/****************************************************************************/
@@ -69,15 +68,8 @@ extern int __machine_test(void);
/****************************************************************************/
/* locale_init_exit.c */
extern int __locale_init(void);
extern void __locale_exit(void);
/****************************************************************************/
/* stdio_init_exit.c */
extern int __stdio_init(void);
extern void __stdio_exit(void);
/****************************************************************************/
@@ -87,18 +79,6 @@ extern void __stdlib_exit(void);
/****************************************************************************/
/* unistd_init_exit.c */
extern int __unistd_init(void);
extern void __unistd_exit(void);
/****************************************************************************/
/* dirent_init_exit.c */
extern int __dirent_init(void);
extern void __dirent_exit(void);
/****************************************************************************/
/* stdlib_atexit.c */
extern void __exit_trap_trigger(void);
@@ -106,13 +86,6 @@ extern void __exit_trap_trigger(void);
/* socket_init_exit.c */
extern int __socket_init(void);
extern void __socket_exit(void);
/****************************************************************************/
/* usergroup_init_exit.c */
extern int __usergroup_init(void);
extern void __usergroup_exit(void);
/****************************************************************************/
@@ -134,13 +107,11 @@ extern unsigned long __get_sp(void);
/* stdlib_wildcard_expand.c */
extern UBYTE * __allocate_quote_vector(int num_parameters);
extern int __wildcard_expand_init(void);
extern void __wildcard_expand_exit(void);
/****************************************************************************/
/* stdlib_stackextension.c */
extern int __stk_init(void);
extern void __stk_exit(void);
/****************************************************************************/
@@ -163,7 +134,6 @@ void _fini(void);
/* stdlib_startup.c */
extern int __startup_init(void);
extern void __startup_exit(void);
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_setjmp.c,v 1.1.1.1 2004-07-26 16:32:05 obarthel Exp $
* $Id: stdlib_setjmp.c,v 1.2 2004-09-27 15:07:20 tfrieden Exp $
*
* :ts=4
*
@@ -283,6 +283,8 @@ l1: moveml a0@(4:W),d1-d7 | restore all data registers \n\
/****************************************************************************/
#ifdef PPC_FLOATING_POINT_SUPPORT
__asm(" \n\
\n\
.text \n\
@@ -358,6 +360,48 @@ longjmp: \n\
blr \n\
\n\
");
#else
__asm(" \n\
\n\
.text \n\
.align 2 \n\
\n\
.globl setjmp \n\
\n\
setjmp: \n\
\n\
mflr r10 \n\
mfcr r11 \n\
mr r12, r1 \n\
stmw r10, 0(r3) \n\
li r3, 0 \n\
blr \n\
\n\
");
__asm(" \n\
.text \n\
.align 2 \n\
\n\
.globl longjmp \n\
\n\
longjmp: \n\
\n\
lmw r10,0(r3) \n\
mtlr r10 \n\
mtcr r11 \n\
mr r1,r12 \n\
cmpwi r4, 0 \n\
bne 1f \n\
li r3,1 \n\
blr \n\
1: \n\
mr r3, r4 \n\
blr \n\
\n\
");
#endif /* defined PPC_FLOATING_POINT_SUPPORT */
#endif /* defined STACK_EXTENSION */

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_socket.c,v 1.1.1.1 2004-07-26 16:32:06 obarthel Exp $
* $Id: stdlib_socket.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -37,13 +37,6 @@
/****************************************************************************/
void
__socket_exit(void)
{
}
/****************************************************************************/
int
__socket_init(void)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_stackcheck.c,v 1.1.1.1 2004-07-26 16:32:07 obarthel Exp $
* $Id: stdlib_stackcheck.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -123,8 +123,3 @@ __stk_init(void)
return(OK);
}
void
__stk_exit(void)
{
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_stackextension.c,v 1.1.1.1 2004-07-26 16:32:08 obarthel Exp $
* $Id: stdlib_stackextension.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -294,8 +294,7 @@ __stk_init(void)
/****************************************************************************/
/* Free all spare stackframes */
void
__stk_exit(void)
CLIB_DESTRUCTOR(__stk_exit)
{
ENTER();

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_startup.c,v 1.1.1.1 2004-07-26 16:32:10 obarthel Exp $
* $Id: stdlib_startup.c,v 1.3 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -421,9 +421,10 @@ __startup_init(void)
/****************************************************************************/
void
__startup_exit(void)
CLIB_DESTRUCTOR(__startup_exit)
{
ENTER();
PROFILE_OFF();
/* Now clean up after the streams set up for the Workbench
@@ -461,4 +462,6 @@ __startup_exit(void)
}
PROFILE_ON();
LEAVE();
}

204
library/stdlib_strtoll.c Normal file
View File

@@ -0,0 +1,204 @@
/*
* $Id: stdlib_strtoll.c,v 1.1 2004-09-20 17:16:06 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@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_NULL_POINTER_CHECK_H
#include "stdlib_null_pointer_check.h"
#endif /* _STDLIB_NULL_POINTER_CHECK_H */
/****************************************************************************/
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
#if defined(USE_64_BIT_INTS)
/****************************************************************************/
long long
strtoll(const char *str, char **ptr, int base)
{
BOOL is_negative;
long long result = 0;
long long new_sum;
long long sum;
char c;
ENTER();
SHOWSTRING(str);
SHOWPOINTER(ptr);
SHOWVALUE(base);
assert(str != NULL && base >= 0);
#if defined(CHECK_FOR_NULL_POINTERS)
{
if(str == NULL)
{
SHOWMSG("invalid str parameter");
errno = EFAULT;
goto out;
}
}
#endif /* CHECK_FOR_NULL_POINTERS */
if(base < 0)
{
SHOWMSG("invalid base parameter");
errno = ERANGE;
goto out;
}
/* Skip all leading blanks. */
while((c = (*str)) != '\0')
{
if(NOT isspace(c))
break;
str++;
}
/* The first character may be a sign. */
if(c == '-')
{
/* It's a negative number. */
is_negative = TRUE;
str++;
}
else
{
/* It's not going to be negative. */
is_negative = FALSE;
/* But there may be a sign we will choose to
* ignore.
*/
if(c == '+')
str++;
}
c = (*str);
/* There may be a leading '0x' to indicate that what
* follows is a hexadecimal number.
*/
if(base == 0 || base == 16)
{
if((c == '0') && (str[1] == 'x' || str[1] == 'X'))
{
base = 16;
str += 2;
c = (*str);
}
}
/* If we still don't know what base to use and the
* next letter to follow is a zero then this is
* probably a number in octal notation.
*/
if(base == 0)
{
if(c == '0')
base = 8;
else
base = 10;
}
sum = 0;
if(1 <= base && base <= 36)
{
while(c != '\0')
{
if('0' <= c && c <= '9')
c -= '0';
else if ('a' <= c)
c -= 'a' - 10;
else if ('A' <= c)
c -= 'A' - 10;
else
break;
/* Ignore invalid numbers. */
if(c >= base)
break;
new_sum = base * sum + c;
if(new_sum < sum) /* overflow? */
{
errno = ERANGE;
if(is_negative)
result = LONG_MIN;
else
result = LONG_MAX;
goto out;
}
sum = new_sum;
str++;
c = (*str);
}
}
if(is_negative)
result = (-sum);
else
result = sum;
out:
/* If desired, remember where we stopped reading the
* number from the buffer.
*/
if(ptr != NULL)
(*ptr) = (char *)str;
RETURN(result);
return(result);
}
/****************************************************************************/
#endif /* USE_64_BIT_INTS */

201
library/stdlib_strtoull.c Normal file
View File

@@ -0,0 +1,201 @@
/*
* $Id: stdlib_strtoull.c,v 1.1 2004-09-20 17:16:06 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@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_NULL_POINTER_CHECK_H
#include "stdlib_null_pointer_check.h"
#endif /* _STDLIB_NULL_POINTER_CHECK_H */
/****************************************************************************/
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
#if defined(USE_64_BIT_INTS)
/****************************************************************************/
unsigned long long
strtoull(const char *str, char **ptr, int base)
{
BOOL is_negative;
unsigned long long result = 0;
unsigned long long new_sum;
unsigned long long sum;
char c;
ENTER();
SHOWSTRING(str);
SHOWPOINTER(ptr);
SHOWVALUE(base);
assert(str != NULL && base >= 0);
#if defined(CHECK_FOR_NULL_POINTERS)
{
if(str == NULL)
{
SHOWMSG("invalid str parameter");
errno = EFAULT;
goto out;
}
}
#endif /* CHECK_FOR_NULL_POINTERS */
if(base < 0)
{
SHOWMSG("invalid base parameter");
errno = ERANGE;
goto out;
}
/* Skip all leading blanks. */
while((c = (*str)) != '\0')
{
if(NOT isspace(c))
break;
str++;
}
/* The first character may be a sign. */
if(c == '-')
{
/* It's a negative number. */
is_negative = TRUE;
str++;
}
else
{
/* It's not going to be negative. */
is_negative = FALSE;
/* But there may be a sign we will choose to
* ignore.
*/
if(c == '+')
str++;
}
c = (*str);
/* There may be a leading '0x' to indicate that what
* follows is a hexadecimal number.
*/
if(base == 0 || base == 16)
{
if((c == '0') && (str[1] == 'x' || str[1] == 'X'))
{
base = 16;
str += 2;
c = (*str);
}
}
/* If we still don't know what base to use and the
* next letter to follow is a zero then this is
* probably a number in octal notation.
*/
if(base == 0)
{
if(c == '0')
base = 8;
else
base = 10;
}
sum = 0;
if(1 <= base && base <= 36)
{
while(c != '\0')
{
if('0' <= c && c <= '9')
c -= '0';
else if ('a' <= c)
c -= 'a' - 10;
else if ('A' <= c)
c -= 'A' - 10;
else
break;
/* Ignore invalid numbers. */
if(c >= base)
break;
new_sum = base * sum + c;
if(new_sum < sum) /* overflow? */
{
errno = ERANGE;
result = ULONG_MAX;
goto out;
}
sum = new_sum;
str++;
c = (*str);
}
}
if(is_negative)
result = (-sum);
else
result = sum;
out:
/* If desired, remember where we stopped reading the
* number from the buffer.
*/
if(ptr != NULL)
(*ptr) = (char *)str;
RETURN(result);
return(result);
}
/****************************************************************************/
#endif /* USE_64_BIT_INTS */

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_swapstack.c,v 1.1.1.1 2004-07-26 16:32:11 obarthel Exp $
* $Id: stdlib_swapstack.c,v 1.2 2004-10-02 15:56:13 obarthel Exp $
*
* :ts=4
*
@@ -94,51 +94,19 @@ ___swap_stack_and_call: \n\
/****************************************************************************/
__asm(" \n\
\n\
.text \n\
.align 2 \n\
\n\
.set MainInterface, 632 \n\
.set IExec_StackSwap, 272 \n\
\n\
.globl SysBase \n\
.globl __swap_stack_and_call \n\
\n\
__swap_stack_and_call: \n\
stwu r1, -32(r1) # Make a stack frame \n\
mflr r0 \n\
stw r0, 36(r1) \n\
stmw r29, 8(r1) # Get us three GPRs \n\
# r29 will store IExec \n\
mr r4, r31 # Backup ptr to function to call \n\
mr r3, r30 # Backup ptr to StackSwapStruct \n\
\n\
lis r3, SysBase@ha # Retrieve sysbase pointer \n\
lwz r3, SysBase@l(r3) \n\
lwz r29, MainInterface(r3) # Get IExec \n\
\n\
addi r3, r29, IExec_StackSwap # StackSwap entry \n\
mr r4, r30 # StackSwap struct in r4 \n\
mtlr r3 \n\
blrl # IExec->StackSwap(r4) \n\
\n\
mtlr r31 # Call payload \n\
blrl \n\
\n\
addi r3, r29, IExec_StackSwap # Revert to old stack \n\
mr r4, r30 \n\
mtlr r3 \n\
blrl \n\
\n\
lmw r29, 8(r1) # Restore registers \n\
lwz r0, 36(r1) \n\
mtlr r0 \n\
addi r1, r1, 32 # Clean up stack \n\
\n\
blr \n\
\n\
");
/* Swap the current stack configuration out, call a function provided,
swap the stack configuration back and return. */
int
__swap_stack_and_call(struct StackSwapStruct * stk,APTR function)
{
register int result;
StackSwap(stk);
result = ((int (*)(void))function)();
StackSwap(stk);
return(result);
}
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_wildcard_expand.c,v 1.1.1.1 2004-07-26 16:32:13 obarthel Exp $
* $Id: stdlib_wildcard_expand.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -39,7 +39,6 @@
UBYTE * WEAK __allocate_quote_vector(int num_parameters UNUSED);
int WEAK __wildcard_expand_init(void);
void WEAK __wildcard_expand_exit(void);
/****************************************************************************/
@@ -56,10 +55,3 @@ __wildcard_expand_init(void)
{
return(0);
}
/****************************************************************************/
void
__wildcard_expand_exit(void)
{
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: string_strtok.c,v 1.1.1.1 2004-07-26 16:32:20 obarthel Exp $
* $Id: string_strtok.c,v 1.2 2004-10-25 19:53:15 obarthel Exp $
*
* :ts=4
*
@@ -89,9 +89,12 @@ strtok(char *str, const char *separator_set)
goto out;
/* This is where the search can resume later. */
last = &str[size+1];
if((*last) == '\0')
last = NULL;
last = &str[size];
/* If we didn't hit the end of the string already,
skip the separator. */
if((*last) != '\0')
last++;
/* This is the token we found; make sure that
it looks like a valid string. */

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_clock.c,v 1.1.1.1 2004-07-26 16:32:21 obarthel Exp $
* $Id: time_clock.c,v 1.2 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -37,6 +37,22 @@
/****************************************************************************/
static struct DateStamp start_time;
/****************************************************************************/
CLIB_CONSTRUCTOR(init_start_time)
{
/* Remember when this program was started. */
DateStamp(&start_time);
RETURN(OK);
CONSTRUCTOR_SUCCEED();
}
/****************************************************************************/
clock_t
clock(void)
{
@@ -57,8 +73,8 @@ clock(void)
minutes_now = now.ds_Days * 24 * 60 + now.ds_Minute;
ticks_now = now.ds_Tick;
minutes_start = __start_time.ds_Days * 24 * 60 + __start_time.ds_Minute;
ticks_start = __start_time.ds_Tick;
minutes_start = start_time.ds_Days * 24 * 60 + start_time.ds_Minute;
ticks_start = start_time.ds_Tick;
/* Subtract the start time from the current time. We start
* with the ticks.

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_data.c,v 1.1.1.1 2004-07-26 16:32:22 obarthel Exp $
* $Id: time_data.c,v 1.2 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -37,10 +37,6 @@
/****************************************************************************/
struct DateStamp __start_time;
/****************************************************************************/
const char * const __abbreviated_week_day_names[7] =
{
"Sun",

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_headers.h,v 1.1.1.1 2004-07-26 16:32:23 obarthel Exp $
* $Id: time_headers.h,v 1.2 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -84,10 +84,6 @@
/****************************************************************************/
extern struct DateStamp __start_time;
/****************************************************************************/
extern const char * const __abbreviated_week_day_names[7];
extern const char * const __week_day_names[7];
extern const char * const __abbreviated_month_names[12];

View File

@@ -1,5 +1,5 @@
/*
* $Id: unistd_data.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
* $Id: unistd_chdir_exit.c,v 1.2 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -41,20 +41,34 @@
/****************************************************************************/
/* Names of files and directories to delete when shutting down. */
struct MinList __unlink_list;
/****************************************************************************/
/* Local timer I/O. */
struct MsgPort * __timer_port;
struct timerequest * __timer_request;
/****************************************************************************/
/* If the program's current directory was changed, here is where
* we find out about it.
*/
BPTR __original_current_directory;
BOOL __current_directory_changed;
BOOL __unlock_current_directory;
we find out about it. */
BPTR NOCOMMON __original_current_directory;
BOOL NOCOMMON __current_directory_changed;
BOOL NOCOMMON __unlock_current_directory;
/****************************************************************************/
CLIB_DESTRUCTOR(__chdir_exit)
{
ENTER();
if(__current_directory_changed)
{
BPTR old_dir;
old_dir = CurrentDir(__original_current_directory);
__original_current_directory = ZERO;
if(__unlock_current_directory)
{
UnLock(old_dir);
__unlock_current_directory = FALSE;
}
__current_directory_changed = FALSE;
}
LEAVE();
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: unistd_headers.h,v 1.1.1.1 2004-07-26 16:32:28 obarthel Exp $
* $Id: unistd_headers.h,v 1.3 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -47,22 +47,29 @@ extern char __current_path_name[MAXPATHLEN];
/****************************************************************************/
/* Names of files and directories to delete when shutting down. */
extern struct MinList __unlink_list;
extern struct MinList NOCOMMON __unlink_list;
/****************************************************************************/
/* Local timer I/O. */
extern struct MsgPort * __timer_port;
extern struct timerequest * __timer_request;
extern struct MsgPort * NOCOMMON __timer_port;
extern struct timerequest * NOCOMMON __timer_request;
extern BOOL NOCOMMON __timer_busy;
extern struct Library * NOCOMMON __TimerBase;
/****************************************************************************/
#if defined(__amigaos4__)
extern struct TimerIFace * NOCOMMON __ITimer;
#endif /* __amigaos4__ */
/****************************************************************************/
/* If the program's current directory was changed, here is where
* we find out about it.
*/
extern BPTR __original_current_directory;
extern BOOL __current_directory_changed;
extern BOOL __unlock_current_directory;
we find out about it. */
extern BPTR NOCOMMON __original_current_directory;
extern BOOL NOCOMMON __current_directory_changed;
extern BOOL NOCOMMON __unlock_current_directory;
/****************************************************************************/
@@ -75,4 +82,8 @@ extern void __strip_double_slash(char * file_name,int len);
/****************************************************************************/
extern unsigned int __time_delay(unsigned long seconds,unsigned long microseconds);
/****************************************************************************/
#endif /* _UNISTD_HEADERS_H */

View File

@@ -1,5 +1,5 @@
/*
* $Id: unistd_init_exit.c,v 1.3 2004-08-07 10:24:04 obarthel Exp $
* $Id: unistd_init_exit.c,v 1.6 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -41,21 +41,25 @@
/****************************************************************************/
int
__unistd_init(void)
/* Names of files and directories to delete when shutting down. */
struct MinList NOCOMMON __unlink_list;
/****************************************************************************/
CLIB_CONSTRUCTOR(__unistd_init)
{
ENTER();
NewList((struct List *)&__unlink_list);
RETURN(OK);
return(OK);
CONSTRUCTOR_SUCCEED();
}
/****************************************************************************/
void
__unistd_exit(void)
CLIB_DESTRUCTOR(__unistd_exit)
{
ENTER();
@@ -66,6 +70,9 @@ __unistd_exit(void)
struct UnlinkNode * uln;
BPTR old_dir;
/* Close all the files that still might be open. */
__close_all_files();
while((uln = (struct UnlinkNode *)RemHead((struct List *)&__unlink_list)))
{
old_dir = CurrentDir(uln->uln_Lock);
@@ -80,38 +87,6 @@ __unistd_exit(void)
}
}
if(__timer_request != NULL)
{
if(__timer_request->tr_node.io_Device != NULL)
CloseDevice((struct IORequest *)__timer_request);
DeleteIORequest((struct IORequest *)__timer_request);
__timer_request = NULL;
}
if(__timer_port != NULL)
{
DeleteMsgPort(__timer_port);
__timer_port = NULL;
}
if(__current_directory_changed)
{
BPTR old_dir;
old_dir = CurrentDir(__original_current_directory);
__original_current_directory = ZERO;
if(__unlock_current_directory)
{
UnLock(old_dir);
__unlock_current_directory = FALSE;
}
__current_directory_changed = FALSE;
}
PROFILE_ON();
LEAVE();

View File

@@ -1,5 +1,5 @@
/*
* $Id: unistd_sleep.c,v 1.2 2004-08-07 09:15:33 obarthel Exp $
* $Id: unistd_sleep.c,v 1.3 2004-09-29 12:10:29 obarthel Exp $
*
* :ts=4
*
@@ -44,132 +44,11 @@
unsigned int
sleep(unsigned int seconds)
{
static BOOL sleeping;
unsigned int result = 0;
unsigned int result;
ENTER();
SHOWVALUE(seconds);
if(__check_abort_enabled)
__check_abort();
if(seconds > 0)
{
if(NOT sleeping)
{
BOOL timer_open;
sleeping = TRUE;
if(__timer_request == NULL)
{
timer_open = FALSE;
SHOWMSG("trying to open the timer");
PROFILE_OFF();
__timer_port = CreateMsgPort();
if(__timer_port != NULL)
{
__timer_request = (struct timerequest *)CreateIORequest(__timer_port,sizeof(*__timer_request));
if(__timer_request != NULL)
{
if(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)__timer_request,0) == 0)
timer_open = TRUE;
}
}
if(NOT timer_open)
{
SHOWMSG("that didn't work");
DeleteIORequest((struct IORequest *)__timer_request);
__timer_request = NULL;
DeleteMsgPort(__timer_port);
__timer_port = NULL;
}
PROFILE_ON();
}
else
{
timer_open = TRUE;
}
if(timer_open)
{
ULONG signals_to_wait_for;
ULONG seconds_then;
ULONG timer_signal;
struct DateStamp ds;
ULONG signals;
__timer_request->tr_node.io_Command = TR_ADDREQUEST;
__timer_request->tr_time.tv_secs = seconds;
__timer_request->tr_time.tv_micro = 0;
timer_signal = (1UL << __timer_port->mp_SigBit);
signals_to_wait_for = timer_signal;
SetSignal(0,signals_to_wait_for);
if(__check_abort_enabled)
SET_FLAG(signals_to_wait_for,SIGBREAKF_CTRL_C);
PROFILE_OFF();
DateStamp(&ds);
PROFILE_ON();
seconds_then = (ds.ds_Days * 24 * 60 + ds.ds_Minute) * 60 + ds.ds_Tick / TICKS_PER_SECOND;
SendIO((struct IORequest *)__timer_request);
while(TRUE)
{
PROFILE_OFF();
signals = Wait(signals_to_wait_for);
PROFILE_ON();
if(FLAG_IS_SET(signals,SIGBREAKF_CTRL_C))
{
ULONG seconds_now;
if(CheckIO((struct IORequest *)__timer_request))
AbortIO((struct IORequest *)__timer_request);
WaitIO((struct IORequest *)__timer_request);
SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C);
__check_abort();
PROFILE_OFF();
DateStamp(&ds);
PROFILE_ON();
seconds_now = (ds.ds_Days * 24 * 60 + ds.ds_Minute) * 60 + ds.ds_Tick / TICKS_PER_SECOND;
seconds_now -= seconds_then;
if(seconds_now < seconds)
result = (seconds - seconds_now);
break;
}
if(FLAG_IS_SET(signals,timer_signal))
{
WaitIO((struct IORequest *)__timer_request);
break;
}
}
}
sleeping = FALSE;
}
}
result = __time_delay(seconds,0);
RETURN(result);
return(result);

139
library/unistd_time_delay.c Normal file
View File

@@ -0,0 +1,139 @@
/*
* $Id: unistd_time_delay.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@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 _UNISTD_HEADERS_H
#include "unistd_headers.h"
#endif /* _UNISTD_HEADERS_H */
/****************************************************************************/
#include <proto/timer.h>
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
unsigned int
__time_delay(unsigned long seconds,unsigned long microseconds)
{
unsigned int result = 0;
ENTER();
SHOWVALUE(seconds);
if(__check_abort_enabled)
__check_abort();
if((seconds > 0 || microseconds > 0) && NOT __timer_busy)
{
struct Library * TimerBase = __TimerBase;
#if defined(__amigaos4__)
struct TimerIFace * ITimer = __ITimer;
#endif /* __amigaos4__ */
ULONG signals_to_wait_for;
ULONG seconds_then;
ULONG timer_signal;
struct timeval tv;
ULONG signals;
__timer_busy = TRUE;
__timer_request->tr_node.io_Command = TR_ADDREQUEST;
__timer_request->tr_time.tv_secs = seconds;
__timer_request->tr_time.tv_micro = microseconds;
timer_signal = (1UL << __timer_port->mp_SigBit);
signals_to_wait_for = timer_signal;
SetSignal(0,signals_to_wait_for);
if(__check_abort_enabled)
SET_FLAG(signals_to_wait_for,SIGBREAKF_CTRL_C);
PROFILE_OFF();
GetSysTime(&tv);
PROFILE_ON();
seconds_then = tv.tv_secs + seconds;
SendIO((struct IORequest *)__timer_request);
while(TRUE)
{
PROFILE_OFF();
signals = Wait(signals_to_wait_for);
PROFILE_ON();
if(FLAG_IS_SET(signals,SIGBREAKF_CTRL_C))
{
ULONG seconds_now;
if(CheckIO((struct IORequest *)__timer_request))
AbortIO((struct IORequest *)__timer_request);
WaitIO((struct IORequest *)__timer_request);
SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C);
__check_abort();
/* Now figure out how many seconds have elapsed and
how many would still remain. */
PROFILE_OFF();
GetSysTime(&tv);
PROFILE_ON();
seconds_now = tv.tv_secs;
if(seconds_now < seconds_then)
result = seconds_then - seconds_now;
break;
}
if(FLAG_IS_SET(signals,timer_signal))
{
WaitIO((struct IORequest *)__timer_request);
break;
}
}
__timer_busy = FALSE;
}
RETURN(result);
return(result);
}

146
library/unistd_timer.c Normal file
View File

@@ -0,0 +1,146 @@
/*
* $Id: unistd_timer.c,v 1.2 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@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 _UNISTD_HEADERS_H
#include "unistd_headers.h"
#endif /* _UNISTD_HEADERS_H */
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
/* Local timer I/O. */
struct MsgPort * NOCOMMON __timer_port;
struct timerequest * NOCOMMON __timer_request;
BOOL NOCOMMON __timer_busy;
struct Library * NOCOMMON __TimerBase;
/****************************************************************************/
#if defined(__amigaos4__)
struct TimerIFace * NOCOMMON __ITimer;
#endif /* __amigaos4__ */
/****************************************************************************/
CLIB_CONSTRUCTOR(__timer_init)
{
BOOL success = FALSE;
ENTER();
__timer_port = CreateMsgPort();
if(__timer_port == NULL)
{
__show_error("The timer message port could not be created.");
goto out;
}
__timer_request = (struct timerequest *)CreateIORequest(__timer_port,sizeof(*__timer_request));
if(__timer_request == NULL)
{
__show_error("The timer I/O request could not be created.");
goto out;
}
if(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)__timer_request,0) != OK)
{
__show_error("The timer could not be opened.");
goto out;
}
__TimerBase = (struct Library *)__timer_request->tr_node.io_Device;
#if defined(__amigaos4__)
{
__ITimer = (struct TimerIFace *)GetInterface(__TimerBase, "main", 1, 0);
if(__ITimer == NULL)
{
__show_error("The timer interface could not be obtained.");
goto out;
}
}
#endif /* __amigaos4__ */
success = TRUE;
out:
RETURN(success);
if(success)
CONSTRUCTOR_SUCCEED();
else
CONSTRUCTOR_FAIL();
}
/****************************************************************************/
CLIB_DESTRUCTOR(__timer_exit)
{
ENTER();
#if defined(__amigaos4__)
{
if(__ITimer != NULL)
DropInterface((struct Interface *)__ITimer);
__ITimer = NULL;
}
#endif /* __amigaos4__ */
__TimerBase = NULL;
if(__timer_request != NULL)
{
if(__timer_request->tr_node.io_Device != NULL)
CloseDevice((struct IORequest *)__timer_request);
DeleteIORequest((struct IORequest *)__timer_request);
__timer_request = NULL;
}
if(__timer_port != NULL)
{
DeleteMsgPort(__timer_port);
__timer_port = NULL;
}
LEAVE();
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_usergroup.c,v 1.1.1.1 2004-07-26 16:32:13 obarthel Exp $
* $Id: unistd_usleep.c,v 1.1 2004-09-29 12:10:29 obarthel Exp $
*
* :ts=4
*
@@ -31,21 +31,24 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
#ifndef _UNISTD_HEADERS_H
#include "unistd_headers.h"
#endif /* _UNISTD_HEADERS_H */
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
void
__usergroup_exit(void)
usleep(unsigned long microseconds)
{
}
ENTER();
/****************************************************************************/
SHOWVALUE(microseconds);
int
__usergroup_init(void)
{
return(OK);
__time_delay(0,microseconds);
LEAVE();
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: unistd_wildcard_expand.c,v 1.1.1.1 2004-07-26 16:32:33 obarthel Exp $
* $Id: unistd_wildcard_expand.c,v 1.3 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -74,16 +74,17 @@ static struct AnchorPath * anchor;
/****************************************************************************/
void
__wildcard_expand_exit(void)
CLIB_DESTRUCTOR(__wildcard_expand_exit)
{
ENTER();
if(anchor != NULL)
{
MatchEnd(anchor);
free(anchor);
anchor = NULL;
}
LEAVE();
}
/****************************************************************************/

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 172
#define DATE "21.8.2004"
#define VERS "unix.lib 1.172"
#define VSTRING "unix.lib 1.172 (21.8.2004)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.172 (21.8.2004)"
#define REVISION 183
#define DATE "13.11.2004"
#define VERS "unix.lib 1.183"
#define VSTRING "unix.lib 1.183 (13.11.2004)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.183 (13.11.2004)"

View File

@@ -1 +1 @@
172
183

View File

@@ -1,5 +1,5 @@
/*
* $Id: usergroup_data.c,v 1.1.1.1 2004-07-26 16:32:34 obarthel Exp $
* $Id: usergroup_data.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
*
* :ts=4
*
@@ -41,18 +41,6 @@
/****************************************************************************/
struct Library * __UserGroupBase;
/****************************************************************************/
#if defined(__amigaos4__)
struct UserGroupIFace *__IUserGroup;
#endif /* __amigaos4__ */
/****************************************************************************/
int __root_uid;
int __root_gid;
int __root_euid;

View File

@@ -1,5 +1,5 @@
/*
* $Id: usergroup_headers.h,v 1.1.1.1 2004-07-26 16:32:38 obarthel Exp $
* $Id: usergroup_headers.h,v 1.3 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -42,13 +42,13 @@
/****************************************************************************/
extern struct Library * __UserGroupBase;
extern struct Library * NOCOMMON __UserGroupBase;
/****************************************************************************/
#if defined(__amigaos4__)
extern struct UserGroupIFace *__IUserGroup;
extern struct UserGroupIFace * NOCOMMON __IUserGroup;
#endif /* __amigaos4__ */
@@ -519,14 +519,18 @@ extern int __root_egid;
#define __umask(mask) ({ \
ULONG _umask_mask = (mask); \
{ \
ULONG _umask__re = \
({ \
register struct Library * const __umask__bn __asm("a6") = (struct Library *) (__UserGroupBase);\
register ULONG __umask__re __asm("d0"); \
register ULONG __umask_mask __asm("d0") = (_umask_mask); \
__asm volatile ("jsr a6@(-192:W)" \
: \
: "=r"(__umask__re) \
: "r"(__umask__bn), "r"(__umask_mask) \
: "d0", "d1", "a0", "a1", "fp0", "fp1", "cc", "memory"); \
} \
: "d1", "a0", "a1", "fp0", "fp1", "cc", "memory"); \
__umask__re; \
}); \
_umask__re; \
})
#define __getumask() ({ \
@@ -718,7 +722,7 @@ VOID __endgrent(VOID);
UBYTE *__crypt(UBYTE *key,UBYTE *set);
UBYTE *__ug_GetSalt(struct passwd *user,UBYTE *buf,ULONG size);
UBYTE *__getpass(UBYTE *prompt);
VOID __umask(ULONG mask);
UWORD __umask(ULONG mask);
UWORD __getumask(VOID);
LONG __setsid(VOID);
LONG __getpgrp(VOID);

View File

@@ -1,5 +1,5 @@
/*
* $Id: usergroup_init_exit.c,v 1.1.1.1 2004-07-26 16:32:38 obarthel Exp $
* $Id: usergroup_init_exit.c,v 1.3 2004-09-29 19:57:58 obarthel Exp $
*
* :ts=4
*
@@ -54,12 +54,17 @@ extern char * __program_name;
/****************************************************************************/
extern void __show_error(const char * message);
struct Library * NOCOMMON __UserGroupBase;
/****************************************************************************/
void
__usergroup_exit(void)
#if defined(__amigaos4__)
struct UserGroupIFace * NOCOMMON __IUserGroup;
#endif /* __amigaos4__ */
/****************************************************************************/
CLIB_DESTRUCTOR(__usergroup_exit)
{
ENTER();
@@ -84,8 +89,7 @@ __usergroup_exit(void)
/****************************************************************************/
int
__usergroup_init(void)
CLIB_CONSTRUCTOR(__usergroup_init)
{
struct TagItem tags[2];
int result = ERROR;
@@ -139,7 +143,11 @@ __usergroup_init(void)
PROFILE_ON();
RETURN(result);
return(result);
if(result == OK)
CONSTRUCTOR_SUCCEED();
else
CONSTRUCTOR_FAIL();
}
/****************************************************************************/