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

49 Commits

Author SHA1 Message Date
Olaf Barthel
2c1084a975 This commit was manufactured by cvs2svn to create tag 'V1_203'.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/tags/V1_203@15194 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-28 15:49:26 +00:00
Olaf Barthel
f727c0f4c4 *** empty log message ***
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15193 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-28 15:49:25 +00:00
Olaf Barthel
6a149abc57 - Final checkin prior to upcoming release.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15192 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-28 15:42:13 +00:00
Olaf Barthel
e3bde26409 - Added 68k stubs to amiga_rexxvars.c for the OS4 build to use. The new code now
works just about exactly like the amiga.lib RVI code used to do, which means
  that there is no artificial length limit for the number of characters a string
  retrieved may have, and the code is largely reentrant.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15191 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-18 10:11:59 +00:00
Olaf Barthel
bbc98790fe - The 68k stub for StrcpyN stored d1 as a result value, which was both
dangerous and unnecessary.

- Plugged in 68k stubs for the OS4 build.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15190 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-18 10:06:07 +00:00
Olaf Barthel
e7258bf939 - To work around a bug in the Roadshow TCP/IP stack (since fixed), the waitselect()
function now substitutes a 10 microsecond timeout for a zero length timeout.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15189 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-16 07:53:40 +00:00
Olaf Barthel
4444438e8f - isatty() now checks if the file descriptor refers to a real file before
it calls IsInteractive() on it.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15188 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-16 07:46:05 +00:00
Olaf Barthel
6c50657673 - Added disk type definitions to mount_convertinfo.c and unistd_common_pathconf.c,
prompted by Thore Boeckelmann.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15187 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-16 07:38:10 +00:00
Olaf Barthel
7dcc410d0c - Preparations for OS4 conversion.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15186 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-15 16:22:51 +00:00
Olaf Barthel
f0503cd915 - MakeString() did not clear the ns->ns_Ivalue field and did not NUL-terminate
the copied string either. Fixed.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15185 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-15 09:33:06 +00:00
Olaf Barthel
ca20eeab97 - Small indentation changes for the stub code.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15184 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-14 15:16:03 +00:00
Olaf Barthel
6148d06dca - Rewrote the GetRexxVar()/SetRexxVar() functions (mostly) in 'C', using available
code as a reference. The 68k stubs currently only work for the 68k version of
  the library, and a solution for the OS4 build still needs to be found. The code
  is currently untested, but it should be complete.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15183 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-14 15:07:37 +00:00
Olaf Barthel
6578b303f7 - Added local inline function definitions for the two rexxsyslib.library V45
API functions, rather than omitting support for them in the 68k build.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15182 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-03-11 13:26:18 +00:00
Jens Maus
6801a4fcf0 - reverted the soft-float subdirectory changes as the problem was solved by
olaf in a different way so that libm.a never contains any hard float
  opcodes and instead libm881 contains them. so the separate soft-float
  directory are not required.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15181 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-03-11 07:41:27 +00:00
Jens Maus
fa4223c544 [tboeckel]: when compiling amiga_rexxvars.c for m68k/OS3 the GetRexxVarFromMsg()
and SetRexxVarFromMsg() will not be used and therefore not cause linkage errors
with our libamiga.a stubs anymore.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15180 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-03-11 07:37:31 +00:00
Olaf Barthel
91ccaa5ba9 - Added "-msoft-float" to the non-FPU libm build rules, which ought to
resolve the issues with FPU code popping up in the mathieee#?.library
  software floating point code.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15179 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-03-10 16:31:56 +00:00
Olaf Barthel
234a17cc07 - The printf() family now ignores argument specifications, as in "%2$d %1$d",
which are used for localization on some platforms. This is a non-standard
  feature and the way clib2 treats it for now is just intended to avoid
  trouble while performing the conversion.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15178 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-03-10 15:28:11 +00:00
Olaf Barthel
a41212e575 - Temporarily deactivated the separate -msoft-float builds.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15177 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-03-10 14:59:54 +00:00
Jens Maus
2591e249d7 - [jlangner]: changed the GNUmakefile.68k to also build soft-float variants of all
our libraries. In addition the specs file now also respects the -msoft-float
  option at link time and sets the default link directory accordingly.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15176 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-03-04 16:25:35 +00:00
Jens Maus
5ea68e3265 - the log() and log10() functions always returned -inf() even if the arguments
was within the valid range for a log() function. Using DBL_EPSILON as the
  threshold was not correct as EPSILON is 2.2204460492503131E-16 whereas
  values like 1E-200 are still valid double values for a log().


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15175 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2007-11-08 11:23:53 +00:00
Olaf Barthel
0f3791a9a4 c.lib 1.202 (16.1.2007)
- Added llrint() function contributed by Henning Nielsen Lund. Thank you
  very much!

- <unistd.h> now also include <stdio.h>, so that the SEEK_SET, etc. macros
  are defined for lseek() to use.

- Added a wrapper function which handles the thread-safe stdio stream
  resolution.

- In tcflush() a break signal can no longer cause the read flush loop
  to be quit with two semaphores still locked.

- In __obtain_daemon_message() the test to verify if the bsdsocket.library API
  would support the server API functionality checked the wrong feature. Fixed.

- Switched over the fd->fd_DefaultFile references to fd->fd_Socket where
  sockets are used rather than file handles.

- Added functions which modify the callback function and the userdata pointer
  stored in a low level unbuffered file/socket data structure. These function
  perform the proper locking and are thus safe to use in a thread-safe environment.

- The low level unbuffered file/socket now has a public equivalent, which
  is defined (along with the typedefs and flags) in <sys/clib2_io.h>. Functions
  for tinkering with it are still to come.

- The math kernel code no longer uses its own private scalbn() function.

- Added a function prototype for the _exit() function. Note that _exit() is
  not an ISO 'C' function.

- Corrected the getopt() function prototype, as prompted by Henning Nielsen Lund.

- The printf() family no longer adds a 0 or 0x prefix if the alternate
  conversion modifier is present for the %o and %x conversions and the
  value to be converted is 0 already. Put another way, printf("%#x %#o",0,0);
  now prints "0 0". This required another change so that %p always includes
  the 0x prefix even if the pointer involved is a NULL pointer.

- readlink() no longer sort-of-works for files and directories. It now only
  works for soft linked objects and returns an error for everything else.
  This is based upon a fix by Peter Bengtsson. Thank you very much!

- Moved the lstat() local Lock() function into its own separate file.

- uname() now returns correct and robust information for OS version
  numbers > 36. This integrates a fix by Peter Bengtsson. Thank you
  very much!

- Moved the crtbegin.o/crtend.o files out of the link libraries. Moving
  them in was intended to work as a fix for the shared library build, but
  now it seems that this has to be done at the link stage through the
  GCC specs file...

- Integrated a fix for __rem_pio2() which affects sin(), tan() and cos(),
  contributed by Steven Solie. Thank you very much!

- The internal 'struct fd' file descriptor table entry data structure
  now has a user data field entry.

- Rearranged the contents of the 'struct fd' file descriptor table entry
  data structure in preparation for making it public. Also added a version
  field so that user code can handle changes to it gracefully. The default
  file is no longer a BCPL pointer to a file handle by default, but
  both a BPTR and a socket identifier, wrapped into a union.

- Added experimental tilde expansion in Unix path names. This still needs
  some more work.

- __get_default_file() called __fd_unlock() without having called
  __fd_lock() first. Ouch.

- Removed an unnecessary pair of __fd_lock()..__fd_unlock() calls from
  ttyname_r().

- The libunix.a unlink() function is now reentrant, or at least thread-safe.

- You can now make unlink() stop after a failed deletion attempt which
  failed because the object to be deleted was reported as being "in use".
  The libunix.a variant defaults to report the deletion to have succeeded
  under these circumstances and later tries to delete the files marked
  for deletion. See <dos.h> for a brief documentation of how to change
  the behaviour.

- basename() and dirname() can no longer return NULL. They truncate the
  resulting path name instead. This is done so because some code that
  calls basename() or dirname() does not check if the function's return
  value is NULL.

- The SetOwner() fall-back code for Kickstart 2.04 was passing the wrong
  parameters to the file system. The first (dp_Arg1) should have been
  zero. Ouch.

- basename() is not supposed to modify the string it is passed and should
  return a pointer to a string which can be modified. Now it does. Same
  thing for dirname().

- asctime_r() now returns NULL if the buffer is too short to hold even a single
  byte of data.

- ttyname() now calls ttyname_r(). Also, the libunix.a version of ttyname_r()
  will produce "/CONSOLE" rather than "CONSOLE:".


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15173 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2007-01-16 08:52:30 +00:00
Olaf Barthel
e5a2a2b451 - Added llrint() function contributed by Henning Nielsen Lund. Thank you
very much!

- <unistd.h> now also include <stdio.h>, so that the SEEK_SET, etc. macros
  are defined for lseek() to use.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15172 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2007-01-06 10:09:49 +00:00
Olaf Barthel
ca1fc13792 - Removed the timeval/TimeVal change workaround and replaced it with something
cleaner.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15171 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-12-28 14:30:57 +00:00
Olaf Barthel
3a0324e4ff - Added a wrapper function which handles the thread-safe stdio stream
resolution.

- In tcflush() a break signal can no longer cause the read flush loop
  to be quit with two semaphores still locked.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15170 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-16 14:39:23 +00:00
Olaf Barthel
77279e3224 - In __obtain_daemon_message() the test to verify if the bsdsocket.library API
would support the server API functionality checked the wrong feature. Fixed.

- Switched over the fd->fd_DefaultFile references to fd->fd_Socket where
  sockets are used rather than file handles.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15169 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-16 10:41:15 +00:00
Olaf Barthel
75b0a762ef - Replaced rows of blank spaces by tabs.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15168 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-16 10:09:20 +00:00
Olaf Barthel
c635fb3ffe - Added a comment to clarify which version number is being used for the
'_fd' data structure definition.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15167 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-15 09:21:49 +00:00
Olaf Barthel
70d1e4b7a3 - Added functions which modify the callback function and the userdata pointer
stored in a low level unbuffered file/socket data structure. These function
  perform the proper locking and are thus safe to use in a thread-safe environment.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15166 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-15 09:17:04 +00:00
Olaf Barthel
e9659f46d6 - The low level unbuffered file/socket now has a public equivalent, which
is defined (along with the typedefs and flags) in <sys/clib2_io.h>. Functions
  for tinkering with it are still to come.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15165 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-15 08:51:07 +00:00
Olaf Barthel
acc795df55 - The math kernel code no longer uses its own private scalbn() function.
- Added a function prototype for the _exit() function. Note that _exit() is
  not an ISO 'C' function.

- Corrected the getopt() function prototype, as prompted by Henning Nielsen Lund.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15164 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-13 09:51:53 +00:00
Olaf Barthel
66303e9ba2 - Added a directory to hold contributed code which has not been integrated
with the library yet.

- The byteswap code was contributed by Peter Bengtsson. Thank you very much!


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15163 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-13 09:49:49 +00:00
Olaf Barthel
7e1d5d6f6a - The printf() family no longer adds a 0 or 0x prefix if the alternate
conversion modifier is present for the %o and %x conversions and the
  value to be converted is 0 already. Put another way, printf("%#x %#o",0,0);
  now prints "0 0". This required another change so that %p always includes
  the 0x prefix even if the pointer involved is a NULL pointer.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15162 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-13 09:32:28 +00:00
Olaf Barthel
e789564429 - readlink() no longer sort-of-works for files and directories. It now only
works for soft linked objects and returns an error for everything else.
  This is based upon a fix by Peter Bengtsson. Thank you very much!

- Moved the lstat() local Lock() function into its own separate file.

- uname() now returns correct and robust information for OS version
  numbers > 36. This integrates a fix by Peter Bengtsson. Thank you
  very much!

- Moved the crtbegin.o/crtend.o files out of the link libraries. Moving
  them in was intended to work as a fix for the shared library build, but
  now it seems that this has to be done at the link stage through the
  GCC specs file...

- Integrated a fix for __rem_pio2() which affects sin(), tan() and cos(),
  contributed by Steven Solie. Thank you very much!


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15161 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-11-13 09:25:28 +00:00
Olaf Barthel
350ffdb790 - The internal 'struct fd' file descriptor table entry data structure
now has a user data field entry.

- Rearranged the contents of the 'struct fd' file descriptor table entry
  data structure in preparation for making it public. Also added a version
  field so that user code can handle changes to it gracefully. The default
  file is no longer a BCPL pointer to a file handle by default, but
  both a BPTR and a socket identifier, wrapped into a union.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15160 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-10-10 13:39:26 +00:00
Olaf Barthel
6809a5dd5b - Added experimental tilde expansion in Unix path names. This still needs
some more work.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15159 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-10-03 16:36:47 +00:00
Olaf Barthel
591ee2250e - Removed an unnecessary (STRPTR) cast.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15158 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-10-02 07:16:06 +00:00
Olaf Barthel
2b9d624d1d - Added some documenting comments to the source code.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15157 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-10-02 07:15:37 +00:00
Olaf Barthel
bf4d3b763c - __get_default_file() called __fd_unlock() without having called
__fd_lock() first. Ouch.

- Removed an unnecessary pair of __fd_lock()..__fd_unlock() calls from
  ttyname_r().


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15156 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-27 11:54:54 +00:00
Olaf Barthel
9984a37cb4 - Unlink is now reentrant, or at least thread-safe.
- You can now make unlink() stop after a failed deletion attempt which
  failed because the object to be deleted was reported as being "in use".
  The libunix.a variant defaults to report the deletion to have succeeded
  under these circumstances and later tries to delete the files marked
  for deletion. See <dos.h> for a brief documentation of how to change
  the behaviour.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15155 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-27 09:40:06 +00:00
Olaf Barthel
0b833b8680 - Added the base_dir_nametest test program.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15154 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 18:20:09 +00:00
Olaf Barthel
b8ba11b158 - basename() and dirname() can no longer return NULL. They truncate the
resulting path name instead. This is done so because some code that
  calls basename() or dirname() does not check if the function's return
  value is NULL.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15153 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 18:19:44 +00:00
Olaf Barthel
872b2b335b - Forgot to update chown() to use the same bug fix as fchown().
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15152 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 15:41:50 +00:00
Olaf Barthel
b1f56b1bbe - The SetOwner() fall-back code for Kickstart 2.04 was passing the wrong
parameters to the file system. The first (dp_Arg1) should have been
  zero. Ouch.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15151 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 15:38:21 +00:00
Olaf Barthel
9ce2ba234f - Got rid of some more compiler warnings by introducing function prototypes
which were missing and by casting pointers to the expected types.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15150 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 15:12:47 +00:00
Olaf Barthel
d5bfee3917 - Corrected a couple more compiler warnings caused by mutable/constant
string pointer assignments.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15149 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 14:51:15 +00:00
Olaf Barthel
9f37f76b01 - Replaced "char *" pointers with "const char *" pointers.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15148 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 14:12:15 +00:00
Olaf Barthel
2f3de1dcd6 - ttyname() now calls ttyname_r(). Also, the libunix.a version of ttyname_r()
will produce "/CONSOLE" rather than "CONSOLE:".


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15147 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 14:05:31 +00:00
Olaf Barthel
74b2838663 - asctime_r() now returns NULL if the buffer is too short to hold even a single
byte of data.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15146 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 13:43:06 +00:00
Olaf Barthel
2c450a1e48 - basename() is not supposed to modify the string it is passed and should
return a pointer to a string which can be modified. Now it does. Same
  thing for dirname().


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15145 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2006-09-25 13:29:47 +00:00
141 changed files with 3420 additions and 1623 deletions

View File

