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

74 Commits

Author SHA1 Message Date
Olaf Barthel
b35f5e0fdb This commit was manufactured by cvs2svn to create tag
'BEFORE_CONSTRUCTOR_CHANGE'.

git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/tags/BEFORE_CONSTRUCTOR_CHANGE@14881 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-11 11:35:32 +00:00
Olaf Barthel
86b7e5c429 - Introduced new constructor types and changed the overall priority
order.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14880 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-11 11:35:31 +00:00
Olaf Barthel
42963b39c4 - Moved data out of stdlib_data.c and into the code that references
or initializes it.

- The stdlib constructor now performs the CPU/FPU compatibility test.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14879 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-11 09:37:29 +00:00
Olaf Barthel
678cab02fb - The macro definitions deserved better documentation. Well, they probably still do...
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14878 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-10 13:58:13 +00:00
Olaf Barthel
59d7f8d07f - Fixed another interesting bug in the OS4 destructor code.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14877 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-10 13:30:11 +00:00
Olaf Barthel
9a7c8a8705 - Corrected a typo in the OS4 destructor code.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14876 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-10 13:28:05 +00:00
Olaf Barthel
96e74015f0 - Added S_IREAD, S_IWRITE and S_IEXEC aliases to <sys/stat.h>.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14875 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-10 11:40:57 +00:00
Olaf Barthel
db8710d2ae - Reimplemented the constructor/destructor invocation code for GCC.
Both the 68k and PowerPC platform now invoke them in the same order
  and the 68k code uses the designated invocation priorities. The
  PowerPC destructor function now sets up the exit() jmp_buf before
  the destructor functions are called.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14874 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-10 09:55:03 +00:00
Olaf Barthel
91f12dd8f0 - Reworked the constructor/destructor macros again.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14873 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-10 07:53:57 +00:00
Olaf Barthel
d2f157b0a1 - Cleaned up the GCC constructor/destructor macros again. There is more to come.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14872 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-10 07:47:51 +00:00
Olaf Barthel
e3e82b3657 - Thanks to Joerg Strohmayer, the GCC library build now manages to
invoke the library's constructor/destructor functions in a
  very particular order. That way, you can use constructor/destructor
  functions in your own code and not have them clash with the library's
  own functions.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14871 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-09 21:07:25 +00:00
Olaf Barthel
4d3dc4a77f - The stdio destructor no longer resets the __iob pointer to NULL. This
avoids trouble with destructor functions which use stdio code. Unsolved
  problem: the order in which destructors and constructors are called.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14870 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-09 16:56:05 +00:00
Olaf Barthel
ee556fcb35 - Moved a few __delete_semaphore() calls into conditional compilation
sections where they should have been in the first place.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14869 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-09 12:06:10 +00:00
Olaf Barthel
cc8a8e42c0 - Moved the data declarations out of math_data.c, stat_data.c,
socket_data.c, dirent_data.c and stdio_data.c and into the
  code that initializes them.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14868 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-09 10:48:59 +00:00
Olaf Barthel
0fad53e56e - Moved the CPU/FPU type tests into the respective linker
libraries.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14867 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-07 16:56:36 +00:00
Olaf Barthel
d33e3e909e - Cleaned up the 68k build makefile, so that the CPU and FPU
tests and the error message display can run safely even
  on plain 68000 machines. This won't work for the 32 bit small
  data model, which implies 68020 code, but so there...


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14866 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-07 14:04:09 +00:00
Olaf Barthel
ef43011783 - Made the file descriptor checks in the fsync() and fdatasync()
functions more robust.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14865 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-07 11:58:50 +00:00
Olaf Barthel
a9c8cdc554 - Moved the Workbench console stream initialization into the
initialization code for the stdin/stdout/stderr streams and
  out of the program parameter setup.

- The current program name is now set up in the stdlib
  initialization function.

- Simplified the machine test code; moved the FPU check into
  the math initialization code.

- Added more safety checks to verify that file descriptor
  file handles are valid.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14864 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-07 11:16:43 +00:00
Olaf Barthel
d370bd123b - Corrected the names of macros.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14863 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-06 09:04:44 +00:00
Olaf Barthel
6931123dc1 - DoTimer() now calls AllocSysObject() rather than making up
a MsgPort locally.

- The record locking semaphore code now builds a semaphore to add
  before it tries to find the public one in memory. That way, the
  code can spend less time in Forbid() state and, heaven forbid,
  refrain from allocating memory while in that state.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14862 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-06 09:00:16 +00:00
Olaf Barthel
b2ddf28fa7 - Replaced the plain text documentation with HTML versions.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14861 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-05 18:34:01 +00:00
Olaf Barthel
1bc19a04d3 - Fixed a compiler problem in the socket setup.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14860 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-05 17:55:26 +00:00
Olaf Barthel
1a0999bc1c - Feature freeze!
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14859 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-05 17:16:55 +00:00
Olaf Barthel
1bf430d1d6 - In the thread-safe variant, the library now tries to allow
multiple concurrent callers to use the socket functions. Note
  that this works only with the Roadshow TCP/IP stack, and the
  results with other TCP/IP stacks are rather unpredictable.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14858 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-04 20:08:19 +00:00
Olaf Barthel
f2d1a3238d - Rewrote the code that allocates the file descriptor and file
buffer tables so that all the memory allocations are in one
  place and it's possible to specify exactly how many table
  entries are required at a time.

- Creation and initialization of semaphores now uses the AmigaOS4
  specific functions for this purpose, if available.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14857 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-04 09:07:09 +00:00
Olaf Barthel
2c3bd39f71 - Added a very simple test program, just to see how much of the library
it will pull in when linked.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14856 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-03 15:12:18 +00:00
Olaf Barthel
0deb0e3e2d - Added uname command, as contributed by Peter Bengtsson. Thank you very much!
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14855 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-03 15:02:26 +00:00
Olaf Barthel
dd380f8479 - Fixed the OS4 specific build makefile.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14854 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-03 14:46:10 +00:00
Olaf Barthel
ec3d921f7b - Moved the signal semaphore allocation/initialization/deallocation
into a dedicated module. This also has the advantage that it's
  harder to break code by accidentally forgetting to call
  InitSemaphore() after having allocated the memory for it.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14853 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-03 14:20:55 +00:00
Olaf Barthel
ebd6cc3639 - Added the missing header files required to rebuild ftw_ftw.c and
ftw_nftw.c.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14852 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-03 10:59:17 +00:00
Olaf Barthel
7690bb8399 - Reworked the code that handles quoting for the wildcard expansion
routine. We no longer allocate memory and then modify it, but
  call a function for each quoted parameter which does whatever is
  necessary.

- The shell command parameter parser now considers the non-breaking
  space character (ISO code 160) to be a blank space character, too.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14851 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-03 09:32:09 +00:00
Olaf Barthel
2aba208878 - The lstat() code now reliably detects that it found a soft link.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14850 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-02 18:49:01 +00:00
Olaf Barthel
593caccb38 - Fixed the compilation problems I had introduced by mistake.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14849 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-02 14:47:10 +00:00
Olaf Barthel
ac0cc97924 - Added atoll(), ffs(), ftw(), nftw(), lstat() and uname() code
contributed by Peter Bengtsson. Thank you very much!


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14848 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-03-02 12:57:56 +00:00
Olaf Barthel
ef44c75126 - Cleaned up the header files some more; the POSIX stdio thread locking functions
are now defined as empty macros unless __THREAD_SAFE is defined.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14847 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-28 13:42:54 +00:00
Olaf Barthel
9a8fe330a9 - Updated the README file to mention the PowerPC platform, the floating point
support and the thread-safety.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14846 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-28 13:32:59 +00:00
Olaf Barthel
17d81c12c0 - The translation of Unix to Amiga path names now silently accepts
absolute Amiga path names passed to it and will use them without
  changing them.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14845 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-28 13:32:11 +00:00
Olaf Barthel
c799b17bb9 - Extended the thread-safety locking to the file descriptors.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14844 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-28 13:22:53 +00:00
Olaf Barthel
1df294c07e - The thread-safety code is now subject to conditional compilation.
Both the library and the user code need to be rebuilt with the
  preprocessor symbol __THREAD_SAFE defined to get thread-safe
  code.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14843 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-28 10:07:35 +00:00
Olaf Barthel
f51faeb168 - Added more semaphore locking around the basic stdio, memory, locale
and dirent data operations. That should do it! While the library is
  not reentrant (this is not ixemul.library) it should be thread-safe
  now. Thread-safe in the sense of POSIX 1003.1c-1995.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14842 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-27 21:58:21 +00:00
Olaf Barthel
c0c70bfd99 - Added stdio thread locking functions flockfile(), funlockfile(),
and ftrylockfile().

- Modified the internal FILE structure to allow for thread locking.
  Note that this again requires that the library is rebuilt!

- Added or modified macros for getc_unlocked(), getchar_unlocked(),
  putc_unlocked() and putchar_unlocked().

- Added rand_r().

- Added flockfile()/funlockfile() wrappers around all stdio
  functions.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14841 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-27 18:09:12 +00:00
Olaf Barthel
b10d1ad38c - The process window pointer is now restored and reset between ^C
checks while wildcard patterns are expanded in the the command line.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14840 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-26 09:05:54 +00:00
Olaf Barthel
1550c6fef3 - When using the wildcard expansion code for command line
parameters (which is by default linked in with libunix.a),
  regular expressions can no longer prompt dos.library requesters
  to appear. However, to be on the safe side, if you are expecting
  to pass regular expressions on the command line, do not use
  the wildcard expansion code such as by overriding the library
  symbols with dummy functions such as are used in the file
  "stdlib_wildcard_expand.c".

- Added a new variable '__open_locale' which can be used to
  restrict all library functions to use the "C" language locale
  rather than the current system locale settings. In addition
  to that, two new functions __locale_exit() and __locale_init()
  can be used to close and (re-)open the system locale at a
  later time.

- Local ("static") functions are now identified by the STATIC
  qualifier. This was done in preparation for changes that will
  deal with global and local data and the issue of thread safety.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14839 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-25 10:14:22 +00:00
Olaf Barthel
53d99ac7a2 - Fixed a warning for a possibly uninitialized variable in the new iob hook
code.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14838 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-21 16:09:44 +00:00
Olaf Barthel
c4c25649f2 - Cosmetic changes for (hopefully) better readability.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14837 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-21 10:22:02 +00:00
Olaf Barthel
18f1f75479 - The lseek() function return code was not consistently treated as the
then current file position. Fixed.

- Numerous house-keeping changes.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14836 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-20 15:46:57 +00:00
Olaf Barthel
410833d2ed - The buffered and unbuffered file hook code is now invoked through
function pointers alone. The utility.library/CallHookPkt mechanism
  is no longer required.

- Moved the entire lseek() code relevant for files into the hook
  function.

- Simplified the close() function which now just calls into the
  hook code to perform whatever is necessary. The hook code is
  responsible for cleaning up after aliases, etc. This change in
  turn made it possible to greatly simplify the hook code for
  buffered files which now bypasses close/read/write/lseek and
  directly invokes the hook code for unbuffered files.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14835 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-20 13:19:40 +00:00
Olaf Barthel
cfa6f566db - Simplified the fcntl() code to use the varargs functions more carefully.
Also, the file descriptor duplication code no longer uses a goto to
  deliver its result.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14834 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-20 09:03:02 +00:00
Olaf Barthel
99547756fe - Major, major changes! Moved most of the monolithic code out of
the file descriptor hook and into the respective functions,
  such as dup2(), fchmod(), fchown(), fcntl(), fdatasync(), fstatfs(),
  fsync(), ftruncate() and lseek(). Code which is not strictly
  required will no longer find its way into your programs if you
  link with the updated library.

  NOTE: these changes require that the entire library is rebuilt!


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14833 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-18 18:53:17 +00:00
Olaf Barthel
ea638f0970 - Moved the slash translation code around a bit more. Now ".//" comes out as
"" rather than ":".


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14832 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-16 14:48:17 +00:00
Olaf Barthel
4aa85e1d12 - Rewrote the __translate_unix_to_amiga_path_name() function to
translate patterns such as "foo/bar/../../baz" properly, and to
  use strlen() less.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14831 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-15 17:27:22 +00:00
Olaf Barthel
fcb8cfc0dc - Small changes to make this build properly for OS4.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14830 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-07 11:19:32 +00:00
Olaf Barthel
a626336b7b - Tweaked the build makefiles to produce fewer meaningless warnings.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14828 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-07 10:52:32 +00:00
Olaf Barthel
07d09bb185 - Added the fsync() and fdatasync() functions and the <stdint.h> and
<inttypes.h> header files contributed by Peter Bengtsson. Thank
  you very much!


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14827 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-04 15:03:14 +00:00
Olaf Barthel
6ad88ff97f - The library no longer sends ACTION_DISK_INFO packets to the console
handler. The side-effects were too varied and irritating after all.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14826 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-04 08:49:10 +00:00
Olaf Barthel
2ddfeab0cf - Added some extra documentation on the WBStartup variable.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14825 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-03 17:33:54 +00:00
Olaf Barthel
91028c63bc - Lost the __not_a_number and __infinity variables, including the
code which initialized them.

- Reading/changing the errno variable is no longer done directly, but
  involves accessor functions.

- References to the HUGE_VAL quantity now involve an accessor function, too.

- Changed the manner in which the __huge_val constant is initialized by
  the __math_init() function.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14824 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-03 16:56:20 +00:00
Olaf Barthel
209884bd1f - We now allocate the AnchorPath used in the unistd_wildcard_expand.c
code. Also, the contents of the AnchorPath structure are no longer
  modified between calls. MatchEnd() has to be sufficient.

- Moved redundant code out of the readdir()/opendir()/closedir()
  functions which is not required unless the code is built for
  Unix compatibility mode.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14823 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-03 12:16:38 +00:00
Olaf Barthel
3548d3cf7e - We now allocate the AnchorPath used in the unistd_wildcard_expand.c
code. Also, the contents of the AnchorPath structure are no longer
  modified between calls. MatchEnd() has to be sufficient.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14822 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-02-03 12:14:55 +00:00
Olaf Barthel
50b8b623cc - Folded duplicate code in "time_mktime.c"; also, errno is no longer
modified unless the library is built with the "CHECK_FOR_NULL_POINTERS"
  option.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14821 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-30 16:10:59 +00:00
Olaf Barthel
49bc1d6b13 - Updated the ".cvsignore" file.
- Moved the date/time conversion test code around in "test.c".


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14820 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-30 10:23:26 +00:00
Olaf Barthel
fce21e21d6 - The functions in stdlib.h which require a compiler that supports the
"long long" data type are no longer prototyped if the library is built
  for SAS/C.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14819 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-30 09:48:06 +00:00
Olaf Barthel
f8b1e7516f - Folded duplicate code stdio_init_exit.c into a common function.
- Simplified the code in time_asctime_r.c which builds the time
  string. It gracefully handles buffer sizes which are too short
  by returning an empty string.

- Moved the tm->tm_wday initialization out of the hook function
  in time_strftime.c since it was to be called only once anyway.

- Lost a few compiler warnings in unistd_time_delay.c and
  time_gettimeofday.c.

- Folded duplicate code in time_mktime.c; also, errno is no longer
  modified unless the library is built with the CHECK_FOR_NULL_POINTERS
  option.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14818 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-30 09:37:59 +00:00
Olaf Barthel
8e2820e9b7 - Added the missing 'time_convert_time.c'.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14816 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-29 18:22:19 +00:00
Olaf Barthel
ab22a23f27 - Changed the algorithm that calculates the number of days that have passed
so far as used by the the __convert_time() function and the conversion
  code in strftime().

- Also changed the algorithm used by strftime() to produce the week numbers
  (the '%U' and '%W' format specifiers). The new method is much simpler
  than the old one.

- Made the code that converts a 'time_t' value into the 'struct DateStamp',
  as used by strftime() and utime(), into its own function. This also
  fixes a bug in the code strftime() would use which was completely
  unaware of the local time zone settings.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14815 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-29 18:05:14 +00:00
Olaf Barthel
0ae8d68e64 - We also test the strftime() %U, %W and %j format specifiers.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14814 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-29 17:48:07 +00:00
Olaf Barthel
0b1d21471d - Plugged in a different algorithm for calculating the day of the week in
strftime() and asctime_r(). This one isn't sensitive to the effects of
  adding/subtracting the local time zone.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14813 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-26 18:41:39 +00:00
Olaf Barthel
987316e638 - Added a missing file.
- Updated the .cvsignore file.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14812 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-26 09:24:38 +00:00
Olaf Barthel
e8d4187ea5 - The general test program now also exercises the time conversion functions.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14811 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-25 11:21:58 +00:00
Olaf Barthel
003faf7a24 - mktime() is supposed to convert the time specification, given as local
time, into the number of seconds since January 1st, 1970, relative to
  UTC. This didn't really work up until now since the time value returned
  was given as local time.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14810 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-25 11:21:00 +00:00
Olaf Barthel
d1aaa84bcc - Moved the common DateStamp to time_t conversion code into a shared
function.

- The fall-back function for converting time into a string in strftime()
  now calls itself for the "%x" and "%X" format specifiers.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14809 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-24 10:25:46 +00:00
Olaf Barthel
e1476c15b3 - Added instructions for switching over an existing Amiga 68k GCC installation
to use "clib2".


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14808 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-20 12:47:31 +00:00
Olaf Barthel
17fea5626a - Added a check against DBL_EPSILON in log() and log10() in place of the
check against 0 that used to be in there.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14807 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-18 20:00:08 +00:00
Olaf Barthel
e4b70e946f - The default console output window opened when a program is launched
from Workbench would open and stay open. This was not intended to
  happen and is a side-effect of the new stdio initialization code which
  checks if the stdio streams are in non-blocking mode. Fixed.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14806 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-15 08:17:10 +00:00
365 changed files with 10644 additions and 6043 deletions

View File

