mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
Compare commits
170 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7e201fea06 | |||
| 799ee705e8 | |||
| 3425e33cf9 | |||
| ef66e530b7 | |||
| fbc8694c49 | |||
| eb223f269d | |||
| 025b183b5a | |||
| 8051da3c9a | |||
| ac6d131dc3 | |||
| bb82ad015d | |||
| e403edd04a | |||
| c149db9037 | |||
| 34487c68b4 | |||
| a1b46cb3d4 | |||
| 75f1d5a57e | |||
| 2bc44bb0f2 | |||
| ac03cbb272 | |||
| fd33c09c41 | |||
| 2310605f10 | |||
| 7f0f7929ba | |||
| 3a63fb9ff8 | |||
| 718574aae5 | |||
| bdfdd84e38 | |||
| eeb4e5d7aa | |||
| a665fffff1 | |||
| a436ebdad1 | |||
| 81e66075e2 | |||
| 6bc8108a39 | |||
| f600c5e37a | |||
| 1bdfc0d143 | |||
| 37a1fdee4f | |||
| d10027ece7 | |||
| 60fbee698e | |||
| 933483d365 | |||
| 4291a0564f | |||
| 8a1347e61d | |||
| b9ad1fda3f | |||
| f28dcf8ed1 | |||
| 8eac1027a5 | |||
| 0b19424148 | |||
| f100199861 | |||
| f727c0f4c4 | |||
| 6a149abc57 | |||
| e3bde26409 | |||
| bbc98790fe | |||
| e7258bf939 | |||
| 4444438e8f | |||
| 6c50657673 | |||
| 7dcc410d0c | |||
| f0503cd915 | |||
| ca20eeab97 | |||
| 6148d06dca | |||
| 6578b303f7 | |||
| 6801a4fcf0 | |||
| fa4223c544 | |||
| 91ccaa5ba9 | |||
| 234a17cc07 | |||
| a41212e575 | |||
| 2591e249d7 | |||
| 5ea68e3265 | |||
| 0f3791a9a4 | |||
| e5a2a2b451 | |||
| ca1fc13792 | |||
| 3a0324e4ff | |||
| 77279e3224 | |||
| 75b0a762ef | |||
| c635fb3ffe | |||
| 70d1e4b7a3 | |||
| e9659f46d6 | |||
| acc795df55 | |||
| 66303e9ba2 | |||
| 7e1d5d6f6a | |||
| e789564429 | |||
| 350ffdb790 | |||
| 6809a5dd5b | |||
| 591ee2250e | |||
| 2b9d624d1d | |||
| bf4d3b763c | |||
| 9984a37cb4 | |||
| 0b833b8680 | |||
| b8ba11b158 | |||
| 872b2b335b | |||
| b1f56b1bbe | |||
| 9ce2ba234f | |||
| d5bfee3917 | |||
| 9f37f76b01 | |||
| 2f3de1dcd6 | |||
| 74b2838663 | |||
| 2c450a1e48 | |||
| 828e36f2d7 | |||
| 502d1aaab7 | |||
| d6e18a9266 | |||
| 3fe72eaa44 | |||
| 3541b011a6 | |||
| 7b903355a7 | |||
| 36c33073a5 | |||
| fba16b67fd | |||
| 5c29f84a0d | |||
| aa3240972a | |||
| 8aeb5072ab | |||
| 42dba39aef | |||
| 927407de1b | |||
| f3dcdfe1ce | |||
| ead90dee0d | |||
| 1721b10610 | |||
| 05ef0d30bc | |||
| 3a7ac52248 | |||
| 2c81be592c | |||
| e158a3fe18 | |||
| 40d64e1413 | |||
| 62d0c2dc81 | |||
| 940b8295c0 | |||
| a91cb96b1b | |||
| 864a0e703e | |||
| 5828c6cdab | |||
| cdfe0dad6f | |||
| 85122893ff | |||
| 9caa5b7ec4 | |||
| 6cf4cc5b4a | |||
| 42acda07f3 | |||
| 8633c3a77b | |||
| 5f42fb06f9 | |||
| 4e1c4967e6 | |||
| 2d48db0ce0 | |||
| e2cadc9ea5 | |||
| bde4d37a64 | |||
| c3d55e94ec | |||
| a1dc5e8e6e | |||
| 75a85db1a7 | |||
| d4528b2862 | |||
| b043a1ac1f | |||
| 83543472f1 | |||
| 601caa5708 | |||
| 2cf92a6395 | |||
| c26ee0ba7f | |||
| 41eef5e1aa | |||
| bbea0a86bd | |||
| 91b4f288f9 | |||
| 55ab845de0 | |||
| 184a2ada87 | |||
| 2e227506e5 | |||
| 2e4de301cc | |||
| 9c436ceaaa | |||
| bfedbbabd7 | |||
| 0266e8c0ad | |||
| 524b70034c | |||
| 48654e7cb4 | |||
| e40fc3dea2 | |||
| 230dcf2e26 | |||
| 98d26f36ac | |||
| 9be142d251 | |||
| b2bc0096dc | |||
| e833477448 | |||
| 23c2091ab4 | |||
| ca30ee62a2 | |||
| 9ab31bb996 | |||
| 26b8b9efbf | |||
| 67ff2ca833 | |||
| 797fcb89a1 | |||
| 0809248009 | |||
| 1153e58366 | |||
| 06e5f437d9 | |||
| fa8fc6959f | |||
| 954e614cb2 | |||
| a5a5e36119 | |||
| e4f9d1b7f6 | |||
| 0459ea1fc9 | |||
| fe29857567 | |||
| 5578c6a39e | |||
| 2b50d1586c |
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
*.o
|
||||
*.a
|
||||
/library/compiler.log
|
||||
/library/netinclude
|
||||
@ -1,13 +0,0 @@
|
||||
# The "checkoutlist" file is used to support additional version controlled
|
||||
# administrative files in $CVSROOT/CVSROOT, such as template files.
|
||||
#
|
||||
# The first entry on a line is a filename which will be checked out from
|
||||
# the corresponding RCS file in the $CVSROOT/CVSROOT directory.
|
||||
# The remainder of the line is an error message to use if the file cannot
|
||||
# be checked out.
|
||||
#
|
||||
# File format:
|
||||
#
|
||||
# [<whitespace>]<filename>[<whitespace><error message>]<end-of-line>
|
||||
#
|
||||
# comment lines begin with '#'
|
||||
@ -1,15 +0,0 @@
|
||||
# The "commitinfo" file is used to control pre-commit checks.
|
||||
# The filter on the right is invoked with the repository and a list
|
||||
# of files to check. A non-zero exit of the filter program will
|
||||
# cause the commit to be aborted.
|
||||
#
|
||||
# The first entry on a line is a regular expression which is tested
|
||||
# against the directory that the change is being committed to, relative
|
||||
# to the $CVSROOT. For the first match that is found, then the remainder
|
||||
# of the line is the name of the filter to run.
|
||||
#
|
||||
# If the repository name does not match any of the regular expressions in this
|
||||
# file, the "DEFAULT" line is used, if it is specified.
|
||||
#
|
||||
# If the name "ALL" appears as a regular expression it is always used
|
||||
# in addition to the first matching regex or "DEFAULT".
|
||||
@ -1,21 +0,0 @@
|
||||
# Set this to "no" if pserver shouldn't check system users/passwords
|
||||
#SystemAuth=no
|
||||
|
||||
# Put CVS lock files in this directory rather than directly in the repository.
|
||||
#LockDir=/var/lock/cvs
|
||||
|
||||
# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top
|
||||
# level of the new working directory when using the `cvs checkout'
|
||||
# command.
|
||||
#TopLevelAdmin=no
|
||||
|
||||
# Set `LogHistory' to `all' or `TOEFWUPCGMAR' to log all transactions to the
|
||||
# history file, or a subset as needed (ie `TMAR' logs all write operations)
|
||||
#LogHistory=TOEFWUPCGMAR
|
||||
|
||||
# Set `RereadLogAfterVerify' to `always' (the default) to allow the verifymsg
|
||||
# script to change the log message. Set it to `stat' to force CVS to verify# that the file has changed before reading it (this can take up to an extra
|
||||
# second per directory being committed, so it is not recommended for large
|
||||
# repositories. Set it to `never' (the previous CVS behavior) to prevent
|
||||
# verifymsg scripts from changing the log message.
|
||||
#RereadLogAfterVerify=always
|
||||
@ -1,19 +0,0 @@
|
||||
# This file affects handling of files based on their names.
|
||||
#
|
||||
# The -m option specifies whether CVS attempts to merge files.
|
||||
#
|
||||
# The -k option specifies keyword expansion (e.g. -kb for binary).
|
||||
#
|
||||
# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
|
||||
#
|
||||
# wildcard [option value][option value]...
|
||||
#
|
||||
# where option is one of
|
||||
# -f from cvs filter value: path to filter
|
||||
# -t to cvs filter value: path to filter
|
||||
# -m update methodology value: MERGE or COPY
|
||||
# -k expansion mode value: b, o, kkv, &c
|
||||
#
|
||||
# and value is a single-quote delimited value.
|
||||
# For example:
|
||||
#*.gif -k 'b'
|
||||
@ -1,21 +0,0 @@
|
||||
# The "editinfo" file is used to allow verification of logging
|
||||
# information. It works best when a template (as specified in the
|
||||
# rcsinfo file) is provided for the logging procedure. Given a
|
||||
# template with locations for, a bug-id number, a list of people who
|
||||
# reviewed the code before it can be checked in, and an external
|
||||
# process to catalog the differences that were code reviewed, the
|
||||
# following test can be applied to the code:
|
||||
#
|
||||
# Making sure that the entered bug-id number is correct.
|
||||
# Validating that the code that was reviewed is indeed the code being
|
||||
# checked in (using the bug-id number or a seperate review
|
||||
# number to identify this particular code set.).
|
||||
#
|
||||
# If any of the above test failed, then the commit would be aborted.
|
||||
#
|
||||
# Actions such as mailing a copy of the report to each reviewer are
|
||||
# better handled by an entry in the loginfo file.
|
||||
#
|
||||
# One thing that should be noted is the the ALL keyword is not
|
||||
# supported. There can be only one entry that matches a given
|
||||
# repository.
|
||||
@ -1,27 +0,0 @@
|
||||
# The "loginfo" file controls where "cvs commit" log information
|
||||
# is sent. The first entry on a line is a regular expression which must match
|
||||
# the directory that the change is being made to, relative to the
|
||||
# $CVSROOT. If a match is found, then the remainder of the line is a filter
|
||||
# program that should expect log information on its standard input.
|
||||
#
|
||||
# If the repository name does not match any of the regular expressions in this
|
||||
# file, the "DEFAULT" line is used, if it is specified.
|
||||
#
|
||||
# If the name ALL appears as a regular expression it is always used
|
||||
# in addition to the first matching regex or DEFAULT.
|
||||
#
|
||||
# You may specify a format string as part of the
|
||||
# filter. The string is composed of a `%' followed
|
||||
# by a single format character, or followed by a set of format
|
||||
# characters surrounded by `{' and `}' as separators. The format
|
||||
# characters are:
|
||||
#
|
||||
# s = file name
|
||||
# V = old version number (pre-checkin)
|
||||
# v = new version number (post-checkin)
|
||||
# t = tag or branch name
|
||||
#
|
||||
# For example:
|
||||
#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog
|
||||
# or
|
||||
#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog
|
||||
@ -1,26 +0,0 @@
|
||||
# Three different line formats are valid:
|
||||
# key -a aliases...
|
||||
# key [options] directory
|
||||
# key [options] directory files...
|
||||
#
|
||||
# Where "options" are composed of:
|
||||
# -i prog Run "prog" on "cvs commit" from top-level of module.
|
||||
# -o prog Run "prog" on "cvs checkout" of module.
|
||||
# -e prog Run "prog" on "cvs export" of module.
|
||||
# -t prog Run "prog" on "cvs rtag" of module.
|
||||
# -u prog Run "prog" on "cvs update" of module.
|
||||
# -d dir Place module in directory "dir" instead of module name.
|
||||
# -l Top-level directory only -- do not recurse.
|
||||
#
|
||||
# NOTE: If you change any of the "Run" options above, you'll have to
|
||||
# release and re-checkout any working directories of these modules.
|
||||
#
|
||||
# And "directory" is a path to a directory relative to $CVSROOT.
|
||||
#
|
||||
# The "-a" option specifies an alias. An alias is interpreted as if
|
||||
# everything on the right of the "-a" had been typed on the command line.
|
||||
#
|
||||
# You can encode a module within a module by using the special '&'
|
||||
# character to interpose another module into the current module. This
|
||||
# can be useful for creating a module that consists of many directories
|
||||
# spread out over the entire source repository.
|
||||
@ -1,12 +0,0 @@
|
||||
# The "notify" file controls where notifications from watches set by
|
||||
# "cvs watch add" or "cvs edit" are sent. The first entry on a line is
|
||||
# a regular expression which is tested against the directory that the
|
||||
# change is being made to, relative to the $CVSROOT. If it matches,
|
||||
# then the remainder of the line is a filter program that should contain
|
||||
# one occurrence of %s for the user to notify, and information on its
|
||||
# standard input.
|
||||
#
|
||||
# "ALL" or "DEFAULT" can be used in place of the regular expression.
|
||||
#
|
||||
# For example:
|
||||
#ALL mail -s "CVS notification" %s
|
||||
@ -1,13 +0,0 @@
|
||||
# The "rcsinfo" file is used to control templates with which the editor
|
||||
# is invoked on commit and import.
|
||||
#
|
||||
# The first entry on a line is a regular expression which is tested
|
||||
# against the directory that the change is being made to, relative to the
|
||||
# $CVSROOT. For the first match that is found, then the remainder of the
|
||||
# line is the name of the file that contains the template.
|
||||
#
|
||||
# If the repository name does not match any of the regular expressions in this
|
||||
# file, the "DEFAULT" line is used, if it is specified.
|
||||
#
|
||||
# If the name "ALL" appears as a regular expression it is always used
|
||||
# in addition to the first matching regex or "DEFAULT".
|
||||
@ -1,20 +0,0 @@
|
||||
# The "taginfo" file is used to control pre-tag checks.
|
||||
# The filter on the right is invoked with the following arguments:
|
||||
#
|
||||
# $1 -- tagname
|
||||
# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d
|
||||
# $3 -- repository
|
||||
# $4-> file revision [file revision ...]
|
||||
#
|
||||
# A non-zero exit of the filter program will cause the tag to be aborted.
|
||||
#
|
||||
# The first entry on a line is a regular expression which is tested
|
||||
# against the directory that the change is being committed to, relative
|
||||
# to the $CVSROOT. For the first match that is found, then the remainder
|
||||
# of the line is the name of the filter to run.
|
||||
#
|
||||
# If the repository name does not match any of the regular expressions in this
|
||||
# file, the "DEFAULT" line is used, if it is specified.
|
||||
#
|
||||
# If the name "ALL" appears as a regular expression it is always used
|
||||
# in addition to the first matching regex or "DEFAULT".
|
||||
@ -1,21 +0,0 @@
|
||||
# The "verifymsg" file is used to allow verification of logging
|
||||
# information. It works best when a template (as specified in the
|
||||
# rcsinfo file) is provided for the logging procedure. Given a
|
||||
# template with locations for, a bug-id number, a list of people who
|
||||
# reviewed the code before it can be checked in, and an external
|
||||
# process to catalog the differences that were code reviewed, the
|
||||
# following test can be applied to the code:
|
||||
#
|
||||
# Making sure that the entered bug-id number is correct.
|
||||
# Validating that the code that was reviewed is indeed the code being
|
||||
# checked in (using the bug-id number or a seperate review
|
||||
# number to identify this particular code set.).
|
||||
#
|
||||
# If any of the above test failed, then the commit would be aborted.
|
||||
#
|
||||
# Actions such as mailing a copy of the report to each reviewer are
|
||||
# better handled by an entry in the loginfo file.
|
||||
#
|
||||
# One thing that should be noted is the the ALL keyword is not
|
||||
# supported. There can be only one entry that matches a given
|
||||
# repository.
|
||||
292
README.md
Normal file
292
README.md
Normal file
@ -0,0 +1,292 @@
|
||||
# An ISO 'C' (1994) compliant runtime library for the Amiga
|
||||
|
||||
## What is this?
|
||||
|
||||
This is my attempt to get Samba 2.2.x ported to the Amiga. My first Amiga port required *SAS/C* and a number of strange tricks had to be pulled to get it to support the kind of environment Samba needed. But with the introduction of Samba 2.2.x many of those tricks did not work any more, which is why I decided to attack the problem at the root, namely the runtime library.
|
||||
|
||||
Because it was no longer possible to build Samba with *SAS/C* on the new Amiga platform, the idea came up to move development to the GNU 'C' compiler. This turned out to be a challenge due to its somewhat underdeveloped runtime library and header files. Eventually, I decided to rewrite that library from scratch.
|
||||
|
||||
|
||||
## What does it do?
|
||||
|
||||
Using *'C' - A reference manual* (4th edition) as a reference I wrote a set of header files, then proceeded to implement each single function referenced in them. With few exceptions in the area of wide character support, the result should be a feature complete implementation of the ISO 'C' (1994) runtime library. The library was subsequently updated to offer functionality defined in *ISO/IEC 9899:1999*, also known as *C99*.
|
||||
|
||||
Because Samba needs a few POSIX-like routines to be supported, the library functionality is complemented by a set of routines described in *Advanced programming in the Unix environment*.
|
||||
|
||||
This is not a portable implementation of the library in the sense that you could move it from one 'C' compiler on one operating system to another. This is an Amiga specific implementation.
|
||||
|
||||
The library supports floating point math, which, for the 68k platform, is limited to IEEE single and double precision or M68881 inline math. There is no support for the fast floating point (FFP) format or exclusive IEEE single precision. You either get double precision (IEEE math) or extended precision (M68881 inline math). What it is that you get is determined at compile time. Use the `IEEE_FLOATING_POINT_SUPPORT` preprocessor symbol to activate IEEE math code and the `M68881_FLOATING_POINT_SUPPORT` symbol for M68881 inline math.
|
||||
|
||||
For the PowerPC platform, the library uses code borrowed from <a href="http://www.netlib.org/fdlibm/">fdlibm 5.3</a>, which is a portable library of arithmetic functions developed by Sun Microsystems which, for example, is also used within the Java platform.
|
||||
|
||||
## What does it not do?
|
||||
|
||||
This library is a departure from the typical 'C' runtime environments of the past which had to run on all AmigaOS releases, down to *Kickstart 1.1*. This very library was designed to take advantage of the routines available since *Kickstart 2.04* was introduced and virtually nobody ever put to use. This helps to cut the code size, and it also helps to keep bugs out of the library by falling back onto well-tested implementations. However, the catch is that the code won't run under *Kickstart 1.3* and below. But then these operating system releases have been obsolete for more than a decade, and you can always go back to a compiler environment which supports them.
|
||||
|
||||
There is very little support for `amiga.lib` functionality. There is `NewList()`, `HookEntry()`, `CallHook()`, `CallHookA()`, the `DoMethod()` family, the *RexxVars* family, but that's all. If you need more, you would have to implement it yourself. Put another way, if you absolutely need functionality that is only found in `amiga.lib`, you really shouldn't need it in the first place.
|
||||
|
||||
|
||||
## Where does the source code come from?
|
||||
|
||||
I originally thought that it might be helpful to piece this library together from various sources, such as the BSD libc. It turned out that this code was so 'portable' that it became much more complex than it ought to be. Also, some side-effects were present which considerably changed the behaviour of the library. For example, the BSD libc uses `bcopy()` as an alias for `memcpy()`, and unlike `memcpy()` is documented to, `bcopy()` supports overlapping copies.
|
||||
|
||||
Eventually, I wrote virtually all the code myself, borrowing algorithmic ideas from the BSD libc and the *Manx Aztec 'C'* runtime library. Because I don't know much about the environment *GCC* expects, I borrowed code snippets from *libnix*, which was written by Matthias Fleischer and Gunther Nikl. This in particular concerns the integer and floating point math support, the `setjmp`/`longjmp` routines and the startup code. The M68881 inline math code comes from the `<math-68881.h>` file written by Matthew Self `(self [at] bayes.arc.nasa.gov)`.
|
||||
|
||||
|
||||
## Limitations and caveats
|
||||
|
||||
There is hardly any documentation on the code I wrote. In part this is due to the fact that the code itself is very simple in design. It should speak for itself. However, to make a usable runtime library you have to have a user documentation as in *man pages* or *AutoDocs*. We will eventually have to have *AutoDocs* for this library.
|
||||
|
||||
The exception handling in the math code is not particularly effective. For one part this is due to the fact that there is no exception handler installed by the runtime library when it starts up which could catch and process the error conditions the CPU or FPU generates. The idea was to provide for a portable runtime library with little to no assembly language involved. To make the exception handling complete, such code would be necessary.
|
||||
|
||||
The library currently builds under *SAS/C*, but because the 'normal' program startup code is not utilized, the base relative (A4) addressing does not work. If you are going to test it, use the `data=faronly` option to compile the library and the programs.
|
||||
|
||||
Different build *Makefiles* are supplied for use with *GCC*. There is a `GNUmakefile.68k` for the 68k platform and a `GNUmakefile.os4` for the AmigaOS4 PowerPC version.
|
||||
|
||||
### Floating point math and functions (`scanf()`, `printf()`, etc.)
|
||||
|
||||
The plain `libc.a`, which your software would be linked against by default, does not contain any floating point support code. This means, for example, that `printf("%f",...)` will not produce the desired output and that `scanf("%f",...)` may not read any data at all. If your program needs functions such as these or `atod()` then you must link against `libm.a` or the equivalent.
|
||||
|
||||
To link the floating point support code with your software, use the `-lm` compiler option.
|
||||
**Careful!** The order in which you specify the libraries to link against is important here. Thus, `gcc -o test test.c -lm -lc` would correctly link the program `test` against the proper floating point math library, but `gcc -o test test.c -lc -lm` would not.
|
||||
|
||||
### The thread-safe library
|
||||
|
||||
Thread-safety does not imply that you can have multiple callers access and close the same file. There is no resource tracking to that degree yet. All that the thread-safety tries to afford you is not to get into big trouble if simultaneous and overlapping accesses to files, memory allocation and other resources are taking place.
|
||||
|
||||
The library code is supposed to be thread-safe if built with the `__THREAD_SAFE` preprocessor symbol defined. Note that 'thread-safe' does **not** mean 'reentrant'. Multiple callers for certain library functions are permitted, but not for all of them. For example, `mkdtemp()` is not thread-safe, and neither is `rand()` or `localtime()`. But as per *POSIX 1003.1c-1995* there are thread-safe variants of `rand()` and `localtime()` called `rand_r()`, `localtime_r()`, and others.
|
||||
|
||||
The use of the socket I/O functions is problematic because the underlying `bsdsocket.library` API is not supposed to be used by any process other than the one which opened it. While one TCP/IP stack (my own "Roadshow") allows you to share the library base among different processes, if so configured, it is the exception. No other TCP/IP stack available for the Amiga robustly supports a similar feature. If the TCP/IP stack supports this feature, then the global variable `__can_share_socket_library_base` will be set to a non-zero value.
|
||||
|
||||
Errors reported by the socket I/O functions which modify the global variables `errno` and `h_errno` may be directed to call the `__set_errno()` and `__set_h_errno()` functions instead, if the TCP/IP stack supports this feature. The global variable `__thread_safe_errno_h_errno` will be set to a non-zero value if it does.
|
||||
|
||||
A much more serious problem resides with the `exit()`, `abort()`, `assert()` and `raise()` functions, and how the `SIGINT` signal is processed. In the thread-safe library only the `main()` function may directly or indirectly call the `exit()` function. No child process may do so, since this would wreck its stack context, crashing it instantly; the main program would be very likely to crash, too, because `exit()` will clean up after all memory allocations and files currently in use. Functions such as `abort()` and `raise()` may call the `exit()` function indirectly. And the `raise()` function may be invoked as part of the `Control+C` checking. You should make sure that the signal handling does not affect any child processes. This can be done by replacing the `__check_abort()` function or by disabling `SIGINT` processing altogether, such as through a `signal(SIGINT,SIG_IGN)` call.
|
||||
|
||||
Also take care with file I/O involving the `stdin`/`stdout`/`stderr` streams; read/write operations on these streams will be mapped to the `Input()`/`Output()`/`ErrorOutput()` file handles of the process performing these operations. Since only this small set of operations is mapped, functions such as `fcntl()` or `select()` will not work on the `stdin`/`stdout`/`stderr` streams and the corresponding file descriptors `STDIN_FILENO`/`STDOUT_FILENO`/`STDERR_FILENO`. It is therefore strongly recommended to use the thread-safe library only for applications which can cope with the limitations described above.
|
||||
|
||||
### Using gmon (PowerPC only)
|
||||
|
||||
To use profiling, two steps are required. First of all, your program must be compiled with the *GCC* command line option `-pg`. This instructs the compiler to generate special profiling code in the prologue and epilogue of each function. Additionally, the program must be linked against `libprofile.a`. To do this, either manually add `-lprofile` to the linker command line, or modify the specs file as follows. Find the lines that look like this (it may actually differ slightly from your specs file, but the important thing is that the line before the line to be modified reads `lib:`):
|
||||
|
||||
```
|
||||
lib:
|
||||
--start-group -lc --end-group
|
||||
```
|
||||
|
||||
You will have to modify this to look like this:
|
||||
|
||||
```
|
||||
lib:
|
||||
%{pg: -lprofile} --start-group -lc --end-group
|
||||
```
|
||||
|
||||
Normally, the `specs` file is located at the compiler's installation directory. For cross-compilers, this is `/usr/local/amiga/lib/gcc/ppc-amigaos/*compiler-version*/specs`. For a native compiler, it's in `gcc:lib/gcc/ppc-amigaos/*compiler-version*/specs`. Most likely, your compiler will already have this added to it's `specs` file.
|
||||
|
||||
Profiling makes use of a special PowerPC facility called the *Performance Monitor*. It allows to "mark" tasks and count only during while a marked task is running. This allows performance analysis to be made independent of the actual system load. The *Performance Monitor* is available on all PowerPC models supported by AmigaOS 4 except for the *603e*, and embedded versions of the PowerPC like the *405* and *440* series. Consult the manual of the appropriate chip for more information.
|
||||
|
||||
### Implementation defined behaviour
|
||||
|
||||
#### 'C' language
|
||||
|
||||
##### Environment
|
||||
|
||||
The `main(int argc,char **argv);` function may be called with an `argc` value of 0, in which case the `argv` variable will contain a pointer to the Amiga Workbench startup message, which is of type `struct WBStartup *`, and is defined in the Amiga system header file `<workbench/startup.h>`.
|
||||
|
||||
##### Characters
|
||||
|
||||
The current locale is derived from the current Amiga operating system locale settings. The `setlocale("")` function call will choose the current Amiga operating system locale settings. Any other name passed to the `setlocale()` function, with the exception of `"C"`, which selects the 'C' locale, must be a locale name, as used by the Amiga operating system function `OpenLocale()` in `locale.library`.
|
||||
|
||||
##### Floating-point
|
||||
|
||||
The 68k version of *clib2* supports single and double precision floating point numbers, according to the *IEEE 754* standard. The software floating point number support is built upon the Amiga operating system libraries `mathieeesingbas.library`, `mathieeedoubbas.library` and `mathieeedoubtrans.library`. The hardware floating point number support uses the M68881/M68882/M68040/M68060 floating point unit instead.
|
||||
|
||||
The PowerPC version of *clib2* supports only double precision floating point numbers, according to the *IEEE 754* standard, because that is exactly what the PowerPC CPU supports. Single precision numbers may be implicitly converted to double precision numbers. This also means that the *C99* data type `long double` is identical to the `double` data type. Because there is no difference between these two, the library omits support for *C99* functions specifically designed to operate on `long double` data types, such as `rintl()`.
|
||||
|
||||
Both the 68k and the PowerPC versions of *clib2* may call software floating point support routines in order to perform double and single precision operations that go beyond simple addition and multiplication, such as `sqrt()`. These functions come from Sun Microsystems <a href="http://www.netlib.org/fdlibm/">fdlibm 5.3</a> library.
|
||||
|
||||
Unless your software is linked against `libm.a` no floating point functions will be available to it, possibly causing a linker error. When using the GNU 'C' compiler, you will want to add the option `-lm -lc` to the linker command line.
|
||||
|
||||
The exception handling is currently entirely out of control of the developer and solely subject to the rules imposed by the operating system itself.
|
||||
|
||||
The `fmod()` function returns the value of the `x` parameter and sets `errno` to `EDOM` if the `y` parameter value is 0.
|
||||
|
||||
#### Library functions
|
||||
|
||||
##### `NULL`
|
||||
|
||||
The `NULL` pointer constant is defined in the `<stddef.h>` header and will expand to `((void *)0L)` if the 'C' compiler is used. For a C++ compiler the constant will expand to `0L` instead.
|
||||
|
||||
##### `assert()` diagnostic messages
|
||||
|
||||
The diagnostic messages printed by the `assert()` function take the following form:
|
||||
|
||||
> `[*program name*] *file*:*line*: failed assertion "*condition*".`
|
||||
|
||||
where:
|
||||
|
||||
Label | Meaning
|
||||
----- | -------
|
||||
program name | Optional program name; if the program name is not yet known, then the entire text enclosed in square brackets will be omitted.
|
||||
file | The value of the `__FILE__` symbol at the location of the `assert()` call.
|
||||
line | The value of the `__LINE__` symbol at the location of the `assert()` call.
|
||||
condition | The condition passed to the `assert()` function.
|
||||
|
||||
If available, the diagnostic messages will be sent to `stderr`.
|
||||
|
||||
If the program was launched from Workbench or if the global variable `__no_standard_io` is set to a non-zero value, then the assertion failure message will not be displayed in the shell window, but in a requester window. The diagnostic message shown in this window will take the following form:
|
||||
|
||||
> `Assertion of condition "*condition*" failed in file "*file*", line *line*.`
|
||||
|
||||
The name of the program, if it is know at that time, will be displayed in the requester window title.
|
||||
|
||||
##### Signal handling
|
||||
|
||||
Only the minimum of required signals are supported by this library. These are `SIGABRT`, `SIGFPE`, `SIGILL`, `SIGINT`, `SIGSEGV` and `SIGTERM`.
|
||||
|
||||
As of this writing `SIGFPE` is never called by the floating point library functions.
|
||||
|
||||
The `Ctrl+C` event is translated into `SIGINT`. Signal delivery may be delayed until a library function which polls for the signal examines it. This means, for example, that a runaway program caught in an infinite loop cannot be aborted by sending it a `Ctrl+C` event unless special code is added which tests for the presence of the signal and calls the `__check_abort()` function on its own accord.
|
||||
|
||||
Processing of the `Ctrl+C` event involves the internal `__check_abort()` function which polls for the presence of the event and which will call `raise(SIGINT);`. The `__check_abort()` function may be replaced by user code.
|
||||
|
||||
##### Files
|
||||
|
||||
No new line characters are written unless specifically requested.
|
||||
|
||||
Space characters in a text stream before a new line character are read in and are not discarded.
|
||||
|
||||
When data is read from a file, the last character does not have to be a new line character.
|
||||
|
||||
No `NUL` byte will be appended to data written to a binary stream.
|
||||
|
||||
There is no difference between text and binary streams.
|
||||
|
||||
Writing to a text or binary stream does not truncate the associated file. A stream may be truncated by the initial `fopen()` call if the `mode` parameter starts with the letter `w`.
|
||||
|
||||
The file position indicator is initially set to the end of an append mode stream.
|
||||
|
||||
##### `printf()` family
|
||||
|
||||
The `%p` conversion is the hexadecimal representation of the pointer, and it is preceded by the string `0x`.
|
||||
|
||||
The `%a`, `%e`, `%f`, `%g`, `%A`, `%E`, `%F` and `%G` specifiers will produce the string `inf` for infinity.
|
||||
|
||||
##### `scanf()` family
|
||||
|
||||
The input for the `%p` conversion must be a hexadecimal number, preceded by either the string `0x` or `0X`.
|
||||
|
||||
In the `%[` conversion a `-` (dash) character that is neither the first nor the last character in the scanset indicates that a subrange of characters should be used. Thus `%[a-d]` is equivalent to `%[abcd]`.
|
||||
|
||||
The period (.) is the decimal-point character. The locale specific decimal-point character is accepted as an alternative to the period (.).
|
||||
|
||||
##### `malloc()`, `realloc()` and `calloc()`
|
||||
|
||||
In the standard `libc.a` implementation any request to allocate 0 (zero) bytes will fail. A result value of `NULL` will be returned and the global `errno` variable will be set to `EINVAL`.
|
||||
|
||||
In the `libunix.a` implementation a request to allocate 0 (zero) bytes will result in an allocation of at least 4 bytes, which will be set to zero. Each zero length allocation will return a different memory address.
|
||||
|
||||
##### `rename()`
|
||||
|
||||
In the standard `libc.a` implementation the `rename()` function will fail if there already is a file or directory by the new name to be used.
|
||||
|
||||
In the `libunix.a` implementation the `rename()` function will delete any existing file or directory by the new name.
|
||||
|
||||
##### `remove()`
|
||||
|
||||
In the standard `libc.a` implementation the `remove()` function will fail if the file is protected by deletion or currently in use.
|
||||
|
||||
In the `libunix.a` implementation the `remove()` function will remove the file when the program exits or the file is closed.
|
||||
|
||||
##### `abort()`
|
||||
|
||||
The `abort()` function will flush all buffered files, close all the files currently open and delete temporary files.
|
||||
|
||||
##### `exit()` and `_Exit()`
|
||||
|
||||
The value passed to the `exit()` function will be passed to the Amiga operating system. The value of `EXIT_FAILURE` is equivalent to `RETURN_FAIL` as defined in the Amiga system header file `<dos/dos.h>`; this value maps to the number 20. The value of `EXIT_SUCCESS` is equivalent to `RETURN_OK` as defined in the Amiga system header file `<dos/dos.h>`; this value maps to the number 0.
|
||||
|
||||
The `_Exit()` function will flush all buffered files, close all the files currently open and delete temporary files.
|
||||
|
||||
##### `getenv()`
|
||||
|
||||
Environment data is retrieved from the global Amiga operating system environment storage area through the `dos.library/GetEnv()` function. Global variables are stored in files in the `ENV:` directory.
|
||||
|
||||
##### `system()`
|
||||
|
||||
If the `command` parameter is not NULL and the `system()` function returns, then the result will be equivalent to the exit code of the program invoked, or -1 if the program could not be started. This follows the behaviour of the Amiga operating system function `dos.library/System()`. A return value of 0 typically indicates successful execution and a value > 0 typically indicates failure.
|
||||
|
||||
##### Time
|
||||
|
||||
The default time zone is derived from the Amiga operating system locale settings and takes the form `GMT+*hh*` or `GMT-*hh*`, respectively, in which *hh* stands for the difference between the local time zone and Greenwich Mean Time (actually, this is not GMT but UTC).
|
||||
|
||||
The `clock_t` and `time_t` types are unsigned 32 bit integers. The `time_t` epoch starts with midnight January 1st, 1970.
|
||||
|
||||
Daylight savings time is not supported.
|
||||
|
||||
The reference point used by the `clock()` function is the time when the program was started.
|
||||
|
||||
#### Locale specific behaviour
|
||||
|
||||
The direction of printing is from left to right.
|
||||
|
||||
The period (.) is the decimal-point character.
|
||||
|
||||
The `strftime()` behaviour follows the Amiga operating system locale settings. If the 'C' locale is in effect, then the output generated by the `%Z` takes the form `GMT+*hh*` or `GMT-*hh*`, respectively, in which *hh* stands for the difference between the local time zone and Greenwich Mean Time (this is really UTC).
|
||||
|
||||
## Conventions and design issues
|
||||
|
||||
You will have noticed the 330+ files in this directory. This is not the best way to organize a runtime library, but at least all the bits and pieces are in plain sight. Each file stands for the one or two routines it contains. The name indicates what routine(s) that might be. Each file name is prefixed by the name of the header file in which the corresponding routine is defined. So, for example, you will find that `unistd_lchown.c` contains the definition of the `lchown()` routine, which has its prototype defined in the `<unistd.h>` header file.
|
||||
|
||||
Internal function and variables which need to be visible across several modules have names prefixed with two underscores, as in `__stdio_init()`.
|
||||
|
||||
By default all library routines follow the ISO 'C' conventions in that where implementation defined behaviour is permitted, the AmigaOS rules are followed. For example, `unlink()` will by default operate like `DeleteFile()` and `rename()` will return with an error code set if the name of the file/directory to be renamed would collide with an existing directory entry.
|
||||
|
||||
|
||||
## The startup code
|
||||
|
||||
There are three program startup files provided. The most simplistic is in `startup.c` which I use for *SAS/C*. It just invokes the setup routine which eventually calls `main()` and drops straight into `exit()`.
|
||||
|
||||
The `ncrt0.S` file was adapted from the *libnix* startup code which sets up the base relative data area, if necessary (the `SMALL_DATA` preprocessor symbol must be defined).
|
||||
|
||||
The `nrcrt0.S` file was adapted from *libnix* startup code, too, and sets up the base relative data area for programs to be made resident. Note that the `geta4()` stub is missing here; it wouldn't work in a resident program anyway.
|
||||
|
||||
The `ncrt0.S` and `nrcrt0.S` files are considerably smaller and less complex than the *libnix* code they are based on. This is because in this library design all the more complex tasks are performed in the `stdlib_main.c` file rather than in assembly language.
|
||||
|
||||
|
||||
## Documentation
|
||||
|
||||
Well, you're reading it. There isn't anything much yet. You can consult the book *'C' - A reference manual* and you could look at the
|
||||
<a href="http://www.opengroup.org/onlinepubs/007904975">Open Group's Single Unix
|
||||
Specification</a>.
|
||||
|
||||
It is recommended to browse the contents of the `include` directory. The header files contain information on library behaviour and not just data type and function prototype definitions. Specifically, the `<dos.h>` header file contains documentation about special libraries and global variables which may be used or replaced by user code.
|
||||
|
||||
|
||||
## Legal status
|
||||
|
||||
Because this library is in part based upon free software it would be uncourteous not to make it free software itself. The BSD license would probably be appropriate here.
|
||||
|
||||
The PowerPC math library is based in part on work by Sun Microsystems:
|
||||
|
||||
<pre>
|
||||
====================================================
|
||||
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
|
||||
Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
Permission to use, copy, modify, and distribute this
|
||||
software is freely granted, provided that this notice
|
||||
is preserved.
|
||||
====================================================
|
||||
</pre>
|
||||
|
||||
## Contacting the author
|
||||
|
||||
The basic work was done by Olaf Barthel during two weeks in July 2002. You can reach me at:
|
||||
|
||||
Olaf Barthel
|
||||
Gneisenaustr. 43
|
||||
D-31275 Lehrte
|
||||
|
||||
Or via e-mail:
|
||||
|
||||
obarthel [at] gmx.net
|
||||
@ -28,7 +28,8 @@ rewrite that library from scratch.</p>
|
||||
header files, then proceeded to implement each single function referenced in
|
||||
them. With few exceptions in the area of wide character support, the result
|
||||
should be a feature complete implementation of the ISO 'C' (1994) runtime
|
||||
library.</p>
|
||||
library. The library was subsequently updated to offer functionality defined in
|
||||
<i>ISO/IEC 9899:1999</i>, also known as <i>C99</i>.</p>
|
||||
|
||||
<p>Because Samba needs a few POSIX-like routines to be supported, the library
|
||||
functionality is complemented by a set of routines described in <i>Advanced
|
||||
@ -46,52 +47,10 @@ precision. You either get double precision (IEEE math) or extended precision
|
||||
Use the <tt>IEEE_FLOATING_POINT_SUPPORT</tt> preprocessor symbol to activate IEEE math
|
||||
code and the <tt>M68881_FLOATING_POINT_SUPPORT</tt> symbol for M68881 inline math.</p>
|
||||
|
||||
<p>For the PowerPC platform, the library uses code borrowed from fdlibm 5.3,
|
||||
<p>For the PowerPC platform, the library uses code borrowed from <i>fdlibm 5.3</i>,
|
||||
which is a portable library of arithmetic functions developed by Sun
|
||||
Microsystems which, for example, is also used within the Java platform.</p>
|
||||
|
||||
<p>Not unlike SAS/C, you can configure a minimum stack size the program is to use
|
||||
when it starts up. This is controlled via the <tt>__stack_size</tt> variable (see
|
||||
<tt>stdlib_main.c</tt>).</p>
|
||||
|
||||
<p>I added some <tt>amiga.lib</tt> and <tt>debug.lib</tt> functionality to the library, but don't
|
||||
count on it to be complete.</p>
|
||||
|
||||
<h3>2.1 Thread-safety</h3>
|
||||
|
||||
<p>The library code is supposed to be thread-safe if built with the <tt>__THREAD_SAFE</tt>
|
||||
preprocesssor symbold defined. Note that 'thread-safe' does <em>not</em> mean
|
||||
'reentrant'. Multiple callers for certain library functions are permitted, but
|
||||
not for all of them. For example, <tt>mkdtemp()</tt> is not thread-safe, and neither is
|
||||
<tt>rand()</tt> or <tt>localtime()</tt>. But as per <b>POSIX 1003.1c-1995</b> there are thread-safe
|
||||
variants of <tt>rand()</tt> and <tt>localtime()</tt> called <tt>rand_r()</tt>, <tt>localtime_r()</tt>, and others.</p>
|
||||
|
||||
<p>The use of the socket I/O functions is still problematic because the
|
||||
underlying <tt>bsdsocket.library</tt> API is not supposed to be used by any process
|
||||
other than the one that opened it. While one TCP/IP stack (my own "Roadshow") allows you
|
||||
to share the library base among different processes, if so configured, it is the
|
||||
exception. No other TCP/IP stack available for the Amiga robustly supports a similar
|
||||
feature. Any attempt to enable it by default would introduce incompatibilities which
|
||||
might be difficult to support.</p>
|
||||
|
||||
<p>Also yet unsolved is the issue of reading
|
||||
error codes from the <tt>errno</tt> variable which currently always contains the
|
||||
error code left by the last caller. This is also the case for the global <tt>h_errno</tt>
|
||||
variable, which the socket I/O name resolution functions may change.</p>
|
||||
|
||||
<p>A much more serious problem resides with the <tt>exit()</tt>, <tt>abort()</tt>,
|
||||
<tt>assert()</tt> and <tt>raise()</tt> functions, and the how <tt>SIGINT</tt> signal is
|
||||
processed. In the thread-safe library only the <tt>main()</tt> function may directly
|
||||
or indirectly call the <tt>exit()</tt> function. No child process may do so, since this
|
||||
would wreck its stack context, crashing it instantly; the main program would be very
|
||||
likely to crash, too, because <tt>exit()</tt> will clean up after all memory allocations
|
||||
and files currently in use. Functions such as <tt>abort()</tt> and <tt>raise()</tt> may
|
||||
call the <tt>exit()</tt> function indirectly. And the <tt>raise()</tt> function may
|
||||
be invoked as part of the <tt>Control+C</tt> checking. You should make sure that the
|
||||
signal handling does not affect any child processes. This can be done by replacing the
|
||||
<tt>__check_abort()</tt> function or by disabling <tt>SIGINT</tt> processing altogether,
|
||||
such as through a <tt>signal(SIGINT,SIG_IGN)</tt> call.</p>
|
||||
|
||||
<h2>3. What does it not do?</h2>
|
||||
|
||||
<p>This library is a departure from the typical 'C' runtime environments of the
|
||||
@ -108,13 +67,13 @@ to a compiler environment which supports them.</p>
|
||||
<tt>HookEntry()</tt>, <tt>CallHook()</tt>, <tt>CallHookA()</tt>, the <tt>DoMethod()</tt> family, the RexxVars
|
||||
family, but that's all. If you need more, you would have to implement it
|
||||
yourself. Put another way, if you absolutely need functionality that is only
|
||||
found in <tt>amiga.lib</tt>, you really shouldn't need in in the first place.</p>
|
||||
found in <tt>amiga.lib</tt>, you really shouldn't need it in the first place.</p>
|
||||
|
||||
|
||||
<h2>4. Where does the source code come from?</h2>
|
||||
|
||||
<p>I originally thought that it might be helpful to piece this library together
|
||||
from various sources, such as the BSD libc. Turned out that this code was so
|
||||
from various sources, such as the BSD libc. It turned out that this code was so
|
||||
'portable' that it became much more complex than it ought to be. Also, some
|
||||
side-effects were present which considerably changed the behaviour of the
|
||||
library. For example, the BSD libc uses <tt>bcopy()</tt> as an alias for <tt>memcpy()</tt>, and
|
||||
@ -126,7 +85,7 @@ much about the environment GCC expects, I borrowed code snippets from libnix,
|
||||
which was written by Matthias Fleischer and Gunther Nikl. This in particular
|
||||
concerns the integer and floating point math support, the <tt>setjmp</tt>/<tt>longjmp</tt>
|
||||
routines and the startup code. The M68881 inline math code comes from the
|
||||
<tt><math-68881.h></tt> file written by Matthew Self <tt>(self@bayes.arc.nasa.gov)</tt>.</p>
|
||||
<tt><math-68881.h></tt> file written by Matthew Self <tt>(self [at] bayes.arc.nasa.gov)</tt>.</p>
|
||||
|
||||
|
||||
<h2>5. Limitations and caveats</h2>
|
||||
@ -134,18 +93,9 @@ routines and the startup code. The M68881 inline math code comes from the
|
||||
<p>There is hardly any documentation on the code I wrote. In part this is due to
|
||||
the fact that the code itself is very simple in design. It should speak for
|
||||
itself. However, to make a usable runtime library you have to have a user
|
||||
documentation as in man pages or autodocs. We will eventually have to have
|
||||
documentation as in man pages or AutoDocs. We will eventually have to have
|
||||
autodocs for this library.</p>
|
||||
|
||||
<p>The code is currently plastered with assertions and debug code. It is
|
||||
therefore much larger than it ought to be and runs much slower than it ought
|
||||
to be. For example, the <tt>malloc()</tt> routine will set the contents of the memory
|
||||
allocated to a 'dirty' bit pattern which is likely to break software which
|
||||
makes assumptions about its contents. Likewise, the <tt>free()</tt> routine will trash
|
||||
the memory to deallocate with a different 'dirty' bit pattern to turn up reuse
|
||||
of memory after deallocation. All these debugging features can be disabled by
|
||||
defining the <tt>NDEBUG</tt> preprocessor symbol at compile time (see <tt><assert.h></tt>).</p>
|
||||
|
||||
<p>The exception handling in the math code is not particularly effective. For one
|
||||
part this is due to the fact that there is no exception handler installed by
|
||||
the runtime library when it starts up which could catch and process the error
|
||||
@ -158,8 +108,8 @@ startup code is not utilized, the base relative (A4) addressing does not work.
|
||||
If you are going to test it, use the <tt>data=faronly</tt> option to compile the
|
||||
library and the programs.</p>
|
||||
|
||||
<p>Different build makefiles are supplied for use with GCC. There is
|
||||
<tt>GNUmakefile.68k</tt> for the 68k platform and <tt>GNUmakefile.os4</tt> for the AmigaOS4
|
||||
<p>Different build makefiles are supplied for use with GCC. There is a
|
||||
<tt>GNUmakefile.68k</tt> for the 68k platform and a <tt>GNUmakefile.os4</tt> for the AmigaOS4
|
||||
PowerPC version.</p>
|
||||
|
||||
<h3>5.1 Floating point math and functions (<tt>scanf()</tt>, <tt>printf()</tt>, etc.) </h3>
|
||||
@ -170,7 +120,7 @@ the desired output and that <tt>scanf("%f",...)</tt> may not read any data at al
|
||||
program needs functions such as these or <tt>atod()</tt> then you must link against <tt>libm.a</tt> or
|
||||
the equivalent.</p>
|
||||
|
||||
<p>To link the floating point support code with your software, use the <tt>-lm</tt> compiler option. Careful!
|
||||
<p>To link the floating point support code with your software, use the <tt>-lm</tt> compiler option. <em>Careful!</em>
|
||||
The order in which you specify the libraries to link against is important here. Thus, <tt>gcc -o test test.c -lm -lc</tt>
|
||||
would correctly link the program <tt>test</tt> against the proper floating point math library, but
|
||||
<tt>gcc -o test test.c -lc -lm</tt> would not.</p>
|
||||
@ -183,8 +133,41 @@ yet. All that the thread-safety tries to afford you is not to get into big troub
|
||||
if simultaneous and overlapping accesses to files, memory allocation and other
|
||||
resources are taking place.</p>
|
||||
|
||||
<p>The library code is supposed to be thread-safe if built with the <tt>__THREAD_SAFE</tt>
|
||||
preprocesssor symbol defined. Note that 'thread-safe' does <em>not</em> mean
|
||||
'reentrant'. Multiple callers for certain library functions are permitted, but
|
||||
not for all of them. For example, <tt>mkdtemp()</tt> is not thread-safe, and neither is
|
||||
<tt>rand()</tt> or <tt>localtime()</tt>. But as per <i>POSIX 1003.1c-1995</i> there are thread-safe
|
||||
variants of <tt>rand()</tt> and <tt>localtime()</tt> called <tt>rand_r()</tt>, <tt>localtime_r()</tt>, and others.</p>
|
||||
|
||||
<p>The use of the socket I/O functions is problematic because the
|
||||
underlying <tt>bsdsocket.library</tt> API is not supposed to be used by any process
|
||||
other than the one which opened it. While one TCP/IP stack (my own "Roadshow") allows you
|
||||
to share the library base among different processes, if so configured, it is the
|
||||
exception. No other TCP/IP stack available for the Amiga robustly supports a similar
|
||||
feature. If the TCP/IP stack supports this feature, then the global variable
|
||||
<tt>__can_share_socket_library_base</tt> will be set to a non-zero value.</p>
|
||||
|
||||
<p>Errors reported by the socket I/O functions which modify the global variables
|
||||
<tt>errno</tt> and <tt>h_errno</tt> may be directed to call the <tt>__set_errno()</tt>
|
||||
and <tt>__set_h_errno()</tt> functions instead, if the TCP/IP stack supports this feature. The global
|
||||
variable <tt>__thread_safe_errno_h_errno</tt> will be set to a non-zero value if it does.</p>
|
||||
|
||||
<p>A much more serious problem resides with the <tt>exit()</tt>, <tt>abort()</tt>,
|
||||
<tt>assert()</tt> and <tt>raise()</tt> functions, and how the <tt>SIGINT</tt> signal is
|
||||
processed. In the thread-safe library only the <tt>main()</tt> function may directly
|
||||
or indirectly call the <tt>exit()</tt> function. No child process may do so, since this
|
||||
would wreck its stack context, crashing it instantly; the main program would be very
|
||||
likely to crash, too, because <tt>exit()</tt> will clean up after all memory allocations
|
||||
and files currently in use. Functions such as <tt>abort()</tt> and <tt>raise()</tt> may
|
||||
call the <tt>exit()</tt> function indirectly. And the <tt>raise()</tt> function may
|
||||
be invoked as part of the <tt>Control+C</tt> checking. You should make sure that the
|
||||
signal handling does not affect any child processes. This can be done by replacing the
|
||||
<tt>__check_abort()</tt> function or by disabling <tt>SIGINT</tt> processing altogether,
|
||||
such as through a <tt>signal(SIGINT,SIG_IGN)</tt> call.</p>
|
||||
|
||||
<p> Also take care with file I/O involving the <tt>stdin</tt>/<tt>stdout</tt>/<tt>stderr</tt>
|
||||
streams; read/write operations on these streams will be mapped to the <tt>Input()</tt>/</tt>Output()</tt>/<tt>ErrorOutput()</tt>
|
||||
streams; read/write operations on these streams will be mapped to the <tt>Input()</tt>/<tt>Output()</tt>/<tt>ErrorOutput()</tt>
|
||||
file handles of the process performing these operations. Since only this small set of
|
||||
operations is mapped, functions such as <tt>fcntl()</tt> or <tt>select()</tt> will not
|
||||
work on the <tt>stdin</tt>/<tt>stdout</tt>/<tt>stderr</tt> streams and the corresponding
|
||||
@ -210,7 +193,7 @@ You will have to modify this to look like this:
|
||||
lib:
|
||||
%{pg: -lprofile} --start-group -lc --end-group
|
||||
</pre>
|
||||
Normally, the specs file is located at the compilers installation directory. For cross-compilers,
|
||||
<p>Normally, the specs file is located at the compilers installation directory. For cross-compilers,
|
||||
this is <tt>/usr/local/amiga/lib/gcc/ppc-amigaos/<i>compiler-version</i>/specs</tt>. For a native compiler,
|
||||
it's in <tt>gcc:lib/gcc/ppc-amigaos/<i>compiler-version</i>/specs</tt>. Most likely, your compiler will already have this added to it's specs file.</p>
|
||||
|
||||
@ -221,6 +204,229 @@ is available on all PowerPC models supported by AmigaOS 4 except for the <tt>603
|
||||
embedded versions of the PowerPC like the <tt>405</tt> and <tt>440</tt> series. Consult the manual
|
||||
of the appropriate chip for more information.</p>
|
||||
|
||||
<h3>5.4 Implementation defined behaviour</h3>
|
||||
|
||||
<h4>5.4.1. 'C' language</h4>
|
||||
|
||||
<h5>5.4.1.1. Environment</h5>
|
||||
|
||||
<p>The <tt>main(int argc,char **argv);</tt> function may be called with an <tt>argc</tt> value of 0,
|
||||
in which case the <tt>argv</tt> variable will contain a pointer to the Amiga Workbench startup
|
||||
message, which is of type <tt>struct WBStartup *</tt>, and is defined in the Amiga system header
|
||||
file <tt><workbench/startup.h></tt>.</p>
|
||||
|
||||
<h5>5.4.1.2. Characters</h5>
|
||||
|
||||
<p>The current locale is derived from the current Amiga operating system locale settings. The
|
||||
<tt>setlocale("")</tt> function call will choose the current Amiga operating system locale settings.
|
||||
Any other name passed to the <tt>setlocale()</tt> function, with the exception of <tt>"C"</tt>,
|
||||
which selects the 'C' locale, must be a locale name, as used by the Amiga operating system
|
||||
function <tt>OpenLocale()</tt> in <tt>locale.library</tt>.</p>
|
||||
|
||||
<h5>5.4.1.3. Floating-point</h5>
|
||||
|
||||
<p>The 68k version of clib2 supports single and double precision floating point numbers,
|
||||
according to the <i>IEEE 754</i> standard. The software floating point number support is built upon the Amiga
|
||||
operating system libraries <tt>mathieeesingbas.library</tt>, <tt>mathieeedoubbas.library</tt>
|
||||
and <tt>mathieeedoubtrans.library</tt>. The hardware floating point number support uses
|
||||
the M68881/M68882/M68040/M68060 floating point unit intead.</p>
|
||||
|
||||
<p>The PowerPC version of clib2 supports only double precision floating point numbers, according to
|
||||
the <i>IEEE 754</i> standard, because that is exactly what the PowerPC CPU supports. Single precision
|
||||
numbers may be implicitly converted to double precision numbers. This also means that the <i>C99</i>
|
||||
data type <tt>long double</tt> is identical to the <tt>double</tt> data type. Because there is no
|
||||
difference between these two, the library omits support for <i>C99</i> functions specifically designed
|
||||
to operate on <tt>long double</tt> data types, such as <tt>rintl()</tt>.</p>
|
||||
|
||||
<p>Both the 68k and the PowerPC versions of clib2 may call software floating point support
|
||||
routines in order to perform double and single precision operations that go beyond
|
||||
simple addition and multiplication, such as <tt>sqrt()</tt>. These functions come from
|
||||
Sun Microsystems <i>fdlibm 5.3</i> library.</p>
|
||||
|
||||
<p>Unless your software is linked against <tt>libm.a</tt> no floating point functions will
|
||||
be available to it, possibly causing a linker error. When using the GNU 'C' compiler, you will
|
||||
want to add the option <tt>-lm -lc</tt> to the linker command line.</p>
|
||||
|
||||
<p>The exception handling is currently entirely out of control of the developer
|
||||
and solely subject to the rules imposed by the operating system itself.</p>
|
||||
|
||||
<p>The <tt>fmod()</tt> function returns the value of the <tt>x</tt> parameter and
|
||||
sets <tt>errno</tt> to <tt>EDOM</tt> if the <tt>y</tt> parameter value is 0.</p>
|
||||
|
||||
<h4>5.4.2. Library functions</h4>
|
||||
|
||||
<h5>5.4.2.1. <tt>NULL</tt></h5>
|
||||
|
||||
<p>The <tt>NULL</tt> pointer constant is defined in the <tt><stddef.h></tt> header and
|
||||
will expand to <tt>((void *)0L)</tt> if the 'C' compiler is used. For a C++ compiler the constant
|
||||
will expand to <tt>0L</tt> instead.</p>
|
||||
|
||||
<h5>5.4.2.2. <tt>assert()</tt> diagnostic messages</h5>
|
||||
|
||||
<p>The diagnostic messages printed by the <tt>assert()</tt> function take the following form:</p>
|
||||
|
||||
<blockquote><tt>[<i>program name</i>] <i>file</i>:<i>line</i>: failed assertion "<i>condition</i>".</tt></blockquote>
|
||||
|
||||
<p>where:</p>
|
||||
<table border=0>
|
||||
<tr><th align=right>program name</th><td>Optional program name; if the program name is not yet known, then the
|
||||
entire text enclosed in square brackets will be omitted.</td></tr>
|
||||
<tr><th align=right>file</th><td>The value of the <tt>__FILE__</tt> symbol at the location of the <tt>assert()</tt> call.</td></tr>
|
||||
<tr><th align=right>line</th><td>The value of the <tt>__LINE__</tt> symbol at the location of the <tt>assert()</tt> call.</td></tr>
|
||||
<tr><th align=right>condition</th><td>The condition passed to the <tt>assert()</tt> function.</td></tr>
|
||||
</table>
|
||||
|
||||
<p>If available, the diagnostic messages will be sent to <tt>stderr</tt>.</p>
|
||||
|
||||
<p>If the program was launched from Workbench or if the global variable <tt>__no_standard_io</tt> is set
|
||||
to a non-zero value, then the assertion failure message will not be displayed in the shell window, but
|
||||
in a requester window. The diagnostic message shown in this window will take the following form:</p>
|
||||
|
||||
<blockquote><tt>Assertion of condition "<i>condition</i>" failed in file "<i>file</i>", line <i>line</i>.</tt></blockquote>
|
||||
|
||||
<p>The name of the program, if it is know at that time, will be displayed in the requester window title.</p>
|
||||
|
||||
<h5>5.4.2.3. Signal handling</h5>
|
||||
|
||||
<p>Only the minimum of required signals are supported by this library. These are <tt>SIGABRT</tt>, <tt>SIGFPE</tt>,
|
||||
<tt>SIGILL</tt>, <tt>SIGINT</tt>, <tt>SIGSEGV</tt> and <tt>SIGTERM</tt>.</p>
|
||||
|
||||
<p>As of this writing <tt>SIGFPE</tt> is never called by the floating point library functions.</p>
|
||||
|
||||
<p>The <tt>Ctrl+C</tt> event is translated into <tt>SIGINT</tt>. Signal delivery may be delayed
|
||||
until a library function which polls for the signal examines it. This means, for example, that
|
||||
a runaway program caught in an infinite loop cannot be aborted by sending it a <tt>Ctrl+C</tt> event unless special code
|
||||
is added which tests for the presence of the signal and calls the <tt>__check_abort()</tt> all on its own.</p>
|
||||
|
||||
<p>Processing of the <tt>Ctrl+C</tt> event involves the internal <tt>__check_abort()</tt> function which
|
||||
polls for the presence of the event and which will call <tt>raise(SIGINT);</tt>. The <tt>__check_abort()</tt>
|
||||
function may be replaced by user code.</p>
|
||||
|
||||
<h5>5.4.2.4. Files</h5>
|
||||
|
||||
<p>No new line characters are written unless specifically requested.</p>
|
||||
|
||||
<p>Space characters in a text stream before a new line character are read in and not discarded.</p>
|
||||
|
||||
<p>When data is read from a file, the last character does not have to be a new line character.</p>
|
||||
|
||||
<p>No NUL byte will be appended to data written to a binary stream.</p>
|
||||
|
||||
<p>There is no difference between text and binary streams.</p>
|
||||
|
||||
<p>Writing to a text or binary stream does not truncate the associated file. A stream may be
|
||||
truncated by the initial <tt>fopen()</tt> call if the <tt>mode</tt> parameter starts with
|
||||
the letter <tt>w</tt>.</p>
|
||||
|
||||
<p>The file position indicator is initially set to the end of an append mode stream.</p>
|
||||
|
||||
<h5>5.4.2.5. <tt>printf()</tt> family</h5>
|
||||
|
||||
<p>The <tt>%p</tt> conversion is the hexadecimal representation of the pointer, and
|
||||
it is preceded by the string <tt>0x</tt>.</p>
|
||||
|
||||
<p>The <tt>%a</tt>, <tt>%e</tt>, <tt>%f</tt>, <tt>%g</tt>, <tt>%A</tt>,
|
||||
<tt>%E</tt>, <tt>%F</tt> and <tt>%G</tt> specifiers will produce the string <tt>inf</tt>
|
||||
for infinity.</p>
|
||||
|
||||
<h5>5.4.2.6. <tt>scanf()</tt> family</h5>
|
||||
|
||||
<p>The input for the <tt>%p</tt> conversion must be a hexadecimal number,
|
||||
preceded by either the string <tt>0x</tt> or <tt>0X</tt>.</p>
|
||||
|
||||
<p>In the <tt>%[</tt> conversion a <tt>-</tt> (dash) character that is neither the
|
||||
first nor the last character in the scanset indicates that a subrange of
|
||||
characters should be used. Thus <tt>%[a-d]</tt> is equivalent to <tt>%[abcd]</tt>.</p>
|
||||
|
||||
<p>The period (.) is the decimal-point character. The locale specific decimal-point
|
||||
character is accepted as an alternative to the period (.).</p>
|
||||
|
||||
<h5>5.4.2.7. <tt>malloc()</tt>, <tt>realloc()</tt> and <tt>calloc()</tt></h5>
|
||||
|
||||
<p>In the standard <tt>libc.a</tt> implementation any request to allocate
|
||||
0 (zero) bytes will fail. A result value of <tt>NULL</tt> will be returned and
|
||||
the global <tt>errno</tt> variable will be set to <tt>EINVAL</tt>.</p>
|
||||
|
||||
<p>In the <tt>libunix.a</tt> implementation a request to allocate
|
||||
0 (zero) bytes will result in an allocation of at least 4 bytes, which will
|
||||
be set to zero. Each zero length allocation will return a different
|
||||
memory address.</p>
|
||||
|
||||
<h5>5.4.2.8. <tt>rename()</tt></h5>
|
||||
|
||||
<p>In the standard <tt>libc.a</tt> implementation the <tt>rename()</tt> function
|
||||
will fail if there already is a file or directory by the new name to be used.</p>
|
||||
|
||||
<p>In the <tt>libunix.a</tt> implementation the <tt>rename()</tt> function will
|
||||
delete any existing file or directory by the new name.</p>
|
||||
|
||||
<h5>5.4.2.9. <tt>remove()</tt></h5>
|
||||
|
||||
<p>In the standard <tt>libc.a</tt> implementation the <tt>remove()</tt> function
|
||||
will fail if the file is protected by deletion or currently in use.</p>
|
||||
|
||||
<p>In the <tt>libunix.a</tt> implementation the <tt>remove()</tt> function
|
||||
will remove the file when the program exits or the file is closed.</p>
|
||||
|
||||
<h5>5.4.2.10. <tt>abort()</tt></h5>
|
||||
|
||||
<p>The <tt>abort()</tt> function will flush all buffered files,
|
||||
close all the files currently open and delete temporary files.</p>
|
||||
|
||||
<h5>5.4.2.11. <tt>exit()</tt> and <tt>_Exit()</tt></h5>
|
||||
|
||||
<p>The value passed to the <tt>exit()</tt> function will be passed to the
|
||||
Amiga operating system. The value of <tt>EXIT_FAILURE</tt> is equivalent
|
||||
to <tt>RETURN_FAIL</tt> as defined in the Amiga system header file
|
||||
<tt><dos/dos.h></tt>; this value maps to the number 20. The value
|
||||
of <tt>EXIT_SUCCESS</tt> is equivalent to <tt>RETURN_OK</tt> as defined in
|
||||
the Amiga system header file <tt><dos/dos.h></tt>; this value maps to
|
||||
the number 0.</p>
|
||||
|
||||
<p>The <tt>_Exit()</tt> function will flush all buffered files,
|
||||
close all the files currently open and delete temporary files.</p>
|
||||
|
||||
<h5>5.4.2.12. <tt>getenv()</tt></h5>
|
||||
|
||||
<p>Environment data is retrieved from the global Amiga operating system environment
|
||||
storage area through the <tt>dos.library/GetEnv()</tt> function. Global variables are
|
||||
stored in files in the <tt>ENV:</tt> directory.</p>
|
||||
|
||||
<h5>5.4.2.13. <tt>system()</tt></h5>
|
||||
|
||||
<p>If the <tt>command</tt> parameter is not NULL and the <tt>system()</tt> function returns, then the result will
|
||||
be equivalent to the exit code of the program invoked, or -1 if the program could not be started.
|
||||
This follows the behaviour of the Amiga operating system function <tt>dos.library/System()</tt>.
|
||||
A return value of 0 typically indicates successful execution and a value > 0
|
||||
typically indicates failure.</p>
|
||||
|
||||
<h5>5.4.2.14. Time</h5>
|
||||
|
||||
<p>The default time zone is derived from the Amiga operating system locale
|
||||
settings and takes the form <tt>GMT+<i>hh</i></tt> or <tt>GMT-<i>hh</i></tt>,
|
||||
respectively, in which <i>hh</i> stands for the difference between the local
|
||||
time zone and Greenwich Mean Time.</p>
|
||||
|
||||
<p>The <tt>clock_t</tt> and <tt>time_t</tt> types are unsigned 32 bit integers.
|
||||
The <tt>time_t</tt> epoch starts with midnight January 1st, 1970.</p>
|
||||
|
||||
<p>Daylight savings time is not supported.</p>
|
||||
|
||||
<p>The reference point used by the <tt>clock()</tt> function is the time
|
||||
when the program was started.</p>
|
||||
|
||||
<h4>5.4.3. Locale specific behaviour</h4>
|
||||
|
||||
<p>The direction of printing is from left to right.</p>
|
||||
|
||||
<p>The period (.) is the decimal-point character.</p>
|
||||
|
||||
<p>The <tt>strftime()</tt> behaviour follows the Amiga operating system locale
|
||||
settings. If the 'C' locale is in effect, then the output generated by the
|
||||
<tt>%Z</tt> takes the form <tt>GMT+<i>hh</i></tt> or <tt>GMT-<i>hh</i></tt>,
|
||||
respectively, in which <i>hh</i> stands for the difference between the local
|
||||
time zone and Greenwich Mean Time.</p>
|
||||
|
||||
<h2>6. Conventions and design issues</h2>
|
||||
|
||||
<p>You will have noticed the 330+ files in this directory. This is not the best
|
||||
@ -235,30 +441,11 @@ file.</p>
|
||||
<p>Internal function and variables which need to be visible across several
|
||||
modules have names prefixed with two underscores, as in <tt>__stdio_init()</tt>.</p>
|
||||
|
||||
<p>All routines attempt to do error checking on their parameters. They will
|
||||
either drop into an <tt>assert()</tt> or set an errno value and refuse to go any
|
||||
further. This cuts performance but should help to catch the simple bugs quite
|
||||
easily (<tt>NULL</tt> pointers).</p>
|
||||
|
||||
<p>Just like any halfway sane Amiga 'C' runtime library, this one performs its <tt>^C</tt>
|
||||
checking in the I/O routines. Typically once upon entry and in every iteration
|
||||
of the loop there might be it will quickly poll the <tt>^C</tt> signal and drop into
|
||||
<tt>raise(SIGINT)</tt> in case the signal is set. This is just about the safest method
|
||||
to solve the problem and should be much more robust than the ixemul approach
|
||||
of 'interrupt anywhere - crash anywhere' using the task switch/launch hooks to
|
||||
test for signals.</p>
|
||||
|
||||
<p>By default all library routines follow the ISO 'C' conventions in that where
|
||||
implementation defined behaviour is permitted, the AmigaOS rules are followed.
|
||||
For example, <tt>unlink()</tt> will by default operate like <tt>DeleteFile()</tt> and <tt>rename()</tt>
|
||||
will return with an error code set if the name of the file/directory to be
|
||||
renamed would collide with an existing directory entry. However, your program
|
||||
can set a global variable <tt>__unix_semantics</tt> which will cause some routines to
|
||||
perform like their Unix counterparts. This is necessary for Samba to work but
|
||||
not a generally desirable feature. You have some Unix-like behaviour, but the
|
||||
environment itself is not completely Unix- or POSIX-compliant. And it
|
||||
shouldn't be. Don't make the mistake of trying to mold the environment into a
|
||||
POSIX emulation. It doesn't work; AmigaOS is not Unix.</p>
|
||||
renamed would collide with an existing directory entry.</p>
|
||||
|
||||
|
||||
<h2>7. The startup code</h2>
|
||||
@ -288,6 +475,12 @@ assembly language.</p>
|
||||
<a href="http://www.opengroup.org/onlinepubs/007904975">Open Group's Single Unix
|
||||
Specification</a>.</p>
|
||||
|
||||
<p>It is recommended to browse the contents of the <tt>include</tt> directory. The
|
||||
header files contain information on library behaviour and not just data type and
|
||||
function prototype definitions. Specifically, the <tt><dos.h></tt> header file
|
||||
contains documentation about special libraries and global variables which may be
|
||||
used or replaced by user code.</p>
|
||||
|
||||
|
||||
<h2>9. Legal status</h2>
|
||||
|
||||
@ -319,6 +512,6 @@ can reach me at:</p>
|
||||
|
||||
<p>Or via e-mail:</p>
|
||||
|
||||
<p>olsen@sourcery.han.de</p>
|
||||
<p>obarthel [at] gmx.net</p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -17,13 +17,13 @@
|
||||
|
||||
|
||||
*link:
|
||||
%{fbaserel:%{!resident:-m amiga_bss -fl libb}} %{resident:-m amiga_bss -amiga-datadata-reloc -fl libb} %{fbaserel32:%{!resident32:-m amiga_bss -fl libb32}} %{resident32:-m amiga_bss -amiga-datadata-reloc -fl libb32} %{g:-amiga-debug-hunk} %{m68020:-fl libm020} %{mc68020:-fl libm020} %{m68030:-fl libm020} %{m68040:-fl libm020} %{m68060:-fl libm020} %{m68020-40:-fl libm020} %{m68020-60:-fl libm020}
|
||||
%{fbaserel:%{!resident:-m amiga_bss -fl libb}} %{resident:-m amiga_bss -amiga-datadata-reloc -fl libb} %{fbaserel32:%{!resident32:-m amiga_bss -fl libb32}} %{resident32:-m amiga_bss -amiga-datadata-reloc -fl libb32} %{g:-amiga-debug-hunk} %{m68020:-fl libm020} %{mc68020:-fl libm020} %{m68030:-fl libm020} %{m68040:-fl libm020} %{m68060:-fl libm020} %{m68020-40:-fl libm020} %{m68020-60:-fl libm020} %{noixemul:}
|
||||
|
||||
*lib:
|
||||
%{mstackextend:-lstack} -lc -lamiga -ldebug -lgcc -lc
|
||||
|
||||
*libgcc:
|
||||
|
||||
%{mstackextend:-lstack} -lc -lgcc
|
||||
|
||||
*startfile:
|
||||
%{resident32:nr32crt0.o%s}%{!resident32:%{fbaserel32:nb32crt0.o%s}%{!fbaserel32:%{resident:nrcrt0.o%s}%{!resident:%{fbaserel:nbcrt0.o%s}%{!fbaserel:ncrt0.o%s}}}}
|
||||
@ -35,7 +35,7 @@
|
||||
%{funsigned-char:-D__CHAR_UNSIGNED__}
|
||||
|
||||
*predefines:
|
||||
-Dmc68000 -Damiga -Damigaos -DMCH_AMIGA -DAMIGA -D__chip=__attribute__((__chip__)) -D__saveds=__attribute__((__saveds__)) -D__interrupt=__attribute__((__interrupt__)) -D__stackext=__attribute__((__stackext__)) -D__regargs=__attribute__((__regparm__)) -D__stdargs=__attribute__((__stkparm__)) -D__aligned=__attribute__((__aligned__(4))) -Asystem(amigaos) -Acpu(m68k) -Amachine(m68k)
|
||||
-Dmc68000 -Damiga -Damigaos -DMCH_AMIGA -DAMIGA -D__CLIB2__ -D__chip=__attribute__((__chip__)) -D__saveds=__attribute__((__saveds__)) -D__interrupt=__attribute__((__interrupt__)) -D__stackext=__attribute__((__stackext__)) -D__regargs=__attribute__((__regparm__)) -D__stdargs=__attribute__((__stkparm__)) -D__aligned=__attribute__((__aligned__(4))) -Asystem(amigaos) -Acpu(m68k) -Amachine(m68k)
|
||||
|
||||
*cross_compile:
|
||||
0
|
||||
|
||||
@ -1,11 +1,19 @@
|
||||
#
|
||||
# $Id: GNUmakefile.68k,v 1.73 2005-10-20 07:19:15 obarthel Exp $
|
||||
# $Id: GNUmakefile.68k,v 1.107 2010-10-20 13:50:16 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))
|
||||
@ -21,7 +39,6 @@ LIBC_OBJS = libc_objs
|
||||
LIBUNIX_OBJS = libunix_objs
|
||||
LIBM_OBJS = libm_objs
|
||||
LIBM881_OBJS = libm881_objs
|
||||
LIBSTACK_OBJS = libstack_objs
|
||||
LIBNET_OBJS = libnet_objs
|
||||
LIBDEBUG_OBJS = libdebug_objs
|
||||
LIBAMIGA_OBJS = libamiga_objs
|
||||
@ -30,7 +47,6 @@ LIBC_OBJS = $(TYPE)/libc_objs
|
||||
LIBUNIX_OBJS = $(TYPE)/libunix_objs
|
||||
LIBM_OBJS = $(TYPE)/libm_objs
|
||||
LIBM881_OBJS = $(TYPE)/libm881_objs
|
||||
LIBSTACK_OBJS = $(TYPE)/libstack_objs
|
||||
LIBNET_OBJS = $(TYPE)/libnet_objs
|
||||
LIBDEBUG_OBJS = $(TYPE)/libdebug_objs
|
||||
LIBAMIGA_OBJS = $(TYPE)/libamiga_objs
|
||||
@ -52,15 +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 $<
|
||||
|
||||
$(LIBSTACK_OBJS)/%.o : %.c
|
||||
@echo "Compiling $< [$(TYPE):stack]"
|
||||
@$(CC) -o $(LIBSTACK_OBJS)/$*.o -c $(CFLAGS) -DSTACK_EXTENSION $<
|
||||
@$(CC) -o $(LIBM881_OBJS)/$*.o -c $(CFLAGS) -m68881 -DM68881_FLOATING_POINT_SUPPORT $<
|
||||
|
||||
$(LIBNET_OBJS)/%.o : %.c
|
||||
@echo "Compiling $< [$(TYPE):net]"
|
||||
@ -112,15 +124,17 @@ WARNINGS = \
|
||||
INCLUDES = -Iinclude -I. -Inetinclude
|
||||
#OPTIONS = -fno-builtin -fno-common -DDEBUG
|
||||
OPTIONS = -fno-builtin -fno-common -DNDEBUG
|
||||
#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)
|
||||
|
||||
##############################################################################
|
||||
|
||||
@ -174,6 +188,7 @@ C_LIB = \
|
||||
signal_checkabort.o \
|
||||
signal_data.o \
|
||||
signal_kill.o \
|
||||
signal_mask.o \
|
||||
signal_raise.o \
|
||||
signal_sigaddset.o \
|
||||
signal_sigblock.o \
|
||||
@ -187,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 \
|
||||
@ -231,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 \
|
||||
@ -256,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 \
|
||||
@ -283,6 +303,8 @@ C_LIB = \
|
||||
stdlib_abort.o \
|
||||
stdlib_abs.o \
|
||||
stdlib_alloca.o \
|
||||
stdlib_alloca_cleanup.o \
|
||||
stdlib_alloca_trap.o \
|
||||
stdlib_assertion_failure.o \
|
||||
stdlib_atexit.o \
|
||||
stdlib_atoi.o \
|
||||
@ -304,10 +326,13 @@ C_LIB = \
|
||||
stdlib_dosbase.o \
|
||||
stdlib_exit.o \
|
||||
stdlib_free.o \
|
||||
stdlib_free_unused_slabs.o \
|
||||
stdlib_getdefstacksize.o \
|
||||
stdlib_getenv.o \
|
||||
stdlib_getmemstats.o \
|
||||
stdlib_getsp.o \
|
||||
stdlib_get_errno.o \
|
||||
stdlib_get_slab_usage.o \
|
||||
stdlib_isresident.o \
|
||||
stdlib_labs.o \
|
||||
stdlib_llabs.o \
|
||||
@ -317,6 +342,7 @@ C_LIB = \
|
||||
stdlib_lib_startup.o \
|
||||
stdlib_machine_test.o \
|
||||
stdlib_main.o \
|
||||
stdlib_main_stub.o \
|
||||
stdlib_malloc.o \
|
||||
stdlib_math.o \
|
||||
stdlib_mkdtemp.o \
|
||||
@ -336,6 +362,7 @@ C_LIB = \
|
||||
stdlib_rand_r.o \
|
||||
stdlib_realloc.o \
|
||||
stdlib_red_black.o \
|
||||
stdlib_resetmemstats.o \
|
||||
stdlib_semaphore.o \
|
||||
stdlib_setenv.o \
|
||||
stdlib_setjmp.o \
|
||||
@ -343,11 +370,9 @@ C_LIB = \
|
||||
stdlib_set_process_window.o \
|
||||
stdlib_shell_escape.o \
|
||||
stdlib_showerror.o \
|
||||
stdlib_slab.o \
|
||||
stdlib_slab_max_size.o \
|
||||
stdlib_srand.o \
|
||||
stdlib_stackargbytes.o \
|
||||
stdlib_stackcheck.o \
|
||||
stdlib_stackoverflow.o \
|
||||
stdlib_stacksafezone.o \
|
||||
stdlib_stacksize.o \
|
||||
stdlib_stack_usage.o \
|
||||
stdlib_arg.o \
|
||||
@ -387,6 +412,7 @@ C_LIB = \
|
||||
string_strcspn.o \
|
||||
string_strdup.o \
|
||||
string_strerror.o \
|
||||
string_strerror_r.o \
|
||||
string_strlcat.o \
|
||||
string_strlcpy.o \
|
||||
string_strlen.o \
|
||||
@ -422,6 +448,7 @@ C_LIB = \
|
||||
time_weekday.o \
|
||||
uio_readv.o \
|
||||
uio_writev.o \
|
||||
ulimit_ulimit.o \
|
||||
unistd_access.o \
|
||||
unistd_chdir.o \
|
||||
unistd_chdir_exit.o \
|
||||
@ -442,6 +469,7 @@ C_LIB = \
|
||||
unistd_isatty.o \
|
||||
unistd_lchown.o \
|
||||
unistd_link.o \
|
||||
unistd_lockf.o \
|
||||
unistd_readlink.o \
|
||||
unistd_realpath.o \
|
||||
unistd_sleep.o \
|
||||
@ -451,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
|
||||
@ -468,9 +497,12 @@ UNIX_LIB = \
|
||||
getopt_getopt_long.o \
|
||||
mount_convertinfo.o \
|
||||
mount_statfs.o \
|
||||
resource_getrlimit.o \
|
||||
resource_setrlimit.o \
|
||||
stat_chmod.o \
|
||||
stat_fstat.o \
|
||||
stat_lstat.o \
|
||||
stat_lock.o \
|
||||
stat_mkdir.o \
|
||||
stat_rmdir.o \
|
||||
stat_stat.o \
|
||||
@ -486,12 +518,23 @@ UNIX_LIB = \
|
||||
stdio_record_locking.o \
|
||||
stdio_remove.o \
|
||||
stdio_rename.o \
|
||||
stdlib_alloca.o \
|
||||
stdlib_alloca_cleanup.o \
|
||||
stdlib_alloca_trap.o \
|
||||
stdlib_arg.o \
|
||||
stdlib_expand_wildcard.o \
|
||||
stdlib_expand_wildcard_check.o \
|
||||
stdlib_getmemstats.o \
|
||||
stdlib_main.o \
|
||||
stdlib_main_stub.o \
|
||||
stdlib_mkdtemp.o \
|
||||
stdlib_mkstemp.o \
|
||||
stdlib_mktemp.o \
|
||||
stdlib_malloc.o \
|
||||
stdlib_realloc.o \
|
||||
stdlib_resetmemstats.o \
|
||||
stdlib_system.o \
|
||||
systeminfo_sysinfo.o \
|
||||
termios_cfgetispeed.o \
|
||||
termios_cfgetospeed.o \
|
||||
termios_cfmakeraw.o \
|
||||
@ -504,20 +547,38 @@ UNIX_LIB = \
|
||||
termios_tcgetattr.o \
|
||||
termios_tcsendbreak.o \
|
||||
termios_tcsetattr.o \
|
||||
timeb_ftime.o \
|
||||
uio_readv.o \
|
||||
uio_writev.o \
|
||||
unistd_access.o \
|
||||
unistd_chdir.o \
|
||||
unistd_chdir_exit.o \
|
||||
unistd_chown.o \
|
||||
unistd_common_pathconf.o \
|
||||
unistd_def_path.o \
|
||||
unistd_def_path_delimiter.o \
|
||||
unistd_environ.o \
|
||||
unistd_execl.o \
|
||||
unistd_execle.o \
|
||||
unistd_execlp.o \
|
||||
unistd_execv.o \
|
||||
unistd_execve.o \
|
||||
unistd_execve_env_exit.o \
|
||||
unistd_execve_env_init.o \
|
||||
unistd_execve_exit.o \
|
||||
unistd_execvp.o \
|
||||
unistd_fpathconf.o \
|
||||
unistd_getcwd.o \
|
||||
unistd_lchown.o \
|
||||
unistd_link.o \
|
||||
unistd_lockf.o \
|
||||
unistd_pathconf.o \
|
||||
unistd_readlink.o \
|
||||
unistd_realpath.o \
|
||||
unistd_restorepathname.o \
|
||||
unistd_setcurrentpath.o \
|
||||
unistd_strip_double_slash.o \
|
||||
unistd_symlink.o \
|
||||
unistd_translatea2u.o \
|
||||
unistd_translaterel.o \
|
||||
unistd_translateu2a.o \
|
||||
@ -542,6 +603,17 @@ MATH_LIB = \
|
||||
complex_creal.o \
|
||||
complex_crealf.o \
|
||||
complex_creall.o \
|
||||
fenv_feclearexcept.o \
|
||||
fenv_fegetenv.o \
|
||||
fenv_fegetexceptflag.o \
|
||||
fenv_fegetround.o \
|
||||
fenv_feholdexcept.o \
|
||||
fenv_feraiseexcept.o \
|
||||
fenv_fesetenv.o \
|
||||
fenv_fesetexceptflag.o \
|
||||
fenv_fetestexcept.o \
|
||||
fenv_fetestround.o \
|
||||
fenv_feupdateenv.o \
|
||||
math_acos.o \
|
||||
math_acosf.o \
|
||||
math_acosh.o \
|
||||
@ -578,10 +650,16 @@ MATH_LIB = \
|
||||
math_expm1f.o \
|
||||
math_fabs.o \
|
||||
math_fabsf.o \
|
||||
math_fdim.o \
|
||||
math_fdimf.o \
|
||||
math_floor.o \
|
||||
math_floorf.o \
|
||||
math_fma.o \
|
||||
math_fmaf.o \
|
||||
math_fmax.o \
|
||||
math_fmaxf.o \
|
||||
math_fmin.o \
|
||||
math_fminf.o \
|
||||
math_fmod.o \
|
||||
math_fmodf.o \
|
||||
math_fpclassify.o \
|
||||
@ -605,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 \
|
||||
@ -716,14 +795,6 @@ MATH_LIB_IEEE = \
|
||||
math_subsf3.o \
|
||||
math_truncdfsf2.o
|
||||
|
||||
STACK_LIB = \
|
||||
stack.lib_rev.o \
|
||||
stdlib_setjmp.o \
|
||||
stdlib_stackextension.o \
|
||||
stdlib_stackminframe.o \
|
||||
stdlib_stackoverflow.o \
|
||||
stdlib_stacksafezone.o
|
||||
|
||||
NET_LIB = \
|
||||
net.lib_rev.o \
|
||||
socket_accept.o \
|
||||
@ -759,7 +830,9 @@ NET_LIB = \
|
||||
socket_recv.o \
|
||||
socket_recvfrom.o \
|
||||
socket_recvmsg.o \
|
||||
socket_select_signal.o \
|
||||
socket_select.o \
|
||||
socket_wait_select.o \
|
||||
socket_send.o \
|
||||
socket_sendmsg.o \
|
||||
socket_sendto.o \
|
||||
@ -771,6 +844,7 @@ NET_LIB = \
|
||||
socket_get_h_errno.o \
|
||||
socket_set_h_errno.o \
|
||||
stat_umask.o \
|
||||
systeminfo_sysinfo.o \
|
||||
usergroup_crypt.o \
|
||||
usergroup_data.o \
|
||||
usergroup_endgrent.o \
|
||||
@ -882,7 +956,7 @@ MEMDEBUG_LIB = \
|
||||
|
||||
##############################################################################
|
||||
|
||||
LIBS_68K := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libunix.a \
|
||||
LIBS_68K := $(LIBC_OBJS)/libc.a $(LIBUNIX_OBJS)/libunix.a \
|
||||
$(LIBNET_OBJS)/libnet.a $(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
|
||||
$(LIBM_OBJS)/libm.a
|
||||
LIBS_020 := $(LIBM881_OBJS)/libm881.a $(LIBS_68K)
|
||||
@ -919,7 +993,7 @@ all: \
|
||||
clean:
|
||||
-$(DELETE) $(TYPE) $(LIBS_020) $(STARTUPS) \
|
||||
$(LIBC_OBJS) $(LIBUNIX_OBJS) $(LIBM_OBJS) \
|
||||
$(LIBM881_OBJS) $(LIBSTACK_OBJS) $(LIBNET_OBJS) $(LIBDEBUG_OBJS) \
|
||||
$(LIBM881_OBJS) $(LIBNET_OBJS) $(LIBDEBUG_OBJS) \
|
||||
$(LIBAMIGA_OBJS)
|
||||
|
||||
realclean:
|
||||
@ -935,7 +1009,6 @@ version:
|
||||
copy clone c.lib_rev.rev m.lib_rev.rev
|
||||
copy clone c.lib_rev.rev m881.lib_rev.rev
|
||||
copy clone c.lib_rev.rev net.lib_rev.rev
|
||||
copy clone c.lib_rev.rev stack.lib_rev.rev
|
||||
copy clone c.lib_rev.rev unix.lib_rev.rev
|
||||
bumprev 1 amiga.lib
|
||||
bumprev 1 c.lib
|
||||
@ -943,7 +1016,6 @@ version:
|
||||
bumprev 1 m.lib
|
||||
bumprev 1 m881.lib
|
||||
bumprev 1 net.lib
|
||||
bumprev 1 stack.lib
|
||||
bumprev 1 unix.lib
|
||||
|
||||
##############################################################################
|
||||
@ -1027,8 +1099,6 @@ $(LIBC_OBJS)/stdlib_swapstack.o : stdlib_swapstack.c
|
||||
|
||||
$(LIBC_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
|
||||
|
||||
$(LIBSTACK_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
|
||||
|
||||
##############################################################################
|
||||
|
||||
$(LIBC_OBJS)/c.lib_rev.o : c.lib_rev.c c.lib_rev.h
|
||||
@ -1039,8 +1109,6 @@ $(LIBM_OBJS)/m.lib_rev.o : m.lib_rev.c m.lib_rev.h
|
||||
|
||||
$(LIBM881_OBJS)/m881.lib_rev.o : m881.lib_rev.c m881.lib_rev.h
|
||||
|
||||
$(LIBSTACK_OBJS)/stack.lib_rev.o : stack.lib_rev.c stack.lib_rev.h
|
||||
|
||||
$(LIBNET_OBJS)/net.lib_rev.o : net.lib_rev.c net.lib_rev.h
|
||||
|
||||
$(LIBDEBUG_OBJS)/debug.lib_rev.o : debug.lib_rev.c debug.lib_rev.h
|
||||
@ -1063,6 +1131,12 @@ $(LIBC_OBJS)/stdlib_free.o : stdlib_free.c stdlib_memory.h
|
||||
|
||||
$(LIBC_OBJS)/stdlib_malloc.o : stdlib_malloc.c stdlib_memory.h
|
||||
|
||||
$(LIBC_OBJS)/stdlib_slab.o : stdlib_slab.c stdlib_memory.h
|
||||
|
||||
$(LIBC_OBJS)/stdlib_free_unused_slabs.o : stdlib_free_unused_slabs.c stdlib_memory.h
|
||||
|
||||
$(LIBC_OBJS)/stdlib_get_slab_usage.o : stdlib_get_slab_usage.c stdlib_memory.h
|
||||
|
||||
$(LIBC_OBJS)/stdlib_realloc.o : stdlib_realloc.c stdlib_memory.h
|
||||
|
||||
$(LIBC_OBJS)/stdlib_red_black.o : stdlib_red_black.c stdlib_memory.h
|
||||
@ -1180,16 +1254,6 @@ $(LIBM881_OBJS)/libm881.a : $(LIBM881_OBJS) $(foreach file,$(MATH_LIB_881),$(LIB
|
||||
|
||||
##############################################################################
|
||||
|
||||
$(LIBSTACK_OBJS) :
|
||||
$(MAKEDIR) $@
|
||||
|
||||
$(LIBSTACK_OBJS)/libstack.a : $(LIBSTACK_OBJS) $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
|
||||
-$(DELETE) $@
|
||||
@$(AR) $@ $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
|
||||
$(RANLIB) $@
|
||||
|
||||
##############################################################################
|
||||
|
||||
$(LIBNET_OBJS) :
|
||||
$(MAKEDIR) $@
|
||||
|
||||
@ -1256,8 +1320,6 @@ CONSTRUCTOR_FILES = \
|
||||
stdlib_malloc.c \
|
||||
stdlib_program_name.c \
|
||||
stdlib_setenv.c \
|
||||
stdlib_stackcheck.c \
|
||||
stdlib_stackextension.c \
|
||||
time_clock.c \
|
||||
unistd_chdir_exit.c \
|
||||
unistd_init_exit.c \
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
0
library/TODO
Executable file → Normal file
0
library/TODO
Executable file → Normal file
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga.lib_rev.c,v 1.2 2005-01-02 09:07:06 obarthel Exp $
|
||||
* $Id: amiga.lib_rev.c,v 1.3 2006-01-08 12:04:21 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 197
|
||||
#define DATE "4.11.2005"
|
||||
#define VERS "amiga.lib 1.197"
|
||||
#define VSTRING "amiga.lib 1.197 (4.11.2005)\r\n"
|
||||
#define VERSTAG "\0$VER: amiga.lib 1.197 (4.11.2005)"
|
||||
#define REVISION 209
|
||||
#define DATE "21.11.2016"
|
||||
#define VERS "amiga.lib 1.209"
|
||||
#define VSTRING "amiga.lib 1.209 (21.11.2016)\r\n"
|
||||
#define VERSTAG "\0$VER: amiga.lib 1.209 (21.11.2016)"
|
||||
|
||||
@ -1 +1 @@
|
||||
197
|
||||
209
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_acrypt.c,v 1.3 2005-05-30 14:01:20 obarthel Exp $
|
||||
* $Id: amiga_acrypt.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -49,6 +49,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
UBYTE * ACrypt(UBYTE * buffer, const UBYTE * password, const UBYTE * user);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
UBYTE *
|
||||
ACrypt(UBYTE * buffer, const UBYTE * password, const UBYTE * user)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_addtof.c,v 1.3 2005-02-25 10:14:20 obarthel Exp $
|
||||
* $Id: amiga_addtof.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_argarraydone.c,v 1.2 2005-01-02 09:07:06 obarthel Exp $
|
||||
* $Id: amiga_argarraydone.c,v 1.4 2006-09-25 14:05:31 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -48,7 +48,7 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern char **CXLIB_argarray;
|
||||
extern const unsigned char **CXLIB_argarray;
|
||||
|
||||
extern struct DiskObject * CXLIB_disko;
|
||||
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_argarrayinit.c,v 1.3 2005-10-27 08:58:41 obarthel Exp $
|
||||
* $Id: amiga_argarrayinit.c,v 1.7 2008-09-30 14:09:00 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -52,6 +52,14 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef __amigaos4__
|
||||
#define MEMORY_TYPE MEMF_PRIVATE
|
||||
#else
|
||||
#define MEMORY_TYPE MEMF_ANY
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
const unsigned char ** CXLIB_argarray;
|
||||
|
||||
struct DiskObject * CXLIB_disko;
|
||||
@ -70,14 +78,14 @@ ArgArrayInit(LONG argc, CONST_STRPTR * argv)
|
||||
if(argc == 1)
|
||||
goto out; /* skip command name */
|
||||
|
||||
CXLIB_argarray = (const unsigned char **)AllocVec(sizeof(char *) * argc,MEMF_ANY|MEMF_CLEAR);
|
||||
CXLIB_argarray = (const unsigned char **)AllocVec(sizeof(char *) * argc,MEMORY_TYPE|MEMF_CLEAR);
|
||||
if(CXLIB_argarray == NULL)
|
||||
goto out;
|
||||
|
||||
for(i = 1 ; i < argc ; i++)
|
||||
CXLIB_argarray[i-1] = argv[i];
|
||||
CXLIB_argarray[i-1] = (unsigned char *)argv[i];
|
||||
|
||||
result = (unsigned char **)CXLIB_argarray;
|
||||
result = (STRPTR *)CXLIB_argarray;
|
||||
}
|
||||
else if (IconBase != NULL)
|
||||
{
|
||||
@ -90,7 +98,7 @@ ArgArrayInit(LONG argc, CONST_STRPTR * argv)
|
||||
if(CXLIB_disko == NULL)
|
||||
goto out;
|
||||
|
||||
result = (unsigned char **)CXLIB_disko->do_ToolTypes;
|
||||
result = (STRPTR *)CXLIB_disko->do_ToolTypes;
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_argint.c,v 1.2 2005-01-02 09:07:06 obarthel Exp $
|
||||
* $Id: amiga_argint.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_argstring.c,v 1.2 2005-01-02 09:07:06 obarthel Exp $
|
||||
* $Id: amiga_argstring.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_beginio.c,v 1.3 2005-01-02 09:07:06 obarthel Exp $
|
||||
* $Id: amiga_beginio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -103,6 +103,10 @@ BeginIO(struct IORequest *ior)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID BeginIO(struct IORequest *ior);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
BeginIO(struct IORequest *ior)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_callhook.c,v 1.2 2005-01-02 09:07:06 obarthel Exp $
|
||||
* $Id: amiga_callhook.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
*
|
||||
* $Id: amiga_callhooka.asm,v 1.2 2005-01-02 09:07:06 obarthel Exp $
|
||||
* $Id: amiga_callhooka.asm,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=8
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_callhooka.c,v 1.2 2005-01-02 09:07:06 obarthel Exp $
|
||||
* $Id: amiga_callhooka.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_coercemethod.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_coercemethod.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_createextio.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_createextio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -50,6 +50,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct IORequest * CreateExtIO(CONST struct MsgPort * port, LONG io_size);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct IORequest *
|
||||
CreateExtIO(CONST struct MsgPort * port, LONG io_size)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_createport.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_createport.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -50,6 +50,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct MsgPort * CreatePort(CONST_STRPTR name, LONG pri);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct MsgPort *
|
||||
CreatePort(CONST_STRPTR name, LONG pri)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_createstdio.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_createstdio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -50,6 +50,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct IOStdReq * CreateStdIO(CONST struct MsgPort * port);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct IOStdReq *
|
||||
CreateStdIO(CONST struct MsgPort * port)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_createtask.c,v 1.4 2005-03-18 12:38:21 obarthel Exp $
|
||||
* $Id: amiga_createtask.c,v 1.6 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_deleteextio.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_deleteextio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -50,6 +50,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID DeleteExtIO(struct IORequest * io);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
DeleteExtIO(struct IORequest * io)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_deleteport.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_deleteport.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -50,6 +50,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID DeletePort(struct MsgPort * port);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
DeletePort(struct MsgPort * port)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_deletestdio.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_deletestdio.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -50,6 +50,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID DeleteStdIO(struct IOStdReq * io);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
DeleteStdIO(struct IOStdReq * io)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_deletetask.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_deletetask.c,v 1.5 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -63,6 +63,10 @@ DeleteTask(struct Task *tc)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID DeleteTask(struct Task *tc);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
DeleteTask(struct Task *tc)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_domethod.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_domethod.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_dosupermethod.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_dosupermethod.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_dotimer.c,v 1.6 2005-09-03 14:45:14 obarthel Exp $
|
||||
* $Id: amiga_dotimer.c,v 1.8 2006-04-05 06:43:56 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -55,6 +55,23 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* A quick workaround for the timeval/timerequest->TimeVal/TimeRequest
|
||||
change in the recent OS4 header files. */
|
||||
|
||||
#if defined(__NEW_TIMEVAL_DEFINITION_USED__)
|
||||
|
||||
#define timeval TimeVal
|
||||
#define tv_secs Seconds
|
||||
#define tv_micro Microseconds
|
||||
|
||||
#define timerequest TimeRequest
|
||||
#define tr_node Request
|
||||
#define tr_time Time
|
||||
|
||||
#endif /* __NEW_TIMEVAL_DEFINITION_USED__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
LONG
|
||||
DoTimer(struct timeval *tv,LONG unit,LONG command)
|
||||
{
|
||||
@ -67,10 +84,10 @@ DoTimer(struct timeval *tv,LONG unit,LONG command)
|
||||
#if defined(__amigaos4__)
|
||||
{
|
||||
mp = AllocSysObjectTags(ASOT_PORT,
|
||||
ASOPORT_Action, PA_SIGNAL,
|
||||
ASOPORT_Action, PA_SIGNAL,
|
||||
ASOPORT_AllocSig, FALSE,
|
||||
ASOPORT_Signal, SIGB_SINGLE,
|
||||
ASOPORT_Target, FindTask(NULL),
|
||||
ASOPORT_Signal, SIGB_SINGLE,
|
||||
ASOPORT_Target, FindTask(NULL),
|
||||
TAG_DONE);
|
||||
|
||||
if(mp == NULL)
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_fastrand.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_fastrand.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_freeievents.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_freeievents.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
*
|
||||
* $Id: amiga_hookentry.asm,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_hookentry.asm,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=8
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_hookentry.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_hookentry.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_hotkey.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_hotkey.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_invertstring.c,v 1.3 2005-02-25 10:14:20 obarthel Exp $
|
||||
* $Id: amiga_invertstring.c,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_newlist.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_newlist.c,v 1.4 2006-09-25 15:12:47 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -43,6 +43,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID NewList(struct List *lh);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
NewList(struct List *lh)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_rangerand.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_rangerand.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_remtof.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_remtof.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_rexxvars.c,v 1.6 2005-03-18 12:38:21 obarthel Exp $
|
||||
* $Id: amiga_rexxvars.c,v 1.19 2008-04-18 10:11:59 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -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 UBYTE 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);
|
||||
}
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_setsuperattrs.c,v 1.4 2005-02-25 10:14:20 obarthel Exp $
|
||||
* $Id: amiga_setsuperattrs.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_timedelay.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_timedelay.c,v 1.4 2006-04-05 06:43:56 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -39,6 +39,19 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* A quick workaround for the timeval/timerequest->TimeVal/TimeRequest
|
||||
change in the recent OS4 header files. */
|
||||
|
||||
#if defined(__NEW_TIMEVAL_DEFINITION_USED__)
|
||||
|
||||
#define timeval TimeVal
|
||||
#define tv_secs Seconds
|
||||
#define tv_micro Microseconds
|
||||
|
||||
#endif /* __NEW_TIMEVAL_DEFINITION_USED__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
LONG
|
||||
TimeDelay(LONG unit,ULONG seconds,ULONG micros)
|
||||
{
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: amiga_waitbeam.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: amiga_waitbeam.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -13,9 +13,9 @@ rm -rf $dir_name
|
||||
# Create the directory, copy all the libraries, header files
|
||||
# and release note files inside.
|
||||
mkdir $dir_name
|
||||
cp -a lib $dir_name
|
||||
cp -a lib.threadsafe $dir_name
|
||||
cp -a include $dir_name
|
||||
cp -pR lib $dir_name
|
||||
cp -pR lib.threadsafe $dir_name
|
||||
cp -pR include $dir_name
|
||||
cp changes $dir_name
|
||||
|
||||
# Delete the CVS data from the include directory
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: c.lib_rev.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: c.lib_rev.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 197
|
||||
#define DATE "4.11.2005"
|
||||
#define VERS "c.lib 1.197"
|
||||
#define VSTRING "c.lib 1.197 (4.11.2005)\r\n"
|
||||
#define VERSTAG "\0$VER: c.lib 1.197 (4.11.2005)"
|
||||
#define REVISION 209
|
||||
#define DATE "21.11.2016"
|
||||
#define VERS "c.lib 1.209"
|
||||
#define VSTRING "c.lib 1.209 (21.11.2016)\r\n"
|
||||
#define VERSTAG "\0$VER: c.lib 1.209 (21.11.2016)"
|
||||
|
||||
@ -1 +1 @@
|
||||
197
|
||||
209
|
||||
|
||||
428
library/changes
428
library/changes
@ -1,3 +1,431 @@
|
||||
c.lib 1.209 (21.11.2016)
|
||||
|
||||
- The maximum slab size is now 2^17 bytes (= 131072). If you request
|
||||
a slab size larger than this, you will get slab sizes of 131072
|
||||
bytes instead.
|
||||
|
||||
- Enabling the memory management debugging code no longer produces
|
||||
compiler errors.
|
||||
|
||||
|
||||
c.lib 1.208 (19.11.2016)
|
||||
|
||||
- Updated <stdlib.h> with new functions and data structures for
|
||||
use with the slab allocator.
|
||||
|
||||
- Added __get_slab_usage() function which can be used to query
|
||||
the slab allocator memory usage at runtime.
|
||||
|
||||
|
||||
c.lib 1.207 (18.11.2016)
|
||||
|
||||
- Added a slab allocator which replaces the use of memory pools or the
|
||||
plain AllocMem() operations, respectively. In order to activate the
|
||||
slab allocator, choose a slab size (e.g. 2048 bytes or 4096 bytes)
|
||||
and declare a global variable like this:
|
||||
|
||||
ULONG __slab_max_size = 2048;
|
||||
|
||||
Memory allocations smaller than the slab size will be made from
|
||||
"slabs", i.e. large chunks of memory of the given size. Larger
|
||||
allocations will be managed separately.
|
||||
|
||||
|
||||
m.lib 1.206 (24.4.2015)
|
||||
|
||||
- The fscanf() family failed to parse and convert %f parameters correctly
|
||||
if the respective number did not begin with a digit, but a decimal
|
||||
point. Hence ".7" would not be processed, but "0.7" would.
|
||||
|
||||
c.lib 1.206 (24.4.2015)
|
||||
|
||||
- Reworked the __putc() and putc() macros to reference the 'c' input
|
||||
parameter only once, and to be free of side-effects when tinkering
|
||||
with the buffer position.
|
||||
|
||||
- isatty() had the __fd_lock() call in the wrong place, which could have
|
||||
led to cleanup problems later.
|
||||
|
||||
- The close action in the stdio, socket and termios hook code now
|
||||
also zaps the fd pointer itself after cleaning up the file descriptor
|
||||
table entry.
|
||||
|
||||
- Removed the remains of all the stack extension and stack overflow/underflow
|
||||
checking code. It never actually worked. The bit that does work is the stack
|
||||
usage measurement code, plus the bit that sets up the the custom stack
|
||||
according to local setting or by calling a query function.
|
||||
|
||||
|
||||
c.lib 1.205 (21.8.2010)
|
||||
|
||||
- Added dlclose(), dlerror(), dlopen() and dlsym() functions, which are
|
||||
available only under OS4. There is a variant of dlopen() in libunix.a
|
||||
which will perform a path name conversion. Note that these functions
|
||||
will not work in the thread-safe variant of the library because it
|
||||
would be unwise to tinker with the currently running program's binary.
|
||||
|
||||
- Added support for ELF shared objects and libraries. This is implemented through
|
||||
constructor/destructor functions, which means that you can use this
|
||||
functionality even in Amiga Exec style shared libraries, with the proper
|
||||
library initialization code to invoke the constructor/destructor functions
|
||||
for you.
|
||||
|
||||
- Updated uname() to recognize AmigaOS 4.1.
|
||||
|
||||
- The translation from Unix to Amiga path names did not properly process
|
||||
multiple occurences of "/./" in the path name. Thanks go to Steven Solie
|
||||
for finding the issue.
|
||||
|
||||
- The detection of "/./" and "/../" patterns in Unix path names to be
|
||||
translated into Amiga path names did not test if it was overrunning
|
||||
the end of the string.
|
||||
|
||||
- If strcmp(), strncmp() and memcmp() detect a pair of different
|
||||
characters, then the function result must be calculated as if the
|
||||
characters were of type "unsigned char". This is a requirement
|
||||
according to the ISO 'C' (1994) standard. Thanks go to Georg Steger
|
||||
for finding the issue.
|
||||
|
||||
- The definitions for INT_MIN, INT_MAX and UINT_MAX in <limits.h> no
|
||||
longer use long integer types, as prompted by Steven Solie.
|
||||
|
||||
|
||||
c.lib 1.204 (11.11.2008)
|
||||
|
||||
- The memory allocated by malloc() and friends is now of type MEMF_PRIVATE
|
||||
under OS4 and beyond. The AmigaOS 2.x/3.x compatible code will still
|
||||
use MEMF_ANY in the same situation, though. Other uses of MEMF_ANY have
|
||||
been replaced as well where MEMF_PRIVATE would have made better sense.
|
||||
|
||||
- I/O buffers allocated are now aligned according to the CPU cache line size,
|
||||
if the operating system can supply such detailed information.
|
||||
|
||||
- unsetenv() now returns a status value.
|
||||
|
||||
- Corrected the function prototype for wcspbrk().
|
||||
|
||||
- Added function prototypes for mbrtowc_l(), wcscoll_l(), wcscspn() and wcsrchr().
|
||||
|
||||
|
||||
c.lib 1.203 (28.4.2008)
|
||||
|
||||
- Added 68k stubs to amiga_rexxvars.c for the OS4 build to use. The new code now
|
||||
works just about exactly like the amiga.lib RVI code used to do, which means
|
||||
that there is no artificial length limit for the number of characters a string
|
||||
retrieved may have, and the code is largely reentrant.
|
||||
|
||||
- To work around a bug in the Roadshow TCP/IP stack (since fixed), the waitselect()
|
||||
function now substitutes a 10 microsecond timeout for a zero length timeout.
|
||||
|
||||
- isatty() no longer crashes if passed a socket rather than a file.
|
||||
|
||||
- Rewrote the GetRexxVar()/SetRexxVar() functions (mostly) in 'C', using available
|
||||
code as a reference. The 68k stubs currently only work for the 68k version of
|
||||
the library, and a solution for the OS4 build still needs to be found. The code
|
||||
is currently untested, but it should be complete.
|
||||
|
||||
- The printf() family now ignores argument specifications, as in "%2$d %1$d",
|
||||
which are used for localization on some platforms. This is a non-standard
|
||||
feature and the way clib2 treats it for now is just intended to avoid
|
||||
trouble while performing the conversion.
|
||||
|
||||
- [tboeckel]: when compiling amiga_rexxvars.c for m68k/OS3 the GetRexxVarFromMsg()
|
||||
and SetRexxVarFromMsg() can no longer cause linkage errors if the header files
|
||||
predate the SDK for OS 3.5.
|
||||
|
||||
- [jlangner]: the log() and log10() functions always returned -inf() even if the
|
||||
arguments was within the valid range for a log() function. Using DBL_EPSILON as
|
||||
the threshold was not correct as EPSILON is 2.2204460492503131E-16 whereas
|
||||
values like 1E-200 are still valid double values for a log().
|
||||
|
||||
|
||||
c.lib 1.202 (16.1.2007)
|
||||
|
||||
- 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"
|
||||
will disable expansion of wildcard patterns passed on the command line.
|
||||
Note that if the variable is not set then the global variable
|
||||
'__expand_wildcard_args' will provide the defaults for the switch that
|
||||
controls whether the wildcard expansion takes place. And after the
|
||||
environment variable has been checked, the '__expand_wildcard_args_check'
|
||||
function pointer can still be used to override the switch.
|
||||
|
||||
- fstat() now works with "NIL:" and "/dev/null", respectively. Not that
|
||||
it returns much useful information, though.
|
||||
|
||||
- The _PC_MAX_INPUT query for file handles now returns the default
|
||||
buffer size.
|
||||
|
||||
- Integrated the new OS4 build makefile collection, as contributed by
|
||||
Steven Solie. Thank you very much!
|
||||
|
||||
- Added the missing strerror_r() function.
|
||||
|
||||
- fpathconf() should work with the stdio streams, even in the thread-safe
|
||||
library version, again.
|
||||
|
||||
- Updated m68k specs file in /documentation to contain an own __CLIB2__
|
||||
define so that existing m68k compilers also have this define. In addition,
|
||||
the common "-noixemul" option can now also be specified but will do a NOP
|
||||
so that Makefiles sharing multiple runtime lib setups work without
|
||||
a warning.
|
||||
|
||||
- Added a new callback function which can be used in programs which want
|
||||
to avoid that the command line wildcard expansion takes place.
|
||||
|
||||
- __get_default_file() now dynamically fills in file handles for the
|
||||
stdin/stdout/stderr streams if it's part of the thread-safe library.
|
||||
|
||||
- fpathconf() now checks if the file descriptor is really referring to a file.
|
||||
|
||||
- The termios hook entry code could file descriptor's embedded file handle
|
||||
rather than what the thread safe library had dynamically bound to the
|
||||
stdin/stdout/stderr streams.
|
||||
|
||||
- execve() now finds commands in the current directory again, even if you
|
||||
omit the leading "./" path name.
|
||||
|
||||
- The execve() code that looks for the command/script file now begins by
|
||||
checking if the file name includes path separators. If it does not,
|
||||
then the search for the command begins with the resident command list;
|
||||
otherwise the local directories are checked. The new code also properly
|
||||
cleans up after itself (a FreeDeviceProc() was missing) and the "PROGDIR:"
|
||||
lock now always refers to the directory in which the command/script
|
||||
file is found.
|
||||
|
||||
- Added the missing fdim() and fdimf() functions to the build
|
||||
makefiles. The OS4 build makefile was missing lrint() and
|
||||
lrintf(). Ouch.
|
||||
|
||||
- Added the POSIX exec() family functions, based upon code contributed
|
||||
by Henning Nielsen Lund. Thank you very much!
|
||||
|
||||
- atoll() no longer sets 'errno' directly but now calls __set_errno()
|
||||
instead.
|
||||
|
||||
- Added pathconf(), fpathconf(), sysinfo(), ftime(), ulimit(), getrlimit()
|
||||
and setrlimit() as contributed by Peter Bengtsson. Thank you very much!
|
||||
|
||||
- Added the missing S_ISSOCKET() macro to <sys/stat.h>. Note that this
|
||||
is not actually a POSIX feature.
|
||||
|
||||
- Added fmin(), fminf(), fmax() and fmaxf() to the build makefiles.
|
||||
Somehow I must have forgotten about them :-(
|
||||
|
||||
- select() and waitselect() can now be called without any file descriptor
|
||||
sets to work with, as some software does which uses select() in place
|
||||
of sleep().
|
||||
|
||||
- The <sys/ioctl.h> header file now includes both <sys/select.h> and
|
||||
<sys/filio.h> for better compatibility with the TCP/IP stack header
|
||||
files.
|
||||
|
||||
- Added the global variable __expand_wildcard_args which can be used
|
||||
to disable wildcard pattern expansion of command line parameters when
|
||||
linked against "libunix.a". Note that this has no effect on the "regular"
|
||||
libc.a behaviour.
|
||||
|
||||
|
||||
c.lib 1.200 (17.4.2006)
|
||||
|
||||
- The default break signal mask (SIGBREAKF_CTRL_C) is no longer
|
||||
hard-coded. You can override it at link time with a different
|
||||
variable value for __break_signal_mask. This may have to be
|
||||
augmented by an API for changing the value.
|
||||
|
||||
- Added a waitselect() function which works very much like the
|
||||
bsdsocket.library/WaitSelect() function.
|
||||
|
||||
- Added <sys/time.h> include to <sys/socket.h> due to latest "TimeVal" change
|
||||
in the OS4 SDK. Otherwise "struct timeval" will not be defined at the time
|
||||
the <net/if.h> of the netincludes will be included by <proto/bsdsocket.h>.
|
||||
|
||||
- The strftime() hook function had the locale and character parameters
|
||||
switched, which made 'setlocale(LC_ALL,""); strftime(..);' unusable.
|
||||
Fixed.
|
||||
|
||||
- fchown() and chown() now accept owner and group ID values of -1, which
|
||||
indicate that the respective information should not be changed.
|
||||
|
||||
- The OS4 library build now includes the crtbegin.o and crtend.o object
|
||||
files in the libc.a library, which solves a problem with the thread-safe
|
||||
shared library support code.
|
||||
|
||||
|
||||
c.lib 1.199 (6.3.2006)
|
||||
|
||||
- In <stdio.h> MAXPATHLEN is now equivalent to PATH_MAX (from <limits.h>),
|
||||
as suggested by Henning Nielsen Lund.
|
||||
|
||||
- Added lockf() support, as supplied by Henning Nielsen Lund.
|
||||
Thank you very much!
|
||||
|
||||
- symlink() now also works for absolute and relative links, and is
|
||||
part of "libunix.a". This patch was supplied by Henning Nielsen Lund.
|
||||
Thank you very much!
|
||||
|
||||
- The __main() stub function expected by the 68k GCC build is no
|
||||
longer part of "stdlib_main.c". This helps the C++ support, since the
|
||||
__main symbol definition no longer clashes with the definition in
|
||||
"libgcc.a".
|
||||
|
||||
- The printf() family stripped trailing zeroes from the integer part
|
||||
of %g output. Fixed.
|
||||
|
||||
- Moved an allocation size roundup operation in realloc().
|
||||
|
||||
|
||||
c.lib 1.198 (11.12.2005)
|
||||
|
||||
- Added <fenv.h> for C99, and the (yet unimplemented) functions
|
||||
feclearexcept(), fegetenv(), fegetexceptflag(), fegetround(),
|
||||
feholdexcept(), feraiseexcept(), fesetenv(), fesetexceptflag(),
|
||||
fetestexcept(), fetestround() and feupdateenv().
|
||||
|
||||
- Replaced the old pow() implementation. However, powf() may need to
|
||||
be changed to set a domain error.
|
||||
|
||||
- In libunix.a malloc(), calloc() and realloc() no longer treat a
|
||||
request to allocate 0 bytes as an error, returning NULL. They all
|
||||
return a pointer sized memory chunk (= four bytes) initialized to
|
||||
NULL (= 0) instead.
|
||||
|
||||
- The alloca() implementation which allocates memory from the system
|
||||
rather than the local stack frame is thread-safe now. It also
|
||||
interacts with the realloc(), calloc(), free() and malloc() functions
|
||||
in that the alloca() cleanup routine is called once alloca() has
|
||||
done its job. If all the memory allocated through alloca() has been
|
||||
released no further calls to the cleanup function will be made.
|
||||
|
||||
- In the thread-safe library, realloc() permitted two different overlapping
|
||||
calls to succeed in trying to reallocate the same chunk of memory due to
|
||||
a race condition. Fixed.
|
||||
|
||||
- Added a new function __get_mem_stats() (the prototype is in <dos.h>) which
|
||||
can be used to query the current and maximum memory usage, counting the
|
||||
allocations performed through malloc(), free() and all other functions which
|
||||
use them.
|
||||
|
||||
- Added another function called __reset_max_mem_stats() which will reset the
|
||||
counters for "maximum amount of memory used" and "maximum number of chunks
|
||||
allocated" to the current figures for these values.
|
||||
|
||||
- Fixed the alloca() declaration in <stdlib.h> so that software which keys
|
||||
off the fact whether or not the alloca preprocessor symbol is defined
|
||||
will do the right thing.
|
||||
|
||||
- Added an optional call-back function which can be called if alloca()
|
||||
is about to return NULL, which some software does not consider.
|
||||
Rather than letting such software drop into an illegal memory access
|
||||
or worse, that call-back function will be invoked instead, which can
|
||||
print an error message and eventually call abort().
|
||||
|
||||
|
||||
c.lib 1.197 (4.11.2005)
|
||||
|
||||
- Updated math_hypot.c to a newer (e_hypot.c 1.3 95/01/18) version from
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_carg.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_carg.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_cargf.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_cargf.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_cargl.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_cargl.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_cimag.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_cimag.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_cimagf.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_cimagf.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_cimagl.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_cimagl.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_conj.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_conj.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_conjf.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_conjf.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_conjl.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_conjl.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_creal.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_creal.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_crealf.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_crealf.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_creall.c,v 1.1 2005-04-03 10:22:47 obarthel Exp $
|
||||
* $Id: complex_creall.c,v 1.2 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
4
library/complex_headers.h
Executable file → Normal file
4
library/complex_headers.h
Executable file → Normal file
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: complex_headers.h,v 1.3 2005-05-12 14:50:06 obarthel Exp $
|
||||
* $Id: complex_headers.h,v 1.4 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
3
library/contrib/README
Normal file
3
library/contrib/README
Normal 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.
|
||||
183
library/contrib/byteswap/byteswap.h
Normal file
183
library/contrib/byteswap/byteswap.h
Normal 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: */
|
||||
|
||||
28
library/contrib/byteswap/byteswap_bswap16.c
Normal file
28
library/contrib/byteswap/byteswap_bswap16.c
Normal 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
|
||||
|
||||
29
library/contrib/byteswap/byteswap_bswap24.c
Normal file
29
library/contrib/byteswap/byteswap_bswap24.c
Normal 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
|
||||
|
||||
31
library/contrib/byteswap/byteswap_bswap32.c
Normal file
31
library/contrib/byteswap/byteswap_bswap32.c
Normal 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
|
||||
|
||||
48
library/contrib/byteswap/byteswap_bswap64.c
Normal file
48
library/contrib/byteswap/byteswap_bswap64.c
Normal 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
|
||||
|
||||
|
||||
70
library/contrib/byteswap/byteswap_swab.c
Normal file
70
library/contrib/byteswap/byteswap_swab.c
Normal 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
|
||||
|
||||
|
||||
|
||||
91
library/contrib/byteswap/byteswap_swab24.c
Normal file
91
library/contrib/byteswap/byteswap_swab24.c
Normal 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
|
||||
|
||||
|
||||
112
library/contrib/byteswap/byteswap_swab32.c
Normal file
112
library/contrib/byteswap/byteswap_swab32.c
Normal 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
|
||||
|
||||
|
||||
101
library/contrib/byteswap/byteswap_swab64.c
Normal file
101
library/contrib/byteswap/byteswap_swab64.c
Normal 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: */
|
||||
|
||||
@ -1,7 +1,34 @@
|
||||
//
|
||||
// $Id: crt0.S,v 1.6 2005-10-11 09:28:29 obarthel Exp $
|
||||
// $Id: crt0.S,v 1.6 2005-10-11 09:28:29 obarthel Exp $
|
||||
//
|
||||
// :ts=4
|
||||
// :ts=4
|
||||
//
|
||||
// Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
// Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
// 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.
|
||||
//
|
||||
|
||||
.text
|
||||
|
||||
@ -1,9 +1,37 @@
|
||||
/*
|
||||
* $Id: crtbegin.c,v 1.10 2005-03-18 12:38:22 obarthel Exp $
|
||||
/*
|
||||
* $Id: crtbegin.c,v 1.13 2010-08-21 11:37:03 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Handles global constructors and destructors for the OS4 GCC build.
|
||||
*
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||
* may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
@ -27,12 +55,22 @@ static void (*__DTOR_LIST__[1]) (void) __attribute__(( used, section(".dtors"),
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void _init(void);
|
||||
void _fini(void);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
_init(void)
|
||||
{
|
||||
extern void shared_obj_init(void);
|
||||
int num_ctors,i;
|
||||
int j;
|
||||
|
||||
/* The shared objects need to be set up before any local
|
||||
constructors are invoked. */
|
||||
shared_obj_init();
|
||||
|
||||
for(i = 1, num_ctors = 0 ; __CTOR_LIST__[i] != NULL ; i++)
|
||||
num_ctors++;
|
||||
|
||||
@ -45,6 +83,7 @@ _init(void)
|
||||
void
|
||||
_fini(void)
|
||||
{
|
||||
extern void shared_obj_exit(void);
|
||||
int num_dtors,i;
|
||||
static int j;
|
||||
|
||||
@ -53,6 +92,10 @@ _fini(void)
|
||||
|
||||
while(j++ < num_dtors)
|
||||
__DTOR_LIST__[j]();
|
||||
|
||||
/* The shared objects need to be cleaned up after all local
|
||||
destructors have been invoked. */
|
||||
shared_obj_exit();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -1,9 +1,37 @@
|
||||
/*
|
||||
/*
|
||||
* $Id: crtend.c,v 1.2 2005-03-09 21:07:25 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* End markers for the CTOR and DTOR list.
|
||||
*
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||
* may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_headers.h,v 1.5 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_headers.h,v 1.6 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_isalnum.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_isalnum.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_isalpha.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_isalpha.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_isascii.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
||||
* $Id: ctype_isascii.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_isblank.c,v 1.2 2005-05-29 08:19:36 obarthel Exp $
|
||||
* $Id: ctype_isblank.c,v 1.3 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_iscntrl.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_iscntrl.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_isdigit.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_isdigit.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_isgraph.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_isgraph.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_islower.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_islower.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_isprint.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_isprint.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_ispunct.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_ispunct.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_isspace.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_isspace.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* $Id: ctype_isupper.c,v 1.4 2005-05-29 09:56:09 obarthel Exp $
|
||||
* $Id: ctype_isupper.c,v 1.5 2006-01-08 12:04:22 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user