@@ -1,11 +1,19 @@
#
# $Id: GNUmakefile.68k,v 1.96 2006-09-17 17:36:42 obarthel Exp $
# $Id: GNUmakefile.68k,v 1.106 2008-04-16 07:38:10 obarthel Exp $
#
# :ts=8
#
##############################################################################
############################################
# find out the HOST operating system
# on which this makefile is run (default to AmigaOS)
HOST ?= $(shell uname)
ifeq ($(HOST),)
HOST = AmigaOS
endif
CC = gcc
AR = ar -q
RANLIB = ranlib
@@ -14,6 +22,16 @@ DELETE = delete all quiet
MAKEDIR = makedir
MAKE = $(MAKE_COMMAND) -f GNUmakefile.68k
# override certain things for non-native builds
ifneq ($(HOST), AmigaOS)
CC = m68k-amigaos-gcc
AR = m68k-amigaos-ar -q
RANLIB = m68k-amigaos-ranlib
COPY = cp
DELETE = rm -rf
MAKEDIR = mkdir -p
endif
##############################################################################
ifeq (,$(TYPE))
@@ -50,11 +68,11 @@ $(LIBUNIX_OBJS)/%.o : %.c
$(LIBM_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):m]"
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT $<
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) -msoft-float -DIEEE_FLOATING_POINT_SUPPORT $<
$(LIBM881_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):m881]"
@$(CC) -o $(LIBM881_OBJS)/$*.o -c $(CFLAGS) -DM68881_FLOATING_POINT_SUPPORT -m68881 $<
@$(CC) -o $(LIBM881_OBJS)/$*.o -c $(CFLAGS) -m68881 -DM68881_FLOATING_POINT_SUPPORT $<
$(LIBNET_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):net]"
@@ -109,13 +127,14 @@ INCLUDES = -Iinclude -I. -Inetinclude
#OPTIONS = -fno-builtin -fno-common -DNDEBUG -D__THREAD_SAFE
#OPTIONS = -fno-builtin -fno-common -D__MEM_DEBUG
#OPTIONS = -fno-builtin -fno-common -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG
OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
#OPTIMIZE = -O3 -fomit-frame-pointer -funroll-loops -finline-functions
OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
#OPTIMIZE = -O2 -fomit-frame-pointer
#DEBUG = -g
CFLAGS = \
$(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) \
$(CODE_FLAGS) $(CODE_TYPE) $(INCLUDES)
$(CODE_FLAGS) $(INCLUDES) $(CODE_TYPE)
##############################################################################
@@ -183,11 +202,14 @@ C_LIB = \
stat_fchmod.o \
stat_fstat.o \
stat_lstat.o \
stat_lock.o \
stat_mkdir.o \
stat_rmdir.o \
stat_stat.o \
stat_umask.o \
stdio_asprintf.o \
stdio_change_fd_action.o \
stdio_change_fd_user_data.o \
stdio_clearerr.o \
stdio_dropiobreadbuffer.o \
stdio_duplicate_fd.o \
@@ -227,6 +249,7 @@ C_LIB = \
stdio_getchar.o \
stdio_getchar_unlocked.o \
stdio_gets.o \
stdio_get_fd.o \
stdio_get_file_descriptor.o \
stdio_growfdtable.o \
stdio_growiobtable.o \
@@ -252,6 +275,7 @@ C_LIB = \
stdio_remove.o \
stdio_remove_fd_alias.o \
stdio_rename.o \
stdio_resolve_fd_file.o \
stdio_rewind.o \
stdio_scanf.o \
stdio_setbuf.o \
@@ -455,6 +479,7 @@ C_LIB = \
unistd_time_delay.o \
unistd_truncate.o \
unistd_unlink.o \
unistd_unlink_retries.o \
unistd_usleep.o \
utime_utime.o \
utsname_uname.o
@@ -477,6 +502,7 @@ UNIX_LIB = \
stat_chmod.o \
stat_fstat.o \
stat_lstat.o \
stat_lock.o \
stat_mkdir.o \
stat_rmdir.o \
stat_stat.o \
@@ -657,6 +683,7 @@ MATH_LIB = \
math_ldexpf.o \
math_lgamma.o \
math_lgammaf.o \
math_llrint.o \
math_log.o \
math_log10.o \
math_log10f.o \

View File

@@ -1,5 +1,5 @@
#
# $Id: GNUmakefile.os4,v 1.109 2006-09-17 17:37:27 obarthel Exp $
# $Id: GNUmakefile.os4,v 1.114 2008-04-28 15:49:25 obarthel Exp $
#
# :ts=8
#
@@ -91,7 +91,28 @@ include libprofile.gmk
all-targets: \
lib/crt0.o \
lib/small-data/crt0.o \
lib/soft-float/crt0.o \
lib/baserel/crt0.o \
lib/crtbegin.o \
lib/soft-float/crtbegin.o \
lib/small-data/crtbegin.o \
lib/baserel/crtbegin.o \
lib/crtend.o \
lib/soft-float/crtend.o \
lib/small-data/crtend.o \
lib/baserel/crtend.o \
lib.threadsafe/crt0.o \
lib.threadsafe/small-data/crt0.o \
lib.threadsafe/soft-float/crt0.o \
lib.threadsafe/baserel/crt0.o \
lib.threadsafe/crtbegin.o \
lib.threadsafe/soft-float/crtbegin.o \
lib.threadsafe/small-data/crtbegin.o \
lib.threadsafe/baserel/crtbegin.o \
lib.threadsafe/crtend.o \
lib.threadsafe/soft-float/crtend.o \
lib.threadsafe/small-data/crtend.o \
lib.threadsafe/baserel/crtend.o \
$(LIBS)
##############################################################################
@@ -136,30 +157,74 @@ lib/%.o : AFLAGS += $(LARGEDATA)
lib/%.o : %.S
@$(ASSEMBLE)
lib/%.o : %.c
@$(COMPILE)
lib/small-data/%.o : AFLAGS += $(SMALLDATA)
lib/small-data/%.o : %.S
@$(ASSEMBLE)
lib/small-data/%.o : %.c
@$(COMPILE)
lib/soft-float/%.o : AFLAGS += $(SOFTFLOAT)
lib/soft-float/%.o : %.S
@$(ASSEMBLE)
lib/soft-float/%.o : %.c
@$(COMPILE)
lib/baserel/%.o : AFLAGS += $(BASEREL)
lib/baserel/%.o : %.S
@$(ASSEMBLE)
lib/baserel/%.o : %.c
@$(COMPILE)
lib.threadsafe/%.o : AFLAGS += $(LARGEDATA) $(THREADSAFE)
lib.threadsafe/%.o : %.S
@$(ASSEMBLE)
lib.threadsafe/%.o : %.c
@$(COMPILE)
lib.threadsafe/small-data/%.o : AFLAGS += $(SMALLDATA) $(THREADSAFE)
lib.threadsafe/small-data/%.o : %.S
@$(ASSEMBLE)
lib.threadsafe/small-data/%.o : %.c
@$(COMPILE)
lib.threadsafe/soft-float/%.o : AFLAGS += $(SOFTFLOAT) $(THREADSAFE)
lib.threadsafe/soft-float/%.o : %.S
@$(ASSEMBLE)
lib.threadsafe/soft-float/%.o : %.c
@$(COMPILE)
lib.threadsafe/baserel/%.o : AFLAGS += $(BASEREL) $(THREADSAFE)
lib.threadsafe/baserel/%.o : %.S
@$(ASSEMBLE)
lib.threadsafe/baserel/%.o : %.c
@$(COMPILE)
##############################################################################
define COMPILE
$(MAKEDIR) $(@D)
-$(MAKEDIR) $(@D)
echo "Compiling $< [$(@D)]"
$(CC) -o $@ -c $(CFLAGS) $< $(LOG_COMMAND)
endef
define ASSEMBLE
$(MAKEDIR) $(@D)
-$(MAKEDIR) $(@D)
echo "Assembling $< [$(@D)]"
$(CC) -o $@ -c $(AFLAGS) $< $(LOG_COMMAND)
endef
define MAKELIB
$(MAKEDIR) $@
-$(MAKEDIR) $@
$(DELETE) $@
echo "Making $@"
$(AR) $@ $^ $(LOG_COMMAND)

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 201
#define DATE "21.9.2006"
#define VERS "amiga.lib 1.201"
#define VSTRING "amiga.lib 1.201 (21.9.2006)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.201 (21.9.2006)"
#define REVISION 203
#define DATE "28.4.2008"
#define VERS "amiga.lib 1.203"
#define VSTRING "amiga.lib 1.203 (28.4.2008)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.203 (28.4.2008)"

View File