@@ -1,5 +1,5 @@
#
# $Id: GNUmakefile.68k,v 1.20 2005-01-14 09:07:16 obarthel Exp $
# $Id: GNUmakefile.68k,v 1.40 2005-03-11 09:37:27 obarthel Exp $
#
# :ts=8
#
@@ -77,30 +77,35 @@ $(LIBAMIGA_OBJS)/%.o : %.c
##############################################################################
ifeq (small_data_020,$(TYPE))
CODE_TYPE := -fbaserel -DSMALL_DATA -m68020-60 -DM68020
CODE_TYPE := -m68020-60
CODE_FLAGS := -fbaserel -DSMALL_DATA -DM68020
endif
ifeq (small_data,$(TYPE))
CODE_TYPE := -fbaserel -DSMALL_DATA -m68000
CODE_TYPE := -m68000
CODE_FLAGS := -fbaserel -DSMALL_DATA
endif
ifeq (small_data32,$(TYPE))
CODE_TYPE := -fbaserel32 -DSMALL_DATA32 -m68020-60 -DM68020
CODE_TYPE := -m68020-60
CODE_FLAGS := -fbaserel32 -DSMALL_DATA32 -DM68020
endif
ifeq (large_data_020,$(TYPE))
CODE_TYPE := -m68020-60 -DM68020
CODE_TYPE := -m68020-60
CODE_FLAGS := -DM68020
endif
ifeq (large_data,$(TYPE))
CODE_TYPE := -m68000
CODE_TYPE := -m68000
CODE_FLAGS :=
endif
##############################################################################
WARNINGS = \
-Wall -W -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
-Wundef -Wbad-function-cast -Wmissing-declarations
-Wundef -Wbad-function-cast -Wmissing-declarations -Wunused
# -Wconversion -Wshadow
@@ -108,11 +113,11 @@ INCLUDES = -Iinclude -I. -Inetinclude
OPTIONS = -DNDEBUG -fno-builtin
#OPTIONS = -D__MEM_DEBUG -fno-builtin
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
#OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
#OPTIMIZE = -O2 -fomit-frame-pointer
#DEBUG = -g2
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDES)
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_FLAGS) $(CODE_TYPE) $(INCLUDES)
##############################################################################
@@ -130,27 +135,30 @@ C_LIB = \
ctype_isspace.o \
ctype_isupper.o \
ctype_isxdigit.o \
ctype_table.o \
ctype_tolower.o \
ctype_toupper.o \
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 \
fcntl_fcntl.o \
fcntl_get_default_file.o \
fcntl_lock.o \
fcntl_lseek.o \
fcntl_open.o \
fcntl_read.o \
fcntl_write.o \
fcntl_get_default_file.o \
ftw_ftw.o \
ftw_nftw.o \
libgen_basename.o \
libgen_dirname.o \
locale_init_exit.o \
locale_localeconv.o \
locale_open_locale.o \
locale_setlocale.o \
mount_convertinfo.o \
mount_fstatfs.o \
@@ -168,7 +176,6 @@ C_LIB = \
signal_sigsetmask.o \
stat_chmod.o \
stat_convertfileinfo.o \
stat_data.o \
stat_fchmod.o \
stat_fstat.o \
stat_lstat.o \
@@ -178,21 +185,22 @@ C_LIB = \
stat_umask.o \
stdio_asprintf.o \
stdio_clearerr.o \
stdio_data.o \
stdio_dropiobreadbuffer.o \
stdio_duplicate_fd.o \
stdio_examine_fh.o \
stdio_fclose.o \
stdio_fdhookentry.o \
stdio_feof.o \
stdio_ferror.o \
stdio_fflush.o \
stdio_flush.o \
stdio_fgetc.o \
stdio_fgetpos.o \
stdio_fgets.o \
stdio_filliobreadbuffer.o \
stdio_findvacantfdentry.o \
stdio_findvacantiobentry.o \
stdio_flockfile.o \
stdio_flush.o \
stdio_flushiobwritebuffer.o \
stdio_fopen.o \
stdio_fprintf.o \
@@ -204,27 +212,38 @@ C_LIB = \
stdio_fseek.o \
stdio_fsetpos.o \
stdio_ftell.o \
stdio_ftrylockfile.o \
stdio_funlockfile.o \
stdio_fwrite.o \
stdio_getc.o \
stdio_getc_unlocked.o \
stdio_getchar.o \
stdio_get_file_descriptor.o \
stdio_getchar_unlocked.o \
stdio_gets.o \
stdio_get_file_descriptor.o \
stdio_growfdtable.o \
stdio_growiobtable.o \
stdio_grow_file.o \
stdio_initializefd.o \
stdio_initializeiob.o \
stdio_init_exit.o \
stdio_file_init.o \
stdio_iobhookentry.o \
stdio_lock.o \
stdio_locksemaphorename.o \
stdio_nostdio.o \
stdio_openiob.o \
stdio_parent_of_fh.o \
stdio_perror.o \
stdio_popen.o \
stdio_printf.o \
stdio_putc.o \
stdio_putc_unlocked.o \
stdio_putchar.o \
stdio_putchar_unlocked.o \
stdio_puts.o \
stdio_remove.o \
stdio_remove_fd_alias.o \
stdio_rename.o \
stdio_rewind.o \
stdio_scanf.o \
@@ -238,6 +257,7 @@ C_LIB = \
stdio_tmpnam.o \
stdio_translateioerror.o \
stdio_ungetc.o \
stdio_unlockfile.o \
stdio_vasprintf.o \
stdio_vasprintf_hook_entry.o \
stdio_vfprintf.o \
@@ -254,13 +274,12 @@ C_LIB = \
stdlib_atexit.o \
stdlib_atoi.o \
stdlib_atol.o \
stdlib_atoll.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 \
@@ -275,6 +294,7 @@ C_LIB = \
stdlib_getdefstacksize.o \
stdlib_getenv.o \
stdlib_getsp.o \
stdlib_get_errno.o \
stdlib_init_exit.o \
stdlib_isresident.o \
stdlib_labs.o \
@@ -295,10 +315,13 @@ C_LIB = \
stdlib_putenv.o \
stdlib_qsort.o \
stdlib_rand.o \
stdlib_rand_r.o \
stdlib_realloc.o \
stdlib_red_black.o \
stdlib_semaphore.o \
stdlib_setenv.o \
stdlib_setjmp.o \
stdlib_set_errno.o \
stdlib_set_process_window.o \
stdlib_shell_escape.o \
stdlib_showerror.o \
@@ -310,10 +333,11 @@ C_LIB = \
stdlib_stacksafezone.o \
stdlib_stacksize.o \
stdlib_stack_usage.o \
stdlib_startup.o \
stdlib_arg.o \
stdlib_stdio_window_spec.o \
stdlib_strtol.o \
stdlib_strtoul.o \
stdlib_strtoll.o \
stdlib_strtoul.o \
stdlib_strtoull.o \
stdlib_swapstack.o \
stdlib_sysbase.o \
@@ -325,7 +349,7 @@ C_LIB = \
stdlib_umodsi3.o \
stdlib_unsetenv.o \
stdlib_wildcard_expand.o \
stdlib_stdio_window_spec.o \
strings_ffs.o \
strings_strcasecmp.o \
strings_strncasecmp.o \
string_bcmp.o \
@@ -363,9 +387,12 @@ C_LIB = \
time_asctime_r.o \
time_clock.o \
time_converttime.o \
time_convert_datestamp.o \
time_convert_time.o \
time_ctime.o \
time_ctime_r.o \
time_data.o \
time_days_per_date.o \
time_gettimeofday.o \
time_gmtime.o \
time_gmtime_r.o \
@@ -375,6 +402,7 @@ C_LIB = \
time_numbertostring.o \
time_strftime.o \
time_time.o \
time_weekday.o \
unistd_access.o \
unistd_chdir.o \
unistd_chdir_exit.o \
@@ -383,8 +411,10 @@ C_LIB = \
unistd_dup.o \
unistd_dup2.o \
unistd_fchown.o \
unistd_fdatasync.o \
unistd_fdopen.o \
unistd_fileno.o \
unistd_fsync.o \
unistd_ftruncate.o \
unistd_getcwd.o \
unistd_getopt.o \
@@ -397,17 +427,18 @@ C_LIB = \
unistd_realpath.o \
unistd_sleep.o \
unistd_symlink.o \
unistd_sync_fd.o \
unistd_timer.o \
unistd_time_delay.o \
unistd_truncate.o \
unistd_unlink.o \
unistd_usleep.o \
utime_utime.o
utime_utime.o \
utsname_uname.o
UNIX_LIB = \
unix.lib_rev.o \
dirent_closedir.o \
dirent_data.o \
dirent_rewinddir.o \
dirent_opendir.o \
dirent_readdir.o \
@@ -427,9 +458,11 @@ UNIX_LIB = \
stdio_fflush.o \
stdio_fopen.o \
stdio_init_exit.o \
stdio_file_init.o \
stdio_locksemaphorename.o \
stdio_openiob.o \
stdio_popen.o \
stdio_record_locking.o \
stdio_remove.o \
stdio_rename.o \
stdlib_mkdtemp.o \
@@ -465,12 +498,12 @@ MATH_LIB = \
math_ceil.o \
math_cos.o \
math_cosh.o \
math_data.o \
math_exp.o \
math_fabs.o \
math_floor.o \
math_fmod.o \
math_frexp.o \
math_huge_val.o \
math_hypot.o \
math_init_exit.o \
math_isinf.o \
@@ -504,12 +537,12 @@ MATH_LIB = \
stdio_vsnprintf.o \
stdio_vsprintf.o \
stdlib_atof.o \
stdlib_machine_test.o \
stdlib_strtod.o \
time_difftime.o
MATH_LIB_881 = \
m881.lib_rev.o \
stdlib_machine_test.o \
$(MATH_LIB)
MATH_LIB_IEEE = \
@@ -559,7 +592,6 @@ NET_LIB = \
socket_accept.o \
socket_bind.o \
socket_connect.o \
socket_data.o \
socket_gethostbyaddr.o \
socket_gethostbyname.o \
socket_gethostid.o \
@@ -626,7 +658,8 @@ NET_LIB = \
usergroup_setregid.o \
usergroup_setreuid.o \
usergroup_setsid.o \
usergroup_setuid.o
usergroup_setuid.o \
utsname_uname.o
DEBUG_LIB = \
debug.lib_rev.o \
@@ -716,7 +749,7 @@ LIBS_020 := $(LIBM881_OBJS)/libm881.a $(LIBS_68K)
##############################################################################
# The 881 math library won't build in plain 68k mode
ifneq (,$(findstring 68020,$(CODE_TYPE)))
ifneq (,$(findstring 68020,$(CODE_FLAGS)))
LIBS := $(LIBS_020)
else
LIBS := $(LIBS_68K)
@@ -813,47 +846,47 @@ lib/libm020 : lib
lib/libb/libm020/libm.a: lib lib/libb/libm020
$(MAKE) TYPE=small_data_020 kitchen_sink
$(COPY) $(foreach file,$(LIBS_020),small_data_020/$(file)) lib/libb/libm020
@$(COPY) $(foreach file,$(LIBS_020),small_data_020/$(file)) lib/libb/libm020
lib/libb/libm.a: lib lib/libb
$(MAKE) TYPE=small_data kitchen_sink
$(COPY) $(foreach file,$(LIBS_68K),small_data/$(file)) lib/libb
@$(COPY) $(foreach file,$(LIBS_68K),small_data/$(file)) lib/libb
lib/libb32/libm020/libm.a: lib lib/libb32 lib/libb32/libm020
$(MAKE) TYPE=small_data32 kitchen_sink
$(COPY) $(foreach file,$(LIBS_020),small_data32/$(file)) lib/libb32/libm020
@$(COPY) $(foreach file,$(LIBS_020),small_data32/$(file)) lib/libb32/libm020
lib/libm020/libm.a: lib lib/libm020
$(MAKE) TYPE=large_data_020 kitchen_sink
$(COPY) $(foreach file,$(LIBS_020),large_data_020/$(file)) lib/libm020
@$(COPY) $(foreach file,$(LIBS_020),large_data_020/$(file)) lib/libm020
lib/libm.a: lib
$(MAKE) TYPE=large_data kitchen_sink
$(COPY) $(foreach file,$(LIBS_68K),large_data/$(file)) lib
@$(COPY) $(foreach file,$(LIBS_68K),large_data/$(file)) lib
lib/nrcrt0.o : lib nrcrt0.o
$(COPY) nrcrt0.o lib
@$(COPY) nrcrt0.o lib
lib/nbcrt0.o : lib nbcrt0.o
$(COPY) nbcrt0.o lib
@$(COPY) nbcrt0.o lib
lib/ncrt0.o : lib ncrt0.o
$(COPY) ncrt0.o lib
@$(COPY) ncrt0.o lib
lib/n32bcrt0.o : lib nb32crt0.o
$(COPY) nb32crt0.o lib
@$(COPY) nb32crt0.o lib
lib/n32rcrt0.o : lib nr32crt0.o
$(COPY) nr32crt0.o lib
@$(COPY) nr32crt0.o lib
lib/mainnb.o : lib mainnb.o
$(COPY) mainnb.o lib
@$(COPY) mainnb.o lib
lib/mainb.o : lib mainb.o
$(COPY) mainb.o lib
@$(COPY) mainb.o lib
lib/mainb32.o : lib mainb32.o
$(COPY) mainb32.o lib
@$(COPY) mainb32.o lib
##############################################################################
@@ -907,6 +940,27 @@ $(LIBC_OBJS)/stdlib_red_black.o : stdlib_red_black.c stdlib_mem_debug.h
##############################################################################
# The -fbaserel32 option requires the CPU type to be 68010/68020, too.
ifneq (,$(findstring fbaserel32,$(CODE_FLAGS)))
LOCAL_CODE_FLAGS := $(CODE_FLAGS) $(CODE_TYPE)
else
LOCAL_CODE_FLAGS := $(CODE_FLAGS)
endif
$(LIBC_OBJS)/stdlib_machine_test.o : stdlib_machine_test.c
@echo "Compiling $< [$(TYPE):c]"
@$(CC) -o $(LIBC_OBJS)/stdlib_machine_test.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(LOCAL_CODE_FLAGS) $(INCLUDES) $<
$(LIBM881_OBJS)/stdlib_machine_test.o : stdlib_machine_test.c
@echo "Compiling $< [$(TYPE):c]"
@$(CC) -o $(LIBM881_OBJS)/stdlib_machine_test.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(LOCAL_CODE_FLAGS) $(INCLUDES) -DM68881_FLOATING_POINT_SUPPORT $<
$(LIBC_OBJS)/stdlib_showerror.o : stdlib_showerror.c
@echo "Compiling $< [$(TYPE):c]"
@$(CC) -o $(LIBC_OBJS)/stdlib_showerror.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(LOCAL_CODE_FLAGS) $(INCLUDES) $<
##############################################################################
$(LIBC_OBJS)/stdlib_alloca_debug.o : stdlib_alloca.c
@echo "Compiling $< [$(TYPE):c debug]"
@$(CC) -o $(LIBC_OBJS)/stdlib_alloca_debug.o -c $(CFLAGS) -D__USE_MEM_TREES -D__MEM_DEBUG stdlib_alloca.c
@@ -1034,25 +1088,56 @@ $(LIBAMIGA_OBJS)/libamiga.a : $(LIBAMIGA_OBJS) $(foreach file,$(AMIGA_LIB),$(LIB
##############################################################################
nrcrt0.o : nrcrt0.S
$(CC) -traditional -o $@ -c nrcrt0.S
@echo "Assembling $< [resident]"
@$(CC) -traditional -o $@ -c nrcrt0.S
nr32crt0.o : nrcrt0.S
$(CC) -traditional -m68020 -DSMALL_DATA32 -o $@ -c nrcrt0.S
@echo "Assembling $< [resident32]"
@$(CC) -traditional -m68020 -DSMALL_DATA32 -o $@ -c nrcrt0.S
nbcrt0.o : ncrt0.S
$(CC) -traditional -DSMALL_DATA -o $@ -c ncrt0.S
@echo "Assembling $< [small_data]"
@$(CC) -traditional -DSMALL_DATA -o $@ -c ncrt0.S
nb32crt0.o : ncrt0.S
$(CC) -traditional -m68020 -DSMALL_DATA32 -o $@ -c ncrt0.S
@echo "Assembling $< [small_data32]"
@$(CC) -traditional -m68020 -DSMALL_DATA32 -o $@ -c ncrt0.S
ncrt0.o : ncrt0.S
$(CC) -traditional -o $@ -c ncrt0.S
@echo "Assembling $< [large_data]"
@$(CC) -traditional -o $@ -c ncrt0.S
mainb32.o : stdlib_main.c
$(CC) -o mainb32.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -fbaserel32 -DSMALL_DATA32 -m68020-60 -DM68020 stdlib_main.c
@echo "Compiling $< [small_data32]"
@$(CC) -o mainb32.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -fbaserel32 -DSMALL_DATA32 -m68020-60 -DM68020 stdlib_main.c
mainb.o : stdlib_main.c
$(CC) -o mainb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -fbaserel -DSMALL_DATA -m68000 stdlib_main.c
@echo "Compiling $< [small_data]"
@$(CC) -o mainb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -fbaserel -DSMALL_DATA -m68000 stdlib_main.c
mainnb.o : stdlib_main.c
$(CC) -o mainnb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -m68000 stdlib_main.c
@echo "Compiling $< [large_data]"
@$(CC) -o mainnb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -m68000 stdlib_main.c
##############################################################################
CONSTRUCTOR_FILES = \
amiga_rexxvars.c \
dirent_closedir.c \
locale_init_exit.c \
math_init_exit.c \
socket_init_exit.c \
stdio_file_init.c \
stdio_init_exit.c \
stdlib_alloca.c \
stdlib_setenv.c \
stdlib_stackextension.c \
time_clock.c \
unistd_chdir_exit.c \
unistd_init_exit.c \
unistd_timer.c \
unistd_wildcard_expand.c \
usergroup_init_exit.c
touch_constructor_files:
touch $(CONSTRUCTOR_FILES)

View File

@@ -1,5 +1,5 @@
#
# $Id: GNUmakefile.os4,v 1.20 2005-01-10 00:56:15 theantony Exp $
# $Id: GNUmakefile.os4,v 1.41 2005-03-11 09:37:28 obarthel Exp $
#
# :ts=8
#
@@ -105,11 +105,13 @@ endif
##############################################################################
WARNINGS = \
-Wall -W -Wshadow -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
-Wall -W -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
-Wundef -Wbad-function-cast -Wmissing-declarations -Wunused
# -Wconversion -Wshadow
INCLUDES = -Iinclude -I. -I$(SDK_INCLUDE)
OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames
OPTIONS = -D__THREAD_SAFE -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames
OPTIMIZE = -O -fomit-frame-pointer -funroll-loops
#DEBUG = -g
@@ -132,27 +134,30 @@ C_LIB = \
ctype_isspace.o \
ctype_isupper.o \
ctype_isxdigit.o \
ctype_table.o \
ctype_tolower.o \
ctype_toupper.o \
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 \
fcntl_fcntl.o \
fcntl_get_default_file.o \
fcntl_lock.o \
fcntl_lseek.o \
fcntl_open.o \
fcntl_read.o \
fcntl_write.o \
fcntl_get_default_file.o \
ftw_ftw.o \
ftw_nftw.o \
libgen_basename.o \
libgen_dirname.o \
locale_init_exit.o \
locale_localeconv.o \
locale_open_locale.o \
locale_setlocale.o \
mount_convertinfo.o \
mount_fstatfs.o \
@@ -170,7 +175,6 @@ C_LIB = \
signal_sigsetmask.o \
stat_chmod.o \
stat_convertfileinfo.o \
stat_data.o \
stat_fchmod.o \
stat_fstat.o \
stat_lstat.o \
@@ -180,21 +184,22 @@ C_LIB = \
stat_umask.o \
stdio_asprintf.o \
stdio_clearerr.o \
stdio_data.o \
stdio_dropiobreadbuffer.o \
stdio_duplicate_fd.o \
stdio_examine_fh.o \
stdio_fclose.o \
stdio_fdhookentry.o \
stdio_feof.o \
stdio_ferror.o \
stdio_fflush.o \
stdio_flush.o \
stdio_fgetc.o \
stdio_fgetpos.o \
stdio_fgets.o \
stdio_filliobreadbuffer.o \
stdio_findvacantfdentry.o \
stdio_findvacantiobentry.o \
stdio_flockfile.o \
stdio_flush.o \
stdio_flushiobwritebuffer.o \
stdio_fopen.o \
stdio_fprintf.o \
@@ -206,27 +211,38 @@ C_LIB = \
stdio_fseek.o \
stdio_fsetpos.o \
stdio_ftell.o \
stdio_ftrylockfile.o \
stdio_funlockfile.o \
stdio_fwrite.o \
stdio_getc.o \
stdio_getc_unlocked.o \
stdio_getchar.o \
stdio_get_file_descriptor.o \
stdio_getchar_unlocked.o \
stdio_gets.o \
stdio_get_file_descriptor.o \
stdio_growfdtable.o \
stdio_growiobtable.o \
stdio_grow_file.o \
stdio_initializefd.o \
stdio_initializeiob.o \
stdio_init_exit.o \
stdio_file_init.o \
stdio_iobhookentry.o \
stdio_lock.o \
stdio_locksemaphorename.o \
stdio_nostdio.o \
stdio_openiob.o \
stdio_parent_of_fh.o \
stdio_perror.o \
stdio_popen.o \
stdio_printf.o \
stdio_putc.o \
stdio_putc_unlocked.o \
stdio_putchar.o \
stdio_putchar_unlocked.o \
stdio_puts.o \
stdio_remove.o \
stdio_remove_fd_alias.o \
stdio_rename.o \
stdio_rewind.o \
stdio_scanf.o \
@@ -240,6 +256,7 @@ C_LIB = \
stdio_tmpnam.o \
stdio_translateioerror.o \
stdio_ungetc.o \
stdio_unlockfile.o \
stdio_vasprintf.o \
stdio_vasprintf_hook_entry.o \
stdio_vfprintf.o \
@@ -256,13 +273,12 @@ C_LIB = \
stdlib_atexit.o \
stdlib_atoi.o \
stdlib_atol.o \
stdlib_atoll.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 \
@@ -277,6 +293,7 @@ C_LIB = \
stdlib_getdefstacksize.o \
stdlib_getenv.o \
stdlib_getsp.o \
stdlib_get_errno.o \
stdlib_init_exit.o \
stdlib_isresident.o \
stdlib_labs.o \
@@ -297,10 +314,13 @@ C_LIB = \
stdlib_putenv.o \
stdlib_qsort.o \
stdlib_rand.o \
stdlib_rand_r.o \
stdlib_realloc.o \
stdlib_red_black.o \
stdlib_semaphore.o \
stdlib_setenv.o \
stdlib_setjmp.o \
stdlib_set_errno.o \
stdlib_set_process_window.o \
stdlib_shell_escape.o \
stdlib_showerror.o \
@@ -312,10 +332,11 @@ C_LIB = \
stdlib_stacksafezone.o \
stdlib_stacksize.o \
stdlib_stack_usage.o \
stdlib_startup.o \
stdlib_arg.o \
stdlib_stdio_window_spec.o \
stdlib_strtol.o \
stdlib_strtoul.o \
stdlib_strtoll.o \
stdlib_strtoul.o \
stdlib_strtoull.o \
stdlib_swapstack.o \
stdlib_sysbase.o \
@@ -327,7 +348,7 @@ C_LIB = \
stdlib_umodsi3.o \
stdlib_unsetenv.o \
stdlib_wildcard_expand.o \
stdlib_stdio_window_spec.o \
strings_ffs.o \
strings_strcasecmp.o \
strings_strncasecmp.o \
string_bcmp.o \
@@ -365,9 +386,12 @@ C_LIB = \
time_asctime_r.o \
time_clock.o \
time_converttime.o \
time_convert_datestamp.o \
time_convert_time.o \
time_ctime.o \
time_ctime_r.o \
time_data.o \
time_days_per_date.o \
time_gettimeofday.o \
time_gmtime.o \
time_gmtime_r.o \
@@ -377,6 +401,7 @@ C_LIB = \
time_numbertostring.o \
time_strftime.o \
time_time.o \
time_weekday.o \
unistd_access.o \
unistd_chdir.o \
unistd_chdir_exit.o \
@@ -385,8 +410,10 @@ C_LIB = \
unistd_dup.o \
unistd_dup2.o \
unistd_fchown.o \
unistd_fdatasync.o \
unistd_fdopen.o \
unistd_fileno.o \
unistd_fsync.o \
unistd_ftruncate.o \
unistd_getcwd.o \
unistd_getopt.o \
@@ -399,18 +426,19 @@ C_LIB = \
unistd_realpath.o \
unistd_sleep.o \
unistd_symlink.o \
unistd_sync_fd.o \
unistd_timer.o \
unistd_time_delay.o \
unistd_truncate.o \
unistd_unlink.o \
unistd_usleep.o \
utime_utime.o
utime_utime.o \
utsname_uname.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 \
@@ -429,10 +457,12 @@ UNIX_LIB = \
stdio_fdhookentry.o \
stdio_fflush.o \
stdio_fopen.o \
stdio_file_init.o \
stdio_init_exit.o \
stdio_locksemaphorename.o \
stdio_openiob.o \
stdio_popen.o \
stdio_record_locking.o \
stdio_remove.o \
stdio_rename.o \
stdlib_mkdtemp.o \
@@ -469,12 +499,12 @@ MATH_LIB = \
math_ceil.o \
math_cos.o \
math_cosh.o \
math_data.o \
math_exp.o \
math_fabs.o \
math_floor.o \
math_fmod.o \
math_frexp.o \
math_huge_val.o \
math_hypot.o \
math_init_exit.o \
math_isnan.o \
@@ -524,7 +554,6 @@ NET_LIB = \
socket_accept.o \
socket_bind.o \
socket_connect.o \
socket_data.o \
socket_gethostbyaddr.o \
socket_gethostbyname.o \
socket_gethostid.o \
@@ -591,7 +620,8 @@ NET_LIB = \
usergroup_setregid.o \
usergroup_setreuid.o \
usergroup_setsid.o \
usergroup_setuid.o
usergroup_setuid.o \
utsname_uname.o
# All objects files which make up libdebug.a
DEBUG_LIB = \

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 186
#define DATE "14.1.2005"
#define VERS "amiga.lib 1.186"
#define VSTRING "amiga.lib 1.186 (14.1.2005)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.186 (14.1.2005)"
#define REVISION 189
#define DATE "5.3.2005"
#define VERS "amiga.lib 1.189"
#define VSTRING "amiga.lib 1.189 (5.3.2005)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.189 (5.3.2005)"

View File

@@ -1 +1 @@
186
189

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_addtof.c,v 1.2 2005-01-02 09:07:06 obarthel Exp $
* $Id: amiga_addtof.c,v 1.3 2005-02-25 10:14:20 obarthel Exp $
*
* :ts=4
*
@@ -57,7 +57,7 @@ typedef LONG (* CFUNC)(APTR arg);
/****************************************************************************/
static LONG INTERRUPT ASM
STATIC LONG INTERRUPT ASM
call_routine(REG(a1,struct Isrvstr *i))
{
CFUNC p = (CFUNC)i->ccode;

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_dotimer.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: amiga_dotimer.c,v 1.3 2005-03-06 09:00:16 obarthel Exp $
*
* :ts=4
*
@@ -58,18 +58,37 @@ DoTimer(struct timeval *tv,LONG unit,LONG command)
assert( tv != NULL );
mp = AllocVec(sizeof(*mp),MEMF_ANY|MEMF_PUBLIC|MEMF_CLEAR);
if(mp == NULL)
#if defined(__amigaos4__)
{
error = IOERR_OPENFAIL;
goto out;
}
mp = AllocSysObjectTags(ASOT_PORT,
ASOPORT_Action, PA_SIGNAL,
ASOPORT_Signal, SIGB_SINGLE,
ASOPORT_Target, FindTask(NULL),
TAG_DONE);
mp->mp_Node.ln_Type = NT_MSGPORT;
mp->mp_Flags = PA_SIGNAL;
mp->mp_SigBit = SIGB_SINGLE;
mp->mp_SigTask = FindTask(NULL);
NewList(&mp->mp_MsgList);
if(mp == NULL)
{
error = IOERR_OPENFAIL;
goto out;
}
}
#else
{
mp = AllocVec(sizeof(*mp),MEMF_ANY|MEMF_PUBLIC|MEMF_CLEAR);
if(mp == NULL)
{
error = IOERR_OPENFAIL;
goto out;
}
mp->mp_Node.ln_Type = NT_MSGPORT;
mp->mp_Flags = PA_SIGNAL;
mp->mp_SigBit = SIGB_SINGLE;
mp->mp_SigTask = FindTask(NULL);
NewList(&mp->mp_MsgList);
}
#endif /* __amigaos4__ */
tr = (struct timerequest *)CreateIORequest(mp,sizeof(*tr));
if(tr == NULL)
@@ -107,7 +126,16 @@ DoTimer(struct timeval *tv,LONG unit,LONG command)
DeleteIORequest((struct IORequest *)tr);
}
FreeVec(mp);
#if defined(__amigaos4__)
{
if(mp != NULL)
FreeSysObject(ASOT_PORT,mp);
}
#else
{
FreeVec(mp);
}
#endif /* __amigaos4__ */
return(error);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_invertstring.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: amiga_invertstring.c,v 1.3 2005-02-25 10:14:20 obarthel Exp $
*
* :ts=4
*
@@ -49,7 +49,7 @@
/****************************************************************************/
static int
STATIC int
do_escape(int cc)
{
int result;
@@ -91,7 +91,7 @@ do_escape(int cc)
/****************************************************************************/
static ULONG
STATIC ULONG
do_angle(STRPTR * strp, struct InputEvent *ie)
{
ULONG result;

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_setsuperattrs.c,v 1.3 2005-01-09 10:10:41 obarthel Exp $
* $Id: amiga_setsuperattrs.c,v 1.4 2005-02-25 10:14:20 obarthel Exp $
*
* :ts=4
*
@@ -46,7 +46,7 @@
/****************************************************************************/
static ULONG
STATIC ULONG
SetSuperAttrsA(Class * cl,Object * obj,struct TagItem * tags)
{
ULONG result = 0;

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 186
#define DATE "14.1.2005"
#define VERS "c.lib 1.186"
#define VSTRING "c.lib 1.186 (14.1.2005)\r\n"
#define VERSTAG "\0$VER: c.lib 1.186 (14.1.2005)"
#define REVISION 189
#define DATE "5.3.2005"
#define VERS "c.lib 1.189"
#define VSTRING "c.lib 1.189 (5.3.2005)\r\n"
#define VERSTAG "\0$VER: c.lib 1.189 (5.3.2005)"

View File

@@ -1 +1 @@
186
189

View File

@@ -1,3 +1,265 @@
- DoTimer() now calls AllocSysObject() rather than making up
a MsgPort locally.
- The record locking semaphore code now builds a semaphore to add
before it tries to find the public one in memory. That way, the
code can spend less time in Forbid() state and, heaven forbid,
refrain from allocating memory while in that state.
- Split the general stdio initialization/cleanup code from the
initialization of the stdin/stdout/stderr streams.
- Moved the Workbench console stream initialization into the
initialization code for the stdin/stdout/stderr streams and
out of the program parameter setup.
- The current program name is now set up in the stdlib
initialization function.
- Simplified the machine test code; moved the FPU check into
the math initialization code.
- Added more safety checks to verify that file descriptor
file handles are valid.
- Made the file descriptor checks in the fsync() and fdatasync()
functions more robust.
- Cleaned up the 68k build makefile, so that the CPU and FPU
tests and the error message display can run safely even
on plain 68000 machines. This won't work for the 32 bit small
data model, which implies 68020 code, but so there...
- Moved the CPU/FPU type tests into the respective linker
libraries.
- Moved the data declarations out of math_data.c, stat_data.c,
socket_data.c, dirent_data.c and stdio_data.c and into the
code that initializes them.
- Moved a few __delete_semaphore() calls into conditional compilation
sections where they should have been in the first place.
- Thanks to Jörg Strohmayer, the GCC library build now manages to
invoke the library's constructor/destructor functions in a
very particular order. That way, you can use constructor/destructor
functions in your own code and not have them clash with the library's
own functions.
- Reimplemented the constructor/destructor invocation code for GCC.
Both the 68k and PowerPC platform now invoke them in the same order
and the 68k code uses the designated invocation priorities. The
PowerPC destructor function now sets up the exit() jmp_buf before
the destructor functions are called.
- Added S_IREAD, S_IWRITE and S_IEXEC aliases to <sys/stat.h>.
- Moved data out of stdlib_data.c and into the code that references
or initializes it.
- The stdlib constructor now performs the CPU/FPU compatibility test.
- Introduced new constructor types and changed the overall priority
order.
c.lib 1.189 (5.3.2005)
- Rewrote the __translate_unix_to_amiga_path_name() function to
translate patterns such as "foo/bar/../../baz" properly, and to
use strlen() a lot less.
- Major, major changes! Moved most of the monolithic code out of
the file descriptor hook and into the respective functions,
such as dup2(), fchmod(), fchown(), fcntl(), fdatasync(), fstatfs(),
fsync(), ftruncate() and lseek(). Code which is not strictly
required will no longer find its way into your programs if you
link with the updated library.
NOTE: these changes require that the entire library is rebuilt!
- The buffered and unbuffered file hook code is now invoked through
function pointers alone. The utility.library/CallHookPkt mechanism
is no longer required.
- Moved the entire lseek() code relevant for files into the hook
function.
- Simplified the close() function which now just calls into the
hook code to perform whatever is necessary. The hook code is
responsible for cleaning up after aliases, etc. This change in
turn made it possible to greatly simplify the hook code for
buffered files which now bypasses close/read/write/lseek and
directly invokes the hook code for unbuffered files.
- Added various floating point constants to <math.h>, courtesy
of Henning Nielsen Lund. Thank you very much!
- When using the wildcard expansion code for command line
parameters (which is by default linked in with libunix.a),
regular expressions can no longer prompt dos.library requesters
to appear. However, to be on the safe side, if you are expecting
to pass regular expressions on the command line, do not use
the wildcard expansion code such as by overriding the library
symbols with dummy functions such as are used in the file
"stdlib_wildcard_expand.c".
- Added a new variable '__open_locale' which can be used to
restrict all library functions to use the "C" language locale
rather than the current system locale settings. In addition
to that, two new functions __locale_exit() and __locale_init()
can be used to close and (re-)open the system locale at a
later time.
- Local ("static") functions are now identified by the STATIC
qualifier. This was done in preparation for changes that will
deal with global and local data and the issue of thread safety.
- Added stdio thread locking functions flockfile(), funlockfile(),
and ftrylockfile().
- Modified the internal FILE structure to allow for thread locking.
Note that this again requires that the library is rebuilt!
- Added or modified macros for getc_unlocked(), getchar_unlocked(),
putc_unlocked() and putchar_unlocked().
- Added rand_r().
- Added flockfile()/funlockfile() wrappers around all stdio
functions.
- Added more semaphore locking around the basic stdio, memory, locale
and dirent data operations. That should do it! While the library is
not reentrant (this is not ixemul.library) it should be thread-safe
now. Thread-safe in the sense of POSIX 1003.1c-1995.
- The thread-safety code is now subject to conditional compilation.
Both the library and the user code need to be rebuilt with the
preprocessor symbol __THREAD_SAFE defined to get thread-safe
code.
- Extended the thread-safety locking to the file descriptors.
NOTE: these changes require that the entire library is rebuilt!
- The translation of Unix to Amiga path names now silently accepts
absolute Amiga path names passed to it and will use them without
changing them.
- Added atoll(), ffs(), ftw(), nftw(), lstat() and uname() code
contributed by Peter Bengtsson. Thank you very much!
- Reworked the code that handles quoting for the wildcard expansion
routine. We no longer allocate memory and then modify it, but
call a function for each quoted parameter which does whatever is
necessary.
- The shell command parameter parser now considers the non-breaking
space character (ISO code 160) to be a blank space character, too.
- Moved the signal semaphore allocation/initialization/deallocation
into a dedicated module. This also has the advantage that it's
harder to break code by accidentally forgetting to call
InitSemaphore() after having allocated the memory for it.
- Rewrote the code that allocates the file descriptor and file
buffer tables so that all the memory allocations are in one
place and it's possible to specify exactly how many table
entries are required at a time.
- Creation and initialization of semaphores now uses the AmigaOS4
specific functions for this purpose, if available.
- In the thread-safe variant, the library now tries to allow
multiple concurrent callers to use the socket functions. Note
that this works only with the Roadshow TCP/IP stack, and the
results with other TCP/IP stacks are rather unpredictable.
c.lib 1.188 (7.2.2005)
- Folded duplicate code in "stdio_init_exit.c" into a common function.
- Simplified the code in "time_asctime_r.c" which builds the time
string. It gracefully handles buffer sizes which are too short
by returning an empty string.
- Moved the "tm->tm_wday" initialization out of the hook function
in "time_strftime.c" since it was to be called only once anyway.
- Lost a few compiler warnings in "unistd_time_delay.c" and
"time_gettimeofday.c".
- Folded duplicate code in "time_mktime.c"; also, errno is no longer
modified unless the library is built with the "CHECK_FOR_NULL_POINTERS"
option.
- We now allocate the AnchorPath used in the unistd_wildcard_expand.c
code. Also, the contents of the AnchorPath structure are no longer
modified between calls. MatchEnd() has to be sufficient.
- Moved redundant code out of the readdir()/opendir()/closedir()
functions which is not required unless the code is built for
Unix compatibility mode.
- Lost the __not_a_number and __infinity variables, including the
code which initialized them.
- Reading/changing the errno variable is no longer done directly, but
involves accessor functions.
- References to the HUGE_VAL quantity now involve an accessor function, too.
- Changed the manner in which the __huge_val constant is initialized by
the __math_init() function. The new approach should be more portable.
- The library no longer sends ACTION_DISK_INFO packets to the console
handler. The side-effects were too varied and irritating after all.
- Added the fsync() and fdatasync() functions and the <stdint.h> and
<inttypes.h> header files contributed by Peter Bengtsson. Thank
you very much!
- Tweaked the build makefiles to produce fewer meaningless warnings.
c.lib 1.187 (29.1.2005)
- The default console output window opened when a program is launched
from Workbench would open and stay open. This was not intended to
happen and is a side-effect of the new stdio initialization code which
checks if the stdio streams are in non-blocking mode. Fixed.
- Moved the common DateStamp to time_t conversion code into a shared
function.
- The fall-back function for converting time into a string in strftime()
now calls itself for the "%c", "%x" and "%X" format specifiers.
- mktime() is supposed to convert the time specification, given as local
time, into the number of seconds since January 1st, 1970, relative to
UTC. This didn't really work up until now since the time value returned
was given as local time.
- Plugged in a different algorithm for calculating the day of the week in
strftime() and asctime_r(). This one isn't sensitive to the effects of
adding/subtracting the local time zone.
- Changed the algorithm that calculates the number of days that have passed
so far as used by the the __convert_time() function and the conversion
code in strftime().
- Also changed the algorithm used by strftime() to produce the week numbers
(the '%U' and '%W' format specifiers). The new method is much simpler
than the old one.
- Made the code that converts a 'time_t' value into the 'struct DateStamp',
as used by strftime() and utime(), into its own function. This also
fixes a bug in the code strftime() would use which was completely
unaware of the local time zone settings.
c.lib 1.186 (14.1.2005)
- Redirecting stderr to a file no longer has the effect of showing error

View File

@@ -1,11 +1,15 @@
/*
* $Id: crtbegin.c,v 1.3 2004-09-29 16:54:54 obarthel Exp $
* $Id: crtbegin.c,v 1.8 2005-03-10 13:30:11 obarthel Exp $
*
* :ts=4
*
* Handles global constructors and destructors.
* Handles global constructors and destructors for the OS4 GCC build.
*/
#if defined(__amigaos4__)
/****************************************************************************/
#include <exec/types.h>
/****************************************************************************/
@@ -15,118 +19,28 @@
/****************************************************************************/
#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)
{
ULONG i = (ULONG)__DTOR_LIST__[0];
void (**pFuncPtr)(void);
if (i == ~0UL)
{
/* Find the end of the destructors list */
i = 1;
while (__DTOR_LIST__[i] != NULL)
i++;
/* We're at the NULL entry now. Go back by one */
i--;
}
/* Call all destructors in reverse order */
pFuncPtr = __DTOR_LIST__ + i;
while (i-- > 0)
(**pFuncPtr--)();
}
/****************************************************************************/
#else
/****************************************************************************/
typedef void (*func_ptr)(void);
/****************************************************************************/
static void
_do_ctors(void)
{
extern func_ptr __CTOR_LIST__[];
ULONG nptrs = (ULONG)__CTOR_LIST__[0];
ULONG i;
for(i = nptrs ; i > 0 ; i--)
__CTOR_LIST__[i]();
}
/****************************************************************************/
static void
_do_dtors(void)
{
extern func_ptr __DTOR_LIST__[];
extern jmp_buf __exit_jmp_buf;
ULONG nptrs = (ULONG)__DTOR_LIST__[0];
static ULONG i;
/* If one of the destructors drops into
* exit(), processing will continue with
* the next following destructor.
*/
(void)setjmp(__exit_jmp_buf);
while(i++ < nptrs)
__DTOR_LIST__[i]();
}
/****************************************************************************/
#endif /*__amigaos4__ */
/****************************************************************************/
/* FIXME: Do we need to put these in .init/.fini sections? */
//void _init(void) __attribute__((section(".init")));
//void _fini(void) __attribute__((section(".fini")));
static void (*__CTOR_LIST__[1]) (void) __attribute__(( used, section(".ctors"), aligned(sizeof(void (*)(void))) ));
static void (*__DTOR_LIST__[1]) (void) __attribute__(( used, section(".dtors"), aligned(sizeof(void (*)(void))) ));
/****************************************************************************/
void
_init(void)
{
_do_ctors();
int num_ctors,i;
int j;
for(i = 1, num_ctors = 0 ; __CTOR_LIST__[i] != NULL ; i++)
num_ctors++;
for(j = 0 ; j < num_ctors ; j++)
__CTOR_LIST__[num_ctors - j]();
}
/****************************************************************************/
@@ -134,5 +48,23 @@ _init(void)
void
_fini(void)
{
_do_dtors();
extern jmp_buf __exit_jmp_buf;
int num_dtors,i;
static int j;
/* If one of the destructors drops into
exit(), processing will continue with
the next following destructor. */
(void)setjmp(__exit_jmp_buf);
for(i = 1, num_dtors = 0 ; __DTOR_LIST__[i] != NULL ; i++)
num_dtors++;
while(j++ < num_dtors)
__DTOR_LIST__[j]();
}
/****************************************************************************/
#endif /*__amigaos4__ */

View File

@@ -1,5 +1,5 @@
/*
* $Id: crtend.c,v 1.1.1.1 2004-07-26 16:30:22 obarthel Exp $
* $Id: crtend.c,v 1.2 2005-03-09 21:07:25 obarthel Exp $
*
* :ts=4
*
@@ -10,9 +10,10 @@
/****************************************************************************/
static volatile void (*__CTOR_LIST__[1]) (void) __attribute__((used,section(".ctors"))) = { (void *)0 };
static volatile void (*__DTOR_LIST__[1]) (void) __attribute__((used,section(".dtors"))) = { (void *)0 };
static void (*__CTOR_LIST__[1]) (void) __attribute__((used, section(".ctors"), aligned(sizeof(void (*)(void))) ));
static void (*__DTOR_LIST__[1]) (void) __attribute__((used, section(".dtors"), aligned(sizeof(void (*)(void))) ));
/****************************************************************************/
#endif /*__amigaos4__ */

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_isalnum.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_isalnum.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -49,6 +49,8 @@ isalnum(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -60,5 +62,7 @@ isalnum(int c)
result = isalpha(c) || isdigit(c);
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_isalpha.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_isalpha.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ isalpha(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -59,5 +61,7 @@ isalpha(int c)
('A' <= c && c <= 'Z'));
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_iscntrl.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_iscntrl.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ iscntrl(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -58,5 +60,7 @@ iscntrl(int c)
result = (('\0' <= c && c < ' ') || (c == 127));
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_isdigit.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_isdigit.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ isdigit(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -58,5 +60,7 @@ isdigit(int c)
result = ('0' <= c && c <= '9');
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_isgraph.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_isgraph.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ isgraph(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -58,5 +60,7 @@ isgraph(int c)
result = (' ' < c && c < 127);
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_islower.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_islower.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ islower(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -58,5 +60,7 @@ islower(int c)
result = ('a' <= c && c <= 'z');
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_isprint.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_isprint.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ isprint(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -58,5 +60,7 @@ isprint(int c)
result = (' ' <= c && c <= '~');
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_ispunct.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_ispunct.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ ispunct(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -61,5 +63,7 @@ ispunct(int c)
('{' <= c && c <= '~'));
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_isspace.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_isspace.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ isspace(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -63,5 +65,7 @@ isspace(int c)
c == ' ');
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_isupper.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_isupper.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ isupper(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -58,5 +60,7 @@ isupper(int c)
result = ('A' <= c && c <= 'Z');
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_isxdigit.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_isxdigit.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,8 @@ isxdigit(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -60,5 +62,7 @@ isxdigit(int c)
('A' <= c && c <= 'F'));
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_tolower.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_tolower.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -43,6 +43,8 @@ tolower(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -54,5 +56,7 @@ tolower(int c)
result = ('A' <= c && c <= 'Z') ? (c + ('a' - 'A')) : c;
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_toupper.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_toupper.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -43,6 +43,8 @@ toupper(int c)
DECLARE_LOCALEBASE();
int result;
__locale_lock();
if(__locale_table[LC_CTYPE] != NULL)
{
assert( LocaleBase != NULL );
@@ -54,5 +56,7 @@ toupper(int c)
result = ('a' <= c && c <= 'z') ? (c - ('a' - 'A')) : c;
}
__locale_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: debug.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: debug.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=8
*
@@ -133,7 +133,7 @@ _POPDEBUGLEVEL(void)
/****************************************************************************/
static void
STATIC VOID
_INDENT(void)
{
if(program_name_len > 0)

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 186
#define DATE "14.1.2005"
#define VERS "debug.lib 1.186"
#define VSTRING "debug.lib 1.186 (14.1.2005)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.186 (14.1.2005)"
#define REVISION 189
#define DATE "5.3.2005"
#define VERS "debug.lib 1.189"
#define VSTRING "debug.lib 1.189 (5.3.2005)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.189 (5.3.2005)"

View File

@@ -1 +1 @@
186
189

View File

@@ -1,5 +1,5 @@
/*
* $Id: debug_kputfmt.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: debug_kputfmt.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -43,7 +43,7 @@
parameter table is provided, pick up the parameters and store them in
the table. The table layout follows the format string and can include
both 16 and 32 bit data. */
static size_t
STATIC size_t
process_var_args(char *format_string,va_list argument_list,unsigned short * table)
{
size_t num_args = 0;
@@ -150,7 +150,7 @@ process_var_args(char *format_string,va_list argument_list,unsigned short * tabl
/****************************************************************************/
static VOID ASM
STATIC VOID ASM
raw_put_char(REG(d0,UBYTE c))
{
kputc(c);

View File

@@ -1,5 +1,5 @@
/*
* $Id: dirent_closedir.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: dirent_closedir.c,v 1.8 2005-03-09 10:48:59 obarthel Exp $
*
* :ts=4
*
@@ -47,11 +47,97 @@
/****************************************************************************/
/* Directories being scanned whose locks need to be freed when shutting down. */
struct MinList NOCOMMON __directory_list;
/****************************************************************************/
#if defined(__THREAD_SAFE)
/****************************************************************************/
static struct SignalSemaphore * dirent_lock;
/****************************************************************************/
void
__dirent_lock(void)
{
if(dirent_lock != NULL)
ObtainSemaphore(dirent_lock);
}
/****************************************************************************/
void
__dirent_unlock(void)
{
if(dirent_lock != NULL)
ReleaseSemaphore(dirent_lock);
}
/****************************************************************************/
#endif /* __THREAD_SAFE */
/****************************************************************************/
CLIB_CONSTRUCTOR(__dirent_init)
{
BOOL success = FALSE;
ENTER();
NewList((struct List *)&__directory_list);
#if defined(__THREAD_SAFE)
{
dirent_lock = __create_semaphore();
if(dirent_lock == NULL)
goto out;
}
#endif /* __THREAD_SAFE */
success = TRUE;
out:
RETURN(success);
if(success)
CONSTRUCTOR_SUCCEED();
else
CONSTRUCTOR_FAIL();
}
/****************************************************************************/
CLIB_DESTRUCTOR(__dirent_exit)
{
ENTER();
if(__directory_list.mlh_Head != NULL)
{
while(NOT IsListEmpty((struct List *)&__directory_list))
closedir((DIR *)__directory_list.mlh_Head);
}
#if defined(__THREAD_SAFE)
{
__delete_semaphore(dirent_lock);
dirent_lock = NULL;
}
#endif /* __THREAD_SAFE */
LEAVE();
}
/****************************************************************************/
int
closedir(DIR * directory_pointer)
{
struct DirectoryHandle * dh;
struct Node * node;
int result = -1;
ENTER();
@@ -61,9 +147,11 @@ closedir(DIR * directory_pointer)
if(__check_abort_enabled)
__check_abort();
__dirent_lock();
if(directory_pointer == NULL)
{
errno = EBADF;
__set_errno(EBADF);
goto out;
}
@@ -84,7 +172,7 @@ closedir(DIR * directory_pointer)
if(NOT directory_pointer_is_valid)
{
errno = EBADF;
__set_errno(EBADF);
goto out;
}
}
@@ -94,8 +182,14 @@ closedir(DIR * directory_pointer)
Remove((struct Node *)dh);
while((node = RemHead(&dh->dh_VolumeList)) != NULL)
free(node);
#if defined(UNIX_PATH_SEMANTICS)
{
struct Node * node;
while((node = RemHead((struct List *)&dh->dh_VolumeList)) != NULL)
free(node);
}
#endif /* UNIX_PATH_SEMANTICS */
PROFILE_OFF();
UnLock(dh->dh_DirLock);
@@ -107,6 +201,8 @@ closedir(DIR * directory_pointer)
out:
__dirent_unlock();
RETURN(result);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: dirent_headers.h,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: dirent_headers.h,v 1.7 2005-02-28 10:07:30 obarthel Exp $
*
* :ts=4
*
@@ -42,6 +42,12 @@
/****************************************************************************/
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
#ifndef _MACROS_H
#include "macros.h"
#endif /* _MACROS_H */
@@ -54,9 +60,10 @@ struct DirectoryHandle
BPTR dh_DirLock;
struct FileInfoBlock dh_FileInfo;
struct dirent dh_DirectoryEntry;
int dh_Position;
struct Node * dh_VolumeNode;
struct List dh_VolumeList;
struct MinList dh_VolumeList;
BOOL dh_ScanVolumeList;
};
@@ -66,4 +73,26 @@ extern struct MinList NOCOMMON __directory_list;
/****************************************************************************/
#if defined(__THREAD_SAFE)
/****************************************************************************/
extern void __dirent_lock(void);
extern void __dirent_unlock(void);
/****************************************************************************/
#else
/****************************************************************************/
#define __dirent_lock() ((void)0)
#define __dirent_unlock() ((void)0)
/****************************************************************************/
#endif /* __THREAD_SAFE */
/****************************************************************************/
#endif /* _DIRENT_HEADERS_H */

View File

@@ -1,5 +1,5 @@
/*
* $Id: dirent_opendir.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: dirent_opendir.c,v 1.8 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -57,7 +57,7 @@
/****************************************************************************/
static struct Node *
STATIC struct Node *
find_by_name(struct List * list,const char * name)
{
struct Node * result = NULL;
@@ -89,7 +89,6 @@ opendir(const char * path_name)
#endif /* UNIX_PATH_SEMANTICS */
struct DirectoryHandle * dh = NULL;
DIR * result = NULL;
struct Node * node;
ENTER();
@@ -106,7 +105,7 @@ opendir(const char * path_name)
{
SHOWMSG("invalid parameter");
errno = EFAULT;
__set_errno(EFAULT);
goto out;
}
}
@@ -121,10 +120,12 @@ opendir(const char * path_name)
memset(dh,0,sizeof(*dh));
NewList(&dh->dh_VolumeList);
#if defined(UNIX_PATH_SEMANTICS)
{
struct Node * node;
NewList((struct List *)&dh->dh_VolumeList);
if(__unix_path_semantics)
{
if(__translate_unix_to_amiga_path_name(&path_name,&path_name_nti) != 0)
@@ -159,7 +160,7 @@ opendir(const char * path_name)
{
UnLockDosList(LDF_VOLUMES|LDF_READ);
errno = ENOMEM;
__set_errno(ENOMEM);
goto out;
}
@@ -172,7 +173,7 @@ opendir(const char * path_name)
/* Check if the name is already on the list. Mind you,
this is not the most sophisticated algorithm but then
the number of volumes should be small. */
if(find_by_name(&dh->dh_VolumeList,node->ln_Name) != NULL)
if(find_by_name((struct List *)&dh->dh_VolumeList,node->ln_Name) != NULL)
{
free(node);
continue;
@@ -180,16 +181,16 @@ opendir(const char * path_name)
D(("adding '%s'",node->ln_Name));
AddTail(&dh->dh_VolumeList,node);
AddTail((struct List *)&dh->dh_VolumeList,node);
}
}
UnLockDosList(LDF_VOLUMES|LDF_READ);
/* Bail out if we cannot present anything. */
if(IsListEmpty(&dh->dh_VolumeList))
if(IsListEmpty((struct List *)&dh->dh_VolumeList))
{
errno = ENOMEM;
__set_errno(ENOMEM);
goto out;
}
}
@@ -212,7 +213,7 @@ opendir(const char * path_name)
{
SHOWMSG("couldn't get a lock on it");
__translate_access_io_error_to_errno(IoErr(),&errno);
__set_errno(__translate_access_io_error_to_errno(IoErr()));
goto out;
}
@@ -226,7 +227,7 @@ opendir(const char * path_name)
{
SHOWMSG("couldn't examine it");
__translate_io_error_to_errno(IoErr(),&errno);
__set_errno(__translate_io_error_to_errno(IoErr()));
goto out;
}
@@ -234,7 +235,7 @@ opendir(const char * path_name)
{
SHOWMSG("this isn't a directory");
errno = ENOTDIR;
__set_errno(ENOTDIR);
goto out;
}
}
@@ -243,8 +244,12 @@ opendir(const char * path_name)
assert( __directory_list.mlh_Head != NULL );
__dirent_lock();
AddTail((struct List *)&__directory_list,(struct Node *)dh);
__dirent_unlock();
result = (DIR *)dh;
dh = NULL;
@@ -254,8 +259,14 @@ opendir(const char * path_name)
{
SHOWMSG("ouch. cleaning up");
while((node = RemHead(&dh->dh_VolumeList)) != NULL)
free(node);
#if defined(UNIX_PATH_SEMANTICS)
{
struct Node * node;
while((node = RemHead((struct List *)&dh->dh_VolumeList)) != NULL)
free(node);
}
#endif /* UNIX_PATH_SEMANTICS */
PROFILE_OFF();
UnLock(dh->dh_DirLock);

View File

@@ -1,5 +1,5 @@
/*
* $Id: dirent_readdir.c,v 1.5 2005-01-09 15:58:02 obarthel Exp $
* $Id: dirent_readdir.c,v 1.7 2005-02-03 16:56:15 obarthel Exp $
*
* :ts=4
*
@@ -61,7 +61,7 @@ readdir(DIR * directory_pointer)
{
SHOWMSG("ouch. invalid parameter");
errno = EBADF;
__set_errno(EBADF);
goto out;
}
@@ -93,8 +93,8 @@ readdir(DIR * directory_pointer)
assert( (((ULONG)name) & 3) == 0 );
if(dh->dh_VolumeNode == NULL && NOT IsListEmpty(&dh->dh_VolumeList))
dh->dh_VolumeNode = dh->dh_VolumeList.lh_Head;
if(dh->dh_VolumeNode == NULL && NOT IsListEmpty((struct List *)&dh->dh_VolumeList))
dh->dh_VolumeNode = (struct Node *)dh->dh_VolumeList.mlh_Head;
strcpy(name,"\1:"); /* BSTR for ":" */
@@ -164,7 +164,7 @@ readdir(DIR * directory_pointer)
{
if(CANNOT Examine(parent_directory,fib))
{
__translate_io_error_to_errno(IoErr(),&errno);
__set_errno(__translate_io_error_to_errno(IoErr()));
goto out;
}
}
@@ -206,7 +206,7 @@ readdir(DIR * directory_pointer)
{
SHOWMSG("error scanning directory");
__translate_io_error_to_errno(IoErr(),&errno);
__set_errno(__translate_io_error_to_errno(IoErr()));
goto out;
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: dirent_rewinddir.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: dirent_rewinddir.c,v 1.4 2005-02-03 16:56:15 obarthel Exp $
*
* :ts=4
*
@@ -76,7 +76,7 @@ rewinddir(DIR * directory_pointer)
if(CANNOT Examine(dh->dh_DirLock,&dh->dh_FileInfo))
{
SHOWMSG("ouch. that didn't work");
__translate_io_error_to_errno(IoErr(),&errno);
__set_errno(__translate_io_error_to_errno(IoErr()));
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_close.c,v 1.6 2005-01-14 08:36:54 obarthel Exp $
* $Id: fcntl_close.c,v 1.10 2005-02-20 15:46:52 obarthel Exp $
*
* :ts=4
*
@@ -42,23 +42,16 @@
/****************************************************************************/
int
__close(int file_descriptor,int * error_ptr)
close(int file_descriptor)
{
DECLARE_UTILITYBASE();
struct file_hook_message message;
struct file_action_message fam;
struct fd * fd;
int result = -1;
BOOL no_close;
BOOL is_alias;
ENTER();
SHOWVALUE(file_descriptor);
assert( UtilityBase != NULL );
assert( error_ptr != NULL );
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) );
@@ -69,120 +62,24 @@ __close(int file_descriptor,int * error_ptr)
fd = __get_file_descriptor(file_descriptor);
if(fd == NULL)
{
(*error_ptr) = EBADF;
__set_errno(EBADF);
goto out;
}
fam.fam_Action = file_action_close;
assert( fd->fd_Action != NULL );
if((*fd->fd_Action)(fd,&fam) < 0)
{
__set_errno(fam.fam_Error);
goto out;
}
result = 0;
SHOWMSG("last customer; cleaning up");
if(fd->fd_Original != NULL) /* this is an alias */
{
struct fd * list_fd;
SHOWMSG("taking out the alias");
assert( fd->fd_Original != fd );
assert( fd->fd_Original->fd_Original == NULL );
/* Remove this alias from the list. */
for(list_fd = fd->fd_Original ;
list_fd != NULL ;
list_fd = list_fd->fd_NextLink)
{
if(list_fd->fd_NextLink == fd)
{
list_fd->fd_NextLink = fd->fd_NextLink;
break;
}
}
no_close = TRUE;
is_alias = TRUE;
}
else if (fd->fd_NextLink != NULL) /* this one has aliases attached; it is the 'original' resource */
{
struct fd * first_alias;
struct fd * list_fd;
SHOWMSG("closing original descriptor; migrating it to first alias");
/* The first link now becomes the original resource */
first_alias = fd->fd_NextLink;
first_alias->fd_Original = NULL;
/* The resources are migrated to the first link. */
for(list_fd = first_alias->fd_NextLink ;
list_fd != NULL ;
list_fd = list_fd->fd_NextLink)
{
list_fd->fd_Original = first_alias;
}
no_close = TRUE;
is_alias = TRUE;
}
else
{
no_close = FLAG_IS_SET(fd->fd_Flags,FDF_NO_CLOSE);
is_alias = FALSE;
}
/* Reset the console to regular buffered/unbuffered input. We don't do this
for aliases and their like since the original stream is still in use. */
if(NOT is_alias)
{
if((FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_DEFAULT_NON_BLOCKING)) ||
(FLAG_IS_CLEAR(fd->fd_Flags,FDF_NON_BLOCKING) && FLAG_IS_SET(fd->fd_Flags,FDF_DEFAULT_NON_BLOCKING)))
{
SHOWMSG("resetting non-blocking access mode");
message.action = file_hook_action_set_blocking;
message.arg = FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING);
assert( fd->fd_Hook != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
}
}
(*error_ptr) = OK;
if(NOT no_close && NOT is_alias)
{
SHOWMSG("shutting down");
message.action = file_hook_action_close;
assert( fd->fd_Hook != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
result = message.result;
(*error_ptr) = message.error;
}
memset(fd,0,sizeof(*fd));
out:
RETURN(result);
return(result);
}
/****************************************************************************/
int
close(int file_descriptor)
{
int result;
ENTER();
result = __close(file_descriptor,&errno);
RETURN(result);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_creat.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: fcntl_creat.c,v 1.4 2005-02-03 16:56:15 obarthel Exp $
*
* :ts=4
*
@@ -66,7 +66,7 @@ creat(const char * path_name, mode_t mode)
{
if(path_name == NULL)
{
errno = EFAULT;
__set_errno(EFAULT);
goto out;
}
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_fcntl.c,v 1.5 2005-01-02 09:07:07 obarthel Exp $
* $Id: fcntl_fcntl.c,v 1.12 2005-03-04 09:07:09 obarthel Exp $
*
* :ts=4
*
@@ -44,12 +44,13 @@
int
fcntl(int file_descriptor, int cmd, ... /* int arg */ )
{
DECLARE_UTILITYBASE();
struct file_hook_message message;
struct file_action_message fam;
struct flock * l;
int vacant_slot;
int result = -1;
struct fd * fd;
struct fd * fd = NULL;
va_list arg;
int error;
int flags;
int fdbase;
int i;
@@ -59,8 +60,6 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
SHOWVALUE(file_descriptor);
SHOWVALUE(cmd);
assert( UtilityBase != NULL );
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) );
@@ -71,10 +70,12 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
fd = __get_file_descriptor(file_descriptor);
if(fd == NULL)
{
errno = EBADF;
__set_errno(EBADF);
goto out;
}
__fd_lock(fd);
switch(cmd)
{
case F_GETLK:
@@ -83,42 +84,41 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
SHOWMSG("cmd=F_GETLK/F_SETLK/F_SETLKW");
va_start(arg,cmd);
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
{
__set_errno(EINVAL);
goto out;
}
va_start(arg,cmd);
l = va_arg(arg,struct flock *);
va_end(arg);
assert( l != NULL );
if(l->l_type < F_RDLCK || l->l_type > F_WRLCK)
{
SHOWMSG("invalid flock type");
va_end(arg);
errno = EINVAL;
__set_errno(EINVAL);
break;
}
if(l->l_whence < SEEK_SET || l->l_whence > SEEK_END)
{
SHOWMSG("invalid flock offset");
va_end(arg);
errno = EINVAL;
__set_errno(EINVAL);
break;
}
message.action = file_hook_action_lock_record;
message.lock = l;
message.command = cmd;
if(__handle_record_locking(cmd,l,fd,&error) < 0)
{
__set_errno(error);
goto out;
}
assert( fd->fd_Hook != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
result = message.result;
errno = message.error;
va_end(arg);
result = 0;
break;
@@ -126,7 +126,11 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
SHOWMSG("cmd=F_GETFL");
result = 0;
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
{
__set_errno(EINVAL);
goto out;
}
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
SET_FLAG(result,O_NONBLOCK);
@@ -134,34 +138,36 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
if(FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO))
SET_FLAG(result,O_ASYNC);
result = 0;
break;
case F_SETFL:
SHOWMSG("cmd=F_SETFL");
result = 0;
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
{
__set_errno(EINVAL);
goto out;
}
va_start(arg,cmd);
flags = va_arg(arg,int);
va_end(arg);
if((FLAG_IS_SET(flags,O_NONBLOCK) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_NON_BLOCKING)) ||
(FLAG_IS_CLEAR(flags,O_NONBLOCK) && FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING)))
{
message.action = file_hook_action_set_blocking;
message.arg = FLAG_IS_CLEAR(flags,O_NONBLOCK);
fam.fam_Action = file_action_set_blocking;
fam.fam_Arg = FLAG_IS_CLEAR(flags,O_NONBLOCK);
assert( fd->fd_Hook != NULL );
assert( fd->fd_Action != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
result = message.result;
if(result < 0)
if((*fd->fd_Action)(fd,&fam) < 0)
{
errno = message.error;
__set_errno(fam.fam_Error);
va_end(arg);
goto out;
}
@@ -174,19 +180,15 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
if((FLAG_IS_SET(flags,O_ASYNC) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_ASYNC_IO)) ||
(FLAG_IS_CLEAR(flags,O_ASYNC) && FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO)))
{
message.action = file_hook_action_set_async;
message.arg = FLAG_IS_SET(flags,O_ASYNC);
fam.fam_Action = file_action_set_async;
fam.fam_Arg = FLAG_IS_SET(flags,O_ASYNC);
assert( fd->fd_Hook != NULL );
assert( fd->fd_Action != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
result = message.result;
if(result < 0)
if((*fd->fd_Action)(fd,&fam) < 0)
{
errno = message.error;
__set_errno(fam.fam_Error);
va_end(arg);
goto out;
}
@@ -196,80 +198,75 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
}
va_end(arg);
result = 0;
break;
case F_DUPFD:
SHOWMSG("cmd=F_DUPFD");
va_start(arg, cmd);
fdbase = va_arg(arg, int);
va_end(arg);
if(fdbase < 0)
{
errno = EINVAL;
__set_errno(EINVAL);
goto out;
}
/* Check if we have that many fd's already */
while(fdbase >= __num_fd)
{
if(__check_abort_enabled)
__check_abort();
/* No; enlarge it */
if(__grow_fd_table() < 0)
goto out;
}
/* Make sure that we have the required number of file
descriptors available. */
if(__grow_fd_table(fdbase + 1) < 0)
goto out;
vacant_slot = -1;
/* Guaranteed to have enough here */
while(TRUE)
do
{
__stdio_unlock();
if(__check_abort_enabled)
__check_abort();
__stdio_lock();
for(i = fdbase ; i < __num_fd ; i++)
{
if(FLAG_IS_CLEAR(__fd[i]->fd_Flags,FDF_IN_USE))
{
/* Got a file descriptor, duplicate it */
message.action = file_hook_action_duplicate_fd;
message.duplicate_fd = __fd[i];
assert( fd->fd_Hook != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
/* If it worked, leave */
if (message.result == 0)
{
result = i;
goto out;
}
vacant_slot = i;
break;
}
}
/* Didn't really find any, grow the table further */
if (__grow_fd_table() < 0)
if(vacant_slot < 0 && __grow_fd_table(0) < 0)
goto out;
}
while(vacant_slot < 0);
/* Got a file descriptor, duplicate it */
__duplicate_fd(__fd[vacant_slot],fd);
result = vacant_slot;
break;
errno = EMFILE;
break;
default:
SHOWMSG("something else");
errno = ENOSYS;
__set_errno(ENOSYS);
break;
}
out:
__fd_unlock(fd);
RETURN(result);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_get_default_file.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: fcntl_get_default_file.c,v 1.3 2005-02-03 16:56:15 obarthel Exp $
*
* :ts=4
*
@@ -55,7 +55,7 @@ __get_default_file(int file_descriptor,long * file_ptr)
fd = __get_file_descriptor(file_descriptor);
if(fd == NULL)
{
errno = EBADF;
__set_errno(EBADF);
goto out;
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_headers.h,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: fcntl_headers.h,v 1.3 2005-02-03 16:56:15 obarthel Exp $
*
* :ts=4
*
@@ -42,4 +42,10 @@
/****************************************************************************/
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
#endif /* _FCNTL_HEADERS_H */

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_data.c,v 1.4 2005-01-02 09:07:08 obarthel Exp $
* $Id: fcntl_lock.c,v 1.1 2005-02-28 13:22:53 obarthel Exp $
*
* :ts=4
*
@@ -31,28 +31,32 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#if defined(SOCKET_SUPPORT)
#ifndef _STDIO_HEADERS_H
#include "stdio_headers.h"
#endif /* _STDIO_HEADERS_H */
/****************************************************************************/
#ifndef _SOCKET_HEADERS_H
#include "socket_headers.h"
#endif /* _SOCKET_HEADERS_H */
#if defined(__THREAD_SAFE)
/****************************************************************************/
struct Library * __SocketBase;
void
__fd_lock(struct fd * fd)
{
if(fd != NULL && fd->fd_Lock != NULL)
ObtainSemaphore(fd->fd_Lock);
}
/****************************************************************************/
#if defined(__amigaos4__)
struct SocketIFace *__ISocket;
#endif /* __amigaos4__ */
void
__fd_unlock(struct fd * fd)
{
if(fd != NULL && fd->fd_Lock != NULL)
ReleaseSemaphore(fd->fd_Lock);
}
/****************************************************************************/
int h_errno;
/****************************************************************************/
#endif /* SOCKET_SUPPORT */
#endif /* __THREAD_SAFE */

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_lseek.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: fcntl_lseek.c,v 1.7 2005-02-20 15:46:52 obarthel Exp $
*
* :ts=4
*
@@ -42,11 +42,11 @@
/****************************************************************************/
off_t
__lseek(int file_descriptor, off_t offset, int mode, int * error_ptr)
lseek(int file_descriptor, off_t offset, int mode)
{
DECLARE_UTILITYBASE();
struct file_hook_message message;
struct file_action_message fam;
off_t result = -1;
off_t position;
struct fd * fd;
ENTER();
@@ -55,9 +55,6 @@ __lseek(int file_descriptor, off_t offset, int mode, int * error_ptr)
SHOWVALUE(offset);
SHOWVALUE(mode);
assert( UtilityBase != NULL );
assert( error_ptr != NULL );
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) );
@@ -68,7 +65,7 @@ __lseek(int file_descriptor, off_t offset, int mode, int * error_ptr)
fd = __get_file_descriptor(file_descriptor);
if(fd == NULL)
{
(*error_ptr) = EBADF;
__set_errno(EBADF);
goto out;
}
@@ -76,50 +73,27 @@ __lseek(int file_descriptor, off_t offset, int mode, int * error_ptr)
{
SHOWMSG("seek mode is invalid");
(*error_ptr) = EINVAL;
__set_errno(EINVAL);
goto out;
}
SHOWMSG("calling the hook");
fam.fam_Action = file_action_seek;
fam.fam_Offset = offset;
fam.fam_Mode = mode;
#if defined(UNIX_PATH_SEMANTICS)
assert( fd->fd_Action != NULL );
position = (*fd->fd_Action)(fd,&fam);
if(position < 0)
{
message.action = file_hook_action_seek_and_extend;
__set_errno(fam.fam_Error);
goto out;
}
#else
{
message.action = file_hook_action_seek;
}
#endif /* UNIX_PATH_SEMANTICS */
message.position = offset;
message.mode = mode;
assert( fd->fd_Hook != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
(*error_ptr) = message.error;
result = message.result;
result = position;
out:
RETURN(result);
return(result);
}
/****************************************************************************/
off_t
lseek(int file_descriptor, off_t offset, int mode)
{
off_t result;
ENTER();
result = __lseek(file_descriptor,offset,mode,&errno);
RETURN(result);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_open.c,v 1.7 2005-01-09 16:07:27 obarthel Exp $
* $Id: fcntl_open.c,v 1.14 2005-03-04 09:07:09 obarthel Exp $
*
* :ts=4
*
@@ -56,7 +56,7 @@
/* This is used in place of ChangeMode() in order to work around a bug in
dos.library V40 and below: a "NIL:" file handle will crash the
caller of the ChangeMode() function. */
static LONG
STATIC LONG
safe_change_mode(LONG type,BPTR file_handle,LONG mode)
{
LONG result = DOSFALSE;
@@ -94,6 +94,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
struct name_translation_info path_name_nti;
#endif /* UNIX_PATH_SEMANTICS */
D_S(struct FileInfoBlock,fib);
struct SignalSemaphore * fd_lock;
LONG is_file_system = FALSE;
LONG open_mode;
BPTR lock = ZERO;
@@ -117,13 +118,15 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
if(__check_abort_enabled)
__check_abort();
__stdio_lock();
#if defined(CHECK_FOR_NULL_POINTERS)
{
if(path_name == NULL)
{
SHOWMSG("path name is invalid");
errno = EFAULT;
__set_errno(EFAULT);
goto out;
}
}
@@ -134,14 +137,14 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
SHOWMSG("access mode is invalid");
errno = EINVAL;
__set_errno(EINVAL);
goto out;
}
fd_slot_number = __find_vacant_fd_entry();
if(fd_slot_number < 0)
{
if(__grow_fd_table() < 0)
if(__grow_fd_table(0) < 0)
{
SHOWMSG("couldn't find a vacant file descriptor, and couldn't allocate one either");
goto out;
@@ -160,7 +163,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
if(path_name_nti.is_root)
{
errno = EACCES;
__set_errno(EACCES);
goto out;
}
}
@@ -187,7 +190,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
SHOWMSG("the file already exists");
errno = EEXIST;
__set_errno(EEXIST);
goto out;
}
@@ -197,14 +200,14 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
SHOWMSG("there's something not a directory on the path");
errno = ENOTDIR;
__set_errno(ENOTDIR);
goto out;
}
else if (error != ERROR_OBJECT_NOT_FOUND && error != ERROR_ACTION_NOT_KNOWN)
{
SHOWMSG("error accessing the object");
__translate_io_error_to_errno(IoErr(),&errno);
__set_errno(__translate_io_error_to_errno(IoErr()));
goto out;
}
@@ -233,7 +236,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
SHOWMSG("could not examine the object");
__translate_io_error_to_errno(IoErr(),&errno);
__set_errno(__translate_io_error_to_errno(IoErr()));
goto out;
}
@@ -242,7 +245,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
SHOWMSG("can't open a directory");
errno = EISDIR;
__set_errno(EISDIR);
goto out;
}
@@ -251,7 +254,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
SHOWMSG("this object is not write enabled");
errno = EACCES;
__set_errno(EACCES);
goto out;
}
@@ -274,14 +277,14 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
SHOWMSG("there's something not a directory on the path");
errno = ENOTDIR;
__set_errno(ENOTDIR);
goto out;
}
else if (error != ERROR_OBJECT_NOT_FOUND && error != ERROR_ACTION_NOT_KNOWN)
{
SHOWMSG("error accessing the object");
__translate_io_error_to_errno(IoErr(),&errno);
__set_errno(__translate_io_error_to_errno(IoErr()));
goto out;
}
}
@@ -305,7 +308,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
LONG io_err = IoErr();
D(("the file '%s' didn't open in mode %ld",path_name,open_mode));
__translate_access_io_error_to_errno(IoErr(),&errno);
__set_errno(__translate_access_io_error_to_errno(io_err));
/* Check if ended up trying to open a directory as if
it were a plain file. */
@@ -317,7 +320,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
if(lock != ZERO)
{
if(Examine(lock,fib) && fib->fib_DirEntryType >= 0)
errno = EISDIR;
__set_errno(EISDIR);
}
PROFILE_ON();
@@ -326,9 +329,24 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
goto out;
}
#if defined(__THREAD_SAFE)
{
fd_lock = __create_semaphore();
if(fd_lock == NULL)
{
__set_errno(ENOMEM);
goto out;
}
}
#else
{
fd_lock = NULL;
}
#endif /* __THREAD_SAFE */
fd = __fd[fd_slot_number];
__initialize_fd(fd,(HOOKFUNC)__fd_hook_entry,handle,0);
__initialize_fd(fd,__fd_hook_entry,handle,0,fd_lock);
/* Figure out if this stream is attached to a console. */
PROFILE_OFF();
@@ -343,7 +361,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
SHOWMSG("enabling non-blocking mode");
if(SetMode(handle,1)) /* single character mode */
if(SetMode(handle,DOSTRUE)) /* single character mode */
SET_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
}
}
@@ -449,6 +467,8 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
UnLock(lock);
__stdio_unlock();
PROFILE_ON();
RETURN(result);

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_read.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: fcntl_read.c,v 1.7 2005-02-28 10:07:30 obarthel Exp $
*
* :ts=4
*
@@ -48,11 +48,11 @@
/****************************************************************************/
ssize_t
__read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
read(int file_descriptor, void * buffer, size_t num_bytes)
{
DECLARE_UTILITYBASE();
ssize_t num_bytes_read;
ssize_t result = -1;
struct fd * fd;
off_t result = -1;
ENTER();
@@ -60,10 +60,11 @@ __read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
SHOWPOINTER(buffer);
SHOWVALUE(num_bytes);
assert( error_ptr != NULL );
assert( buffer != NULL );
assert( (int)num_bytes >= 0);
assert( UtilityBase != NULL );
if(__check_abort_enabled)
__check_abort();
#if defined(CHECK_FOR_NULL_POINTERS)
{
@@ -71,7 +72,7 @@ __read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
{
SHOWMSG("invalid buffer");
(*error_ptr) = EFAULT;
__set_errno(EFAULT);
goto out;
}
}
@@ -81,13 +82,10 @@ __read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
assert( __fd[file_descriptor] != NULL );
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
if(__check_abort_enabled)
__check_abort();
fd = __get_file_descriptor(file_descriptor);
if(fd == NULL)
{
(*error_ptr) = EBADF;
__set_errno(EBADF);
goto out;
}
@@ -95,52 +93,38 @@ __read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
{
SHOWMSG("this descriptor is not read-enabled");
(*error_ptr) = EBADF;
__set_errno(EBADF);
goto out;
}
if(num_bytes > 0)
{
struct file_hook_message message;
struct file_action_message fam;
SHOWMSG("calling the hook");
message.action = file_hook_action_read;
message.data = buffer;
message.size = num_bytes;
fam.fam_Action = file_action_read;
fam.fam_Data = buffer;
fam.fam_Size = num_bytes;
assert( fd->fd_Hook != NULL );
assert( fd->fd_Action != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
(*error_ptr) = message.error;
result = message.result;
num_bytes_read = (*fd->fd_Action)(fd,&fam);
if(num_bytes_read < 0)
{
__set_errno(fam.fam_Error);
goto out;
}
}
else
{
(*error_ptr) = 0;
result = 0;
num_bytes_read = 0;
}
result = num_bytes_read;
out:
RETURN(result);
return(result);
}
/****************************************************************************/
ssize_t
read(int file_descriptor, void * buffer, size_t num_bytes)
{
ssize_t result;
ENTER();
result = __read(file_descriptor,buffer,num_bytes,&errno);
RETURN(result);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_write.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: fcntl_write.c,v 1.7 2005-02-28 10:07:30 obarthel Exp $
*
* :ts=4
*
@@ -48,11 +48,11 @@
/****************************************************************************/
ssize_t
__write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_ptr)
write(int file_descriptor, const void * buffer, size_t num_bytes)
{
DECLARE_UTILITYBASE();
ssize_t num_bytes_written;
ssize_t result = -1;
struct fd * fd;
off_t result = -1;
ENTER();
@@ -60,10 +60,11 @@ __write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_
SHOWPOINTER(buffer);
SHOWVALUE(num_bytes);
assert( error_ptr != NULL );
assert( buffer != NULL );
assert( (int)num_bytes >= 0 );
assert( UtilityBase != NULL );
if(__check_abort_enabled)
__check_abort();
#if defined(CHECK_FOR_NULL_POINTERS)
{
@@ -71,7 +72,7 @@ __write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_
{
SHOWMSG("invalid buffer address");
(*error_ptr) = EFAULT;
__set_errno(EFAULT);
goto out;
}
}
@@ -81,13 +82,10 @@ __write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_
assert( __fd[file_descriptor] != NULL );
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
if(__check_abort_enabled)
__check_abort();
fd = __get_file_descriptor(file_descriptor);
if(fd == NULL)
{
(*error_ptr) = EBADF;
__set_errno(EBADF);
goto out;
}
@@ -95,52 +93,38 @@ __write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_
{
SHOWMSG("file descriptor is not write-enabled");
(*error_ptr) = EBADF;
__set_errno(EBADF);
goto out;
}
if(num_bytes > 0)
{
struct file_hook_message message;
struct file_action_message fam;
SHOWMSG("calling the hook");
message.action = file_hook_action_write;
message.data = (void *)buffer;
message.size = num_bytes;
fam.fam_Action = file_action_write;
fam.fam_Data = (void *)buffer;
fam.fam_Size = num_bytes;
assert( fd->fd_Hook != NULL );
assert( fd->fd_Action != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
(*error_ptr) = message.error;
result = message.result;
num_bytes_written = (*fd->fd_Action)(fd,&fam);
if(num_bytes_written < 0)
{
__set_errno(fam.fam_Error);
goto out;
}
}
else
{
(*error_ptr) = 0;
result = 0;
num_bytes_written = 0;
}
result = num_bytes_written;
out:
RETURN(result);
return(result);
}
/****************************************************************************/
ssize_t
write(int file_descriptor, const void * buffer, size_t num_bytes)
{
ssize_t result;
ENTER();
result = __write(file_descriptor,buffer,num_bytes,&errno);
RETURN(result);
return(result);
}

240
library/ftw_ftw.c Normal file
View File

@@ -0,0 +1,240 @@
/*
* $Id: ftw_ftw.c,v 1.2 2005-03-03 10:59:17 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 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.
*/
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
/*
* This ftw() implementation builds heavily on existing functionality and could certainly
* be made more efficient (e.g. by combining walk & stat using ExAll()/ExNext()) but this
* way the Unix pathname translation is free.
*/
/****************************************************************************/
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <ftw.h>
#include <errno.h>
#include <dos.h>
/****************************************************************************/
#ifndef _DEBUG_H
#include "debug.h"
#endif /* _DEBUG_H */
#ifndef _FTW_HEADERS_H
#include "ftw_headers.h"
#endif /* _FTW_HEADERS_H */
#ifndef _STDLIB_PROTOS_H
#include "stdlib_protos.h" /* get/set errno. */
#endif /* _STDLIB_PROTOS_H */
/****************************************************************************/
static int
walk(const char *path,int (*func)(const char *,const struct stat *,int),int depth,int level)
{
int result = 0;
DIR *dp;
struct dirent *de;
struct stat st;
char *next_name;
int type;
int old_length;
int errtmp;
ENTER();
SHOWSTRING(path);
SHOWPOINTER(func);
SHOWVALUE(depth);
SHOWVALUE(level);
if(__check_abort_enabled)
__check_abort();
if(level > depth)
goto out;
if(stat(path,&st) == OK)
{
if (S_ISDIR(st.st_mode))
{
if(FLAG_IS_SET(st.st_mode,S_IRUSR))
type = FTW_D; /* Directory */
else
type = FTW_DNR; /* Directory No Read-permission */
}
else if (S_ISREG(st.st_mode))
{
type = FTW_F; /* File */
}
else
{
/* Skip */
goto out;
}
}
else
{
type = FTW_NS; /* No Stat */
}
result = (*func)(path,&st,type);
if(result != 0)
goto out;
if(type == FTW_D)
{
dp = opendir(path); /* Also takes care of Unix->Amiga pathname conversion. */
if(dp == NULL)
{
result = -1; /* Pass errno from opendir() */
goto out;
}
old_length = strlen(path);
next_name = malloc(old_length + NAME_MAX + 2); /* Allocate new for each recursive step to handle extremely long path names. */
if(next_name == NULL)
{
__set_errno(ENOMEM);
result = -1;
goto out;
}
strcpy(next_name,path);
if(old_length > 0 && next_name[old_length - 1] != ':' && next_name[old_length-1] != '/')
next_name[old_length++] = '/';
while((result == 0) && (de = readdir(dp)) != NULL)
{
strlcpy(&next_name[old_length],de->d_name,NAME_MAX + 2);
result = walk(next_name,func,depth,level+1);
}
errtmp = __get_errno();
closedir(dp);
free(next_name);
__set_errno(errtmp);
}
out:
RETURN(result);
return(result);
}
int
ftw(const char *path,int (*func)(const char *,const struct stat *,int),int depth)
{
int result = -1;
char *base;
int len;
ENTER();
SHOWSTRING(path);
SHOWPOINTER(func);
SHOWVALUE(depth);
if(path == NULL)
{
SHOWMSG("NULL pathname to ftw().");
__set_errno(EFAULT);
goto out;
}
if(func == NULL)
{
SHOWMSG("No function supplied.");
__set_errno(EFAULT);
goto out;
}
if(depth < 0)
{
SHOWMSG("Invalid depth.\n");
__set_errno(EINVAL);
goto out;
}
/* Make sure the path never ends with '/' unless used to indicate parent directory. */
len = strlen(path);
if(len > 1 && path[len - 1] == '/' && path[len - 2] != '/')
{
int error;
base = strdup(path);
if(base == NULL)
{
__set_errno(ENOMEM);
goto out;
}
base[len - 1] = '\0';
result = walk(base,func,depth,0);
error = __get_errno();
free(base);
__set_errno(error);
}
else
{
result = walk(path,func,depth,0);
}
out:
RETURN(result);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_constructor_end.c,v 1.2 2005-01-02 09:07:08 obarthel Exp $
* $Id: ftw_headers.h,v 1.1 2005-03-02 12:57:53 obarthel Exp $
*
* :ts=4
*
@@ -31,14 +31,17 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#if defined(__amigaos4__)
#ifndef _FTW_HEADERS_H
#define _FTW_HEADERS_H
/****************************************************************************/
/* End markers for the CTOR and DTOR list. */
static volatile void (*__CTOR_LIST__[1]) (void) __attribute__((section(".ctors"))) = { (void *)0 };
static volatile void (*__DTOR_LIST__[1]) (void) __attribute__((section(".dtors"))) = { (void *)0 };
#include <sys/stat.h>
/****************************************************************************/
#endif /*__amigaos4__ */
#include "macros.h"
/****************************************************************************/
#endif /* _FTW_HEADERS_H */

336
library/ftw_nftw.c Normal file
View File

@@ -0,0 +1,336 @@
/*
* $Id: ftw_nftw.c,v 1.2 2005-03-03 10:59:17 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 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.
*/
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
/*
* This nftw() implementation builds heavily on existing functionality and could certainly
* be made more efficient.
*/
/****************************************************************************/
#include <dirent.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <ftw.h>
#include <errno.h>
#include <dos.h>
/****************************************************************************/
#ifndef _DEBUG_H
#include "debug.h"
#endif /* _DEBUG_H */
#ifndef _FTW_HEADERS_H
#include "ftw_headers.h"
#endif /* _FTW_HEADERS_H */
#ifndef _STDLIB_PROTOS_H
#include "stdlib_protos.h" /* get/set errno. */
#endif /* _STDLIB_PROTOS_H */
/****************************************************************************/
static int
walk(const char *path,int (*func)(const char *,const struct stat *,int,struct FTW *),const int depth,int level,const int flags,const int base,int * const prune)
{
int result = 0;
DIR *dp;
struct dirent *de;
struct stat st;
char *next_name;
char *old_cwd = 0;
int type;
int old_length;
int errtmp;
struct FTW extra_info;
int stat_result;
ENTER();
SHOWSTRING(path);
SHOWPOINTER(func);
SHOWVALUE(depth);
SHOWVALUE(level);
SHOWVALUE(flags);
if(__check_abort_enabled)
__check_abort();
if(level > depth)
goto out;
if(FLAG_IS_SET(flags,FTW_PHYS))
stat_result = lstat(path,&st);
else
stat_result = stat(path,&st);
if(stat_result == OK)
{
if (S_ISLNK(st.st_mode)) /* Should only be possible if lstat() is used. */
{
type = FTW_SL;
}
else if (S_ISDIR(st.st_mode))
{
if(FLAG_IS_SET(st.st_mode,S_IRUSR))
type = FTW_D; /* Directory */
else
type = FTW_DNR; /* Directory No Read-permission */
}
else if (S_ISREG(st.st_mode))
{
type = FTW_F; /* File */
}
else
{
/* Skip */
goto out;
}
}
else
{
if(FLAG_IS_CLEAR(flags,FTW_PHYS) && lstat(path,&st) == OK)
type = FTW_SLN; /* Broken link. */
else
type = FTW_NS; /* No Stat */
}
extra_info.quit = 0;
extra_info.base = base;
extra_info.level = level;
if(type == FTW_D)
{
old_length = strlen(path);
if(FLAG_IS_CLEAR(flags,FTW_DEPTH))
result = (*func)(path,&st,type,&extra_info);
if(extra_info.quit == 0)
{
dp = opendir(path); /* Also takes care of Unix->Amiga pathname conversion. */
if(dp == NULL)
{
result = -1;
goto out;
}
if(FLAG_IS_SET(flags,FTW_CHDIR)) /* Change to directory before traversing. */
{
old_cwd = malloc(old_length + NAME_MAX);
if(old_cwd == NULL)
{
__set_errno(ENOMEM);
result = -1;
goto out;
}
getcwd(old_cwd,old_length + NAME_MAX);
chdir(path);
}
next_name = malloc(old_length + NAME_MAX + 2); /* Allocate new for each recursive step to handle extremely long path names. */
if(next_name == NULL)
{
__set_errno(ENOMEM);
result = -1;
goto out;
}
strcpy(next_name,path);
if(old_length > 0 && next_name[old_length - 1] != ':' && next_name[old_length - 1] != '/')
next_name[old_length++] = '/';
while((result == 0) && (de = readdir(dp)) != NULL)
{
strlcpy(&next_name[old_length],de->d_name,NAME_MAX + 2);
result = walk(next_name,func,depth,level + 1,flags,old_length,prune);
if((*prune) != 0)
{
(*prune) = 0;
break;
}
}
errtmp = __get_errno();
closedir(dp);
__set_errno(errtmp);
free(next_name);
if((result == 0) && FLAG_IS_SET(flags,FTW_DEPTH))
result = (*func)(path,&st,FTW_DP,&extra_info);
}
if(extra_info.quit == FTW_PRUNE) /* Abort traversal of current directory. */
(*prune) = 1;
}
else
{
result = (*func)(path,&st,type,&extra_info);
}
out:
if(old_cwd != NULL)
{
errtmp = __get_errno();
chdir(old_cwd); /* Restore (pop) old directory. */
free(old_cwd);
__set_errno(errtmp);
}
RETURN(result);
return(result);
}
/****************************************************************/
static int
index_of_end_part(const char *path)
{
int result = 0;
int i;
i = strlen(path) - 1;
while(i-- > 0)
{
if(path[i] == '/' || path[i] == ':')
{
result = i + 1;
break;
}
}
return(result);
}
/****************************************************************/
int
nftw(const char *path,int (*func)(const char *,const struct stat *,int,struct FTW *),int depth,int flags)
{
char *base;
int len;
int base_index;
int prune = 0;
int result = -1;
ENTER();
SHOWSTRING(path);
SHOWPOINTER(func);
SHOWVALUE(depth);
SHOWVALUE(flags);
if(path == NULL)
{
SHOWMSG("NULL pathname to nftw().");
__set_errno(EFAULT);
goto out;
}
if(func == NULL)
{
SHOWMSG("No function supplied.");
__set_errno(EFAULT);
goto out;
}
if(depth < 0)
{
SHOWMSG("Invalid depth.\n");
__set_errno(EINVAL);
goto out;
}
if((flags & ~FTW_ALL_FLAGS) != 0)
{
SHOWMSG("Bogus flags.");
__set_errno(EINVAL);
goto out;
}
/* Make sure the path never ends with '/' unless used to indicate parent directory. */
len = strlen(path);
if(len > 1 && path[len - 1] == '/' && path[len - 2] != '/')
{
int error;
base = strdup(path);
if(base == NULL)
{
__set_errno(ENOMEM);
goto out;
}
base[len - 1] = '\0';
base_index = index_of_end_part(base);
result = walk(base,func,depth,0,flags,base_index,&prune);
error = __get_errno();
free(base);
__set_errno(error);
}
else
{
base_index = index_of_end_part(path);
result = walk(path,func,depth,0,flags,base_index,&prune);
}
out:
RETURN(result);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: dos.h,v 1.5 2005-01-02 09:07:21 obarthel Exp $
* $Id: dos.h,v 1.9 2005-03-06 09:04:44 obarthel Exp $
*
* :ts=4
*
@@ -66,6 +66,26 @@ extern "C" {
* ISO 'C' standard context. It is redefined to WBenchMsg to make it
* compatible with the original Amiga program startup code which would
* refer to the variable under that name.
*
* It is recommended to access the Workbench startup message as part of your
* program's main() function, like this:
*
* int
* main(int argc,char ** argv)
* {
* struct WBStartup * wb_startup_message;
*
* if(argc == 0)
* wb_startup_message = (struct WBStartup *)argv;
* else
* wb_startup_message = NULL;
*
* ...
* }
*
* This approach has the advantage that your program does not rely upon a
* global variable initialized by the startup code, whose name you might
* not even know exactly.
*/
extern struct WBStartup * __WBenchMsg;
#define WBenchMsg __WBenchMsg
@@ -252,6 +272,32 @@ extern unsigned int (* __get_default_stack_size)(void);
/****************************************************************************/
/*
* This library falls back onto locale.library to perform string collation
* in strcoll(), character conversion in toupper() and various other
* functions. This may not your intention. To restrict the library to use
* only the "C" language locale, declare the following variable in your
* code and set it to FALSE, so that it overrides the default settings.
* The variable value is checked during program startup and, if set to
* TRUE, has the effect of opening locale.library and obtaining the
* default locale.
*/
extern BOOL __open_locale;
/*
* Two functions control how this library uses the locale.library API to
* perform string collation, character and time conversion, etc.
*
* __locale_init() opens locale.library and attempts to open the default
* locale. If it succeeds, it will return 0 and -1 otherwise.
*
* __locale_exit() releases the default locale and closes locale.library.
*/
extern int __locale_init(void);
extern void __locale_exit(void);
/****************************************************************************/
/*
* If linked with -lunix, Unix path names are translated to Amiga path
* names (and the other way round). If you wish to disable this, set the
@@ -278,7 +324,7 @@ extern int __translate_relative_path_name(char const ** name_ptr,char *replace,s
extern void __restore_path_name(char const ** name_ptr,struct name_translation_info * nti);
extern int __translate_amiga_to_unix_path_name(char const ** name_ptr,struct name_translation_info * nti);
extern int __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translation_info * nti);
extern void __translate_io_error_to_errno(LONG io_error,int * errno_ptr);
extern int __translate_io_error_to_errno(LONG io_error);
/****************************************************************************/

102
library/include/ftw.h Normal file
View File

@@ -0,0 +1,102 @@
/*
* $Id: ftw.h,v 1.1 2005-03-02 12:57:56 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 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 _FTW_H
#define _FTW_H
/****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
#include <sys/stat.h>
/****************************************************************************/
/* Values passed to the user function (argument #3). */
enum
{
FTW_F, /* Regular file. */
FTW_D, /* Directory. */
FTW_DP, /* Directory, already visited. (nftw() only) */
FTW_SL, /* Symlink. (nftw() only) */
FTW_SLN, /* Broken Symlink. (does not point to an existing file, nftw() only) */
FTW_DNR, /* Directory which can not be read (e.g. not enough permissions) */
FTW_NS /* Stat failed. */
};
/****************************************************************************/
/* Flags for FTW.quit */
#define FTW_SKD (1L<<0) /* Skip directory. */
#define FTW_PRUNE (1L<<1) /* Prune traversal. (skip up) */
/****************************************************************************/
/* Flags for nftw() */
#define FTW_PHYS (1L<<0)
#define FTW_MOUNT (1L<<1) /* Currently unsupported. */
#define FTW_DEPTH (1L<<2)
#define FTW_CHDIR (1L<<3)
#define FTW_ALL_FLAGS (0x0000000f)
/****************************************************************************/
struct FTW
{
int quit; /* Flags passed out from the user function to ftw()/nftw() */
int base; /* Index of current item from start of string. e.g. 4 for "foo/bar" */
int level; /* Current depth. (counted from 0) */
};
/****************************************************************************/
extern int ftw(const char *path,int (*func)(const char *,const struct stat *,int),int depth);
extern int nftw(const char *path,int (*func)(const char *,const struct stat *,int,struct FTW *),int depth,int flags);
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */
/****************************************************************************/
#endif /* _FTW_H */

296
library/include/inttypes.h Normal file
View File

@@ -0,0 +1,296 @@
/*
* $Id: inttypes.h,v 1.1 2005-02-04 15:03:13 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 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 _INTTYPES_H
#define _INTTYPES_H
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
/* Integral types with specified size; contributed by Peter Bengtsson */
/****************************************************************************/
#ifndef _STDINT_H
#include <stdint.h>
#endif /* _STDINT_H */
/****************************************************************************/
/* printf() format specifications for different types. */
/* "Decimal" */
#define PRId8 "d"
#define PRId16 "d"
#define PRId32 "d"
#define PRId64 "lld"
#define PRIdLEAST8 "d"
#define PRIdLEAST16 "d"
#define PRIdLEAST32 "d"
#define PRIdLEAST64 "lld"
#define PRIdFAST8 "d"
#define PRIdFAST16 "d"
#define PRIdFAST32 "d"
#define PRIdFAST64 "lld"
#define PRIdPTR "ld"
/* "Integer" */
#define PRIi8 "i"
#define PRIi16 "i"
#define PRIi32 "i"
#define PRIi64 "lli"
#define PRIiLEAST8 "i"
#define PRIiLEAST16 "i"
#define PRIiLEAST32 "i"
#define PRIiLEAST64 "lli"
#define PRIiFAST8 "i"
#define PRIiFAST16 "i"
#define PRIiFAST32 "i"
#define PRIiFAST64 "lli"
#define PRIiPTR "li"
/* "Unsigned" */
#define PRIu8 "u"
#define PRIu16 "u"
#define PRIu32 "u"
#define PRIu64 "llu"
#define PRIuLEAST8 "u"
#define PRIuLEAST16 "u"
#define PRIuLEAST32 "u"
#define PRIuLEAST64 "llu"
#define PRIuFAST8 "u"
#define PRIuFAST16 "u"
#define PRIuFAST32 "u"
#define PRIuFAST64 "llu"
#define PRIuPTR "lu"
/* "Hexadecimal - lowercase " */
#define PRIx8 "x"
#define PRIx16 "x"
#define PRIx32 "x"
#define PRIx64 "llx"
#define PRIxLEAST8 "x"
#define PRIxLEAST16 "x"
#define PRIxLEAST32 "x"
#define PRIxLEAST64 "llx"
#define PRIxFAST8 "x"
#define PRIxFAST16 "x"
#define PRIxFAST32 "x"
#define PRIxFAST64 "llx"
#define PRIxPTR "lx"
/* "Hexadecimal - Uppercase" */
#define PRIX8 "X"
#define PRIX16 "X"
#define PRIX32 "X"
#define PRIX64 "llX"
#define PRIXLEAST8 "X"
#define PRIXLEAST16 "X"
#define PRIXLEAST32 "X"
#define PRIXLEAST64 "llX"
#define PRIXFAST8 "X"
#define PRIXFAST16 "X"
#define PRIXFAST32 "X"
#define PRIXFAST64 "llX"
#define PRIXPTR "lX"
/* "Octal" */
#define PRIo8 "o"
#define PRIo16 "o"
#define PRIo32 "o"
#define PRIo64 "llo"
#define PRIoLEAST8 "o"
#define PRIoLEAST16 "o"
#define PRIoLEAST32 "o"
#define PRIoLEAST64 "llo"
#define PRIoFAST8 "o"
#define PRIoFAST16 "o"
#define PRIoFAST32 "o"
#define PRIoFAST64 "llo"
#define PRIoPTR "lo"
/* intmax_t is 32 bits for SAS/C, 64-bits for GCC or if using a conforming C99 compiler. */
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
#define PRIdMAX "lld"
#define PRIiMAX "lli"
#define PRIuMAX "llu"
#define PRIxMAX "llx"
#define PRIXMAX "llX"
#define PRIoMAX "llo"
#else
#define PRIdMAX "ld"
#define PRIiMAX "li"
#define PRIuMAX "lu"
#define PRIxMAX "lx"
#define PRIXMAX "lX"
#define PRIoMAX "lo"
#endif
/* scanf() format specifiers. */
/* "Decimal" */
/* #define SCNd8 "hhd" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNd16 "hd"
#define SCNd32 "d"
#define SCNd64 "lld"
/* #define SCNdLEAST8 "hhd" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNdLEAST16 "hd"
#define SCNdLEAST32 "d"
#define SCNdLEAST64 "lld"
/* #define SCNdFAST8 "hhd" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNdFAST16 "d"
#define SCNdFAST32 "d"
#define SCNdFAST64 "lld"
#define SCNdPTR "d"
/* "Integer" */
/* #define SCNi8 "hhi" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNi16 "hi"
#define SCNi32 "i"
#define SCNi64 "lli"
/* #define SCNiLEAST8 "hhi" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNiLEAST16 "hi"
#define SCNiLEAST32 "i"
#define SCNiLEAST64 "lli"
/* #define SCNiFAST8 "hhi" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNiFAST16 "i"
#define SCNiFAST32 "i"
#define SCNiFAST64 "lli"
#define SCNiPTR "i"
/* "Unsigned" */
/* #define SCNu8 "hhu" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNu16 "hu"
#define SCNu32 "u"
#define SCNu64 "llu"
/* #define SCNuLEAST8 "hhu" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNuLEAST16 "hu"
#define SCNuLEAST32 "u"
#define SCNuLEAST64 "llu"
/* #define SCNuFAST8 "hhu" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNuFAST16 "u"
#define SCNuFAST32 "u"
#define SCNuFAST64 "llu"
#define SCNuPTR "u"
/* "Hexadecimal" */
/* #define SCNx8 "hhx" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNx16 "hx"
#define SCNx32 "x"
#define SCNx64 "llx"
/* #define SCNxLEAST8 "hhx" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNxLEAST16 "hx"
#define SCNxLEAST32 "x"
#define SCNxLEAST64 "llx"
/* #define SCNxFAST8 "hhx" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNxFAST16 "x"
#define SCNxFAST32 "x"
#define SCNxFAST64 "llx"
#define SCNxPTR "x"
/* "Octal" */
/* #define SCNo8 "hho" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNo16 "ho"
#define SCNo32 "o"
#define SCNo64 "llo"
/* #define SCNoLEAST8 "hho" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNoLEAST16 "ho"
#define SCNoLEAST32 "o"
#define SCNoLEAST64 "llo"
/* #define SCNoFAST8 "hho" */ /* Missing. TODO: Add support for char conversions in scanf() */
#define SCNoFAST16 "o"
#define SCNoFAST32 "o"
#define SCNoFAST64 "llo"
#define SCNoPTR "o"
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
#define SCNdMAX "lld"
#define SCNiMAX "lli"
#define SCNuMAX "llu"
#define SCNxMAX "llx"
#define SCNoMAX "llo"
#else
#define SCNdMAX "ld"
#define SCNiMAX "li"
#define SCNuMAX "lu"
#define SCNxMAX "lx"
#define SCNoMAX "lo"
#endif
/* TODO: Add the rest of inttypes.h here + in the library. */
/*
* Missing stuff is among other things atoll(), strtoll(), ...
* Then there is the matter of wchar support - Zzzz.
*/
/****************************************************************************/
#endif /* _INTTYPES_H */

View File

@@ -1,5 +1,5 @@
/*
* $Id: math.h,v 1.5 2005-01-02 09:07:21 obarthel Exp $
* $Id: math.h,v 1.6 2005-02-25 10:14:22 obarthel Exp $
*
* :ts=4
*
@@ -85,6 +85,22 @@ extern double tanh(double x);
/****************************************************************************/
#define M_E 2.7182818284590452354
#define M_LOG2E 1.4426950408889634074
#define M_LOG10E 0.43429448190325182765
#define M_LN2 0.69314718055994530942
#define M_LN10 2.30258509299404568402
#define M_PI 3.14159265358979323846
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.78539816339744830962
#define M_1_PI 0.31830988618379067154
#define M_2_PI 0.63661977236758134308
#define M_2_SQRTPI 1.12837916709551257390
#define M_SQRT2 1.41421356237309504880
#define M_SQRT1_2 0.70710678118654752440
/****************************************************************************/
extern double rint(double x);
extern float rintf(float x);
extern int isinf(double x);

186
library/include/stdint.h Normal file
View File

@@ -0,0 +1,186 @@
/*
* $Id: stdint.h,v 1.1 2005-02-04 15:03:14 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 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 _STDINT_H
#define _STDINT_H
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
/* C99 integer type definitions; contributed by Peter Bengtsson */
/****************************************************************************/
#ifndef _LIMITS_H
#include <limits.h>
#endif /* _LIMITS_H */
/****************************************************************************/
/* Common for all supported compilers. */
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef signed char int_least8_t;
typedef signed short int_least16_t;
typedef signed int int_least32_t;
typedef unsigned char uint_least8_t;
typedef unsigned short uint_least16_t;
typedef unsigned int uint_least32_t;
/* This is mostly guesswork. */
typedef signed char int_fast8_t;
typedef signed int int_fast16_t;
typedef signed int int_fast32_t;
typedef unsigned char uint_fast8_t;
typedef unsigned int uint_fast16_t;
typedef unsigned int uint_fast32_t;
typedef signed long intptr_t;
typedef unsigned long uintptr_t;
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
typedef signed long long int_least64_t;
typedef unsigned long long uint_least64_t;
typedef signed long long int_fast64_t;
typedef unsigned long long uint_fast64_t;
typedef signed long long intmax_t;
typedef unsigned long long uintmax_t;
#else /* No 64-bit types for SAS/C */
typedef signed long intmax_t;
typedef unsigned long uintmax_t;
#endif
#define INT8_MIN SCHAR_MIN
#define INT8_MAX SCHAR_MAX
#define UINT8_MAX UCHAR_MAX
#define INT16_MIN SHRT_MIN
#define INT16_MAX SHRT_MAX
#define UINT16_MAX USHRT_MAX
#define INT32_MIN INT_MIN
#define INT32_MAX INT_MAX
#define UINT32_MAX UINT_MAX
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
#define INT64_MIN LLONG_MIN
#define INT64_MAX LLONG_MAX
#define UINT64_MAX ULLONG_MAX
#endif
#define INT_LEAST8_MIN SCHAR_MIN
#define INT_LEAST8_MAX SCHAR_MAX
#define UINT_LEAST8_MAX UCHAR_MAX
#define INT_LEAST16_MIN SHRT_MIN
#define INT_LEAST16_MAX SHRT_MAX
#define UINT_LEAST16_MAX USHRT_MAX
#define INT_LEAST32_MIN INT_MIN
#define INT_LEAST32_MAX INT_MAX
#define UINT_LEAST32_MAX UINT_MAX
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
#define INT_LEAST64_MIN LLONG_MIN
#define INT_LEAST64_MAX LLONG_MAX
#define UINT_LEAST64_MAX ULLONG_MAX
#endif
#define INT_FAST8_MIN SCHAR_MIN
#define INT_FAST8_MAX SCHAR_MAX
#define UINT_FAST8_MAX UCHAR_MAX
#define INT_FAST16_MIN INT_MIN
#define INT_FAST16_MAX INT_MAX
#define UINT_FAST16_MAX UINT_MAX
#define INT_FAST32_MIN INT_MIN
#define INT_FAST32_MAX INT_MAX
#define UINT_FAST32_MAX UINT_MAX
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
#define INT_FAST64_MIN LLONG_MIN
#define INT_FAST64_MAX LLONG_MAX
#define UINT_FAST64_MAX ULLONG_MAX
#endif
#define INTPTR_MIN LONG_MIN
#define INTPTR_MAX LONG_MAX
#define UINTPTR_MAX ULONG_MAX
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
#define INTMAX_MIN LLONG_MIN
#define INTMAX_MAX LLONG_MAX
#define UINTMAX_MAX ULLONG_MAX
#else
#define INTMAX_MIN LONG_MIN
#define INTMAX_MAX LONG_MAX
#define UINTMAX_MAX ULONG_MAX
#endif
#if !defined(__cpluspluis) || defined(__STDC_LIMIT_MACROS)
/* sigatomic_t is an int. */
#define SIG_ATOMIC_MIN INT_MIN
#define SIG_ATOMIC_MAX INT_MAX
/* Maximum value of size_t */
#define SIZE_MAX UINT_MAX
#endif /* not C++ or LIMIT_MACROS */
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS)
#define INT8_C(x) x
#define INT16_C(x) x
#define INT32_C(x) x
#define INT64_C(x) x ## LL
#define UINT8_C(x) x ## U
#define UINT16_C(x) x ## U
#define UINT32_C(x) x ## U
#define UINT64_C(x) x ## ULL
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
#define INTMAX_C(x) x ## LL
#define UINTMAX_C(x) x ## ULL
#else
#define INTMAX_C(x) x ## L
#define UINTMAX_C(x) x ## UL
#endif
#endif /* not C++ or CONSTANT_MACROS */
/****************************************************************************/
#endif /* _STDINT_H */

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio.h,v 1.5 2005-01-02 09:07:21 obarthel Exp $
* $Id: stdio.h,v 1.9 2005-03-06 09:04:44 obarthel Exp $
*
* :ts=4
*
@@ -249,20 +249,11 @@ extern char *tmpnam(char *buf);
/****************************************************************************/
/*
* A special buffer flush routine which returns the last character written
* in case of success and EOF in case of failure. This is used by the
* putc() macro defined below.
*/
extern int __flush(FILE *stream);
/****************************************************************************/
/*
* fgetc() implemented as a "simple" macro; note that fgetc() does much more than
* can be conveniently expressed as a macro!
*/
#define getc(f) \
#define __getc_unlocked(f) \
(((((FILE *)(f))->flags & (__FILE_IN_USE|__FILE_READABLE|__FILE_EOF)) == (__FILE_IN_USE|__FILE_READABLE) && \
(((FILE *)(f))->flags & __FILE_BUFFER_MASK) != _IONBF && \
((FILE *)(f))->position < ((FILE *)(f))->num_read_bytes) ? \
@@ -275,7 +266,7 @@ extern int __flush(FILE *stream);
* fputc() implemented as a "simple" macro; note that fputc() does much more than
* can be conveniently expressed as a macro!
*/
#define putc(c,f) \
#define __putc_unlocked(c,f) \
(((((FILE *)(f))->flags & (__FILE_IN_USE|__FILE_WRITABLE)) == (__FILE_IN_USE|__FILE_WRITABLE) && \
(((FILE *)(f))->flags & __FILE_BUFFER_MASK) != _IONBF && \
(((FILE *)(f))->num_write_bytes < ((FILE *)(f))->size)) ? \
@@ -288,6 +279,25 @@ extern int __flush(FILE *stream);
/****************************************************************************/
#if defined(__THREAD_SAFE)
#define getc(f) (flockfile(f), __unlockfile((f),__getc_unlocked(f)))
#define putc(c,f) (flockfile(f), __unlockfile((f),__putc_unlocked((c),(f))))
#else
#define getc(f) __getc_unlocked(f)
#define putc(c,f) __putc_unlocked((c),(f))
#endif /* __THREAD_SAFE */
/****************************************************************************/
#define getchar() getc(stdin)
#define putchar(c) putc((c),stdout)
/****************************************************************************/
/*
* If requested, reimplement some of the file I/O routines as macros.
*/
@@ -296,8 +306,6 @@ extern int __flush(FILE *stream);
/****************************************************************************/
#define getchar() getc(stdin)
#define putchar(c) putc((c),stdout)
#define clearerr(file) ((void)((file)->flags &= ~(__FILE_EOF|__FILE_ERROR)))
#define feof(file) (((file)->flags & __FILE_EOF) != 0)
#define ferror(file) (((file)->flags & __FILE_ERROR) != 0)
@@ -316,6 +324,38 @@ extern int __flush(FILE *stream);
/****************************************************************************/
/*
* A special buffer flush routine which returns the last character written
* in case of success and EOF in case of failure. This is used by the
* __putc_unlocked() macro defined above.
*/
extern int __flush(FILE *stream);
/****************************************************************************/
/*
* A special function which returns the input character. This is used by
* the __getc_unlocked() macro defined above.
*/
extern int __unlockfile(FILE *stream,int c);
/****************************************************************************/
extern int getc_unlocked(FILE *stream);
extern int getchar_unlocked(void);
extern int putc_unlocked(int c,FILE *stream);
extern int putchar_unlocked(int c);
/****************************************************************************/
#define getc_unlocked(f) __getc_unlocked(f)
#define putc_unlocked(c,f) __putc_unlocked((c),(f))
#define getchar_unlocked() __getc_unlocked(stdin)
#define putchar_unlocked(c) __putc_unlocked((c),stdout)
/****************************************************************************/
extern FILE * fdopen(int file_descriptor, const char * type);
extern int fileno(FILE * file);
extern int asprintf(char **ret, const char *format, ...);
@@ -326,6 +366,30 @@ extern FILE * popen(const char *command, const char *type);
/****************************************************************************/
#if defined(__THREAD_SAFE)
/****************************************************************************/
extern void flockfile(FILE * file);
extern void funlockfile(FILE * file);
extern int ftrylockfile(FILE * file);
/****************************************************************************/
#else
/****************************************************************************/
#define flockfile(file) ((void)0)
#define funlockfile(file) ((void)0)
#define ftrylockfile(file) (0)
/****************************************************************************/
#endif /* __THREAD_SAFE */
/****************************************************************************/
extern int vasprintf(char **ret,const char *format,va_list arg);
#ifdef __MEM_DEBUG

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib.h,v 1.5 2005-01-02 09:07:21 obarthel Exp $
* $Id: stdlib.h,v 1.8 2005-03-02 12:57:56 obarthel Exp $
*
* :ts=4
*
@@ -149,8 +149,17 @@ extern long atol(const char *str);
/****************************************************************************/
extern int rand_r(unsigned int * seed);
/****************************************************************************/
/* These functions are unavailable under SAS/C for lack of a
"long long" data type. */
#if ! defined(__SASC)
extern long long strtoll(const char *str, char **ptr, int base);
extern unsigned long long strtoull(const char *str, char **ptr, int base);
extern long long atoll(const char *str);
#endif /* __SASC */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: strings.h,v 1.3 2005-01-02 09:07:21 obarthel Exp $
* $Id: strings.h,v 1.4 2005-03-02 12:57:56 obarthel Exp $
*
* :ts=4
*
@@ -52,9 +52,10 @@ extern "C" {
/****************************************************************************/
/* These two come from 4.4BSD. */
/* These come from 4.4BSD. */
extern int strcasecmp(const char *s1, const char *s2);
extern int strncasecmp(const char *s1, const char *s2, size_t len);
extern int ffs(int i);
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stat.h,v 1.3 2005-01-02 09:07:21 obarthel Exp $
* $Id: stat.h,v 1.4 2005-03-10 11:40:57 obarthel Exp $
*
* :ts=4
*
@@ -79,6 +79,15 @@ extern "C" {
#define S_IWOTH 0000002 /* W for other */
#define S_IXOTH 0000001 /* X for other */
/****************************************************************************/
/* Aliases for the owner RWX mask. */
#define S_IREAD S_IRUSR
#define S_IWRITE S_IWUSR
#define S_IEXEC S_IXUSR
/****************************************************************************/
#define S_IFMT 0170000 /* type of file */
#define S_IFIFO 0010000 /* named pipe (fifo) */
#define S_IFDIR 0040000 /* directory */
@@ -87,6 +96,8 @@ extern "C" {
#define S_IFLNK 0120000 /* symbolic link */
#define S_IFSOCK 0140000 /* socket */
/****************************************************************************/
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) /* directory */
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) /* regular file */
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) /* symbolic link */

View File

@@ -1,5 +1,5 @@
/*
* $Id: types.h,v 1.3 2005-01-02 09:07:21 obarthel Exp $
* $Id: types.h,v 1.4 2005-02-20 15:46:57 obarthel Exp $
*
* :ts=4
*
@@ -53,7 +53,7 @@ typedef unsigned int gid_t;
typedef unsigned int ino_t;
typedef unsigned int mode_t;
typedef unsigned int nlink_t;
typedef int off_t;
typedef long int off_t;
typedef int pid_t;
typedef unsigned int rlim_t;
typedef int ssize_t;

View File

@@ -0,0 +1,74 @@
/*
* $Id: utsname.h,v 1.1 2005-03-02 12:57:56 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 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 _SYS_UTSNAME_H
#define _SYS_UTSNAME_H
/****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
#define SYS_NMLN 32
/****************************************************************************/
struct utsname
{
char sysname[SYS_NMLN]; /* OS Name ("AmigaOS") */
char nodename[SYS_NMLN]; /* Usually Hostname, but there appears to be no standard. */
char release[SYS_NMLN]; /* Release e.g. "51.1" (The Version of version.library) */
char version[SYS_NMLN]; /* Version e.h. "4.0" (OS Version) */
char machine[SYS_NMLN]; /* Machine e.g. "m68k" or "ppc" */
};
/****************************************************************************/
extern int uname(struct utsname *);
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */
/****************************************************************************/
#endif /* _SYS_UTSNAME_H */

View File

@@ -1,5 +1,5 @@
/*
* $Id: unistd.h,v 1.8 2005-01-02 09:07:21 obarthel Exp $
* $Id: unistd.h,v 1.9 2005-02-04 15:03:14 obarthel Exp $
*
* :ts=4
*
@@ -98,6 +98,8 @@ 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);
extern int fsync(int file_descriptor);
extern int fdatasync(int file_descriptor);
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: locale_headers.h,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: locale_headers.h,v 1.6 2005-02-28 10:07:30 obarthel Exp $
*
* :ts=4
*
@@ -53,9 +53,9 @@
/****************************************************************************/
#ifndef _STDLIB_LOCALE_UTILITY_H
#include "stdlib_locale_utility.h"
#endif /* _STDLIB_LOCALE_UTILITY_H */
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
@@ -78,6 +78,28 @@ extern char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
/****************************************************************************/
#if defined(__THREAD_SAFE)
/****************************************************************************/
extern void __locale_lock(void);
extern void __locale_unlock(void);
/****************************************************************************/
#else
/****************************************************************************/
#define __locale_lock() ((void)0)
#define __locale_unlock() ((void)0)
/****************************************************************************/
#endif /* __THREAD_SAFE */
/****************************************************************************/
extern void __close_all_locales(void);
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: locale_init_exit.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
* $Id: locale_init_exit.c,v 1.8 2005-03-03 14:20:55 obarthel Exp $
*
* :ts=4
*
@@ -63,6 +63,8 @@ char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
void
__close_all_locales(void)
{
__locale_lock();
if(__LocaleBase != NULL)
{
DECLARE_LOCALEBASE();
@@ -86,14 +88,19 @@ __close_all_locales(void)
CloseLocale(__locale_table[LC_ALL]);
__locale_table[LC_ALL] = NULL;
}
__locale_unlock();
}
/****************************************************************************/
CLIB_DESTRUCTOR(__locale_exit)
void
__locale_exit(void)
{
ENTER();
__locale_lock();
if(__LocaleBase != NULL)
{
DECLARE_LOCALEBASE();
@@ -120,48 +127,140 @@ CLIB_DESTRUCTOR(__locale_exit)
__LocaleBase = NULL;
}
__locale_unlock();
LEAVE();
}
/****************************************************************************/
CLIB_CONSTRUCTOR(__locale_init)
int
__locale_init(void)
{
int i;
int result = -1;
ENTER();
for(i = 0 ; i < NUM_LOCALES ; i++)
strcpy(__locale_name_table[i],"C");
PROFILE_OFF();
__LocaleBase = OpenLibrary("locale.library",38);
__locale_lock();
#if defined(__amigaos4__)
if(__LocaleBase == NULL)
{
if (__LocaleBase != NULL)
__LocaleBase = OpenLibrary("locale.library",38);
#if defined(__amigaos4__)
{
__ILocale = (struct LocaleIFace *)GetInterface(__LocaleBase, "main", 1, 0);
if(__ILocale == NULL)
if (__LocaleBase != NULL)
{
CloseLibrary(__LocaleBase);
__LocaleBase = NULL;
__ILocale = (struct LocaleIFace *)GetInterface(__LocaleBase, "main", 1, 0);
if(__ILocale == NULL)
{
CloseLibrary(__LocaleBase);
__LocaleBase = NULL;
}
}
}
#endif /* __amigaos4__ */
}
#endif /* __amigaos4__ */
if(__LocaleBase != NULL)
if(__LocaleBase != NULL && __default_locale == NULL)
{
DECLARE_LOCALEBASE();
__default_locale = OpenLocale(NULL);
}
if(__default_locale != NULL)
result = 0;
__locale_unlock();
PROFILE_ON();
RETURN(OK);
CONSTRUCTOR_SUCCEED();
RETURN(result);
return(result);
}
/****************************************************************************/
#if defined(__THREAD_SAFE)
/****************************************************************************/
static struct SignalSemaphore * locale_lock;
/****************************************************************************/
void
__locale_lock(void)
{
if(locale_lock != NULL)
ObtainSemaphore(locale_lock);
}
/****************************************************************************/
void
__locale_unlock(void)
{
if(locale_lock != NULL)
ReleaseSemaphore(locale_lock);
}
/****************************************************************************/
#endif /* __THREAD_SAFE */
/****************************************************************************/
CLIB_DESTRUCTOR(__locale_exit_destructor)
{
ENTER();
__locale_exit();
#if defined(__THREAD_SAFE)
{
__delete_semaphore(locale_lock);
locale_lock = NULL;
}
#endif /* __THREAD_SAFE */
LEAVE();
}
/****************************************************************************/
CLIB_CONSTRUCTOR(__locale_init_constructor)
{
BOOL success = FALSE;
int i;
ENTER();
#if defined(__THREAD_SAFE)
{
locale_lock = __create_semaphore();
if(locale_lock == NULL)
goto out;
}
#endif /* __THREAD_SAFE */
for(i = 0 ; i < NUM_LOCALES ; i++)
strcpy(__locale_name_table[i],"C");
if(__open_locale)
__locale_init();
success = TRUE;
out:
RETURN(success);
if(success)
CONSTRUCTOR_SUCCEED();
else
CONSTRUCTOR_FAIL();
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: locale_localeconv.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: locale_localeconv.c,v 1.4 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -41,12 +41,18 @@ struct lconv *
localeconv(void)
{
static struct lconv loc;
struct Locale * numeric_locale = __locale_table[LC_NUMERIC];
struct Locale * monetary_locale = __locale_table[LC_MONETARY];
struct Locale * numeric_locale;
struct Locale * monetary_locale;
struct lconv * result;
ENTER();
__locale_lock();
numeric_locale = __locale_table[LC_NUMERIC];
monetary_locale = __locale_table[LC_MONETARY];
/* This makes up the current locale settings from the various
* components in use.
*/
@@ -71,6 +77,8 @@ localeconv(void)
result = &loc;
__locale_unlock();
RETURN(result);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stat_data.c,v 1.2 2005-01-02 09:07:08 obarthel Exp $
* $Id: locale_open_locale.c,v 1.1 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -31,10 +31,10 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _STAT_HEADERS_H
#include "stat_headers.h"
#endif /* _STAT_HEADERS_H */
#ifndef _LOCALE_HEADERS_H
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
/****************************************************************************/
mode_t __current_umask = S_IWGRP | S_IWOTH;
BOOL __open_locale = TRUE;

View File

@@ -1,5 +1,5 @@
/*
* $Id: locale_setlocale.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: locale_setlocale.c,v 1.4 2005-02-27 21:58:21 obarthel Exp $
*
* :ts=4
*
@@ -52,11 +52,13 @@ setlocale(int category, const char *locale)
else
SHOWSTRING(locale);
__locale_lock();
if(category < LC_ALL || category > LC_TIME)
{
SHOWMSG("invalid category");
errno = EINVAL;
__set_errno(EINVAL);
goto out;
}
@@ -75,7 +77,7 @@ setlocale(int category, const char *locale)
{
SHOWMSG("locale name is too long");
errno = ENAMETOOLONG;
__set_errno(ENAMETOOLONG);
goto out;
}
@@ -103,7 +105,7 @@ setlocale(int category, const char *locale)
{
SHOWMSG("couldn't open the locale");
errno = ENOENT;
__set_errno(ENOENT);
goto out;
}
}
@@ -155,6 +157,8 @@ setlocale(int category, const char *locale)
out:
__locale_unlock();
RETURN(result);
return(result);
}

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 186
#define DATE "14.1.2005"
#define VERS "m.lib 1.186"
#define VSTRING "m.lib 1.186 (14.1.2005)\r\n"
#define VERSTAG "\0$VER: m.lib 1.186 (14.1.2005)"
#define REVISION 189
#define DATE "5.3.2005"
#define VERS "m.lib 1.189"
#define VSTRING "m.lib 1.189 (5.3.2005)\r\n"
#define VERSTAG "\0$VER: m.lib 1.189 (5.3.2005)"

View File

@@ -1 +1 @@
186
189

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 186
#define DATE "14.1.2005"
#define VERS "m881.lib 1.186"
#define VSTRING "m881.lib 1.186 (14.1.2005)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.186 (14.1.2005)"
#define REVISION 189
#define DATE "5.3.2005"
#define VERS "m881.lib 1.189"
#define VSTRING "m881.lib 1.189 (5.3.2005)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.189 (5.3.2005)"

View File

@@ -1 +1 @@
186
189

View File

@@ -1,5 +1,5 @@
/*
* $Id: macros.h,v 1.5 2005-01-12 09:15:50 obarthel Exp $
* $Id: macros.h,v 1.15 2005-03-11 11:35:31 obarthel Exp $
*
* :ts=4
*
@@ -54,20 +54,6 @@
/****************************************************************************/
#ifndef ZERO
#define ZERO ((BPTR)NULL)
#endif /* ZERO */
/****************************************************************************/
#define UNIX_TIME_OFFSET 252460800
/****************************************************************************/
#define MILLION (1000000)
/****************************************************************************/
#define NUM_ENTRIES(t) (sizeof(t) / sizeof(t[0]))
/****************************************************************************/
@@ -83,17 +69,157 @@
/****************************************************************************/
/* Macro to get longword-aligned stack space for a structure
* Uses ANSI token catenation to form a name for the char array
* based on the variable name, then creates an appropriately
* typed pointer to point to the first longword boundary in the
* char array allocated.
*/
Uses ANSI token catenation to form a name for the char array
based on the variable name, then creates an appropriately
typed pointer to point to the first longword boundary in the
char array allocated. */
#define D_S(type, name) \
char a_##name[sizeof(type)+3]; \
type *name = (type *)((LONG)(a_##name+3) & ~3)
/****************************************************************************/
/* BCPL style "NULL"; this should be in <dos/dos.h>. */
#ifndef ZERO
#define ZERO ((BPTR)NULL)
#endif /* ZERO */
/****************************************************************************/
/* Constructor and destructor functions, as used by the library for data
initialization and cleanup. These particular functions are invoked by
the startup code before and after the main() function is/was called.
How this works is very compiler specific. We support three flavours
below. */
/****************************************************************************/
#ifdef __SASC
#define CONSTRUCTOR(name,pri) \
int __stdargs _STI_##pri##_##name(void); \
int __stdargs _STI_##pri##_##name(void)
#define DESTRUCTOR(name,pri) \
int __stdargs _STD_##pri##_##name(void); \
int __stdargs _STD_##pri##_##name(void)
#define CONSTRUCTOR_SUCCEED() \
return(0)
#define CONSTRUCTOR_FAIL() \
return(1)
#endif /* __SASC */
/****************************************************************************/
#ifdef __GNUC__
#if defined(__amigaos4__)
#define CONSTRUCTOR(name,pri) \
STATIC VOID __attribute__((used)) name##_ctor(VOID); \
STATIC VOID (*__##name##_ctor)(VOID) __attribute__((used,section(".ctors._" #pri))) = name##_ctor; \
STATIC VOID name##_ctor(VOID)
#define DESTRUCTOR(name,pri) \
STATIC VOID __attribute__((used)) name##_dtor(VOID); \
STATIC VOID (*__##name##_dtor)(VOID) __attribute__((used,section(".dtors._" #pri))) = name##_dtor; \
STATIC VOID name##_dtor(VOID)
#else
#define CONSTRUCTOR(name,pri) \
STATIC VOID __attribute__((constructor)) __ctor##pri##_##name##(VOID); \
STATIC void __ctor##pri##_##name##(VOID)
#define DESTRUCTOR(name,pri) \
STATIC VOID __attribute__((destructor)) __dtor##pri##_##name##(VOID); \
STATIC VOID __dtor##pri##_##name##(VOID)
#endif /* __amigaos4__ */
#define CONSTRUCTOR_SUCCEED() \
return
#define CONSTRUCTOR_FAIL() \
exit(RETURN_FAIL)
#endif /* __GNUC__ */
/****************************************************************************/
/* These macros are for declaring functions to serve as constructors or
destructors. In which order these should be invoked is defined by the
priority, which is a number in the range 0-999. User-supplied
constructor/destructor functions should have priority 0. That way,
the user-supplied constructors will be invoked after the library
constructors and the user-supplied destructors before the library
destructors. */
#define STDLIB_CONSTRUCTOR(name) CONSTRUCTOR(name, 100)
#define STDLIB_DESTRUCTOR(name) DESTRUCTOR(name, 100)
#define STK_CONSTRUCTOR(name) CONSTRUCTOR(name, 110)
#define STK_DESTRUCTOR(name) DESTRUCTOR(name, 110)
#define STDIO_CONSTRUCTOR(name) CONSTRUCTOR(name, 120)
#define STDIO_DESTRUCTOR(name) DESTRUCTOR(name, 120)
#define FILE_CONSTRUCTOR(name) CONSTRUCTOR(name, 130)
#define FILE_DESTRUCTOR(name) DESTRUCTOR(name, 130)
#define MATH_CONSTRUCTOR(name) CONSTRUCTOR(name, 140)
#define MATH_DESTRUCTOR(name) DESTRUCTOR(name, 140)
#define SOCKET_CONSTRUCTOR(name) CONSTRUCTOR(name, 150)
#define SOCKET_DESTRUCTOR(name) DESTRUCTOR(name, 150)
#define ARG_CONSTRUCTOR(name) CONSTRUCTOR(name, 160)
#define ARG_DESTRUCTOR(name) DESTRUCTOR(name, 160)
#define CLIB_CONSTRUCTOR(name) CONSTRUCTOR(name, 170)
#define CLIB_DESTRUCTOR(name) DESTRUCTOR(name, 170)
#define PROFILE_CONSTRUCTOR(name) CONSTRUCTOR(name, 180)
#define PROFILE_DESTRUCTOR(name) DESTRUCTOR(name, 180)
/****************************************************************************/
/* Magic macros for code profiling, SAS/C style. Normally, you would find
these in <sprof.h>, which is SAS/C-specific. */
/****************************************************************************/
#ifdef __SASC
extern void ASM _PROLOG(REG(a0,char *));
extern void ASM _EPILOG(REG(a0,char *));
#if _PROFILE
#define PROFILE_OFF() _PROLOG(0L)
#define PROFILE_ON() _EPILOG(0L)
#else
#define PROFILE_OFF() ((void)0)
#define PROFILE_ON() ((void)0)
#endif /* _PROFILE */
#endif /* __SASC */
/****************************************************************************/
#ifdef __GNUC__
#define PROFILE_OFF() ((void)0)
#define PROFILE_ON() ((void)0)
#endif /* __GNUC__ */
/****************************************************************************/
/* Special data and function attributes; for OS4 most, if not all of them
are in a file called <amiga_compiler.h> which is pulled in by the
<exec/types.h> header file. */
/****************************************************************************/
#ifndef AMIGA_COMPILER_H
#ifdef __SASC
@@ -144,7 +270,7 @@
#define WEAK __attribute__((weak))
#else
#define WEAK /* WEAK */
#endif
#endif /* __GNUC__ */
#endif /* WEAK */
/****************************************************************************/
@@ -152,52 +278,20 @@
#ifndef UNUSED
#ifdef __GNUC__
#define UNUSED __attribute__((unused))
#define NOCOMMON __attribute__((nocommon))
#else
#define UNUSED /* UNUSED */
#define NOCOMMON /* NOCOMMON */
#endif
#endif /* __GNUC__ */
#endif /* UNUSED */
/****************************************************************************/
#ifdef __SASC
#define CLIB_CONSTRUCTOR(name) int __stdargs _STI_500_##name(void)
#define CLIB_DESTRUCTOR(name) void __stdargs _STD_500_##name(void)
#define PROFILE_CONSTRUCTOR(name) int __stdargs _STI_150_##name(void)
#define PROFILE_DESTRUCTOR(name) void __stdargs _STD_150_##name(void)
#define CONSTRUCTOR_SUCCEED() return(0)
#define CONSTRUCTOR_FAIL() return(1)
#endif /* __SASC */
#ifndef NOCOMMON
#ifdef __GNUC__
#define CLIB_CONSTRUCTOR(name) static void __attribute__((constructor)) name##_ctor(void)
#define CLIB_DESTRUCTOR(name) static void __attribute__((destructor)) name##_dtor(void)
#define PROFILE_CONSTRUCTOR(name) static void __attribute__((constructor)) name##_ctor(void)
#define PROFILE_DESTRUCTOR(name) static void __attribute__((destructor)) name##_dtor(void)
#define CONSTRUCTOR_SUCCEED() return
#define CONSTRUCTOR_FAIL() exit(RETURN_FAIL) /* ZZZ not a nice thing to do; fix the constructor invocation code! */
#endif /* __GNUC__ */
/****************************************************************************/
#ifdef __SASC
extern void ASM _PROLOG(REG(a0,char *));
extern void ASM _EPILOG(REG(a0,char *));
#if _PROFILE
#define PROFILE_OFF() _PROLOG(0L)
#define PROFILE_ON() _EPILOG(0L)
#define NOCOMMON __attribute__((nocommon))
#else
#define PROFILE_OFF() ((void)0)
#define PROFILE_ON() ((void)0)
#endif /* _PROFILE */
#endif /* __SASC */
#ifdef __GNUC__
#define PROFILE_OFF() ((void)0)
#define PROFILE_ON() ((void)0)
#define NOCOMMON /* NOCOMMON */
#endif /* __GNUC__ */
#endif /* NOCOMMON */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_acos.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_acos.c,v 1.5 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___acos:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__acos(double x)
{
double result;
@@ -119,7 +119,7 @@ __acos(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__acos(double x)
{
double result;
@@ -153,7 +153,7 @@ qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
INLINE static const double
INLINE STATIC const double
__acos(double x)
{
double z,p,q,r,w,s,c,df;
@@ -227,7 +227,7 @@ acos(double x)
else
{
result = 0;
errno = EDOM;
__set_errno(EDOM);
}
return(result);

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_asin.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_asin.c,v 1.5 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___asin:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__asin(double x)
{
double result;
@@ -119,7 +119,7 @@ __asin(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__asin(double x)
{
double result;
@@ -156,7 +156,7 @@ qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
INLINE static const double
INLINE STATIC const double
__asin(double x)
{
double t,w,p,q,c,r,s;
@@ -238,7 +238,7 @@ asin(double x)
else
{
result = 0;
errno = EDOM;
__set_errno(EDOM);
}
return(result);

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_atan.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_atan.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___atan:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__atan(double x)
{
double result;
@@ -119,7 +119,7 @@ __atan(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__atan(double x)
{
double result;
@@ -169,7 +169,7 @@ static const double
one = 1.0,
huge = 1.0e300;
INLINE static const double
INLINE STATIC const double
__atan(double x)
{
double w,s1,s2,z;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_atan2.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_atan2.c,v 1.6 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -62,7 +62,7 @@ extern double __atan(double x);
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__atan2(double y,double x)
{
const double pi = 3.14159265358979323846;
@@ -108,7 +108,7 @@ __atan2(double y,double x)
else
{
result = 0;
errno = EDOM;
__set_errno(EDOM);
}
}
}
@@ -122,7 +122,7 @@ __atan2(double y,double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__atan(double x)
{
double result;
@@ -134,7 +134,7 @@ __atan(double x)
return(result);
}
INLINE static const double
INLINE STATIC const double
__atan2(double y,double x)
{
double pi,pi_over_2;
@@ -187,7 +187,7 @@ __atan2(double y,double x)
else
{
result = 0;
errno = EDOM;
__set_errno(EDOM);
}
}
}
@@ -209,7 +209,7 @@ pi_o_2 = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */
pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
INLINE static const double
INLINE STATIC const double
__atan2(double y,double x)
{
double z;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_ceil.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_ceil.c,v 1.4 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___ceil:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__ceil(double x)
{
double result;
@@ -119,7 +119,7 @@ __ceil(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__ceil(double x)
{
int rounding_mode, round_up;
@@ -150,10 +150,9 @@ __ceil(double x)
#if defined(PPC_FLOATING_POINT_SUPPORT)
static const double huge = 1.0e300;
INLINE static const double
INLINE STATIC const double
__ceil(double x)
{
int i0,i1,j0;
@@ -233,6 +232,7 @@ __ceil(double x)
}
#endif /* PPC_FLOATING_POINT_SUPPORT */
/****************************************************************************/
double

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_cos.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_cos.c,v 1.4 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___cos:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__cos(double x)
{
double result;
@@ -119,7 +119,7 @@ __cos(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__cos(double x)
{
double result;
@@ -137,7 +137,7 @@ __cos(double x)
#if defined(PPC_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__cos(double x)
{
double y[2],z=0.0;
@@ -172,6 +172,7 @@ __cos(double x)
}
}
}
#endif /* PPC_FLOATING_POINT_SUPPORT */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_cosh.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_cosh.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___cosh:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__cosh(double x)
{
double result;
@@ -119,7 +119,7 @@ __cosh(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__cosh(double x)
{
double result;
@@ -139,7 +139,7 @@ __cosh(double x)
static const double one = 1.0, half=0.5, huge = 1.0e300;
INLINE static const double
INLINE STATIC const double
__cosh(double x)
{
double t,w;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_exp.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_exp.c,v 1.4 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___exp:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__exp(double x)
{
double result;
@@ -119,7 +119,7 @@ __exp(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__exp(double x)
{
double result;
@@ -155,7 +155,7 @@ P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */
INLINE static const double
INLINE STATIC const double
__exp(double x)
{
double y,hi,lo,c,t;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_fabs.c,v 1.5 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_fabs.c,v 1.6 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -88,7 +88,7 @@ ___fabs:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__fabs(double x)
{
double result;
@@ -110,7 +110,7 @@ __fabs(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__fabs(double x)
{
double result;
@@ -134,7 +134,7 @@ __fabs(double x)
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__fabs(double x)
{
double res;
@@ -153,7 +153,7 @@ __fabs(double x)
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__fabs(double x)
{
double res;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_floor.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_floor.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___floor:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__floor(double x)
{
double result;
@@ -119,7 +119,7 @@ __floor(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__floor(double x)
{
int rounding_mode, round_down;
@@ -153,7 +153,7 @@ __floor(double x)
#if defined(PPC_FLOATING_POINT_SUPPORT)
static const double huge = 1.0e300;
INLINE static const double
INLINE STATIC const double
__floor(double x)
{
int i0,i1,j0;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_fmod.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_fmod.c,v 1.5 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -54,7 +54,7 @@
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__fmod(double x,double y)
{
double q,p,result;
@@ -79,7 +79,7 @@ __fmod(double x,double y)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__fmod(double x,double y)
{
double result;
@@ -102,7 +102,7 @@ static const double
one = 1.0,
Zero[] = {0.0, -0.0,};
INLINE static const double
INLINE STATIC const double
__fmod(double x,double y)
{
int n,hx,hy,hz,ix,iy,sx,i;
@@ -285,7 +285,7 @@ fmod(double x,double y)
else
{
result = x;
errno = EDOM;
__set_errno(EDOM);
}
return(result);

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_frexp.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_frexp.c,v 1.4 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -58,7 +58,7 @@
#if defined(IEEE_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__frexp(double x,int * nptr)
{
int int_exponent = 0;
@@ -106,7 +106,7 @@ __frexp(double x,int * nptr)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__frexp(double x,int * nptr)
{
double float_exponent;
@@ -146,7 +146,7 @@ __frexp(double x,int * nptr)
static const double
two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */
INLINE static const double
INLINE STATIC const double
__frexp(double x,int * eptr)
{
int hx, ix, lx;
@@ -189,8 +189,9 @@ frexp(double x,int *nptr)
{
if(nptr == NULL)
{
result = HUGE_VAL;
errno = EFAULT;
__set_errno(EFAULT);
result = __get_huge_val();
goto out;
}
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_headers.h,v 1.5 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_headers.h,v 1.6 2005-02-03 16:56:15 obarthel Exp $
*
* :ts=4
*
@@ -192,8 +192,14 @@ extern double __scalbn(double x, int n);
/****************************************************************************/
extern double __not_a_number;
extern double __infinity;
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* math_huge_val.c */
double __get_huge_val(void);
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_data.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_huge_val.c,v 1.1 2005-02-03 16:56:15 obarthel Exp $
*
* :ts=4
*
@@ -37,16 +37,8 @@
/****************************************************************************/
#if defined(IEEE_FLOATING_POINT_SUPPORT)
struct Library * MathIeeeSingBasBase;
struct Library * MathIeeeDoubBasBase;
struct Library * MathIeeeDoubTransBase;
#endif /* IEEE_FLOATING_POINT_SUPPORT */
/****************************************************************************/
double __huge_val;
double __not_a_number;
double __infinity;
double
__get_huge_val(void)
{
return(__huge_val);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_hypot.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_hypot.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -52,7 +52,7 @@
#if defined(IEEE_FLOATING_POINT_SUPPORT) || defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__hypot(double x,double y)
{
double yx;
@@ -85,7 +85,7 @@ __hypot(double x,double y)
static const double one = 1.0;
INLINE static const double
INLINE STATIC const double
__hypot(double x,double y)
{
int n0;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_init_exit.c,v 1.6 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_init_exit.c,v 1.10 2005-03-09 10:48:59 obarthel Exp $
*
* :ts=4
*
@@ -41,6 +41,10 @@
/****************************************************************************/
#include <exec/execbase.h>
/****************************************************************************/
#include <proto/exec.h>
/****************************************************************************/
@@ -53,6 +57,20 @@
/****************************************************************************/
#if defined(IEEE_FLOATING_POINT_SUPPORT)
struct Library * MathIeeeSingBasBase;
struct Library * MathIeeeDoubBasBase;
struct Library * MathIeeeDoubTransBase;
#endif /* IEEE_FLOATING_POINT_SUPPORT */
/****************************************************************************/
double __huge_val;
/****************************************************************************/
CLIB_DESTRUCTOR(__math_exit)
{
ENTER();
@@ -113,8 +131,8 @@ __math_init(void)
{
char message[60];
strcpy(message,failed_library);
strcat(message," could not be opened.");
strlcpy(message,failed_library,sizeof(message));
strlcat(message," could not be opened.",sizeof(message));
__show_error(message);
@@ -127,82 +145,28 @@ __math_init(void)
the largest representable floating point value. */
if(sizeof(__huge_val) == 4) /* single precision */
{
static const unsigned long largest_fp_value[1] =
{
/* Exponent = +126, Mantissa = 8,388,607 */
0x7f7fffff
};
union ieee_single * x = (union ieee_single *)&__huge_val;
static const unsigned long not_a_number[1] =
{
/* Exponent = 255 and fraction != 0.0 */
0x7fffffff
};
static const unsigned long infinity[1] =
{
/* Exponent = 255 and fraction = 0.0 */
0x7f800000
};
assert( sizeof(largest_fp_value) == sizeof(__huge_val) );
memmove((void *)&__huge_val,largest_fp_value,sizeof(largest_fp_value));
memmove((void *)&__not_a_number,not_a_number,sizeof(not_a_number));
memmove((void *)&__infinity,infinity,sizeof(infinity));
/* Exponent = +126, Mantissa = 8,388,607 */
x->raw[0] = 0x7f7fffff;
}
else if (sizeof(__huge_val) == 8) /* double precision */
{
static const unsigned long largest_fp_value[2] =
{
/* Exponent = +1022, Mantissa = 4,503,599,627,370,495 */
0x7fefffff,0xffffffff
};
union ieee_double * x = (union ieee_double *)&__huge_val;
static const unsigned long not_a_number[2] =
{
/* Exponent = 2047 and fraction != 0.0 */
0x7fffffff,0xffffffff
};
static const unsigned long infinity[2] =
{
/* Exponent = 2047 and fraction = 0.0 */
0x7ff00000,0x00000000
};
assert( sizeof(largest_fp_value) == sizeof(__huge_val) );
memmove((void *)&__huge_val,largest_fp_value,sizeof(largest_fp_value));
memmove((void *)&__not_a_number,not_a_number,sizeof(not_a_number));
memmove((void *)&__infinity,infinity,sizeof(infinity));
/* Exponent = +1022, Mantissa = 4,503,599,627,370,495 */
x->raw[0] = 0x7fefffff;
x->raw[1] = 0xffffffff;
}
#if defined(USE_LONG_DOUBLE)
else if (sizeof(__huge_val) == 12) /* extended precision */
{
static const unsigned long largest_fp_value[3] =
{
/* Exponent = +32766, Mantissa = 18,446,744,073,709,551,615 */
0x7ffe0000,0xffffffff,0xffffffff
};
union ieee_long_double * x = (union ieee_long_double *)&__huge_val;
static const unsigned long not_a_number[3] =
{
/* Exponent = 32767 and fraction != 0.0 */
0x7fff0000,0xffffffff,0xffffffff
};
static const unsigned long infinity[3] =
{
/* Exponent = 32767 and fraction = 0.0 */
0x7fff0000,0x00000000,0x00000000
};
assert( sizeof(largest_fp_value) == sizeof(__huge_val) );
memmove((void *)&__huge_val,largest_fp_value,sizeof(largest_fp_value));
memmove((void *)&__not_a_number,not_a_number,sizeof(not_a_number));
memmove((void *)&__infinity,infinity,sizeof(infinity));
/* Exponent = +32766, Mantissa = 18,446,744,073,709,551,615 */
x->raw[0] = 0x7ffe0000;
x->raw[1] = 0xffffffff;
x->raw[2] = 0xffffffff;
}
#endif /* USE_LONG_DOUBLE */

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_kernel_rem_pio2.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_kernel_rem_pio2.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -69,7 +69,7 @@ one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
INLINE static int __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int *ipio2)
INLINE STATIC int kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int *ipio2)
{
int jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
double z,fw,f[20],fq[20],q[20];
@@ -341,7 +341,7 @@ int __rem_pio2(double x, double *y)
tx[2] = z;
nx = 3;
while(tx[nx-1]==zero) nx--; /* skip zero term */
n = __kernel_rem_pio2(tx,y,e0,nx,2,two_over_pi);
n = kernel_rem_pio2(tx,y,e0,nx,2,two_over_pi);
if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
return n;
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_kernel_scalbn.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_kernel_scalbn.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -50,7 +50,7 @@
/****************************************************************************/
INLINE static double copysign(double x, double y)
INLINE STATIC double copysign(double x, double y)
{
unsigned int hx,hy;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_ldexp.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_ldexp.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -66,7 +66,7 @@ union dtol
long ival[2];
};
INLINE static const double
INLINE STATIC const double
__ldexp(double x,int n)
{
union dtol number;
@@ -96,7 +96,7 @@ __ldexp(double x,int n)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__ldexp(double x,int n)
{
double result;
@@ -129,7 +129,7 @@ union dtol
long ival[2];
};
INLINE static const double
INLINE STATIC const double
__ldexp(double x,int n)
{
union dtol number;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_log.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_log.c,v 1.6 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___log:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__log(double x)
{
double result;
@@ -119,7 +119,7 @@ __log(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__log(double x)
{
double result;
@@ -150,7 +150,7 @@ Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
Lg7 = 1.479819860511658591e-01, /* 3FC2F112 DF3E5244 */
zero = 0.0;
INLINE static const double
INLINE STATIC const double
__log(double x)
{
double hfsq,f,s,z,R,w,t1,t2,dk;
@@ -244,19 +244,16 @@ log(double x)
{
double result;
/* ZZZ when do we consider 'x' to be invalid? If it's close
* enough to zero or negative. How large is epsilon, and how
* do we return minus infinity?
*/
if(x > 0.0)
if(x > DBL_EPSILON)
{
result = __log(x);
}
else
{
/* ZZZ this should be minus infinity */
result = -HUGE_VAL;
errno = ERANGE;
__set_errno(ERANGE);
/* This should really be minus infinity. */
result = (-__get_huge_val());
}
return(result);

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_log10.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_log10.c,v 1.5 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___log10:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__log10(double x)
{
double result;
@@ -119,7 +119,7 @@ __log10(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__log10(double x)
{
double result;
@@ -144,7 +144,7 @@ log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */
log10_2lo = 3.69423907715893078616e-13, /* 0x3D59FEF3, 0x11F12B36 */
zero = 0.0;
INLINE static const double
INLINE STATIC const double
__log10(double x)
{
double y,z;
@@ -186,19 +186,16 @@ log10(double x)
{
double result;
/* ZZZ when do we consider 'x' to be invalid? If it's close
* enough to zero or negative. How large is epsilon, and how
* do we return minus infinity?
*/
if(x > 0.0)
if(x > DBL_EPSILON)
{
result = __log10(x);
}
else
{
/* ZZZ this should be minus infinity */
result = -HUGE_VAL;
errno = ERANGE;
__set_errno(ERANGE);
/* This should really be minus infinity. */
result = (-__get_huge_val());
}
return(result);

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_logb.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_logb.c,v 1.5 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -54,7 +54,7 @@
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__logb(double x)
{
double result;
@@ -70,7 +70,7 @@ __logb(double x)
#if defined(PPC_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__logb(double x)
{
unsigned int lx,ix;
@@ -103,7 +103,7 @@ logb(double x)
if(x == 0.0)
{
result = -HUGE_VAL;
result = -__get_huge_val();
goto out;
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_modf.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_modf.c,v 1.5 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -58,7 +58,7 @@
#if defined(IEEE_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__modf(double x,double *nptr)
{
double int_n;
@@ -88,7 +88,7 @@ __modf(double x,double *nptr)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__modf(double x,double *nptr)
{
double result;
@@ -111,7 +111,7 @@ __modf(double x,double *nptr)
#if defined(__PPC__)
INLINE static const double
INLINE STATIC const double
__modf(double x,double *nptr)
{
double int_n;
@@ -150,8 +150,9 @@ modf(double x,double *nptr)
{
if(nptr == NULL)
{
errno = EFAULT;
result = HUGE_VAL;
__set_errno(EFAULT);
result = __get_huge_val();
goto out;
}
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_pow.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_pow.c,v 1.6 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -98,7 +98,7 @@ ___pow:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__pow(double x,double y)
{
double result;
@@ -121,7 +121,7 @@ __pow(double x,double y)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__exp(double x)
{
double result;
@@ -133,7 +133,7 @@ __exp(double x)
return(result);
}
INLINE static const double
INLINE STATIC const double
__log(double x)
{
double result;
@@ -145,7 +145,7 @@ __log(double x)
return(result);
}
INLINE static const double
INLINE STATIC const double
__pow(double x,double y)
{
double result;
@@ -208,7 +208,7 @@ ivln2 = 1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */
ivln2_h = 1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/
ivln2_l = 1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
INLINE static const double
INLINE STATIC const double
__pow(double x,double y)
{
double z,ax,z_h,z_l,p_h,p_l;
@@ -424,8 +424,9 @@ pow(double x,double y)
if(x == 0.0 && y < 0.0)
{
result = HUGE_VAL;
errno = EDOM;
__set_errno(EDOM);
result = __get_huge_val();
goto out;
}
@@ -436,8 +437,9 @@ pow(double x,double y)
abs_y = fabs(y);
if(floor(abs_y) != abs_y)
{
result = HUGE_VAL;
errno = EDOM;
__set_errno(EDOM);
result = __get_huge_val();
goto out;
}
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_sin.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_sin.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___sin:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__sin(double x)
{
double result;
@@ -119,7 +119,7 @@ __sin(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__sin(double x)
{
double result;
@@ -137,7 +137,7 @@ __sin(double x)
#if defined(PPC_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__sin(double x)
{
double y[2],z=0.0;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_sinh.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_sinh.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___sinh:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__sinh(double x)
{
double result;
@@ -119,7 +119,7 @@ __sinh(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__sinh(double x)
{
double result;
@@ -139,7 +139,7 @@ __sinh(double x)
static const double one = 1.0, shuge = 1.0e307;
INLINE static const double
INLINE STATIC const double
__sinh(double x)
{
double t,w,h;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_sqrt.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_sqrt.c,v 1.6 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___sqrt:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__sqrt(double x)
{
double result;
@@ -119,7 +119,7 @@ __sqrt(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__sqrt(double x)
{
double result;
@@ -139,7 +139,7 @@ __sqrt(double x)
static const double one = 1.0, tiny=1.0e-300;
INLINE static const double
INLINE STATIC const double
__sqrt(double x)
{
double z;
@@ -252,7 +252,7 @@ sqrt(double x)
else
{
result = 0;
errno = EDOM;
__set_errno(EDOM);
}
return(result);

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_tan.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_tan.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___tan:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__tan(double x)
{
double result;
@@ -119,7 +119,7 @@ __tan(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__tan(double x)
{
double result;
@@ -137,7 +137,7 @@ __tan(double x)
#if defined(PPC_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__tan(double x)
{
double y[2],z=0.0;

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_tanh.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_tanh.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ ___tanh:
/****************************************************************************/
INLINE static const double
INLINE STATIC const double
__tanh(double x)
{
double result;
@@ -119,7 +119,7 @@ __tanh(double x)
#if defined(M68881_FLOATING_POINT_SUPPORT)
INLINE static const double
INLINE STATIC const double
__tanh(double x)
{
double result;
@@ -139,7 +139,7 @@ __tanh(double x)
static const double one=1.0, two=2.0, tiny = 1.0e-300;
INLINE static const double
INLINE STATIC const double
__tanh(double x)
{
double t,z;

View File

@@ -1,5 +1,5 @@
/*
* $Id: mount_fstatfs.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: mount_fstatfs.c,v 1.9 2005-03-07 11:16:43 obarthel Exp $
*
* :ts=4
*
@@ -50,11 +50,11 @@
int
fstatfs(int file_descriptor, struct statfs *buf)
{
DECLARE_UTILITYBASE();
struct file_hook_message message;
D_S(struct InfoData,id);
BPTR parent_dir = ZERO;
int result = -1;
struct fd * fd;
struct fd * fd = NULL;
LONG success;
ENTER();
@@ -62,7 +62,9 @@ fstatfs(int file_descriptor, struct statfs *buf)
SHOWPOINTER(buf);
assert( buf != NULL );
assert( UtilityBase != NULL );
if(__check_abort_enabled)
__check_abort();
#if defined(CHECK_FOR_NULL_POINTERS)
{
@@ -70,7 +72,7 @@ fstatfs(int file_descriptor, struct statfs *buf)
{
SHOWMSG("invalid buffer parameter");
errno = EFAULT;
__set_errno(EFAULT);
goto out;
}
}
@@ -80,36 +82,61 @@ fstatfs(int file_descriptor, struct statfs *buf)
assert( __fd[file_descriptor] != NULL );
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
if(__check_abort_enabled)
__check_abort();
fd = __get_file_descriptor(file_descriptor);
if(fd == NULL)
{
errno = EBADF;
__set_errno(EBADF);
goto out;
}
SHOWMSG("calling the hook");
__fd_lock(fd);
message.action = file_hook_action_info;
message.info_data = id;
assert( fd->fd_Hook != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
result = message.result;
if(result != 0)
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
{
errno = message.error;
__set_errno(EINVAL);
goto out;
}
if(fd->fd_DefaultFile == ZERO)
{
__set_errno(EBADF);
goto out;
}
PROFILE_OFF();
parent_dir = __safe_parent_of_file_handle(fd->fd_DefaultFile);
PROFILE_ON();
if(parent_dir == ZERO)
{
SHOWMSG("couldn't find parent directory");
__set_errno(__translate_io_error_to_errno(IoErr()));
goto out;
}
PROFILE_OFF();
success = Info(parent_dir,id);
PROFILE_ON();
if(NO success)
{
SHOWMSG("couldn't get info on drive");
__set_errno(__translate_io_error_to_errno(IoErr()));
goto out;
}
__convert_info_to_statfs(id,buf);
result = 0;
out:
__fd_unlock(fd);
UnLock(parent_dir);
RETURN(result);
return(result);
}

Some files were not shown because too many files have changed in this diff Show More