@@ -1 +1 @@
201
203

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_acrypt.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_acrypt.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -49,6 +49,10 @@
/****************************************************************************/
UBYTE * ACrypt(UBYTE * buffer, const UBYTE * password, const UBYTE * user);
/****************************************************************************/
UBYTE *
ACrypt(UBYTE * buffer, const UBYTE * password, const UBYTE * user)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_argarraydone.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_argarraydone.c,v 1.4 2006-09-25 14:05:31 obarthel Exp $
*
* :ts=4
*
@@ -48,7 +48,7 @@
/****************************************************************************/
extern char **CXLIB_argarray;
extern const unsigned char **CXLIB_argarray;
extern struct DiskObject * CXLIB_disko;

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_beginio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_beginio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -103,6 +103,10 @@ BeginIO(struct IORequest *ior)
/****************************************************************************/
VOID BeginIO(struct IORequest *ior);
/****************************************************************************/
VOID
BeginIO(struct IORequest *ior)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createextio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_createextio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -50,6 +50,10 @@
/****************************************************************************/
struct IORequest * CreateExtIO(CONST struct MsgPort * port, LONG io_size);
/****************************************************************************/
struct IORequest *
CreateExtIO(CONST struct MsgPort * port, LONG io_size)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createport.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_createport.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -50,6 +50,10 @@
/****************************************************************************/
struct MsgPort * CreatePort(CONST_STRPTR name, LONG pri);
/****************************************************************************/
struct MsgPort *
CreatePort(CONST_STRPTR name, LONG pri)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createstdio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_createstdio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -50,6 +50,10 @@
/****************************************************************************/
struct IOStdReq * CreateStdIO(CONST struct MsgPort * port);
/****************************************************************************/
struct IOStdReq *
CreateStdIO(CONST struct MsgPort * port)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createtask.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_createtask.c,v 1.6 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -209,6 +209,10 @@ CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
/****************************************************************************/
struct Task * CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size);
/****************************************************************************/
struct Task *
CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deleteextio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_deleteextio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -50,6 +50,10 @@
/****************************************************************************/
VOID DeleteExtIO(struct IORequest * io);
/****************************************************************************/
VOID
DeleteExtIO(struct IORequest * io)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deleteport.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_deleteport.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -50,6 +50,10 @@
/****************************************************************************/
VOID DeletePort(struct MsgPort * port);
/****************************************************************************/
VOID
DeletePort(struct MsgPort * port)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deletestdio.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_deletestdio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -50,6 +50,10 @@
/****************************************************************************/
VOID DeleteStdIO(struct IOStdReq * io);
/****************************************************************************/
VOID
DeleteStdIO(struct IOStdReq * io)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deletetask.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_deletetask.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -63,6 +63,10 @@ DeleteTask(struct Task *tc)
/****************************************************************************/
VOID DeleteTask(struct Task *tc);
/****************************************************************************/
VOID
DeleteTask(struct Task *tc)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_newlist.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
* $Id: amiga_newlist.c,v 1.4 2006-09-25 15:12:47 obarthel Exp $
*
* :ts=4
*
@@ -43,6 +43,10 @@
/****************************************************************************/
VOID NewList(struct List *lh);
/****************************************************************************/
VOID
NewList(struct List *lh)
{

View File

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

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 201
#define DATE "21.9.2006"
#define VERS "c.lib 1.201"
#define VSTRING "c.lib 1.201 (21.9.2006)\r\n"
#define VERSTAG "\0$VER: c.lib 1.201 (21.9.2006)"
#define REVISION 203
#define DATE "28.4.2008"
#define VERS "c.lib 1.203"
#define VSTRING "c.lib 1.203 (28.4.2008)\r\n"
#define VERSTAG "\0$VER: c.lib 1.203 (28.4.2008)"

View File

@@ -1 +1 @@
201
203

View File

@@ -1,3 +1,141 @@
c.lib 1.203 (28.4.2008)
- Added 68k stubs to amiga_rexxvars.c for the OS4 build to use. The new code now
works just about exactly like the amiga.lib RVI code used to do, which means
that there is no artificial length limit for the number of characters a string
retrieved may have, and the code is largely reentrant.
- To work around a bug in the Roadshow TCP/IP stack (since fixed), the waitselect()
function now substitutes a 10 microsecond timeout for a zero length timeout.
- isatty() no longer crashes if passed a socket rather than a file.
- Rewrote the GetRexxVar()/SetRexxVar() functions (mostly) in 'C', using available
code as a reference. The 68k stubs currently only work for the 68k version of
the library, and a solution for the OS4 build still needs to be found. The code
is currently untested, but it should be complete.
- The printf() family now ignores argument specifications, as in "%2$d %1$d",
which are used for localization on some platforms. This is a non-standard
feature and the way clib2 treats it for now is just intended to avoid
trouble while performing the conversion.
- [tboeckel]: when compiling amiga_rexxvars.c for m68k/OS3 the GetRexxVarFromMsg()
and SetRexxVarFromMsg() can no longer cause linkage errors if the header files
predate the SDK for OS 3.5.
- [jlangner]: the log() and log10() functions always returned -inf() even if the
arguments was within the valid range for a log() function. Using DBL_EPSILON as
the threshold was not correct as EPSILON is 2.2204460492503131E-16 whereas
values like 1E-200 are still valid double values for a log().
c.lib 1.202 (16.1.2007)
- Added llrint() function contributed by Henning Nielsen Lund. Thank you
very much!
- <unistd.h> now also include <stdio.h>, so that the SEEK_SET, etc. macros
are defined for lseek() to use.
- Added a wrapper function which handles the thread-safe stdio stream
resolution.
- In tcflush() a break signal can no longer cause the read flush loop
to be quit with two semaphores still locked.
- In __obtain_daemon_message() the test to verify if the bsdsocket.library API
would support the server API functionality checked the wrong feature. Fixed.
- Switched over the fd->fd_DefaultFile references to fd->fd_Socket where
sockets are used rather than file handles.
- Added functions which modify the callback function and the userdata pointer
stored in a low level unbuffered file/socket data structure. These function
perform the proper locking and are thus safe to use in a thread-safe environment.
- The low level unbuffered file/socket now has a public equivalent, which
is defined (along with the typedefs and flags) in <sys/clib2_io.h>. Functions
for tinkering with it are still to come.
- The math kernel code no longer uses its own private scalbn() function.
- Added a function prototype for the _exit() function. Note that _exit() is
not an ISO 'C' function.
- Corrected the getopt() function prototype, as prompted by Henning Nielsen Lund.
- The printf() family no longer adds a 0 or 0x prefix if the alternate
conversion modifier is present for the %o and %x conversions and the
value to be converted is 0 already. Put another way, printf("%#x %#o",0,0);
now prints "0 0". This required another change so that %p always includes
the 0x prefix even if the pointer involved is a NULL pointer.
- readlink() no longer sort-of-works for files and directories. It now only
works for soft linked objects and returns an error for everything else.
This is based upon a fix by Peter Bengtsson. Thank you very much!
- Moved the lstat() local Lock() function into its own separate file.
- uname() now returns correct and robust information for OS version
numbers > 36. This integrates a fix by Peter Bengtsson. Thank you
very much!
- Moved the crtbegin.o/crtend.o files out of the link libraries. Moving
them in was intended to work as a fix for the shared library build, but
now it seems that this has to be done at the link stage through the
GCC specs file...
- Integrated a fix for __rem_pio2() which affects sin(), tan() and cos(),
contributed by Steven Solie. Thank you very much!
- The internal 'struct fd' file descriptor table entry data structure
now has a user data field entry.
- Rearranged the contents of the 'struct fd' file descriptor table entry
data structure in preparation for making it public. Also added a version
field so that user code can handle changes to it gracefully. The default
file is no longer a BCPL pointer to a file handle by default, but
both a BPTR and a socket identifier, wrapped into a union.
- Added experimental tilde expansion in Unix path names. This still needs
some more work.
- __get_default_file() called __fd_unlock() without having called
__fd_lock() first. Ouch.
- Removed an unnecessary pair of __fd_lock()..__fd_unlock() calls from
ttyname_r().
- The libunix.a unlink() function is now reentrant, or at least thread-safe.
- You can now make unlink() stop after a failed deletion attempt which
failed because the object to be deleted was reported as being "in use".
The libunix.a variant defaults to report the deletion to have succeeded
under these circumstances and later tries to delete the files marked
for deletion. See <dos.h> for a brief documentation of how to change
the behaviour.
- basename() and dirname() can no longer return NULL. They truncate the
resulting path name instead. This is done so because some code that
calls basename() or dirname() does not check if the function's return
value is NULL.
- The SetOwner() fall-back code for Kickstart 2.04 was passing the wrong
parameters to the file system. The first (dp_Arg1) should have been
zero. Ouch.
- basename() is not supposed to modify the string it is passed and should
return a pointer to a string which can be modified. Now it does. Same
thing for dirname().
- asctime_r() now returns NULL if the buffer is too short to hold even a single
byte of data.
- ttyname() now calls ttyname_r(). Also, the libunix.a version of ttyname_r()
will produce "/CONSOLE" rather than "CONSOLE:".
c.lib 1.201 (21.9.2006)
- If defined, the local environment variable "DISABLE_COMMANDLINE_WILDCARD_EXPANSION"

3
library/contrib/README Normal file
View File

@@ -0,0 +1,3 @@
This directory contains contributions which have not yet been integrated
with the clib2 library build but which should be in the CVS repository
both for safekeeping and for you to look at and adapt.

View File

@@ -0,0 +1,183 @@
#ifndef __BYTESWAP_H
#define __BYTESWAP_H
#include <sys/types.h>
#include <stdint.h>
#if defined(__GNUC__)
#define __CONST_FUNC __attribute__((const))
#else
#define __CONST_FUNC /* Nothing */
#endif
/* Single value byteswap functions. */
extern __CONST_FUNC uint16_t bswap16(uint16_t);
extern __CONST_FUNC uint32_t bswap24(uint32_t);
extern __CONST_FUNC uint32_t bswap32(uint32_t);
#ifdef INT64_MIN
extern __CONST_FUNC uint64_t bswap64(uint64_t);
#endif
/* Block byteswap functions. The swab() function usually resides in unistd.h, so perhaps it should be moved there? */
/* NOTE: Contrary to the standard swab(), this version returns the "to" pointer and the pointers are not restrict
* qualified - so swapping buffer-contents in-place is supported.
* Also, swab24(), swab32() and swab64() are non-standard functions.
*/
extern void *swab(void *from,void *to,ssize_t nbytes);
extern void *swab24(void *from,void *to,ssize_t nbytes); /* Same as swab(), but operates on 24-bit words instead. */
extern void *swab32(void *from,void *to,ssize_t nbytes); /* Same as swab(), but operates on 32-bit words instead. */
extern void *swab64(void *from,void *to,ssize_t nbytes); /* Same as swab(), but operates on 64-bit words instead. */
#define swab16(x) swab(x)
/*
* Optimized inline-versions for the single-value functions follow.
* Only GCC+PPC and GCC+m68k support for now.
*/
#if defined(__GNUC__)
/* Select implementation. */
#define bswap16(x) (__builtin_constant_p(x))?__const_swap16(x):__swap16(x)
#define bswap24(x) (__builtin_constant_p(x))?__const_swap24(x):__swap24(x)
#define bswap32(x) (__builtin_constant_p(x))?__const_swap32(x):__swap32(x)
#define bswap64(x) (__builtin_constant_p(x))?__const_swap64(x):__swap64(x)
/* Assembler implementations */
#if defined(__PPC__)
static __inline__ __CONST_FUNC uint16_t __swap16(uint16_t u16) {
uint_fast16_t result;
__asm__("\
rlwinm %[result],%[u16],8,16,24\n\
rlwimi %[result],%[u16],24,24,31\n\
":[result]"=&r"(result):[u16]"r"(u16));
return(result);
}
static __inline__ __CONST_FUNC uint32_t __swap24(uint32_t u32) {
uint_fast32_t result;
__asm__("\
rlwinm %[result],%[u32],16,8,31\n\
rlwimi %[result],%[u32],0,16,24\n\
":[result]"=&r"(result):[u32]"r"(u32));
return(result);
}
static __inline__ __CONST_FUNC uint32_t __swap32(uint32_t u32) {
uint_fast32_t result;
__asm__("\
rlwinm %[result],%[u32],8,8,31\n\
rlwimi %[result],%[u32],24,0,7\n\
rlwimi %[result],%[u32],24,16,23\n\
":[result]"=&r"(result):[u32]"r"(u32));
return(result);
}
/*
* Note: __swap64() might perhaps be optimized a bit more by scheduling the
* instructions to alternate register-use, but this instead means there
* are two less registers free since "u64" and "result" may no longer overlap.
* Decisions, decisions....
*/
static __inline__ __CONST_FUNC uint64_t __swap64(uint64_t u64) {
uint_fast64_t result;
uint_fast32_t tmp;
__asm__("\
rlwinm %[tmp],%[u64],8,8,31\n\
rlwimi %[tmp],%[u64],24,0,7\n\
rlwimi %[tmp],%[u64],24,16,23\n\
rlwinm %[result],%L[u64],8,8,31\n\
rlwimi %[result],%L[u64],24,0,7\n\
rlwimi %[result],%L[u64],24,16,23\n\
or %L[result],%[tmp],%[tmp]\n\
":[result]"=r"(result),[tmp]"=&r"(tmp):[u64]"r"(u64));
return(result);
}
#elif defined(__mc68020__)
static __inline__ __CONST_FUNC uint16_t __swap16(uint16_t u16) {
__asm__("\
rol.w #8,%[u16]\n\
":[u16]"+d"(u16)::"cc");
return(u16);
}
static __inline__ __CONST_FUNC uint32_t __swap24(uint32_t u32) {
__asm__("\
rol.w #8,%[u32]\n\
swap %[u32]\n\
rol.w #8,%[u32]\n\
ror.l #8,%[u32]\n\
":[u32]"+d"(u32)::"cc");
return(u32);
}
static __inline__ __CONST_FUNC uint32_t __swap32(uint32_t u32) {
__asm__("\
rol.w #8,%[u32]\n\
swap %[u32]\n\
rol.w #8,%[u32]\n\
":[u32]"+d"(u32)::"cc");
return(u32);
}
static __inline__ __CONST_FUNC uint64_t __swap64(uint64_t u64) {
__asm__("\
rol.w #8,%[u64]\n\
rol.w #8,%L[u64]\n\
swap %[u64]\n\
swap %L[u64]\n\
rol.w #8,%[u64]\n\
rol.w #8,%L[u64]\n\
exg %[u64],L%[u64]\n\
":[u64]"+d"(u64)::"cc");
return(u64);
}
#else
/* Unknown or undefined architecture. Perhaps compiling with "-strict -ansi", but should not use this header then anyway. */
#undef bswap16
#undef bswap24
#undef bswap32
#undef bswap64
#define bswap16(x) (__builtin_constant_p(x))?__const_swap16(x):bswap16(x)
#define bswap24(x) (__builtin_constant_p(x))?__const_swap24(x):bswap24(x)
#define bswap32(x) (__builtin_constant_p(x))?__const_swap32(x):bswap32(x)
#define bswap64(x) (__builtin_constant_p(x))?__const_swap64(x):bswap64(x)
#endif
/* C implementations for constant values */
static __inline__ uint16_t __const_swap16(uint16_t u16) {
return(u16>>8|u16<<8);
}
static __inline__ uint32_t __const_swap24(uint32_t u32) {
return(((u32&0xff)<<16)|((u32&0xff00))|((u32&0xff0000)>>16));
}
static __inline__ uint32_t __const_swap32(uint32_t u32) {
return(((u32&0xff)<<24)|((u32&0xff00)<<8)|((u32&0xff0000)>>8)|((u32&0xff000000)>>24));
}
static __inline__ uint64_t __const_swap64(uint64_t u64) {
return(((u64&0xffLL)<<56)|((u64&0xff00LL)<<40)|((u64&0xff0000LL)<<24)|((u64&0xff000000LL)<<8)|
((u64&0xff00000000LL)>>8)|((u64&0xff0000000000LL)>>24)|((u64&0xff000000000000LL)>>40)|((u64&0xff00000000000000LL)>>56));
}
#endif /* __GNUC__ */
#endif /* __BYTESWAP_H */
/* vi:set ts=3: */

View File

@@ -0,0 +1,28 @@
#if defined(__PPC__) && defined(__GNUC__)
asm("\
.text\n\
.align 2\n\
.globl bswap16\n\
.type bswap16, @function\n\
bswap16:\n\
# rlwinm %r4,%r3,8,16,24\n\
# rlwimi %r4,%r3,24,24,31\n\
# or %r3,%r4,%r4\n\
rlwimi %r3,%r3,16,8,15\n\
srwi %r3,%r3,8\n\
blr\n\
");
#else
#include <stdint.h>
uint16_t bswap16(uint16_t u16)
{
return(u16>>8|u16<<8);
}
#endif

View File

@@ -0,0 +1,29 @@
#if defined(__PPC__) && defined(__GNUC__)
asm(" .text\n\
.align 2\n\
.globl bswap24\n\
.type bswap24, @function\n\
bswap32:\n\
rlwinm %r4,%r3,16,8,31\n\
rlwimi %r4,%r3,0,16,24\n\
or %r3,%r4,%r4\n\
blr\n\
");
#else
#include <stdint.h>
uint32_t bswap24(uint32_t u32)
{
return(
((u32&0xff)<<16)|
((u32&0xff00))|
((u32&0xff0000)>>16)
);
}
#endif

View File

@@ -0,0 +1,31 @@
#if defined(__PPC__) && defined(__GNUC__)
asm(" .text\n\
.align 2\n\
.globl bswap32\n\
.type bswap32, @function\n\
bswap32:\n\
rlwinm %r4,%r3,8,8,31\n\
rlwimi %r4,%r3,24,0,7\n\
rlwimi %r4,%r3,24,16,23\n\
or %r3,%r4,%r4\n\
blr\n\
");
#else
#include <stdint.h>
uint32_t bswap32(uint32_t u32)
{
return(
((u32&0xff)<<24)|
((u32&0xff00)<<8)|
((u32&0xff0000)>>8)|
((u32&0xff000000)>>24)
);
}
#endif

View File

@@ -0,0 +1,48 @@
#if defined(USE_64_BIT_INTS)
#if defined(__PPC__) && defined(__GNUC__)
asm(" .text\n\
.align 2\n\
.globl bswap64\n\
.type bswap64, @function\n\
bswap64:\n\
rlwinm %r5,%r3,8,8,31\n\
rlwimi %r5,%r3,24,0,7\n\
rlwimi %r5,%r3,24,16,23\n\
rlwinm %r3,%r4,8,8,31\n\
rlwimi %r3,%r4,24,0,7\n\
rlwimi %r3,%r4,24,16,23\n\
or %r4,%r5,%r5\n\
blr\n\
");
#else
#include <stdint.h>
uint64_t bswap64(uint64_t u64)
{
union {
uint64_t ll;
uint32_t l[2];
} v={.ll=u64};
uint32_t tmp;
tmp=v.l[0];
v.l[0]=((v.l[1]&0xff)<<24)|
((v.l[1]&0xff00)<<8)|
((v.l[1]&0xff0000)>>8)|
((v.l[1]&0xff000000)>>24);
v.l[1]=((tmp&0xff)<<24)|
((tmp&0xff00)<<8)|
((tmp&0xff0000)>>8)|
((tmp&0xff000000)>>24);
return(v.ll);
}
#endif
#endif

View File

@@ -0,0 +1,70 @@
#if defined(__GNUC__) && defined(__PPC__)
/* r3=from, r4=to, r5=len/count, r6=index, r7=load/store/temp */
asm("\
.text\n\
.align 2\n\
.globl swab\n\
.type swab,@function\n\
swab:\n\
dcbt 0,%r3\n\
srawi. %r5,%r5,1\n\
bc 4,gt,.exit\n\
andi. %r7,%r3,3 # Check if we start on an address evenly divisible by 4.\n\
li %r6,0\n\
bc 4,gt,.preploop\n\
lhbrx %r7,%r6,%r3 # Fix alignment if needed.\n\
sthx %r7,%r6,%r4\n\
addi %r6,%r6,2\n\
subi %r5,%r5,1\n\
.preploop:\n\
andi. %r7,%r5,1 # Check if even or odd number of 16-bit words.\n\
srawi %r5,%r5,1 # Number of 32-bit words to half-swap.\n\
mtctr %r5\n\
bc 12,gt,.oddloop # Jump to loop for odd number of 16-bit words.\n\
.loop: # Loop is 'unrolled' by reading/writing 32-bit words.\n\
lwbrx %r7,%r6,%r3\n\
rotlwi %r7,%r7,16\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
bc 0,lt,.loop\n\
.exit:\n\
or %r3,%r4,%r4\n\
blr\n\
.oddloop:\n\
lwbrx %r7,%r6,%r3\n\
rotlwi %r7,%r7,16\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
bc 0,lt,.oddloop\n\
sub %r6,%r6,2\n\
lhbrx %r7,%r6,%r3 # Fix last 16-bit word.\n\
sthx %r7,%r6,%r4\n\
or %r3,%r4,%r4\n\
blr\n\
");
#else
#include <sys/types.h>
#include <stdint.h>
void *swab(void *from,void *to,ssize_t len)
{
int i;
uint16_t u16,*u16in=from,*u16out=to;
for(i=0;i<(len>>1);i++) {
u16=u16in[i];
u16out[i]=u16>>8|u16<<8;
}
return(u16out);
}
#endif

View File

@@ -0,0 +1,91 @@
#if defined(__GNUC__) && defined(__PPC__)
/* r3=from, r4=to, r5=len/remaining, r6/r7=index & r7=temp, r8/r9/r10=read/write temp */
asm("\
.text\n\
.align 2\n\
.globl swab24\n\
.type swab24,@function\n\
swab24:\n\
dcbt 0,%r3\n\
li %r7,3\n\
divwu %r5,%r5,%r7\n\
andi. %r7,%r5,3\n\
srawi. %r5,%r5,2\n\
mtctr %r5\n\
or %r5,%r7,%r7\n\
li %r6,0\n\
bc 4,gt,.postfix\n\
.loop:\n\
lwbrx %r8,%r6,%r3\n\
addi %r7,%r6,4\n\
lwzx %r9,%r7,%r3\n\
addi %r7,%r6,8\n\
lwbrx %r10,%r7,%r3\n\
rotlwi %r8,%r8,8\n\
or %r7,%r9,%r9\n\
rlwimi %r9,%r8,16,8,15\n\
rlwimi %r9,%r10,8,16,23\n\
rlwimi %r8,%r7,16,24,31\n\
rotrwi %r10,%r10,8\n\
rlwimi %r10,%r7,16,0,7\n\
stwx %r8,%r6,%r4\n\
addi %r6,%r6,4\n\
stwx %r9,%r6,%r4\n\
addi %r6,%r6,4\n\
stwx %r10,%r6,%r4\n\
addi %r6,%r6,4\n\
bc 0,lt,.loop\n\
.postfix: # Fix any remaining 24-bit words (number of remaining words in r5).\n\
or. %r5,%r5,%r5\n\
bc 4,gt,.exit\n\
mtctr %r5\n\
add %r3,%r3,%r6\n\
add %r6,%r4,%r6\n\
subi %r3,%r3,1\n\
.fixloop:\n\
lbzu %r7,1(%r3)\n\
lbzu %r8,1(%r3)\n\
lbzu %r9,1(%r3)\n\
stb %r7,2(%r6)\n\
stb %r8,1(%r6)\n\
stb %r9,0(%r6)\n\
addi %r6,%r6,3\n\
bc 0,lt,.fixloop\n\
.exit:\n\
or %r3,%r4,%r4\n\
blr\n\
");
#else
#include <sys/types.h>
#include <stdint.h>
/*
* Ugh, this is really very, very ineffiecient.
* (But simple, understandable and safe)
*/
void *swab24(void *from,void *to,ssize_t len)
{
uint8_t *src=from,B0,B1,B2,*dst=to;
int i;
for(i=0;i<len;i+=3) {
B0=src[i];
B1=src[i+1];
B2=src[i+2];
dst[i]=B2;
dst[i+1]=B1;
dst[i+2]=B0;
}
return(to);
}
#endif

View File

@@ -0,0 +1,112 @@
#if defined(__GNUC__) && defined(__PPC__)
/* r3=from, r4=to, r5=len, r6=index, r7=load/store temp */
asm("\
.text\n\
.align 2\n\
.globl swab32\n\
.type swab32,@function\n\
swab32:\n\
srawi. %r5,%r5,2\n\
li %r6,0\n\
bc 4,gt,.exit\n\
mtctr %r5\n\
.loop:\n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
bc 0,lt,.loop\n\
.exit:\n\
or %r3,%r4,%r4\n\
blr\n\
");
/* r3=from, r4=to, r5=len/temp, r6=index, r7=load/store temp, r8=cache hint
*
* The unrolled, cache-hinting version appears to be about 4.5% faster, but
* in this case I opted for the smaller implementation. swab64() appears to
* gain more from cache-hinting - probably because of it using more registers
* for intermediate storage.
asm("\
.text\n\
.align 2\n\
.globl swab32\n\
.type swab32,@function\n\
swab32:\n\
dcbt 0,%r3\n\
andi. %r8,%r5,31 # The number of bytes handled in '.pre'. Used for prefetch hint.\n\
srawi %r5,%r5,2 # Convert bytes-># of 32-bit words\n\
andi. %r7,%r5,7\n\
li %r6,0\n\
bc 4,gt,.preploop\n\
mtctr %r7\n\
.pre: # One 32-bit word at a time until we have (nLeft%8)==0 \n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
bc 0,lt,.pre\n\
.preploop:\n\
srawi. %r5,%r5,3 # Divide by 8 again to get number of loops.\n\
addi %r8,%r8,32 # Start address for next loop (from r3).\n\
bc 4,gt,.exit\n\
mtctr %r5\n\
.loop: # Loop unrolled 8 times = 32 bytes = 1 cache-line (except on the 970).\n\
dcbt %r8,%r3 # Cache hint (prefetch) for the next loop\n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
lwbrx %r7,%r6,%r3\n\
stwx %r7,%r6,%r4\n\
addi %r6,%r6,4\n\
addi %r8,%r8,32 # Update cache-hint offset\n\
bc 0,lt,.loop\n\
.exit:\n\
or %r3,%r4,%r4\n\
blr\n\
");
*/
#else
#include <sys/types.h>
#include <stdint.h>
void *swab32(void *from,void *to,ssize_t len)
{
int i;
uint32_t *u32in=from,*u32out=to,tmp;
for(i=0;i<(len>>2);i++) {
tmp=u32in[i];
u32out[i]=((tmp&0xff)<<24)|
((tmp&0xff00)<<8)|
((tmp&0xff0000)>>8)|
((tmp&0xff000000)>>24);
}
return(to);
}
#endif

View File

@@ -0,0 +1,101 @@
#if defined(__GNUC__) && defined(__PPC__)
/* r3=from, r4=to, r5=len/temp, r6/r7=index, r8/r9=load/store temp, r10=cache hint */
/* This version is unrolled and uses cache-hinting. It appears to gain about 10%
* over a non-unrolled, non-hinting version.
*/
asm("\
.text\n\
.align 2\n\
.globl swab64\n\
.type swab64,@function\n\
swab64:\n\
dcbt 0,%r3\n\
andi. %r10,%r5,31 # The number of bytes handled in '.pre'. Used for prefetch hint.\n\
srawi %r5,%r5,3 # Convert bytes-># of 64-bit words\n\
andi. %r7,%r5,3\n\
li %r6,0\n\
bc 4,gt,.preploop\n\
mtctr %r7\n\
.pre: # One 64-bit word at a time until we have (nLeft%4)==0 \n\
lwbrx %r8,%r6,%r3\n\
addi %r7,%r6,4\n\
lwbrx %r9,%r7,%r3\n\
stwx %r8,%r7,%r4\n\
stwx %r9,%r6,%r4\n\
addi %r6,%r6,8\n\
bc 0,lt,.pre\n\
.preploop:\n\
srawi. %r5,%r5,2 # Divide by 4 again to get number of loops.\n\
addi %r10,%r10,32 # Start address for next loop.\n\
bc 4,gt,.exit\n\
mtctr %r5\n\
.loop: # Loop unrolled 4 times = 32 bytes = 1 cache-line (except on the 970).\n\
dcbt %r10,%r3 # Cache hint (prefetch) for the next iteration\n\
lwbrx %r8,%r6,%r3\n\
addi %r7,%r6,4\n\
lwbrx %r9,%r7,%r3\n\
stwx %r8,%r7,%r4\n\
stwx %r9,%r6,%r4\n\
addi %r6,%r6,8\n\
lwbrx %r8,%r6,%r3\n\
addi %r7,%r6,4\n\
lwbrx %r9,%r7,%r3\n\
stwx %r8,%r7,%r4\n\
stwx %r9,%r6,%r4\n\
addi %r6,%r6,8\n\
lwbrx %r8,%r6,%r3\n\
addi %r7,%r6,4\n\
lwbrx %r9,%r7,%r3\n\
stwx %r8,%r7,%r4\n\
stwx %r9,%r6,%r4\n\
addi %r6,%r6,8\n\
lwbrx %r8,%r6,%r3\n\
addi %r7,%r6,4\n\
lwbrx %r9,%r7,%r3\n\
stwx %r8,%r7,%r4\n\
stwx %r9,%r6,%r4\n\
addi %r6,%r6,8\n\
addi %r10,%r10,32 # Update cache-hint offset\n\
bc 0,lt,.loop\n\
.exit:\n\
or %r3,%r4,%r4\n\
blr\n\
");
#else
#include <sys/types.h>
#include <stdint.h>
void *swab64(void *from,void *to,ssize_t len)
{
int i;
struct {
uint32_t u32[2];
} *u64in=from,*u64out=to;
uint32_t tmp1,tmp2;
for(i=0;i<(len>>3);i++) {
tmp1=u64in[i].u32[0];
tmp2=u64in[i].u32[1];
u64out[i].u32[0]=((tmp2&0xff)<<24)|
((tmp2&0xff00)<<8)|
((tmp2&0xff0000)>>8)|
((tmp2&0xff000000)>>24);
u64out[i].u32[1]=((tmp1&0xff)<<24)|
((tmp1&0xff00)<<8)|
((tmp1&0xff0000)>>8)|
((tmp1&0xff000000)>>24);
}
return(to);
}
#endif
/* vi:set ts=3: */

View File

@@ -1,5 +1,5 @@
/*
* $Id: debug.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $
* $Id: debug.c,v 1.6 2006-09-25 14:51:15 obarthel Exp $
*
* :ts=8
*
@@ -273,7 +273,7 @@ _DPRINTF(const char *fmt,...)
va_list args;
va_start(args,fmt);
KPutFmt((char *)fmt,args);
KPutFmt(fmt,args);
va_end(args);
KPrintF("\n");
@@ -288,7 +288,7 @@ _DLOG(const char *fmt,...)
va_list args;
va_start(args,fmt);
KPutFmt((char *)fmt,args);
KPutFmt(fmt,args);
va_end(args);
}
}

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 201
#define DATE "21.9.2006"
#define VERS "debug.lib 1.201"
#define VSTRING "debug.lib 1.201 (21.9.2006)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.201 (21.9.2006)"
#define REVISION 203
#define DATE "28.4.2008"
#define VERS "debug.lib 1.203"
#define VSTRING "debug.lib 1.203 (28.4.2008)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.203 (28.4.2008)"

View File

@@ -1 +1 @@
201
203

View File

@@ -1,5 +1,5 @@
/*
* $Id: dirent_readdir.c,v 1.9 2006-01-08 12:04:22 obarthel Exp $
* $Id: dirent_readdir.c,v 1.10 2006-09-25 14:51:15 obarthel Exp $
*
* :ts=4
*
@@ -88,7 +88,7 @@ readdir(DIR * directory_pointer)
{
D_S(struct FileInfoBlock,fib);
D_S(struct bcpl_name,bcpl_name);
UBYTE * name = bcpl_name->name;
char * name = (char *)bcpl_name->name;
BPTR dir_lock;
assert( (((ULONG)name) & 3) == 0 );
@@ -96,7 +96,7 @@ readdir(DIR * directory_pointer)
if(dh->dh_VolumeNode == NULL && NOT IsListEmpty((struct List *)&dh->dh_VolumeList))
dh->dh_VolumeNode = (struct Node *)dh->dh_VolumeList.mlh_Head;
strcpy((char *)name,"\1:"); /* BSTR for ":" */
strcpy(name,"\1:"); /* BSTR for ":" */
while(result == NULL && dh->dh_VolumeNode != NULL && dh->dh_VolumeNode->ln_Succ != NULL)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_fcntl.c,v 1.19 2006-01-08 12:04:22 obarthel Exp $
* $Id: fcntl_fcntl.c,v 1.20 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -97,7 +97,7 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
goto out;
}
if(fd->fd_DefaultFile == ZERO)
if(fd->fd_File == ZERO)
{
__set_errno(EBADF);
goto out;
@@ -155,7 +155,7 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
SHOWMSG("cmd=F_SETFL");
/* If this is a file, make sure that we don't hit a zero file handle. */
if(FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_SOCKET) && fd->fd_DefaultFile == ZERO)
if(FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_SOCKET) && fd->fd_File == ZERO)
{
__set_errno(EBADF);
goto out;

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_get_default_file.c,v 1.6 2006-09-12 14:16:44 obarthel Exp $
* $Id: fcntl_get_default_file.c,v 1.8 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -46,7 +46,6 @@ __get_default_file(int file_descriptor,long * file_ptr)
{
int result = ERROR;
struct fd * fd;
BPTR file;
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
assert( __fd[file_descriptor] != NULL );
@@ -60,67 +59,9 @@ __get_default_file(int file_descriptor,long * file_ptr)
goto out;
}
__fd_unlock(fd);
__fd_lock(fd);
#if defined(__THREAD_SAFE)
{
/* Check if this file should be dynamically bound to one of the
three standard I/O streams. */
if(FLAG_IS_SET(fd->fd_Flags,FDF_STDIO))
{
switch(fd->fd_DefaultFile)
{
case STDIN_FILENO:
file = Input();
break;
case STDOUT_FILENO:
file = Output();
break;
case STDERR_FILENO:
#if defined(__amigaos4__)
{
file = ErrorOutput();
}
#else
{
struct Process * this_process = (struct Process *)FindTask(NULL);
file = this_process->pr_CES;
}
#endif /* __amigaos4__ */
/* The following is rather controversial; if the standard error stream
is unavailable, we default to reuse the standard output stream. This
is problematic if the standard output stream was redirected and should
not be the same as the standard error output stream. */
if(file == ZERO)
file = Output();
break;
default:
file = ZERO;
break;
}
}
else
{
file = fd->fd_DefaultFile;
}
}
#else
{
file = fd->fd_DefaultFile;
}
#endif /* __THREAD_SAFE */
(*file_ptr) = (long)file;
(*file_ptr) = (long)__resolve_fd_file(fd);
result = 0;

View File

@@ -1,5 +1,5 @@
/*
* $Id: dos.h,v 1.26 2006-09-22 07:54:25 obarthel Exp $
* $Id: dos.h,v 1.28 2006-09-27 09:40:06 obarthel Exp $
*
* :ts=4
*
@@ -509,8 +509,8 @@ extern BOOL (*__expand_wildcard_args_check)(void);
* ("/gcc/bin:/SDK/C:/SDK/Local/C:/C:.") as used by the execvp()
* function.
*/
extern char * __default_path_delimiter;
extern char * __default_path;
extern const char * __default_path_delimiter;
extern const char * __default_path;
/****************************************************************************/
@@ -555,6 +555,16 @@ extern void __execve_exit(int return_code);
/****************************************************************************/
/*
* The unlink() and remove() functions in libunix.a may return success even
* though deletion failed because the file/directory/link in question is still
* reported as being "in use". This is the default behaviour. If you want the
* deletion to fail instead, set '__unlink_retries' to FALSE.
*/
extern BOOL __unlink_retries;
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@@ -1,5 +1,5 @@
/*
* $Id: libgen.h,v 1.6 2006-01-08 12:06:14 obarthel Exp $
* $Id: libgen.h,v 1.7 2006-09-25 13:29:47 obarthel Exp $
*
* :ts=4
*
@@ -53,8 +53,8 @@ extern "C" {
/****************************************************************************/
char * basename(char *path);
char * dirname(char *path);
char * basename(const char *path);
char * dirname(const char *path);
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: math.h,v 1.21 2006-01-08 12:06:14 obarthel Exp $
* $Id: math.h,v 1.22 2007-01-06 10:09:49 obarthel Exp $
*
* :ts=4
*
@@ -297,6 +297,7 @@ extern double hypot(double x,double y);
extern double lgamma(double x);
extern double log1p(double x);
extern double logb(double x);
extern long long int llrint(double x);
extern long int lrint(double x);
extern long int lround(double x);
extern double nan(const char *tagp);

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib.h,v 1.17 2006-01-08 12:06:14 obarthel Exp $
* $Id: stdlib.h,v 1.18 2006-11-13 09:51:53 obarthel Exp $
*
* :ts=4
*
@@ -156,6 +156,7 @@ extern long atol(const char *str);
/****************************************************************************/
extern void _exit(int status);
extern int rand_r(unsigned int * seed);
/****************************************************************************/

View File

@@ -0,0 +1,190 @@
/*
* $Id: clib2_io.h,v 1.4 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************
*
* Documentation and source code for this library, and the most recent library
* build are available from <http://sourceforge.net/projects/clib2>.
*
*****************************************************************************
*/
#ifndef _SYS_CLIB2_IO_H
#define _SYS_CLIB2_IO_H
/****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
/* Operations that can be performed by the file action function. */
enum file_action_t
{
file_action_read,
file_action_write,
file_action_seek,
file_action_close,
file_action_set_blocking,
file_action_set_async,
file_action_examine
};
/****************************************************************************/
/* A message sent to a file action function. */
struct file_action_message
{
enum file_action_t fam_Action; /* What to do */
char * fam_Data; /* Where to read/write the data */
int fam_Size; /* How much data to write */
long int fam_Offset; /* The seek offset */
int fam_Mode; /* The seek mode */
int fam_Arg; /* Action parameters, e.g. whether or not
this file should be set non-blocking or
use asynchronous I/O */
struct FileInfoBlock * fam_FileInfo; /* File information to be filled in */
struct MsgPort * fam_FileSystem; /* File system pointer to be filled in */
int fam_Error; /* Error code, if any... */
};
/****************************************************************************/
/* A forward declaration to make the following typedef work. */
struct _fd;
/****************************************************************************/
/* The file action function for unbuffered files. */
typedef int (*_file_action_fd_t)(struct _fd * _fd,struct file_action_message * fam);
/****************************************************************************/
/* A low level unbuffered file or socket. */
struct _fd
{
int fd_Version; /* Version number of this definition
of the '_fd' data structure (see
below). */
_file_action_fd_t fd_Action; /* Function to invoke to perform actions */
void * fd_UserData; /* To be used by custom file action
functions */
ULONG fd_Flags; /* File properties */
union
{
BPTR fdu_File; /* A dos.library file handle */
LONG fdu_Socket; /* A socket identifier */
} fdu_Default;
};
/****************************************************************************/
/* The version of the '_fd' data structure, covering the fields 'fd_Version'
through 'fdu_Default' bears version number 1. */
/****************************************************************************/
/* Sneaky preprocessor tricks to make access to the file/socket IDs
work smoothly. */
#define fd_DefaultFile fdu_Default.fdu_File
#define fd_File fdu_Default.fdu_File
#define fd_Socket fdu_Default.fdu_Socket
/****************************************************************************/
/* Flag bits that can be set in _fd->fd_Flags; not all of these may be in
use, or can be changed. */
#define FDF_READ (1UL<<0) /* Data can be read from this file */
#define FDF_WRITE (1UL<<1) /* Data can be written to this file */
#define FDF_APPEND (1UL<<2) /* Before any data is written to it,
the file position must be set to the
end of the file */
#define FDF_NO_CLOSE (1UL<<3) /* Never close this file */
#define FDF_NON_BLOCKING (1UL<<4) /* File was switched into non-blocking
mode (console streams only) */
#define FDF_IS_SOCKET (1UL<<5) /* This is not a disk file but a socket */
#define FDF_IS_LOCKED (1UL<<6) /* This file has an advisory record lock set */
#define FDF_IN_USE (1UL<<7) /* This file is in use */
#define FDF_CREATED (1UL<<8) /* This file was newly created and may need
to have its protection bits updated after
it has been closed */
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
#define FDF_ASYNC_IO (1UL<<10) /* File was switched into asynchronous I/O
mode (sockets only). */
#define FDF_IS_INTERACTIVE (1UL<<11) /* File is attached to a console window or
something like it. */
#define FDF_STDIO (1UL<<12) /* File is to be attached to one of the
standard input/output/error streams. */
#define FDF_TERMIOS (1UL<<13) /* File is under termios control.
FDF_IS_INTERACTIVE should also be set. */
/****************************************************************************/
/* Obtain a pointer to the _fd data structure associated with a file
descriptor number. Note that this does not perform any locking, which
means that you have to be absolutely certain that the file will not be
closed while you are still looking at it. This function can return
NULL if the file descriptor you provided is not valid. */
extern struct _fd * __get_fd(int file_descriptor);
/* Replaces the action callback function and (optionally) returns the old
function pointer; returns 0 for success and -1 for failure if you
provided an invalid file descriptor. This function performs proper locking
and is thus safe to use in a thread-safe environment. */
extern int __change_fd_action(int file_descriptor,_file_action_fd_t new_action,_file_action_fd_t * old_action_ptr);
/* Replaces the user data pointer and (optionally) returns the old user
data pointer; returns 0 for success and -1 for failure if you
provided an invalid file descriptor. This function performs proper locking
and is thus safe to use in a thread-safe environment. */
extern int __change_fd_user_data(int file_descriptor,void * new_user_data,void ** old_user_data_ptr);
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */
/****************************************************************************/
#endif /* _SYS_CLIB2_IO_H */

View File

@@ -1,5 +1,5 @@
/*
* $Id: unistd.h,v 1.21 2006-08-02 06:49:47 obarthel Exp $
* $Id: unistd.h,v 1.23 2007-01-06 10:09:49 obarthel Exp $
*
* :ts=4
*
@@ -51,6 +51,10 @@
#include <fcntl.h>
#endif /* _FCNTL_H */
#ifndef _STDIO_H
#include <stdio.h>
#endif /* _STDIO_H */
#if !defined(__NO_NET_API) && !defined(_SYS_SELECT_H)
#include <sys/select.h>
#endif /* __NO_NET_API && _SYS_SELECT_H */
@@ -114,7 +118,7 @@ extern int chdir(const char * path_name);
extern int lockf(int file_descriptor, int function, off_t size);
extern unsigned int sleep(unsigned int seconds);
extern void usleep(unsigned long microseconds);
extern int getopt(int argc, char * argv[], char *opts);
extern int getopt(int argc, char * const argv[], const char *opts);
extern pid_t getpid(void);
extern char *realpath(const char *file_name, char *resolved_name);
extern int fsync(int file_descriptor);

View File

@@ -1,5 +1,5 @@
#
# $Id: libc.gmk,v 1.1 2006-09-17 17:37:27 obarthel Exp $
# $Id: libc.gmk,v 1.4 2006-11-16 14:39:23 obarthel Exp $
#
# :ts=8
#
@@ -21,7 +21,6 @@ LIBS += \
C_LIB := \
c.lib_rev.o \
crtbegin.o \
ctype_isalnum.o \
ctype_isalpha.o \
ctype_isascii.o \
@@ -85,11 +84,14 @@ C_LIB := \
stat_fchmod.o \
stat_fstat.o \
stat_lstat.o \
stat_lock.o \
stat_mkdir.o \
stat_rmdir.o \
stat_stat.o \
stat_umask.o \
stdio_asprintf.o \
stdio_change_fd_action.o \
stdio_change_fd_user_data.o \
stdio_clearerr.o \
stdio_dropiobreadbuffer.o \
stdio_duplicate_fd.o \
@@ -129,6 +131,7 @@ C_LIB := \
stdio_getchar.o \
stdio_getchar_unlocked.o \
stdio_gets.o \
stdio_get_fd.o \
stdio_get_file_descriptor.o \
stdio_growfdtable.o \
stdio_growiobtable.o \
@@ -154,6 +157,7 @@ C_LIB := \
stdio_remove.o \
stdio_remove_fd_alias.o \
stdio_rename.o \
stdio_resolve_fd_file.o \
stdio_rewind.o \
stdio_scanf.o \
stdio_setbuf.o \
@@ -359,8 +363,7 @@ C_LIB := \
unistd_unlink.o \
unistd_usleep.o \
utime_utime.o \
utsname_uname.o \
crtend.o
utsname_uname.o
##############################################################################

View File

@@ -1,5 +1,5 @@
/*
* $Id: libgen_basename.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $
* $Id: libgen_basename.c,v 1.8 2006-10-02 07:15:37 obarthel Exp $
*
* :ts=4
*
@@ -33,6 +33,7 @@
#include <string.h>
#include <libgen.h>
#include <stdio.h>
/****************************************************************************/
@@ -45,9 +46,12 @@
/****************************************************************************/
char *
basename(char *path)
basename(const char *path)
{
static char new_path[MAXPATHLEN];
const char * str;
char * result;
size_t len;
ENTER();
@@ -56,41 +60,63 @@ basename(char *path)
else
SHOWSTRING(path);
/* An empty path always comes out as the "current directory". */
if(path == NULL || path[0] == '\0')
{
result = (char *)".";
str = ".";
len = 1;
}
else
{
int len,i;
/* Strip all trailing slashes. */
len = strlen(path);
while(len > 0 && path[len-1] == '/')
len--;
/* Is there anything left? */
if(len > 0)
{
result = path;
size_t i;
path[len] = '\0';
/* Return what follows the last slash in the path. That's
usually a file or directory name. */
str = path;
for(i = len-1 ; i >= 0 ; i--)
for(i = len - 1 ; ; i--)
{
if(path[i] == '/')
{
result = &path[i+1];
len -= i+1;
str = &path[i+1];
break;
}
if(i == 0)
break;
}
}
else
/* If the whole operation produced an empty string, then it
means that we dealt with a string which consisted entirely
of slashes. And that's what we will return. */
if(len == 0)
{
result = (char *)"/";
str = "/";
len = 1;
}
}
SHOWSTRING(result);
/* Truncate the path name we can return. This function always returns
a valid pointer rather than NULL because some software expects it
to do so (I blame the specifications). */
if(len >= sizeof(new_path))
len = sizeof(new_path)-1;
memcpy(new_path,str,len);
new_path[len] = '\0';
result = new_path;
RETURN(result);
return(result);

View File

@@ -1,5 +1,5 @@
/*
* $Id: libgen_dirname.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $
* $Id: libgen_dirname.c,v 1.8 2006-10-02 07:15:37 obarthel Exp $
*
* :ts=4
*
@@ -33,6 +33,7 @@
#include <string.h>
#include <libgen.h>
#include <stdio.h>
/****************************************************************************/
@@ -45,9 +46,12 @@
/****************************************************************************/
char *
dirname(char *path)
dirname(const char *path)
{
static char new_path[MAXPATHLEN];
const char * str;
char * result;
size_t len;
ENTER();
@@ -56,42 +60,57 @@ dirname(char *path)
else
SHOWSTRING(path);
if(path == NULL || path[0] == '\0')
{
result = (char *)".";
}
else
{
int len,i;
/* An empty path always comes out as the "current directory". */
str = ".";
len = 1;
if(path != NULL && path[0] != '\0')
{
/* Strip all trailing slashes. */
len = strlen(path);
while(len > 0 && path[len-1] == '/')
while(len > 1 && path[len-1] == '/')
len--;
/* Is there anything left? */
if(len > 0)
{
result = (char *)".";
size_t i;
for(i = len-1 ; i >= 0 ; i--)
for(i = len-1 ; ; i--)
{
if(path[i] == '/')
{
path[i] = '\0';
/* Return everything up to, but not including
the last slash in the path. That's usually
the directory name. */
str = path;
len = i;
result = path;
/* If that produces an empty string, it means
that the entire string consists of slash
characters. We'll return only the first. */
if(i == 0)
len++;
break;
}
if(i == 0)
break;
}
}
else
{
result = (char *)"/";
}
}
SHOWSTRING(result);
/* Truncate the path name we can return. This function always returns
a valid pointer rather than NULL because some software expects it
to do so (I blame the specifications). */
if(len >= sizeof(new_path))
len = sizeof(new_path)-1;
memcpy(new_path,str,len);
new_path[len] = '\0';
result = new_path;
RETURN(result);
return(result);

View File

@@ -1,5 +1,5 @@
#
# $Id: libm.gmk,v 1.1 2006-09-17 17:37:27 obarthel Exp $
# $Id: libm.gmk,v 1.3 2007-01-06 10:09:48 obarthel Exp $
#
# :ts=8
#
@@ -109,7 +109,6 @@ MATH_LIB := \
math_kernel_cosf.o \
math_kernel_expm1.o \
math_kernel_rem_pio2.o \
math_kernel_scalbn.o \
math_kernel_sin.o \
math_kernel_sinf.o \
math_kernel_tan.o \
@@ -118,6 +117,7 @@ MATH_LIB := \
math_ldexpf.o \
math_lgamma.o \
math_lgammaf.o \
math_llrint.o \
math_log.o \
math_log10.o \
math_log10f.o \

View File

@@ -1,5 +1,5 @@
#
# $Id: libunix.gmk,v 1.1 2006-09-17 17:37:27 obarthel Exp $
# $Id: libunix.gmk,v 1.3 2006-11-13 09:25:28 obarthel Exp $
#
# :ts=8
#
@@ -37,6 +37,7 @@ UNIX_LIB := \
stat_chmod.o \
stat_fstat.o \
stat_lstat.o \
stat_lock.o \
stat_mkdir.o \
stat_rmdir.o \
stat_stat.o \
@@ -122,6 +123,7 @@ UNIX_LIB := \
unistd_ttyname_r.o \
unistd_unix_path_semantics.o \
unistd_unlink.o \
unistd_unlink_retries.o \
unistd_wildcard_expand.o \
utime_utime.o

View File

@@ -1,5 +1,5 @@
/*
* $Id: locale_localeconv.c,v 1.6 2006-09-22 09:02:51 obarthel Exp $
* $Id: locale_localeconv.c,v 1.7 2006-09-25 14:51:15 obarthel Exp $
*
* :ts=4
*
@@ -54,18 +54,18 @@ localeconv(void)
monetary_locale = __locale_table[LC_MONETARY];
/* This makes up the current locale settings from the various
* components in use.
*/
loc.decimal_point = (numeric_locale != NULL) ? ((char *)numeric_locale->loc_DecimalPoint) : (char *)".";
loc.thousands_sep = (numeric_locale != NULL) ? ((char *)numeric_locale->loc_GroupSeparator) : (char *)"";
loc.grouping = (numeric_locale != NULL) ? ((char *)numeric_locale->loc_Grouping) : (char *)"";
loc.int_curr_symbol = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonIntCS) : (char *)"";
loc.currency_symbol = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonCS) : (char *)"";
loc.mon_decimal_point = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonDecimalPoint) : (char *)"";
loc.mon_thousands_sep = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonGroupSeparator) : (char *)"";
loc.mon_grouping = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonGrouping) : (char *)"";
loc.positive_sign = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonPositiveSign) : (char *)"";
loc.negative_sign = (monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonNegativeSign) : (char *)"";
components in use. */
loc.decimal_point = ((numeric_locale != NULL) ? ((char *)numeric_locale->loc_DecimalPoint) : (char *)".");
loc.thousands_sep = ((numeric_locale != NULL) ? ((char *)numeric_locale->loc_GroupSeparator) : (char *)"");
loc.grouping = ((numeric_locale != NULL) ? ((char *)numeric_locale->loc_Grouping) : (char *)"");
loc.int_curr_symbol = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonIntCS) : (char *)"");
loc.currency_symbol = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonCS) : (char *)"");
loc.mon_decimal_point = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonDecimalPoint) : (char *)"");
loc.mon_thousands_sep = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonGroupSeparator) : (char *)"");
loc.mon_grouping = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonGrouping) : (char *)"");
loc.positive_sign = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonPositiveSign) : (char *)"");
loc.negative_sign = ((monetary_locale != NULL) ? ((char *)monetary_locale->loc_MonNegativeSign) : (char *)"");
loc.int_frac_digits = (monetary_locale != NULL) ? monetary_locale->loc_MonIntFracDigits : CHAR_MAX;
loc.frac_digits = (monetary_locale != NULL) ? monetary_locale->loc_MonFracDigits : CHAR_MAX;
loc.p_cs_precedes = (monetary_locale != NULL) ? monetary_locale->loc_MonPositiveCSPos : CHAR_MAX;

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 201
#define DATE "21.9.2006"
#define VERS "m.lib 1.201"
#define VSTRING "m.lib 1.201 (21.9.2006)\r\n"
#define VERSTAG "\0$VER: m.lib 1.201 (21.9.2006)"
#define REVISION 203
#define DATE "28.4.2008"
#define VERS "m.lib 1.203"
#define VSTRING "m.lib 1.203 (28.4.2008)\r\n"
#define VERSTAG "\0$VER: m.lib 1.203 (28.4.2008)"

View File

@@ -1 +1 @@
201
203

View File

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

View File

@@ -1 +1 @@
201
202

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_headers.h,v 1.14 2006-01-08 12:04:23 obarthel Exp $
* $Id: math_headers.h,v 1.15 2006-11-13 09:51:53 obarthel Exp $
*
* :ts=4
*
@@ -216,7 +216,6 @@ extern double __kernel_sin(double x, double y, int iy);
extern int __rem_pio2(double x, double *y);
extern double __kernel_tan(double x, double y, int iy);
extern double __expm1(double x);
extern double __scalbn(double x, int n);
extern float __kernel_cosf(float x, float y);
extern float __kernel_sinf(float x, float y, int iy);
extern LONG __rem_pio2f(float x, float *y);

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_kernel_rem_pio2.c,v 1.5 2006-01-08 12:04:23 obarthel Exp $
* $Id: math_kernel_rem_pio2.c,v 1.7 2006-11-13 09:51:53 obarthel Exp $
*
* :ts=4
*
@@ -55,7 +55,7 @@ static const double PIo2[] = {
1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
3.28200341580791294123e422, /* 0x3B78CC51, 0x60000000 */
3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
@@ -102,7 +102,7 @@ recompute:
}
/* compute n */
z = __scalbn(z,(int)q0); /* actual value of z */
z = scalbn(z,(int)q0); /* actual value of z */
z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
n = (int) z;
z -= (double)n;
@@ -135,7 +135,7 @@ recompute:
}
if(ih==2) {
z = one - z;
if(carry!=0) z -= __scalbn(one,(int)q0);
if(carry!=0) z -= scalbn(one,(int)q0);
}
}
@@ -161,7 +161,7 @@ recompute:
jz -= 1; q0 -= 24;
while(iq[jz]==0) { jz--; q0-=24;}
} else { /* break z into 24-bit if necessary */
z = __scalbn(z,-(int)q0);
z = scalbn(z,-(int)q0);
if(z>=two24) {
fw = (double)((int)(twon24*z));
iq[jz] = (int)(z-two24*fw);
@@ -171,7 +171,7 @@ recompute:
}
/* convert integer "bit" chunk to floating-point value */
fw = __scalbn(one,(int)q0);
fw = scalbn(one,(int)q0);
for(i=jz;i>=0;i--) {
q[i] = fw*(double)iq[i]; fw*=twon24;
}
@@ -331,7 +331,7 @@ int __rem_pio2(double x, double *y)
}
/* keep the compiler happy */
z = 0;
/* set z = __scalbn(|x|,ilogb(x)-23) */
/* set z = scalbn(|x|,ilogb(x)-23) */
GET_LOW_WORD(low,x);
SET_LOW_WORD(z,low);
e0 = (int)((ix>>20)-1046); /* e0 = ilogb(z)-23; */

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_kernel_scalbn.c,v 1.5 2006-01-08 12:04:23 obarthel Exp $
* $Id: math_llrint.c,v 1.1 2007-01-06 10:09:48 obarthel Exp $
*
* :ts=4
*
@@ -46,43 +46,83 @@
/****************************************************************************/
#if defined(FLOATING_POINT_SUPPORT) && defined(PPC_FLOATING_POINT_SUPPORT)
#if defined(FLOATING_POINT_SUPPORT)
/****************************************************************************/
static const double
huge = 1.0e+300,
tiny = 1.0e-300,
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
twom54 = 5.55111512312578270212e-17; /* 0x3C900000, 0x00000000 */
/* Adding a double, x, to 2^52 will cause the result to be rounded based on
the fractional part of x, according to the implementation's current rounding
mode. 2^52 is the smallest double that can be represented using all 52 significant
digits. */
static const double TWO52[2]={
4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
-4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
};
double __scalbn (double x, int n)
/****************************************************************************/
long long int
llrint(double x)
{
int k,hx,lx;
EXTRACT_WORDS(hx,lx,x);
k = (hx&0x7ff00000)>>20; /* extract exponent */
if (k==0) { /* 0 or subnormal x */
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
x *= two54;
GET_HIGH_WORD(hx,x);
k = ((hx&0x7ff00000)>>20) - 54;
if (n< -50000) return tiny*x; /*underflow*/
}
if (k==0x7ff) return x+x; /* NaN or Inf */
k = k+n;
if (k > 0x7fe) return huge*copysign(huge,x); /* overflow */
if (k > 0) /* normal result */
{SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
if (k <= -54) {
if (n > 50000) /* in case integer overflow in n+k */
return huge*copysign(huge,x); /*overflow*/
else return tiny*copysign(tiny,x); /*underflow*/
}
k += 54; /* subnormal result */
SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
return x*twom54;
LONG i0,j0,sx;
ULONG i1;
double t;
volatile double w;
long long int result;
EXTRACT_WORDS(i0,i1,x);
/* Extract sign bit. */
sx = (i0>>31)&1;
/* Extract exponent field. */
j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
if(j0 < 20)
{
if(j0 < -1)
return 0;
else
{
w = TWO52[sx] + x;
t = w - TWO52[sx];
GET_HIGH_WORD(i0, t);
/* Detect the all-zeros representation of plus and
minus zero, which fails the calculation below. */
if ((i0 & ~(1 << 31)) == 0)
return 0;
j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
i0 &= 0x000fffff;
i0 |= 0x00100000;
result = i0 >> (20 - j0);
}
}
else if (j0 < (int)(8 * sizeof (long long int)) - 1)
{
if (j0 >= 52)
result = ((long long int) ((i0 & 0x000fffff) | 0x0010000) << (j0 - 20)) |
(i1 << (j0 - 52));
else
{
w = TWO52[sx] + x;
t = w - TWO52[sx];
EXTRACT_WORDS (i0, i1, t);
j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
i0 &= 0x000fffff;
i0 |= 0x00100000;
result = ((long long int) i0 << (j0 - 20)) | (i1 >> (52 - j0));
}
}
else
{
return (long long int) x;
}
return sx ? -result : result;
}
/****************************************************************************/
#endif /* FLOATING_POINT_SUPPORT && PPC_FLOATING_POINT_SUPPORT */
#endif /* FLOATING_POINT_SUPPORT */

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
/*
* $Id: mount_fstatfs.c,v 1.13 2006-01-08 12:04:24 obarthel Exp $
* $Id: mount_fstatfs.c,v 1.14 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -106,7 +106,7 @@ fstatfs(int file_descriptor, struct statfs *buf)
}
PROFILE_OFF();
parent_dir = __safe_parent_of_file_handle(fd->fd_DefaultFile);
parent_dir = __safe_parent_of_file_handle(fd->fd_File);
PROFILE_ON();
if(parent_dir == ZERO)

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 201
#define DATE "21.9.2006"
#define VERS "net.lib 1.201"
#define VSTRING "net.lib 1.201 (21.9.2006)\r\n"
#define VERSTAG "\0$VER: net.lib 1.201 (21.9.2006)"
#define REVISION 203
#define DATE "28.4.2008"
#define VERS "net.lib 1.203"
#define VSTRING "net.lib 1.203 (28.4.2008)\r\n"
#define VERSTAG "\0$VER: net.lib 1.203 (28.4.2008)"

View File

@@ -1 +1 @@
201
203

View File

@@ -1,5 +1,5 @@
|
| $Id: nrcrt0.S,v 1.5 2006-01-08 12:04:24 obarthel Exp $
| $Id: nrcrt0.S,v 1.6 2006-11-16 10:09:20 obarthel Exp $
|
| :ts=4
|
@@ -56,7 +56,7 @@ MEMF_CLEAR = 65536
.text
.globl _main | This enforces linkage against the main() function
.globl _main | This enforces linkage against the main() function
.globl __main
.globl ___is_resident

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_accept.c,v 1.16 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_accept.c,v 1.17 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -95,7 +95,7 @@ accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)
goto out;
/* Remember the socket number for later. */
socket_fd = (LONG)fd->fd_DefaultFile;
socket_fd = fd->fd_Socket;
/* Now let go of the stdio lock, so that the only locking performed
will be done inside the accept() call. */

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_bind.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_bind.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -84,7 +84,7 @@ bind(int sockfd,const struct sockaddr *name,socklen_t namelen)
goto out;
PROFILE_OFF();
result = __bind((LONG)fd->fd_DefaultFile,(struct sockaddr *)name,namelen);
result = __bind(fd->fd_Socket,(struct sockaddr *)name,namelen);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_connect.c,v 1.8 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_connect.c,v 1.9 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -84,7 +84,7 @@ connect(int sockfd,const struct sockaddr *name,socklen_t namelen)
goto out;
PROFILE_OFF();
result = __connect((LONG)fd->fd_DefaultFile,(struct sockaddr *)name,namelen);
result = __connect(fd->fd_Socket,(struct sockaddr *)name,namelen);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_getpeername.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_getpeername.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -84,7 +84,7 @@ getpeername(int sockfd,struct sockaddr *name,socklen_t *namelen)
goto out;
PROFILE_OFF();
result = __getpeername((LONG)fd->fd_DefaultFile,name,(LONG *)namelen);
result = __getpeername(fd->fd_Socket,name,(LONG *)namelen);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_getsockname.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_getsockname.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -84,7 +84,7 @@ getsockname(int sockfd,struct sockaddr *name,socklen_t *namelen)
goto out;
PROFILE_OFF();
result = __getsockname((LONG)fd->fd_DefaultFile,name,(LONG *)namelen);
result = __getsockname(fd->fd_Socket,name,(LONG *)namelen);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_getsockopt.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_getsockopt.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -86,7 +86,7 @@ getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)
goto out;
PROFILE_OFF();
result = __getsockopt((LONG)fd->fd_DefaultFile,level,optname,optval,(LONG *)optlen);
result = __getsockopt(fd->fd_Socket,level,optname,optval,(LONG *)optlen);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_hook_entry.c,v 1.16 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_hook_entry.c,v 1.17 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -79,7 +79,7 @@ __socket_hook_entry(
PROFILE_OFF();
result = __recv((LONG)fd->fd_DefaultFile,fam->fam_Data,fam->fam_Size,0);
result = __recv(fd->fd_Socket,fam->fam_Data,fam->fam_Size,0);
if(result < 0)
fam->fam_Error = __get_errno();
@@ -99,7 +99,7 @@ __socket_hook_entry(
PROFILE_OFF();
result = __send((LONG)fd->fd_DefaultFile,fam->fam_Data,fam->fam_Size,0);
result = __send(fd->fd_Socket,fam->fam_Data,fam->fam_Size,0);
if(result < 0)
fam->fam_Error = __get_errno();
@@ -126,7 +126,7 @@ __socket_hook_entry(
{
PROFILE_OFF();
result = __CloseSocket((LONG)fd->fd_DefaultFile);
result = __CloseSocket(fd->fd_Socket);
PROFILE_ON();
}
@@ -163,7 +163,7 @@ __socket_hook_entry(
param = (int)(fam->fam_Arg == 0);
result = __IoctlSocket(fd->fd_DefaultFile,FIONBIO,&param);
result = __IoctlSocket(fd->fd_Socket,FIONBIO,&param);
if(result < 0)
fam->fam_Error = __get_errno();
@@ -175,7 +175,7 @@ __socket_hook_entry(
param = (int)(fam->fam_Arg != 0);
result = __IoctlSocket(fd->fd_DefaultFile,FIOASYNC,&param);
result = __IoctlSocket(fd->fd_Socket,FIOASYNC,&param);
if(result < 0)
fam->fam_Error = __get_errno();

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_ioctl.c,v 1.12 2006-09-21 09:24:20 obarthel Exp $
* $Id: socket_ioctl.c,v 1.14 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -84,12 +84,12 @@ ioctl(int sockfd,int request, ... /* char *arg */)
SHOWPOINTER(param);
PROFILE_OFF();
result = __IoctlSocket((LONG)fd->fd_DefaultFile,request,param);
result = __IoctlSocket(fd->fd_Socket,request,param);
PROFILE_ON();
if(result == 0)
{
int * option = (int *)param;
const int * option = (const int *)param;
if(request == (int)FIONBIO)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_listen.c,v 1.5 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_listen.c,v 1.6 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -64,7 +64,7 @@ listen(int sockfd,int backlog)
goto out;
PROFILE_OFF();
result = __listen((LONG)fd->fd_DefaultFile,backlog);
result = __listen(fd->fd_Socket,backlog);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_obtain_daemon.c,v 1.4 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_obtain_daemon.c,v 1.5 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -93,7 +93,7 @@ __obtain_daemon_message(VOID)
struct TagItem tags[2];
/* Check if it is safe to call the IsServerProcess() function. */
tags[0].ti_Tag = SBTM_GETREF(SBTC_BREAKMASK);
tags[0].ti_Tag = SBTM_GETREF(SBTC_HAVE_SERVER_API);
tags[0].ti_Data = (ULONG)&have_server_api;
tags[1].ti_Tag = TAG_END;

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_recv.c,v 1.6 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_recv.c,v 1.7 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -86,7 +86,7 @@ recv(int sockfd,void *buff,size_t nbytes,int flags)
goto out;
PROFILE_OFF();
result = __recv((LONG)fd->fd_DefaultFile,buff,(LONG)nbytes,flags);
result = __recv(fd->fd_Socket,buff,(LONG)nbytes,flags);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_recvfrom.c,v 1.8 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_recvfrom.c,v 1.9 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -87,7 +87,7 @@ recvfrom(int sockfd,void *buff,size_t len,int flags,struct sockaddr *from,sockle
goto out;
PROFILE_OFF();
result = __recvfrom((LONG)fd->fd_DefaultFile,buff,len,flags,from,(LONG *)fromlen);
result = __recvfrom(fd->fd_Socket,buff,len,flags,from,(LONG *)fromlen);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_recvmsg.c,v 1.6 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_recvmsg.c,v 1.7 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -84,7 +84,7 @@ recvmsg(int sockfd,struct msghdr *msg,int flags)
goto out;
PROFILE_OFF();
result = __recvmsg((LONG)fd->fd_DefaultFile,msg,flags);
result = __recvmsg(fd->fd_Socket,msg,flags);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_select_signal.c,v 1.3 2006-06-22 09:02:44 obarthel Exp $
* $Id: socket_select_signal.c,v 1.5 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -288,7 +288,7 @@ map_descriptor_sets(
/* Is this a socket descriptor? */
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
{
int socket_fd = (int)fd->fd_DefaultFile;
int socket_fd = fd->fd_Socket;
D(("corresponds to socket #%ld",socket_fd));
@@ -326,7 +326,7 @@ map_descriptor_sets(
/* Let's see if we can examine the file. Some file systems
may not support this. */
if(CANNOT __safe_examine_file_handle(fd->fd_DefaultFile,fib))
if(CANNOT __safe_examine_file_handle(fd->fd_File,fib))
{
SHOWMSG("file is unusable; we cannot examine the file.");
continue;
@@ -415,7 +415,7 @@ remap_descriptor_sets(
for(output_fd = 0 ; output_fd < num_output_fds ; output_fd++)
{
fd = get_file_descriptor(output_fd);
if(fd != NULL && FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET) && (int)fd->fd_DefaultFile == socket_fd)
if(fd != NULL && FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET) && fd->fd_Socket == socket_fd)
{
assert( output_fd < num_output_fds );
assert( FLAG_IS_SET(__fd[output_fd]->fd_Flags,FDF_IS_SOCKET) );
@@ -480,7 +480,7 @@ get_num_descriptors_used(int num_fds,int * num_socket_used_ptr,int * num_file_us
{
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
{
int which_socket_fd = (int)fd->fd_DefaultFile;
int which_socket_fd = fd->fd_Socket;
if(num_socket_used < which_socket_fd+1)
num_socket_used = which_socket_fd+1;
@@ -812,7 +812,7 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
{
/* For an interactive stream, we simply ask. */
if(WaitForChar(fd->fd_DefaultFile,1))
if(WaitForChar(fd->fd_File,1))
got_input = TRUE;
}
else
@@ -824,7 +824,7 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc
unread data in the file, we will be able to read from it.
For pipes, any data reported to be in the "file" indicates
that there is something worth reading available. */
if(__safe_examine_file_handle(fd->fd_DefaultFile,fib))
if(__safe_examine_file_handle(fd->fd_File,fib))
{
if(FLAG_IS_SET(fd->fd_Flags,FDF_CACHE_POSITION))
{
@@ -1010,14 +1010,14 @@ __select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struc
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
{
if(WaitForChar(fd->fd_DefaultFile,1))
if(WaitForChar(fd->fd_File,1))
got_input = TRUE;
}
else
{
D_S(struct FileInfoBlock,fib);
if(__safe_examine_file_handle(fd->fd_DefaultFile,fib))
if(__safe_examine_file_handle(fd->fd_File,fib))
{
if(FLAG_IS_SET(fd->fd_Flags,FDF_CACHE_POSITION))
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_send.c,v 1.8 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_send.c,v 1.9 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -86,7 +86,7 @@ send(int sockfd,const void *buff,size_t nbytes,int flags)
goto out;
PROFILE_OFF();
result = __send((LONG)fd->fd_DefaultFile,(void *)buff,(LONG)nbytes,flags);
result = __send(fd->fd_Socket,(void *)buff,(LONG)nbytes,flags);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_sendmsg.c,v 1.7 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_sendmsg.c,v 1.8 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -84,7 +84,7 @@ sendmsg(int sockfd,const struct msghdr *msg,int flags)
goto out;
PROFILE_OFF();
result = __sendmsg((LONG)fd->fd_DefaultFile,(struct msghdr *)msg,flags);
result = __sendmsg(fd->fd_Socket,(struct msghdr *)msg,flags);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_sendto.c,v 1.10 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_sendto.c,v 1.11 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -87,7 +87,7 @@ sendto(int sockfd,const void *buff,size_t len,int flags,const struct sockaddr *t
goto out;
PROFILE_OFF();
result = __sendto((LONG)fd->fd_DefaultFile,(void *)buff,len,flags,(struct sockaddr *)to,tolen);
result = __sendto(fd->fd_Socket,(void *)buff,len,flags,(struct sockaddr *)to,tolen);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_setsockopt.c,v 1.9 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_setsockopt.c,v 1.10 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -86,7 +86,7 @@ setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen)
goto out;
PROFILE_OFF();
result = __setsockopt((LONG)fd->fd_DefaultFile,level,optname,(void *)optval,optlen);
result = __setsockopt(fd->fd_Socket,level,optname,(void *)optval,optlen);
PROFILE_ON();
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_shutdown.c,v 1.5 2006-01-08 12:04:24 obarthel Exp $
* $Id: socket_shutdown.c,v 1.6 2006-11-16 10:41:15 obarthel Exp $
*
* :ts=4
*
@@ -64,7 +64,7 @@ shutdown(int sockfd, int how)
goto out;
PROFILE_OFF();
result = __shutdown((LONG)fd->fd_DefaultFile,how);
result = __shutdown(fd->fd_Socket,how);
PROFILE_ON();
out:

View File

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

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 201
#define DATE "21.9.2006"
#define VERS "stack.lib 1.201"
#define VSTRING "stack.lib 1.201 (21.9.2006)\r\n"
#define VERSTAG "\0$VER: stack.lib 1.201 (21.9.2006)"
#define REVISION 202
#define DATE "16.1.2007"
#define VERS "stack.lib 1.202"
#define VSTRING "stack.lib 1.202 (16.1.2007)\r\n"
#define VERSTAG "\0$VER: stack.lib 1.202 (16.1.2007)"

View File

@@ -1 +1 @@
201
202

View File

@@ -1,5 +1,5 @@
/*
* $Id: stat_fchmod.c,v 1.12 2006-01-08 12:04:24 obarthel Exp $
* $Id: stat_fchmod.c,v 1.13 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -127,7 +127,7 @@ fchmod(int file_descriptor, mode_t mode)
SET_FLAG(protection,FIBF_OTR_EXECUTE);
PROFILE_OFF();
parent_dir = __safe_parent_of_file_handle(fd->fd_DefaultFile);
parent_dir = __safe_parent_of_file_handle(fd->fd_File);
PROFILE_ON();
if(parent_dir == ZERO)
@@ -139,7 +139,7 @@ fchmod(int file_descriptor, mode_t mode)
}
PROFILE_OFF();
success = __safe_examine_file_handle(fd->fd_DefaultFile,fib);
success = __safe_examine_file_handle(fd->fd_File,fib);
PROFILE_ON();
if(NO success)

View File

@@ -1,5 +1,5 @@
/*
* $Id: stat_headers.h,v 1.6 2006-01-08 12:04:24 obarthel Exp $
* $Id: stat_headers.h,v 1.7 2006-11-13 09:25:28 obarthel Exp $
*
* :ts=4
*
@@ -59,6 +59,7 @@ extern mode_t NOCOMMON __current_umask;
/****************************************************************************/
extern void __convert_file_info_to_stat(const struct MsgPort * file_system,const struct FileInfoBlock * fib,struct stat * st);
extern BPTR __lock(const char *name,const int mode,int * link_length,char * real_name,size_t real_name_size);
/****************************************************************************/

186
library/stat_lock.c Normal file
View File

@@ -0,0 +1,186 @@
/*
* $Id: stat_lock.c,v 1.1 2006-11-13 09:25:28 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _STDLIB_NULL_POINTER_CHECK_H
#include "stdlib_null_pointer_check.h"
#endif /* _STDLIB_NULL_POINTER_CHECK_H */
/****************************************************************************/
#ifndef _STAT_HEADERS_H
#include "stat_headers.h"
#endif /* _STAT_HEADERS_H */
#ifndef _LOCALE_HEADERS_H
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
#ifndef _TIME_HEADERS_H
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
/*
* __lock(): An implementation of Lock() which remembers whether or
* not it resolved soft links.
*
* Unfortunately is is limited to 255 character names.
*/
BPTR
__lock(
const char * name,
const int mode,
int * link_length,
char * real_name,
size_t real_name_size)
{
D_S(struct bcpl_name,bname);
const size_t name_size = sizeof(bname->name);
char * new_name = NULL;
struct DevProc * dvp = NULL;
BPTR lock = ZERO;
size_t name_len;
LONG error;
assert( name != NULL && link_length != NULL );
if(real_name != NULL && real_name_size > 0)
strcpy(real_name,"");
name_len = strlen(name);
if(name_len >= name_size)
{
SetIoErr(ERROR_LINE_TOO_LONG);
goto out;
}
/* Convert the name into a BCPL string. */
bname->name[0] = name_len;
memmove(&bname->name[1],name,name_len);
while(TRUE)
{
/* Get a handle on the device, volume or assignment name in the path. */
dvp = GetDeviceProc((STRPTR)name,dvp);
if(dvp == NULL)
goto out;
/* Try to obtain a lock on the object. */
lock = DoPkt(dvp->dvp_Port,ACTION_LOCATE_OBJECT,dvp->dvp_Lock,MKBADDR(bname),mode,0,0);
if(lock != ZERO)
break;
error = IoErr();
if(error == ERROR_OBJECT_NOT_FOUND)
{
/* If this is part of a multi-volume assignment, try the next part. */
if(FLAG_IS_SET(dvp->dvp_Flags,DVPF_ASSIGN))
continue;
/* Not much we can do here... */
break;
}
else if (error == ERROR_IS_SOFT_LINK)
{
size_t new_name_size = name_size+1;
LONG result;
/* Provide as much buffer space as possible. */
if(real_name_size > new_name_size)
new_name_size = real_name_size;
/* For soft link resolution we need a temporary buffer to
let the file system store the resolved path name in. */
new_name = malloc(new_name_size);
if(new_name == NULL)
{
SetIoErr(ERROR_NO_FREE_STORE);
goto out;
}
/* Now ask the file system to resolve the entire path. */
result = ReadLink(dvp->dvp_Port,dvp->dvp_Lock,(STRPTR)name,(STRPTR)new_name,(LONG)new_name_size);
if(result < 0)
{
/* This will return either -1 (resolution error) or -2
(buffer too small). We regard both as trouble. */
SetIoErr(ERROR_INVALID_COMPONENT_NAME);
goto out;
}
assert( result > 0 );
/* Remember the length of the link name. */
(*link_length) = result;
/* If the caller supplied a buffer, copy as much of the name
as possible into it. */
if(real_name != NULL && real_name_size > 0)
strlcpy(real_name,new_name,real_name_size);
/* Finished for now. */
break;
}
else
{
/* Some other error; ask if the user wants to have another go at it. */
if(ErrorReport(error,REPORT_LOCK,dvp->dvp_Lock,dvp->dvp_Port) != 0)
break;
}
/* Retry the lookup. */
FreeDeviceProc(dvp);
dvp = NULL;
}
out:
error = IoErr();
if(new_name != NULL)
free(new_name);
if(dvp != NULL)
FreeDeviceProc(dvp);
SetIoErr(error);
return(lock);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stat_lstat.c,v 1.14 2006-09-21 09:24:20 obarthel Exp $
* $Id: stat_lstat.c,v 1.15 2006-11-13 09:25:28 obarthel Exp $
*
* :ts=4
*
@@ -55,118 +55,6 @@
/****************************************************************************/
/*
* lstat_lock(): An implementation of Lock() which remembers whether or
* not it resolved soft links.
*
* Unfortunately is is limited to 255 character names.
*/
static BPTR
lstat_lock(const char *name,const int mode,int * link_length)
{
D_S(struct bcpl_name,bname);
const size_t name_size = sizeof(bname->name);
char * new_name = NULL;
struct DevProc * dvp = NULL;
BPTR lock = ZERO;
size_t name_len;
LONG error;
assert( name != NULL && link_length != NULL );
name_len = strlen(name);
if(name_len >= name_size)
{
SetIoErr(ERROR_LINE_TOO_LONG);
goto out;
}
/* Convert the name into a BCPL string. */
bname->name[0] = name_len;
memmove(&bname->name[1],name,name_len);
while(TRUE)
{
/* Get a handle on the device, volume or assignment name in the path. */
dvp = GetDeviceProc((STRPTR)name,dvp);
if(dvp == NULL)
goto out;
/* Try to obtain a lock on the object. */
lock = DoPkt(dvp->dvp_Port,ACTION_LOCATE_OBJECT,dvp->dvp_Lock,MKBADDR(bname),mode,0,0);
if(lock != ZERO)
break;
error = IoErr();
if(error == ERROR_OBJECT_NOT_FOUND)
{
/* If this is part of a multi-volume assignment, try the next part. */
if(FLAG_IS_SET(dvp->dvp_Flags,DVPF_ASSIGN))
continue;
/* Not much we can do here... */
break;
}
else if (error == ERROR_IS_SOFT_LINK)
{
LONG result;
/* For soft link resolution we need a temporary buffer to
let the file system store the resolved path name in. */
new_name = malloc(name_size);
if(new_name == NULL)
{
SetIoErr(ERROR_NO_FREE_STORE);
goto out;
}
/* Now ask the file system to resolve the entire path. */
result = ReadLink(dvp->dvp_Port,dvp->dvp_Lock,(STRPTR)name,(STRPTR)new_name,name_size);
if(result < 0)
{
/* This will return either -1 (resolution error) or -2
(buffer too small). We regard both as trouble. */
SetIoErr(ERROR_INVALID_COMPONENT_NAME);
goto out;
}
assert( result > 0 );
/* Remember the length of the link name. */
(*link_length) = result;
/* Finished for now. */
break;
}
else
{
/* Some other error; ask if the user wants to have another go at it. */
if(ErrorReport(error,REPORT_LOCK,dvp->dvp_Lock,dvp->dvp_Port) != 0)
break;
}
/* Retry the lookup. */
FreeDeviceProc(dvp);
dvp = NULL;
}
out:
error = IoErr();
if(new_name != NULL)
free(new_name);
FreeDeviceProc(dvp);
SetIoErr(error);
return(lock);
}
int
lstat(const char * path_name, struct stat * st)
{
@@ -247,7 +135,7 @@ lstat(const char * path_name, struct stat * st)
D(("trying to get a lock on '%s'",path_name));
PROFILE_OFF();
file_lock = lstat_lock(path_name,SHARED_LOCK,&link_length);
file_lock = __lock(path_name,SHARED_LOCK,&link_length,NULL,0);
PROFILE_ON();
if(file_lock == ZERO && link_length < 0)

View File

@@ -0,0 +1,72 @@
/*
* $Id: stdio_change_fd_action.c,v 1.1 2006-11-15 09:17:04 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _STDIO_HEADERS_H
#include "stdio_headers.h"
#endif /* _STDIO_HEADERS_H */
/****************************************************************************/
int
__change_fd_action(
int file_descriptor,
_file_action_fd_t new_action,
_file_action_fd_t * old_action_ptr)
{
int result = -1;
struct fd * fd;
if(old_action_ptr != NULL)
(*old_action_ptr) = NULL;
__stdio_lock();
fd = __get_file_descriptor(file_descriptor);
if(fd != NULL)
{
__fd_lock(fd);
if(old_action_ptr != NULL)
(*old_action_ptr) = (_file_action_fd_t)fd->fd_Action;
fd->fd_Action = (file_action_fd_t)new_action;
__fd_unlock(fd);
result = 0;
}
__stdio_unlock();
return(result);
}

View File

@@ -0,0 +1,72 @@
/*
* $Id: stdio_change_fd_user_data.c,v 1.1 2006-11-15 09:17:04 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _STDIO_HEADERS_H
#include "stdio_headers.h"
#endif /* _STDIO_HEADERS_H */
/****************************************************************************/
int
__change_fd_user_data(
int file_descriptor,
void * new_user_data,
void ** old_user_data_ptr)
{
int result = -1;
struct fd * fd;
if(old_user_data_ptr != NULL)
(*old_user_data_ptr) = NULL;
__stdio_lock();
fd = __get_file_descriptor(file_descriptor);
if(fd != NULL)
{
__fd_lock(fd);
if(old_user_data_ptr != NULL)
(*old_user_data_ptr) = fd->fd_UserData;
fd->fd_UserData = new_user_data;
__fd_unlock(fd);
result = 0;
}
__stdio_unlock();
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_duplicate_fd.c,v 1.5 2006-01-08 12:04:24 obarthel Exp $
* $Id: stdio_duplicate_fd.c,v 1.6 2006-10-10 13:39:26 obarthel Exp $
*
* :ts=4
*
@@ -55,8 +55,8 @@ __duplicate_fd(struct fd * duplicate_fd,struct fd * original_fd)
duplicate_fd->fd_Original = original_fd;
/* Add the duplicate at the beginning of the list. */
duplicate_fd->fd_NextLink = duplicate_fd->fd_Original->fd_NextLink;
duplicate_fd->fd_Original->fd_NextLink = duplicate_fd;
duplicate_fd->fd_NextAlias = duplicate_fd->fd_Original->fd_NextAlias;
duplicate_fd->fd_Original->fd_NextAlias = duplicate_fd;
__fd_unlock(original_fd);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_fdhookentry.c,v 1.33 2006-09-20 19:46:57 obarthel Exp $
* $Id: stdio_fdhookentry.c,v 1.34 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -81,64 +81,7 @@ __fd_hook_entry(
__fd_lock(fd);
#if defined(__THREAD_SAFE)
{
/* Check if this file should be dynamically bound to one of the
three standard I/O streams. */
if(FLAG_IS_SET(fd->fd_Flags,FDF_STDIO))
{
switch(fd->fd_DefaultFile)
{
case STDIN_FILENO:
file = Input();
break;
case STDOUT_FILENO:
file = Output();
break;
case STDERR_FILENO:
#if defined(__amigaos4__)
{
file = ErrorOutput();
}
#else
{
struct Process * this_process = (struct Process *)FindTask(NULL);
file = this_process->pr_CES;
}
#endif /* __amigaos4__ */
/* The following is rather controversial; if the standard error stream
is unavailable, we default to reuse the standard output stream. This
is problematic if the standard output stream was redirected and should
not be the same as the standard error output stream. */
if(file == ZERO)
file = Output();
break;
default:
file = ZERO;
break;
}
}
else
{
file = fd->fd_DefaultFile;
}
}
#else
{
file = fd->fd_DefaultFile;
}
#endif /* __THREAD_SAFE */
file = __resolve_fd_file(fd);
if(file == ZERO)
{
SHOWMSG("file is closed");
@@ -246,7 +189,7 @@ __fd_hook_entry(
{
/* Should we reset this file into line buffered mode? */
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING) && FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
SetMode(fd->fd_DefaultFile,DOSFALSE);
SetMode(fd->fd_File,DOSFALSE);
/* Are we allowed to close this file? */
if(FLAG_IS_CLEAR(fd->fd_Flags,FDF_NO_CLOSE))
@@ -265,14 +208,14 @@ __fd_hook_entry(
PROFILE_OFF();
parent_dir = __safe_parent_of_file_handle(fd->fd_DefaultFile);
parent_dir = __safe_parent_of_file_handle(fd->fd_File);
if(parent_dir != ZERO)
{
if(__safe_examine_file_handle(fd->fd_DefaultFile,fib))
if(__safe_examine_file_handle(fd->fd_File,fib))
name_and_path_valid = TRUE;
}
if(CANNOT Close(fd->fd_DefaultFile))
if(CANNOT Close(fd->fd_File))
{
fam->fam_Error = __translate_io_error_to_errno(IoErr());
@@ -281,7 +224,7 @@ __fd_hook_entry(
PROFILE_ON();
fd->fd_DefaultFile = ZERO;
fd->fd_File = ZERO;
#if defined(UNIX_PATH_SEMANTICS)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_file_init.c,v 1.11 2006-01-08 12:04:24 obarthel Exp $
* $Id: stdio_file_init.c,v 1.12 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -321,7 +321,7 @@ FILE_CONSTRUCTOR(stdio_file_init)
if(__WBenchMsg != NULL)
{
PROFILE_OFF();
__fd[STDERR_FILENO]->fd_DefaultFile = Output();
__fd[STDERR_FILENO]->fd_File = Output();
PROFILE_ON();
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_NO_CLOSE);
@@ -351,13 +351,13 @@ FILE_CONSTRUCTOR(stdio_file_init)
Otherwise, try to duplicate the standard output stream. */
if(ces != ZERO)
{
__fd[STDERR_FILENO]->fd_DefaultFile = ces;
__fd[STDERR_FILENO]->fd_File = ces;
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_NO_CLOSE);
}
else
{
__fd[STDERR_FILENO]->fd_DefaultFile = Open("CONSOLE:",MODE_NEWFILE);
__fd[STDERR_FILENO]->fd_File = Open("CONSOLE:",MODE_NEWFILE);
}
}
@@ -366,7 +366,7 @@ FILE_CONSTRUCTOR(stdio_file_init)
/* Figure out if the standard error stream is bound to a console. */
if(FLAG_IS_CLEAR(__fd[STDERR_FILENO]->fd_Flags,FDF_STDIO))
{
if(IsInteractive(__fd[STDERR_FILENO]->fd_DefaultFile))
if(IsInteractive(__fd[STDERR_FILENO]->fd_File))
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_IS_INTERACTIVE);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_fwrite.c,v 1.10 2006-01-08 12:04:24 obarthel Exp $
* $Id: stdio_fwrite.c,v 1.11 2006-09-25 15:38:21 obarthel Exp $
*
* :ts=4
*
@@ -104,7 +104,7 @@ fwrite(const void *ptr,size_t element_size,size_t count,FILE *stream)
if(element_size > 0 && count > 0)
{
unsigned char * data = (unsigned char *)ptr;
const unsigned char * data = (unsigned char *)ptr;
unsigned char c;
int buffer_mode;
size_t total_bytes_written = 0;

48
library/stdio_get_fd.c Normal file
View File

@@ -0,0 +1,48 @@
/*
* $Id: stdio_get_fd.c,v 1.1 2006-11-15 09:17:04 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2006 by Olaf Barthel <olsen (at) sourcery.han.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _STDIO_HEADERS_H
#include "stdio_headers.h"
#endif /* _STDIO_HEADERS_H */
/****************************************************************************/
struct _fd *
__get_fd(int file_descriptor)
{
struct _fd * result;
result = (struct _fd *)__get_file_descriptor(file_descriptor);
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_grow_file.c,v 1.6 2006-01-08 12:04:24 obarthel Exp $
* $Id: stdio_grow_file.c,v 1.7 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -70,7 +70,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
assert( FLAG_IS_CLEAR(fd->fd_Flags,FDF_STDIO) );
fh = BADDR(fd->fd_DefaultFile);
fh = BADDR(fd->fd_File);
if(fh != NULL && fh->fh_Type != NULL && DoPkt(fh->fh_Type,ACTION_DISK_INFO,MKBADDR(id),0,0,0,0))
block_size = id->id_BytesPerBlock;
@@ -105,7 +105,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
memset(aligned_buffer,0,(size_t)buffer_size);
PROFILE_OFF();
seek_position = Seek(fd->fd_DefaultFile,0,OFFSET_END);
seek_position = Seek(fd->fd_File,0,OFFSET_END);
PROFILE_ON();
if(seek_position == SEEK_ERROR && IoErr() != OK)
@@ -117,7 +117,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
position = (off_t)seek_position;
PROFILE_OFF();
seek_position = Seek(fd->fd_DefaultFile,0,OFFSET_CURRENT);
seek_position = Seek(fd->fd_File,0,OFFSET_CURRENT);
PROFILE_ON();
current_position = (off_t)seek_position;
@@ -147,7 +147,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
alignment_skip = 0;
PROFILE_OFF();
bytes_written = Write(fd->fd_DefaultFile,aligned_buffer,size);
bytes_written = Write(fd->fd_File,aligned_buffer,size);
PROFILE_ON();
if(bytes_written != size)

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_headers.h,v 1.26 2006-09-20 19:46:57 obarthel Exp $
* $Id: stdio_headers.h,v 1.30 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -144,6 +144,12 @@
/****************************************************************************/
#ifndef _SYS_CLIB2_IO_H
#include <sys/clib2_io.h>
#endif /* _SYS_CLIB2_IO_H */
/****************************************************************************/
/* Forward declarations for below... */
struct fd;
struct iob;
@@ -173,42 +179,6 @@ struct iob;
/****************************************************************************/
/* Operations that can be performed by the file action function. */
enum file_action_t
{
file_action_read,
file_action_write,
file_action_seek,
file_action_close,
file_action_set_blocking,
file_action_set_async,
file_action_examine
};
/****************************************************************************/
/* A message sent to a file action function. */
struct file_action_message
{
enum file_action_t fam_Action; /* What to do */
char * fam_Data; /* Where to read/write the data */
int fam_Size; /* How much data to write */
long int fam_Offset; /* The seek offset */
int fam_Mode; /* The seek mode */
int fam_Arg; /* Whether or not this file should
be set non-blocking or use
asynchronous I/O */
struct FileInfoBlock * fam_FileInfo;
struct MsgPort * fam_FileSystem;
int fam_Error; /* Error code, if any... */
};
/****************************************************************************/
/* The file action function for buffered files. */
typedef int (*file_action_iob_t)(struct iob * iob,struct file_action_message * fam);
@@ -342,31 +312,6 @@ struct iob
/****************************************************************************/
#define FDF_READ (1UL<<0) /* Data can be read from this file */
#define FDF_WRITE (1UL<<1) /* Data can be written to this file */
#define FDF_APPEND (1UL<<2) /* Before any data is written to it,
the file position must be set to the
end of the file */
#define FDF_NO_CLOSE (1UL<<3) /* Never close this file */
#define FDF_NON_BLOCKING (1UL<<4) /* File was switched into non-blocking
mode (console streams only) */
#define FDF_IS_SOCKET (1UL<<5) /* This is not a disk file but a socket */
#define FDF_IS_LOCKED (1UL<<6) /* This file has an advisory record lock set */
#define FDF_IN_USE (1UL<<7) /* This file is in use */
#define FDF_CREATED (1UL<<8) /* This file was newly created and may need
to have its protection bits updated after
it has been closed */
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
#define FDF_ASYNC_IO (1UL<<10) /* File was switched into asynchronous I/O
mode (sockets only). */
#define FDF_IS_INTERACTIVE (1UL<<11) /* File is attached to a console window or
something like it. */
#define FDF_STDIO (1UL<<12) /* File is to be attached to one of the
standard input/output/error streams. */
#define FDF_TERMIOS (1UL<<13) /* File is under termios control.
FDF_IS_INTERACTIVE should also be set. */
/****************************************************************************/
/* The file action function for unbuffered files. */
typedef int (*file_action_fd_t)(struct fd * fd,struct file_action_message * fam);
@@ -379,21 +324,34 @@ typedef void (*fd_cleanup_t)(struct fd * fd);
struct fd
{
file_action_fd_t fd_Action; /* Function to invoke to perform actions */
ULONG fd_Flags; /* File properties */
struct fd * fd_Original; /* NULL if this is not a dup()ed file
descriptor; points to original
descriptor if non-NULL */
struct fd * fd_NextLink; /* Points to next duplicate of this
file descriptor; NULL for none */
BPTR fd_DefaultFile; /* A dos.library file handle */
ULONG fd_Position; /* Cached file position (seek offset). */
fd_cleanup_t fd_Cleanup; /* Cleanup function, if any. */
int fd_Version; /* Version number of this definition
of the 'fd' data structure. */
file_action_fd_t fd_Action; /* Function to invoke to perform actions */
void * fd_UserData; /* To be used by custom file action
functions */
ULONG fd_Flags; /* File properties */
struct SignalSemaphore * fd_Lock; /* For thread locking */
union
{
BPTR fdu_File; /* A dos.library file handle */
LONG fdu_Socket; /* A socket identifier */
} fdu_Default;
void * fd_Aux; /* Auxilliary data for "special" files,
e.g. termios support. */
/************************************************************************/
/* Public portion ends here */
/************************************************************************/
struct SignalSemaphore * fd_Lock; /* For thread locking */
ULONG fd_Position; /* Cached file position (seek offset). */
fd_cleanup_t fd_Cleanup; /* Cleanup function, if any. */
struct fd * fd_Original; /* NULL if this is not a dup()ed file
descriptor; points to original
descriptor if non-NULL */
struct fd * fd_NextAlias; /* Points to next duplicate of this
file descriptor; NULL for none */
void * fd_Aux; /* Auxilliary data for "special" files,
e.g. termios support. */
};
/****************************************************************************/
@@ -433,7 +391,7 @@ extern int NOCOMMON __num_fd;
/****************************************************************************/
extern char * NOCOMMON __file_lock_semaphore_name;
extern const char * NOCOMMON __file_lock_semaphore_name;
/****************************************************************************/
@@ -481,7 +439,7 @@ extern BOOL NOCOMMON __no_standard_io;
/****************************************************************************/
#define __fd_is_aliased(fd) \
((fd)->fd_Original != NULL || (fd)->fd_NextLink != NULL)
((fd)->fd_Original != NULL || (fd)->fd_NextAlias != NULL)
/****************************************************************************/
@@ -501,6 +459,10 @@ extern void __fd_unlock(struct fd *fd);
/****************************************************************************/
extern BPTR __resolve_fd_file(struct fd * fd);
/****************************************************************************/
#else
/****************************************************************************/
@@ -517,6 +479,10 @@ extern void __fd_unlock(struct fd *fd);
/****************************************************************************/
#define __resolve_fd_file(fd) (fd->fd_File)
/****************************************************************************/
#endif /* __THREAD_SAFE */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_initializefd.c,v 1.6 2006-01-08 12:04:24 obarthel Exp $
* $Id: stdio_initializefd.c,v 1.7 2006-10-10 13:39:26 obarthel Exp $
*
* :ts=4
*
@@ -49,6 +49,7 @@ __initialize_fd(
memset(fd,0,sizeof(*fd));
fd->fd_Version = 1;
fd->fd_DefaultFile = default_file;
fd->fd_Flags = flags;
fd->fd_Action = action_function;

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_locksemaphorename.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $
* $Id: stdio_locksemaphorename.c,v 1.6 2006-09-25 14:05:31 obarthel Exp $
*
* :ts=4
*
@@ -37,4 +37,4 @@
/****************************************************************************/
char * NOCOMMON __file_lock_semaphore_name = (char *)"Advisory File Locking";
const char * NOCOMMON __file_lock_semaphore_name = "Advisory File Locking";

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_record_locking.c,v 1.16 2006-04-05 08:39:45 obarthel Exp $
* $Id: stdio_record_locking.c,v 1.19 2006-11-16 14:39:23 obarthel Exp $
*
* :ts=4
*
@@ -75,7 +75,7 @@ struct FileLockNode
struct MinList fln_LockedRegionList; /* List of locked regions */
BPTR fln_FileParentDir; /* Refers to the file's parent directory */
UBYTE fln_FileName[1]; /* Name of the file; together with the
char fln_FileName[1]; /* Name of the file; together with the
* parent directory, this should uniquely
* identify the file.
*/
@@ -298,7 +298,7 @@ remove_locked_region_node(struct FileLockSemaphore * fls,struct fd * fd,LONG sta
/* Find the locked file this descriptor
* buffer belongs to.
*/
if(find_file_lock_node_by_file_handle(fls,fd->fd_DefaultFile,&which_lock) == OK)
if(find_file_lock_node_by_file_handle(fls,fd->fd_File,&which_lock) == OK)
{
struct LockedRegionNode * lrn;
struct LockedRegionNode * lrn_next;
@@ -342,7 +342,7 @@ remove_locked_region_node(struct FileLockSemaphore * fls,struct fd * fd,LONG sta
{
CLEAR_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
}
while((fd = fd->fd_NextLink) != NULL);
while((fd = fd->fd_NextAlias) != NULL);
}
}
}
@@ -434,7 +434,7 @@ create_file_lock_node(struct fd * fd,struct FileLockNode ** result_ptr)
* and the name of the file for later use in
* comparisons.
*/
if(CANNOT __safe_examine_file_handle(fd->fd_DefaultFile,fib))
if(CANNOT __safe_examine_file_handle(fd->fd_File,fib))
{
SHOWMSG("couldn't examine file handle");
@@ -453,7 +453,7 @@ create_file_lock_node(struct fd * fd,struct FileLockNode ** result_ptr)
memset(fln,0,sizeof(*fln));
fln->fln_FileParentDir = __safe_parent_of_file_handle(fd->fd_DefaultFile);
fln->fln_FileParentDir = __safe_parent_of_file_handle(fd->fd_File);
if(fln->fln_FileParentDir == ZERO)
{
SHOWMSG("couldn't get parent directory");
@@ -462,7 +462,7 @@ create_file_lock_node(struct fd * fd,struct FileLockNode ** result_ptr)
goto out;
}
strcpy((char *)fln->fln_FileName,fib->fib_FileName);
strcpy(fln->fln_FileName,fib->fib_FileName);
NewList((struct List *)&fln->fln_LockedRegionList);
@@ -678,7 +678,7 @@ cleanup_locked_records(struct fd * fd)
fls = obtain_file_lock_semaphore(FALSE);
if(fls != NULL)
{
BPTR file_handle = fd->fd_DefaultFile;
BPTR file_handle = fd->fd_File;
struct FileLockNode * which_lock = NULL;
pid_t this_task = getpid();
LONG error;
@@ -725,7 +725,7 @@ cleanup_locked_records(struct fd * fd)
{
CLEAR_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
}
while((fd = fd->fd_NextLink) != NULL);
while((fd = fd->fd_NextAlias) != NULL);
}
release_file_lock_semaphore(fls);
@@ -741,7 +741,7 @@ int
__handle_record_locking(int cmd,struct flock * l,struct fd * fd,int * error_ptr)
{
struct FileLockSemaphore * fls = NULL;
BPTR file_handle = fd->fd_DefaultFile;
BPTR file_handle = fd->fd_File;
struct LockedRegionNode * lrn = NULL;
struct FileLockNode * fln = NULL;
D_S(struct FileInfoBlock,fib);
@@ -1086,7 +1086,7 @@ __handle_record_locking(int cmd,struct flock * l,struct fd * fd,int * error_ptr)
{
SET_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
}
while((fd = fd->fd_NextLink) != NULL);
while((fd = fd->fd_NextAlias) != NULL);
}
else if (cmd == F_SETLK)
{
@@ -1164,7 +1164,7 @@ __handle_record_locking(int cmd,struct flock * l,struct fd * fd,int * error_ptr)
{
SET_FLAG(fd->fd_Flags,FDF_IS_LOCKED);
}
while((fd = fd->fd_NextLink) != NULL);
while((fd = fd->fd_NextAlias) != NULL);
}
else if (cmd == F_GETLK)
{

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