mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
Compare commits
57 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 59c0bb7f0b | |||
| 7492d108a3 | |||
| 9bf1e01518 | |||
| be2d80a86a | |||
| 24ea9161a7 | |||
| 2d5193371a | |||
| 186887bba5 | |||
| 83f0977c0c | |||
| e22a226640 | |||
| 3c1df9b1db | |||
| 655ea577d2 | |||
| 99e6856c11 | |||
| b252f90d66 | |||
| 1ed26d0a60 | |||
| 4dd74de299 | |||
| 3b5a4a32a4 | |||
| 7f7ca50d06 | |||
| 0ed8ef67ed | |||
| 267bdc4be6 | |||
| a7bac89279 | |||
| 95f0617964 | |||
| 4b3dbd3546 | |||
| b8663a4240 | |||
| aa3ccda8de | |||
| 8062f49f1c | |||
| 1310865c33 | |||
| 2ed76311fd | |||
| 3f19d52557 | |||
| 7038751f6b | |||
| 5d9e4c07a6 | |||
| f49a45f6a8 | |||
| fef99a0181 | |||
| 17a0e794c5 | |||
| 64f39b51ae | |||
| a7e0bc8e16 | |||
| 14595cc0a8 | |||
| 8555296691 | |||
| 53bb602493 | |||
| a048eadf09 | |||
| 51e20cee1d | |||
| 618af18519 | |||
| 0cbc101798 | |||
| 5d508c6e6d | |||
| a4b138e406 | |||
| 7d21a272cc | |||
| 7ae8399e43 | |||
| 0d101fd928 | |||
| 6a2db55fc2 | |||
| 6214bc2067 | |||
| 4a4c8b2ef9 | |||
| f3c4ee68cd | |||
| 0848048029 | |||
| dfd3dc3170 | |||
| 5d705f3c30 | |||
| 51f1dacdfa | |||
| 56e788a268 | |||
| 916dfa3c6a |
@ -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.
|
||||
@ -1,19 +0,0 @@
|
||||
In order to build the library, you need a 'C' compiler (obvious, isn't it?) and
|
||||
a set of header files for the networking API definitions. The networking header
|
||||
files go into a directory "netinclude" which has to sit in the same directory as
|
||||
the source code and the "include" directory you find in there. I'm not currently
|
||||
supplying these header files here. Drop me a line, and I'll take care of that.
|
||||
|
||||
The SAS/C flavour (smakefile) should get the library built using the "large data"
|
||||
model. This rules out the use of residentable programs as the startup code I'm
|
||||
using is very primitive (startup.o) and doesn't tinker with A4 relative data
|
||||
addressing (and how this may be set up).
|
||||
|
||||
There are two makefiles for GCC, each a different flavour. There is "GNUmakefile.68k",
|
||||
which will build the library for GCC on the 68k platform ("classic" Amiga). This
|
||||
builds all variants of the library, for large data, small data, resident, whatever
|
||||
model. It's a lot of work and I don't recommend you do this on a plain 68k machine.
|
||||
It will literally (!) take hours. The other makefile flavour is for AmigaOS4 using
|
||||
the PowerPC hosted GCC system ("GNUmakefile.os4"). This builds only the large data
|
||||
version of the library, but this is usually all you need. Small data support is
|
||||
currently not implemented but might follow in the future.
|
||||
@ -1,235 +0,0 @@
|
||||
An ISO 'C' (1994) compliant runtime library for the Amiga
|
||||
=========================================================
|
||||
|
||||
1. 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.
|
||||
|
||||
|
||||
2. What does it do?
|
||||
|
||||
Using "'C' - A reference manual" 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.
|
||||
|
||||
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 environent". This set is not complete, however. It
|
||||
will have to grow even further to accomodate for Samba's needs, but this is
|
||||
a good start. I specifically added hooks for integrating socket I/O at a
|
||||
later point of time.
|
||||
|
||||
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 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.
|
||||
|
||||
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 '__stack_size' variable
|
||||
(see "stdlib_main.c").
|
||||
|
||||
I added some amiga.lib and debug.lib functionality to the library, but
|
||||
don't count on it to be complete.
|
||||
|
||||
|
||||
3. 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.
|
||||
|
||||
Practically all library routines are implemented in a sort of na<6E>ve
|
||||
fashion. That is, they contain virtually no optimizations whatsoever. This
|
||||
is particularly apparent in workhorses such as memset() or memmove(). But
|
||||
then, the issue is easy testability and Amiga platform portability.
|
||||
|
||||
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 in
|
||||
in the first place.
|
||||
|
||||
|
||||
4. 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. 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@bayes.arc.nasa.gov).
|
||||
|
||||
|
||||
5. 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 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 malloc() 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 free() 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 NDEBUG preprocessor symbol at compile time
|
||||
(see <assert.h>).
|
||||
|
||||
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.
|
||||
|
||||
If you are going to rebuild the library with SAS/C you will need to
|
||||
reassign INCLUDE: to point to the local 'include' directory or things won't
|
||||
work.
|
||||
|
||||
|
||||
6. 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 variable names are prefixed with two underscores, as
|
||||
in '__stdio_init()'.
|
||||
|
||||
All routines attempt to do error checking on their parameters. They will
|
||||
either drop into an assert() or set an errno value and refuse to go any
|
||||
further. This cuts performance but should help to catch the simple bugs
|
||||
quite easily (NULL pointers).
|
||||
|
||||
Just like any halfway sane Amiga 'C'<27>runtime library, this one performs its
|
||||
^C 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 ^C signal and
|
||||
drop into raise(SIGINT) 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.
|
||||
|
||||
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. However, your program can set a global variable '__unix_semantics'
|
||||
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.
|
||||
|
||||
|
||||
7. 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.
|
||||
|
||||
|
||||
8. 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 Open Group's Single Unix
|
||||
Specification at <http://www.opengroup.org/onlinepubs/007904975>.
|
||||
|
||||
|
||||
9. 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:
|
||||
|
||||
====================================================
|
||||
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.
|
||||
====================================================
|
||||
|
||||
|
||||
|
||||
10. 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:
|
||||
|
||||
olsen@sourcery.han.de
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# $Id: GNUmakefile.68k,v 1.6 2004-08-16 09:33:11 obarthel Exp $
|
||||
# $Id: GNUmakefile.68k,v 1.17 2004-11-18 09:40:37 obarthel Exp $
|
||||
#
|
||||
# :ts=8
|
||||
#
|
||||
@ -9,7 +9,7 @@
|
||||
CC = gcc
|
||||
AR = ar -q
|
||||
RANLIB = ranlib
|
||||
COPY = copy clone
|
||||
COPY = copy clone buf=0
|
||||
DELETE = delete all quiet
|
||||
MAKEDIR = makedir
|
||||
MAKE = make -f GNUmakefile.68k
|
||||
@ -40,7 +40,7 @@ endif
|
||||
|
||||
.c.o:
|
||||
@echo "Compiling $<"
|
||||
@$(CC) -c $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT $<
|
||||
@$(CC) -c $(CFLAGS) $<
|
||||
|
||||
$(LIBC_OBJS)/%.o : %.c
|
||||
@echo "Compiling $< [$(TYPE):c]"
|
||||
@ -103,10 +103,10 @@ WARNINGS = \
|
||||
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
|
||||
|
||||
INCLUDES = -Iinclude -I. -Inetinclude
|
||||
OPTIONS = -DUSE_64_BIT_INTS -DNDEBUG -fno-builtin -DNO_INLINE_STDARG
|
||||
#OPTIONS = -DUSE_64_BIT_INTS -D__MEM_DEBUG -fno-builtin
|
||||
#OPTIONS = -DUSE_64_BIT_INTS -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
|
||||
OPTIMIZE = -O
|
||||
OPTIONS = -DNDEBUG -fno-builtin -DNO_INLINE_STDARG
|
||||
#OPTIONS = -D__MEM_DEBUG -fno-builtin
|
||||
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
|
||||
OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
|
||||
#OPTIMIZE = -O2 -fomit-frame-pointer
|
||||
#DEBUG = -g2
|
||||
|
||||
@ -144,9 +144,9 @@ C_LIB = \
|
||||
fcntl_open.o \
|
||||
fcntl_read.o \
|
||||
fcntl_write.o \
|
||||
fcntl_get_default_file.o \
|
||||
libgen_basename.o \
|
||||
libgen_dirname.o \
|
||||
locale_data.o \
|
||||
locale_init_exit.o \
|
||||
locale_localeconv.o \
|
||||
locale_setlocale.o \
|
||||
@ -286,6 +286,10 @@ C_LIB = \
|
||||
stdlib_modsi3.o \
|
||||
stdlib_mulsi3.o \
|
||||
stdlib_never_free.o \
|
||||
stdlib_osliberror.o \
|
||||
stdlib_oslibversion.o \
|
||||
stdlib_priority.o \
|
||||
stdlib_process_name.o \
|
||||
stdlib_putenv.o \
|
||||
stdlib_qsort.o \
|
||||
stdlib_rand.o \
|
||||
@ -306,6 +310,8 @@ C_LIB = \
|
||||
stdlib_startup.o \
|
||||
stdlib_strtol.o \
|
||||
stdlib_strtoul.o \
|
||||
stdlib_strtoll.o \
|
||||
stdlib_strtoull.o \
|
||||
stdlib_swapstack.o \
|
||||
stdlib_sysbase.o \
|
||||
stdlib_system.o \
|
||||
@ -315,8 +321,8 @@ C_LIB = \
|
||||
stdlib_udivsi4.o \
|
||||
stdlib_umodsi3.o \
|
||||
stdlib_unsetenv.o \
|
||||
stdlib_usergroup.o \
|
||||
stdlib_wildcard_expand.o \
|
||||
stdlib_stdio_window_spec.o \
|
||||
strings_strcasecmp.o \
|
||||
strings_strncasecmp.o \
|
||||
string_bcmp.o \
|
||||
@ -337,6 +343,8 @@ C_LIB = \
|
||||
string_strcspn.o \
|
||||
string_strdup.o \
|
||||
string_strerror.o \
|
||||
string_strlcat.o \
|
||||
string_strlcpy.o \
|
||||
string_strlen.o \
|
||||
string_strncat.o \
|
||||
string_strncmp.o \
|
||||
@ -346,24 +354,29 @@ C_LIB = \
|
||||
string_strspn.o \
|
||||
string_strstr.o \
|
||||
string_strtok.o \
|
||||
string_strtok_r.o \
|
||||
string_strxfrm.o \
|
||||
time_asctime.o \
|
||||
time_asctime_r.o \
|
||||
time_clock.o \
|
||||
time_converttime.o \
|
||||
time_ctime.o \
|
||||
time_ctime_r.o \
|
||||
time_data.o \
|
||||
time_gettimeofday.o \
|
||||
time_gmtime.o \
|
||||
time_gmtime_r.o \
|
||||
time_localtime.o \
|
||||
time_localtime_r.o \
|
||||
time_mktime.o \
|
||||
time_numbertostring.o \
|
||||
time_strftime.o \
|
||||
time_time.o \
|
||||
unistd_access.o \
|
||||
unistd_chdir.o \
|
||||
unistd_chdir_exit.o \
|
||||
unistd_chown.o \
|
||||
unistd_currentpathname.o \
|
||||
unistd_data.o \
|
||||
unistd_dup.o \
|
||||
unistd_dup2.o \
|
||||
unistd_fchown.o \
|
||||
@ -381,8 +394,11 @@ C_LIB = \
|
||||
unistd_realpath.o \
|
||||
unistd_sleep.o \
|
||||
unistd_symlink.o \
|
||||
unistd_timer.o \
|
||||
unistd_time_delay.o \
|
||||
unistd_truncate.o \
|
||||
unistd_unlink.o \
|
||||
unistd_usleep.o \
|
||||
utime_utime.o
|
||||
|
||||
UNIX_LIB = \
|
||||
@ -395,6 +411,7 @@ UNIX_LIB = \
|
||||
fcntl_creat.o \
|
||||
fcntl_fcntl.o \
|
||||
fcntl_open.o \
|
||||
fcntl_get_default_file.o \
|
||||
mount_convertinfo.o \
|
||||
mount_statfs.o \
|
||||
stat_chmod.o \
|
||||
@ -420,6 +437,7 @@ UNIX_LIB = \
|
||||
stdlib_system.o \
|
||||
unistd_access.o \
|
||||
unistd_chdir.o \
|
||||
unistd_chdir_exit.o \
|
||||
unistd_chown.o \
|
||||
unistd_getcwd.o \
|
||||
unistd_lchown.o \
|
||||
@ -481,7 +499,6 @@ MATH_LIB = \
|
||||
stdio_vasprintf.o \
|
||||
stdio_vfprintf.o \
|
||||
stdio_vfscanf.o \
|
||||
stdio_vfscanf.o \
|
||||
stdio_vprintf.o \
|
||||
stdio_vsnprintf.o \
|
||||
stdio_vsprintf.o \
|
||||
@ -672,6 +689,7 @@ AMIGA_LIB = \
|
||||
amiga_newlist.o \
|
||||
amiga_rangerand.o \
|
||||
amiga_remtof.o \
|
||||
amiga_rexxvars.o \
|
||||
amiga_setsuperattrs.o \
|
||||
amiga_timedelay.o \
|
||||
amiga_waitbeam.o
|
||||
@ -681,8 +699,7 @@ AMIGA_LIB = \
|
||||
LIBS_68K := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.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)
|
||||
#LIBS_020 := $(LIBS_68K)
|
||||
LIBS_020 := $(LIBM881_OBJS)/libm881.a $(LIBS_68K)
|
||||
|
||||
##############################################################################
|
||||
|
||||
@ -708,8 +725,8 @@ all: \
|
||||
lib/mainnb.o \
|
||||
lib/mainb.o \
|
||||
lib/mainb32.o \
|
||||
lib/libm.a \
|
||||
lib/libm020/libm.a \
|
||||
lib/libm.a \
|
||||
lib/libb/libm.a \
|
||||
lib/libb/libm020/libm.a \
|
||||
lib/libb32/libm020/libm.a
|
||||
@ -981,28 +998,3 @@ mainb.o : stdlib_main.c
|
||||
|
||||
mainnb.o : stdlib_main.c
|
||||
$(CC) -o mainnb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -m68000 stdlib_main.c
|
||||
|
||||
##############################################################################
|
||||
|
||||
#test: test.o ncrt0.o libc.a libunix.a libm.a libdebug.a libamiga.a
|
||||
# $(CC) -Wl,--verbose $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT \
|
||||
# -o $@ -nostdlib ncrt0.o test.o -L. -lm -lunix -ldebug -lc -lamiga
|
||||
|
||||
#test: test.o ncrt0.o nbcrt0.o nrcrt0.o libc.a libunix.a libm.a libdebug.a libamiga.a
|
||||
# $(CC) -resident -Wl,--verbose $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT -fbaserel32 -DSMALL_DATA \
|
||||
# -o $@ -nostdlib nbcrt0.o test.o -L. -lm -lunix -ldebug -lc -lamiga
|
||||
|
||||
test : test.c
|
||||
gcc -o test test.c -D__MEM_DEBUG -DFLOATING_POINT_SUPPORT -Llib -lunix -lm
|
||||
|
||||
#test: test.o ncrt0.o nbcrt0.o nrcrt0.o libc.a libunix.a libm.a libdebug.a libamiga.a
|
||||
# $(CC) -resident -Wl,--verbose $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT -fbaserel -DSMALL_DATA \
|
||||
# -o $@ -nostdlib nrcrt0.o test.o -L. -lm -lunix -ldebug -lc -lamiga
|
||||
|
||||
##############################################################################
|
||||
|
||||
mkid:
|
||||
mkid -v #?.(c|h|asm|i) include/#?.(c|h|asm|i) include/sys/#?.(c|h|asm|i)
|
||||
|
||||
update:
|
||||
mkid -v -u
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# $Id: GNUmakefile.os4,v 1.5 2004-08-16 09:33:11 obarthel Exp $
|
||||
# $Id: GNUmakefile.os4,v 1.15 2004-11-18 09:40:37 obarthel Exp $
|
||||
#
|
||||
# :ts=8
|
||||
#
|
||||
@ -35,7 +35,6 @@ ifeq (,$(TYPE))
|
||||
LIBC_OBJS = libc_objs
|
||||
LIBUNIX_OBJS = libunix_objs
|
||||
LIBM_OBJS = libm_objs
|
||||
LIBSTACK_OBJS = libstack_objs
|
||||
LIBNET_OBJS = libnet_objs
|
||||
LIBDEBUG_OBJS = libdebug_objs
|
||||
LIBAMIGA_OBJS = libamiga_objs
|
||||
@ -43,7 +42,6 @@ else
|
||||
LIBC_OBJS = $(TYPE)/libc_objs
|
||||
LIBUNIX_OBJS = $(TYPE)/libunix_objs
|
||||
LIBM_OBJS = $(TYPE)/libm_objs
|
||||
LIBSTACK_OBJS = $(TYPE)/libstack_objs
|
||||
LIBNET_OBJS = $(TYPE)/libnet_objs
|
||||
LIBDEBUG_OBJS = $(TYPE)/libdebug_objs
|
||||
LIBAMIGA_OBJS = $(TYPE)/libamiga_objs
|
||||
@ -51,9 +49,10 @@ endif
|
||||
|
||||
##############################################################################
|
||||
|
||||
# General build rules for all object files and the individual libraries
|
||||
%.o : %.c
|
||||
@echo "Compiling $<"
|
||||
@$(CC) -c $(CFLAGS) -DPPC_FLOATING_POINT_SUPPORT $<
|
||||
@$(CC) -c $(CFLAGS) $<
|
||||
|
||||
$(LIBC_OBJS)/%.o : %.c
|
||||
@echo "Compiling $< [$(TYPE):c]"
|
||||
@ -65,11 +64,7 @@ $(LIBUNIX_OBJS)/%.o : %.c
|
||||
|
||||
$(LIBM_OBJS)/%.o : %.c
|
||||
@echo "Compiling $< [$(TYPE):m]"
|
||||
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) -DPPC_FLOATING_POINT_SUPPORT $<
|
||||
|
||||
$(LIBSTACK_OBJS)/%.o : %.c
|
||||
@echo "Compiling $< [$(TYPE):stack]"
|
||||
@$(CC) -o $(LIBSTACK_OBJS)/$*.o -c $(CFLAGS) $<
|
||||
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) $(FLOAT_TYPE) $<
|
||||
|
||||
$(LIBNET_OBJS)/%.o : %.c
|
||||
@echo "Compiling $< [$(TYPE):net]"
|
||||
@ -85,12 +80,20 @@ $(LIBAMIGA_OBJS)/%.o : %.c
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Build options for the individual libraries
|
||||
ifeq (small_data,$(TYPE))
|
||||
CODE_TYPE := -msdata=sysv -DSMALL_DATA
|
||||
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq (large_data,$(TYPE))
|
||||
CODE_TYPE := -msdata=data
|
||||
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq (large_data_softfloat,$(TYPE))
|
||||
CODE_TYPE := -msdata=data -msoft-float
|
||||
FLOAT_TYPE :=
|
||||
endif
|
||||
|
||||
##############################################################################
|
||||
@ -100,14 +103,15 @@ WARNINGS = \
|
||||
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
|
||||
|
||||
INCLUDES = -Iinclude -I. -I$(SDK_INCLUDE)
|
||||
OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -fno-builtin -D__USE_INLINE__ -Wa,-mregnames
|
||||
OPTIMIZE = -O3 -fomit-frame-pointer -funroll-loops
|
||||
OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames
|
||||
OPTIMIZE = -O -fomit-frame-pointer -funroll-loops
|
||||
#DEBUG = -g
|
||||
|
||||
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDES)
|
||||
|
||||
##############################################################################
|
||||
|
||||
# All objects files which make up libc.a
|
||||
C_LIB = \
|
||||
c.lib_rev.o \
|
||||
ctype_isalnum.o \
|
||||
@ -127,9 +131,9 @@ C_LIB = \
|
||||
ctype_table.o \
|
||||
dirent_closedir.o \
|
||||
dirent_data.o \
|
||||
dirent_rewinddir.o \
|
||||
dirent_opendir.o \
|
||||
dirent_readdir.o \
|
||||
dirent_rewinddir.o \
|
||||
errno_data.o \
|
||||
fcntl_close.o \
|
||||
fcntl_creat.o \
|
||||
@ -138,9 +142,9 @@ C_LIB = \
|
||||
fcntl_open.o \
|
||||
fcntl_read.o \
|
||||
fcntl_write.o \
|
||||
fcntl_get_default_file.o \
|
||||
libgen_basename.o \
|
||||
libgen_dirname.o \
|
||||
locale_data.o \
|
||||
locale_init_exit.o \
|
||||
locale_localeconv.o \
|
||||
locale_setlocale.o \
|
||||
@ -248,41 +252,42 @@ C_LIB = \
|
||||
stdlib_atol.o \
|
||||
stdlib_bsearch.o \
|
||||
stdlib_calloc.o \
|
||||
stdlib_checkdetach.o \
|
||||
stdlib_constructor.o \
|
||||
stdlib_constructor_begin.o \
|
||||
stdlib_constructor_end.o \
|
||||
stdlib_data.o \
|
||||
stdlib_default_pool_size.o \
|
||||
stdlib_default_puddle_size.o \
|
||||
stdlib_destructor.o \
|
||||
stdlib_detach.o \
|
||||
stdlib_disablerequesters.o \
|
||||
stdlib_div.o \
|
||||
stdlib_modsi3.o \
|
||||
stdlib_divsi3.o \
|
||||
stdlib_divsi4.o \
|
||||
stdlib_umodsi3.o \
|
||||
stdlib_udivsi3.o \
|
||||
stdlib_udivsi4.o \
|
||||
stdlib_dosbase.o \
|
||||
stdlib_exit.o \
|
||||
stdlib_free.o \
|
||||
stdlib_getdefstacksize.o \
|
||||
stdlib_getenv.o \
|
||||
stdlib_getsp.o \
|
||||
stdlib_init_exit.o \
|
||||
stdlib_isresident.o \
|
||||
stdlib_labs.o \
|
||||
stdlib_ldiv.o \
|
||||
stdlib_getdefstacksize.o \
|
||||
stdlib_stackargbytes.o \
|
||||
stdlib_stack_usage.o \
|
||||
stdlib_checkdetach.o \
|
||||
stdlib_detach.o \
|
||||
stdlib_isresident.o \
|
||||
stdlib_sysbase.o \
|
||||
stdlib_dosbase.o \
|
||||
stdlib_machine_test.o \
|
||||
stdlib_malloc.o \
|
||||
stdlib_math.o \
|
||||
stdlib_mkdtemp.o \
|
||||
stdlib_mkstemp.o \
|
||||
stdlib_mktemp.o \
|
||||
stdlib_modsi3.o \
|
||||
stdlib_mulsi3.o \
|
||||
stdlib_never_free.o \
|
||||
stdlib_osliberror.o \
|
||||
stdlib_oslibversion.o \
|
||||
stdlib_priority.o \
|
||||
stdlib_process_name.o \
|
||||
stdlib_putenv.o \
|
||||
stdlib_qsort.o \
|
||||
stdlib_rand.o \
|
||||
@ -294,20 +299,28 @@ C_LIB = \
|
||||
stdlib_showerror.o \
|
||||
stdlib_socket.o \
|
||||
stdlib_srand.o \
|
||||
stdlib_stackargbytes.o \
|
||||
stdlib_stackcheck.o \
|
||||
stdlib_stackoverflow.o \
|
||||
stdlib_stacksafezone.o \
|
||||
stdlib_stacksize.o \
|
||||
stdlib_stack_usage.o \
|
||||
stdlib_startup.o \
|
||||
stdlib_strtol.o \
|
||||
stdlib_strtoul.o \
|
||||
stdlib_strtoll.o \
|
||||
stdlib_strtoull.o \
|
||||
stdlib_swapstack.o \
|
||||
stdlib_sysbase.o \
|
||||
stdlib_system.o \
|
||||
stdlib_termination_message.o \
|
||||
stdlib_threshold.o \
|
||||
stdlib_udivsi3.o \
|
||||
stdlib_udivsi4.o \
|
||||
stdlib_umodsi3.o \
|
||||
stdlib_unsetenv.o \
|
||||
stdlib_usergroup.o \
|
||||
stdlib_wildcard_expand.o \
|
||||
stdlib_stdio_window_spec.o \
|
||||
strings_strcasecmp.o \
|
||||
strings_strncasecmp.o \
|
||||
string_bcmp.o \
|
||||
@ -328,6 +341,8 @@ C_LIB = \
|
||||
string_strcspn.o \
|
||||
string_strdup.o \
|
||||
string_strerror.o \
|
||||
string_strlcat.o \
|
||||
string_strlcpy.o \
|
||||
string_strlen.o \
|
||||
string_strncat.o \
|
||||
string_strncmp.o \
|
||||
@ -337,24 +352,29 @@ C_LIB = \
|
||||
string_strspn.o \
|
||||
string_strstr.o \
|
||||
string_strtok.o \
|
||||
string_strtok_r.o \
|
||||
string_strxfrm.o \
|
||||
time_asctime.o \
|
||||
time_asctime_r.o \
|
||||
time_clock.o \
|
||||
time_converttime.o \
|
||||
time_ctime.o \
|
||||
time_ctime_r.o \
|
||||
time_data.o \
|
||||
time_gettimeofday.o \
|
||||
time_gmtime.o \
|
||||
time_gmtime_r.o \
|
||||
time_localtime.o \
|
||||
time_localtime_r.o \
|
||||
time_mktime.o \
|
||||
time_numbertostring.o \
|
||||
time_strftime.o \
|
||||
time_time.o \
|
||||
unistd_access.o \
|
||||
unistd_chdir.o \
|
||||
unistd_chdir_exit.o \
|
||||
unistd_chown.o \
|
||||
unistd_currentpathname.o \
|
||||
unistd_data.o \
|
||||
unistd_dup.o \
|
||||
unistd_dup2.o \
|
||||
unistd_fchown.o \
|
||||
@ -372,21 +392,25 @@ C_LIB = \
|
||||
unistd_realpath.o \
|
||||
unistd_sleep.o \
|
||||
unistd_symlink.o \
|
||||
unistd_timer.o \
|
||||
unistd_time_delay.o \
|
||||
unistd_truncate.o \
|
||||
unistd_unlink.o \
|
||||
utime_utime.o
|
||||
|
||||
unistd_usleep.o \
|
||||
utime_utime.o
|
||||
|
||||
# All objects files which make up libunix.a
|
||||
UNIX_LIB = \
|
||||
unix.lib_rev.o \
|
||||
dirent_closedir.o \
|
||||
dirent_data.o \
|
||||
dirent_rewinddir.o \
|
||||
dirent_opendir.o \
|
||||
dirent_readdir.o \
|
||||
dirent_rewinddir.o \
|
||||
fcntl_creat.o \
|
||||
fcntl_fcntl.o \
|
||||
fcntl_open.o \
|
||||
fcntl_get_default_file.o \
|
||||
mount_convertinfo.o \
|
||||
mount_statfs.o \
|
||||
stat_chmod.o \
|
||||
@ -396,12 +420,12 @@ UNIX_LIB = \
|
||||
stat_rmdir.o \
|
||||
stat_stat.o \
|
||||
stdio_fdhookentry.o \
|
||||
stdio_init_exit.o \
|
||||
stdio_locksemaphorename.o \
|
||||
stdio_openiob.o \
|
||||
stdio_fflush.o \
|
||||
stdio_fopen.o \
|
||||
stdio_fopen.o \
|
||||
stdio_init_exit.o \
|
||||
stdio_locksemaphorename.o \
|
||||
stdio_openiob.o \
|
||||
stdio_popen.o \
|
||||
stdio_remove.o \
|
||||
stdio_rename.o \
|
||||
@ -412,6 +436,7 @@ UNIX_LIB = \
|
||||
stdlib_system.o \
|
||||
unistd_access.o \
|
||||
unistd_chdir.o \
|
||||
unistd_chdir_exit.o \
|
||||
unistd_chown.o \
|
||||
unistd_getcwd.o \
|
||||
unistd_lchown.o \
|
||||
@ -430,6 +455,7 @@ UNIX_LIB = \
|
||||
unistd_wildcard_expand.o \
|
||||
utime_utime.o
|
||||
|
||||
# All objects files which make up libm.a
|
||||
MATH_LIB = \
|
||||
math_acos.o \
|
||||
math_asin.o \
|
||||
@ -479,7 +505,6 @@ MATH_LIB = \
|
||||
stdio_vasprintf.o \
|
||||
stdio_vfprintf.o \
|
||||
stdio_vfscanf.o \
|
||||
stdio_vfscanf.o \
|
||||
stdio_vprintf.o \
|
||||
stdio_vsnprintf.o \
|
||||
stdio_vsprintf.o \
|
||||
@ -488,48 +513,7 @@ MATH_LIB = \
|
||||
stdlib_strtod.o \
|
||||
time_difftime.o
|
||||
|
||||
MATH_LIB_IEEE = \
|
||||
m.lib_rev.o \
|
||||
$(MATH_LIB) \
|
||||
math_adddf3.o \
|
||||
math_addsf3.o \
|
||||
math_divdf3.o \
|
||||
math_divsf3.o \
|
||||
math_eqdf2.o \
|
||||
math_eqsf2.o \
|
||||
math_extendsfdf2.o \
|
||||
math_fixdfsi.o \
|
||||
math_fixsfsi.o \
|
||||
math_fixunsdfsi.o \
|
||||
math_fixunssfsi.o \
|
||||
math_floatsidf.o \
|
||||
math_floatsisf.o \
|
||||
math_gedf2.o \
|
||||
math_gesf2.o \
|
||||
math_gtdf2.o \
|
||||
math_gtsf2.o \
|
||||
math_ledf2.o \
|
||||
math_lesf2.o \
|
||||
math_ltdf2.o \
|
||||
math_ltsf2.o \
|
||||
math_muldf3.o \
|
||||
math_mulsf3.o \
|
||||
math_nedf2.o \
|
||||
math_negdf2.o \
|
||||
math_negsf2.o \
|
||||
math_nesf2.o \
|
||||
math_subdf3.o \
|
||||
math_subsf3.o \
|
||||
math_truncdfsf2.o
|
||||
|
||||
STACK_LIB = \
|
||||
stack.lib_rev.o \
|
||||
stdlib_setjmp.o \
|
||||
stdlib_stackextension.o \
|
||||
stdlib_stackminframe.o \
|
||||
stdlib_stackoverflow.o \
|
||||
stdlib_stacksafezone.o
|
||||
|
||||
# All objects files which make up libnet.a
|
||||
NET_LIB = \
|
||||
net.lib_rev.o \
|
||||
socket_accept.o \
|
||||
@ -573,6 +557,7 @@ NET_LIB = \
|
||||
socket_socket.o \
|
||||
socket_hook_entry.o \
|
||||
socket_hstrerror.o \
|
||||
stat_umask.o \
|
||||
usergroup_crypt.o \
|
||||
usergroup_data.o \
|
||||
usergroup_endgrent.o \
|
||||
@ -601,13 +586,12 @@ NET_LIB = \
|
||||
usergroup_setregid.o \
|
||||
usergroup_setreuid.o \
|
||||
usergroup_setsid.o \
|
||||
usergroup_setuid.o \
|
||||
stat_umask.o
|
||||
usergroup_setuid.o
|
||||
|
||||
# All objects files which make up libdebug.a
|
||||
DEBUG_LIB = \
|
||||
debug.lib_rev.o \
|
||||
debug.o \
|
||||
debug_level.o \
|
||||
debug_cmpstrexec.o \
|
||||
debug_kcmpstr.o \
|
||||
debug_kdofmt.o \
|
||||
@ -633,8 +617,10 @@ DEBUG_LIB = \
|
||||
debug_kputstr1.o \
|
||||
debug_kputstr2.o \
|
||||
debug_kvprintf1.o \
|
||||
debug_kvprintf2.o
|
||||
debug_kvprintf2.o \
|
||||
debug_level.o
|
||||
|
||||
# All objects files which make up libamiga.a
|
||||
AMIGA_LIB = \
|
||||
amiga.lib_rev.o \
|
||||
amiga_acrypt.o \
|
||||
@ -643,10 +629,17 @@ AMIGA_LIB = \
|
||||
amiga_argarrayinit.o \
|
||||
amiga_argint.o \
|
||||
amiga_argstring.o \
|
||||
amiga_beginio.o \
|
||||
amiga_callhooka.o \
|
||||
amiga_coercemethod.o \
|
||||
amiga_createextio.o \
|
||||
amiga_createport.o \
|
||||
amiga_createstdio.o \
|
||||
amiga_createtask.o \
|
||||
amiga_deleteextio.o \
|
||||
amiga_deleteport.o \
|
||||
amiga_deletestdio.o \
|
||||
amiga_deletetask.o \
|
||||
amiga_domethod.o \
|
||||
amiga_dosupermethod.o \
|
||||
amiga_dotimer.o \
|
||||
@ -654,49 +647,62 @@ AMIGA_LIB = \
|
||||
amiga_freeievents.o \
|
||||
amiga_hotkey.o \
|
||||
amiga_invertstring.o \
|
||||
amiga_newlist.o \
|
||||
amiga_rangerand.o \
|
||||
amiga_remtof.o \
|
||||
amiga_rexxvars.o \
|
||||
amiga_setsuperattrs.o \
|
||||
amiga_timedelay.o \
|
||||
amiga_waitbeam.o
|
||||
|
||||
##############################################################################
|
||||
|
||||
LIBS := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libunix.a \
|
||||
$(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
|
||||
$(LIBM_OBJS)/libm.a $(LIBNET_OBJS)/libnet.a
|
||||
# The libraries to be built, prefixed by the respective path names
|
||||
LIBS := \
|
||||
$(LIBC_OBJS)/libc.a \
|
||||
$(LIBUNIX_OBJS)/libunix.a \
|
||||
$(LIBDEBUG_OBJS)/libdebug.a \
|
||||
$(LIBAMIGA_OBJS)/libamiga.a \
|
||||
$(LIBM_OBJS)/libm.a \
|
||||
$(LIBNET_OBJS)/libnet.a
|
||||
|
||||
##############################################################################
|
||||
|
||||
# The startup object files to be built
|
||||
STARTUPS := bcrt0.o bcrtbegin.o bcrtend.o crt0.o crtbegin.o crtend.o mainb.o mainnb.o
|
||||
|
||||
##############################################################################
|
||||
|
||||
STARTUPS := crt0.o crtbegin.o crtend.o mainnb.o
|
||||
|
||||
##############################################################################
|
||||
|
||||
# This is the first target: it creates the necessary directories, then proceeds
|
||||
# to build the startup object files and finally the libraries
|
||||
all: \
|
||||
lib \
|
||||
lib/soft-float \
|
||||
lib/small-data \
|
||||
small_data \
|
||||
large_data \
|
||||
large_data_softfloat \
|
||||
lib/bcrt0.o \
|
||||
lib/bcrtbegin.o \
|
||||
lib/bcrtend.o \
|
||||
lib/crt0.o \
|
||||
lib/crtbegin.o \
|
||||
lib/crtend.o \
|
||||
lib/mainb.o \
|
||||
lib/mainnb.o \
|
||||
lib/libm.a
|
||||
|
||||
copy:
|
||||
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
|
||||
lib/libm.a \
|
||||
lib/small-data/libm.a \
|
||||
lib/soft-float/libm.a
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Delete all object files and libraries
|
||||
clean:
|
||||
-$(DELETE) $(TYPE) $(STARTUPS) \
|
||||
$(LIBC_OBJS) $(LIBUNIX_OBJS) $(LIBM_OBJS) $(LIBSTACK_OBJS) $(LIBNET_OBJS) $(LIBDEBUG_OBJS) $(LIBAMIGA_OBJS)
|
||||
|
||||
realclean:
|
||||
$(MAKE) clean
|
||||
-$(DELETE) lib small_data large_data
|
||||
-$(DELETE) $(STARTUPS) lib small_data large_data large_data_softfloat
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Update the version numbers bound to the individual libraries
|
||||
version:
|
||||
cp c.lib_rev.rev amiga.lib_rev.rev
|
||||
cp c.lib_rev.rev debug.lib_rev.rev
|
||||
@ -716,33 +722,74 @@ version:
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Tag all files with a certain version number
|
||||
cvs-tag:
|
||||
cvs -q tag V1_`cat c.lib_rev.rev`
|
||||
|
||||
##############################################################################
|
||||
|
||||
kitchen_sink: $(TYPE) $(LIBS) $(STARTUPS)
|
||||
|
||||
##############################################################################
|
||||
|
||||
ifneq (,$(TYPE))
|
||||
$(TYPE):
|
||||
$(MAKEDIR) $@
|
||||
endif
|
||||
# This target first creates a directory to store the object files in, then
|
||||
# proceeds to build the libraries from the code. It is invoked by the
|
||||
# individual library build targets below.
|
||||
all_libraries: $(TYPE) $(LIBS)
|
||||
|
||||
##############################################################################
|
||||
|
||||
# These create the required subdirectories to store object files and
|
||||
# libraries in
|
||||
lib:
|
||||
-$(MAKEDIR) $@
|
||||
|
||||
lib/libm.a: lib
|
||||
$(MAKE) TYPE=large_data kitchen_sink
|
||||
lib/small-data: lib
|
||||
-$(MAKEDIR) $@
|
||||
|
||||
lib/soft-float: lib
|
||||
-$(MAKEDIR) $@
|
||||
|
||||
small_data:
|
||||
-$(MAKEDIR) $@
|
||||
|
||||
large_data:
|
||||
-$(MAKEDIR) $@
|
||||
|
||||
large_data_softfloat:
|
||||
-$(MAKEDIR) $@
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Dependencies for libm.a (large data variant with hardware floating point code
|
||||
# support): this actually ends up building all the libraries rather than just
|
||||
# libm.a
|
||||
lib/libm.a: large_data large_data/libm.a
|
||||
|
||||
large_data/libm.a:
|
||||
$(MAKE) TYPE=large_data all_libraries
|
||||
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
|
||||
|
||||
lib/small-data/libm.a: lib lib/small-data
|
||||
$(MAKE) TYPE=small_data kitchen_sink
|
||||
##############################################################################
|
||||
|
||||
# Dependencies for libm.a (large data variant with software floating point code
|
||||
# support): this actually ends up building all the libraries rather than just
|
||||
# libm.a
|
||||
lib/soft-float/libm.a: large_data_softfloat large_data_softfloat/libm.a
|
||||
|
||||
large_data_softfloat/libm.a:
|
||||
$(MAKE) TYPE=large_data_softfloat all_libraries
|
||||
$(COPY) $(foreach file,$(LIBS),large_data_softfloat/$(file)) lib/soft-float
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Dependencies for libm.a (small data variant): this actually ends up building all
|
||||
# the libraries rather than just libm.a
|
||||
lib/small-data/libm.a: small_data small_data/libm.a
|
||||
|
||||
small_data/libm.a:
|
||||
$(MAKE) TYPE=small_data all_libraries
|
||||
$(COPY) $(foreach file,$(LIBS),small_data/$(file)) lib/small-data
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Rules to build and move the startup code
|
||||
lib/crt0.o : lib crt0.o
|
||||
$(COPY) crt0.o lib
|
||||
|
||||
@ -758,24 +805,46 @@ lib/mainnb.o : lib mainnb.o
|
||||
lib/mainb.o : lib mainb.o
|
||||
$(COPY) mainb.o lib
|
||||
|
||||
lib/bcrt0.o : lib bcrt0.o
|
||||
$(COPY) bcrt0.o lib
|
||||
|
||||
lib/bcrtbegin.o : lib bcrtbegin.o
|
||||
$(COPY) bcrtbegin.o lib
|
||||
|
||||
lib/bcrtend.o : lib bcrtend.o
|
||||
$(COPY) bcrtend.o lib
|
||||
|
||||
##############################################################################
|
||||
|
||||
$(LIBAMIGA_OBJS)/amiga_hookentry.o : amiga_hookentry.c
|
||||
|
||||
# Individual dependencies which tell make to build the object files from
|
||||
# 'C' source files rather than the assembly language source files of the
|
||||
# same name (e.g. stdlib_getsp.c instead of stdlib_getsp.asm).
|
||||
$(LIBC_OBJS)/stdlib_getsp.o : stdlib_getsp.c
|
||||
|
||||
$(LIBC_OBJS)/stdlib_swapstack.o : stdlib_swapstack.c
|
||||
|
||||
$(LIBC_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
|
||||
|
||||
$(LIBSTACK_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
|
||||
##############################################################################
|
||||
|
||||
# Build rules for version information that goes into each library
|
||||
$(LIBC_OBJS)/c.lib_rev.o : c.lib_rev.c c.lib_rev.h
|
||||
|
||||
$(LIBUNIX_OBJS)/unix.lib_rev.o : unix.lib_rev.c unix.lib_rev.h
|
||||
|
||||
$(LIBM_OBJS)/m.lib_rev.o : m.lib_rev.c m.lib_rev.h
|
||||
|
||||
$(LIBNET_OBJS)/net.lib_rev.o : net.lib_rev.c net.lib_rev.h
|
||||
|
||||
$(LIBDEBUG_OBJS)/debug.lib_rev.o : debug.lib_rev.c debug.lib_rev.h
|
||||
|
||||
$(LIBAMIGA_OBJS)/amiga.lib_rev.o : amiga.lib_rev.c amiga.lib_rev.h
|
||||
|
||||
##############################################################################
|
||||
|
||||
$(LIBC_OBJS)/stdlib_stacksize.o : stdlib_stacksize.c stdlib_gcc_help.h
|
||||
|
||||
$(LIBC_OBJS)/stdlib_shell_escape.o : stdlib_shell_escape.c stdlib_gcc_help.h
|
||||
|
||||
# Build rules for the debug version of the library which has special
|
||||
# memory allocation debugging code, controlled by the contents of
|
||||
# the stdlib_mem_debug.h file.
|
||||
$(LIBC_OBJS)/stdlib_alloca.o : stdlib_alloca.c stdlib_mem_debug.h
|
||||
|
||||
$(LIBC_OBJS)/stdlib_calloc.o : stdlib_calloc.c stdlib_mem_debug.h
|
||||
@ -792,6 +861,7 @@ $(LIBC_OBJS)/stdlib_red_black.o : stdlib_red_black.c stdlib_mem_debug.h
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Individual build rules for libc.a
|
||||
$(LIBC_OBJS) :
|
||||
$(MAKEDIR) $@
|
||||
|
||||
@ -802,6 +872,7 @@ $(LIBC_OBJS)/libc.a : $(LIBC_OBJS) $(foreach file,$(C_LIB),$(LIBC_OBJS)/$(file))
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Individual build rules for libunix.a
|
||||
$(LIBUNIX_OBJS) :
|
||||
$(MAKEDIR) $@
|
||||
|
||||
@ -812,26 +883,18 @@ $(LIBUNIX_OBJS)/libunix.a : $(LIBUNIX_OBJS) $(foreach file,$(UNIX_LIB),$(LIBUNIX
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Individual build rules for libm.a
|
||||
$(LIBM_OBJS) :
|
||||
$(MAKEDIR) $@
|
||||
|
||||
$(LIBM_OBJS)/libm.a : $(LIBM_OBJS) $(foreach file,$(MATH_LIB_IEEE),$(LIBM_OBJS)/$(file))
|
||||
$(LIBM_OBJS)/libm.a : $(LIBM_OBJS) $(foreach file,$(MATH_LIB),$(LIBM_OBJS)/$(file))
|
||||
-$(DELETE) $@
|
||||
@$(AR) $@ $(foreach file,$(MATH_LIB_IEEE),$(LIBM_OBJS)/$(file))
|
||||
$(RANLIB) $@
|
||||
|
||||
##############################################################################
|
||||
|
||||
$(LIBSTACK_OBJS) :
|
||||
$(MAKEDIR) $@
|
||||
|
||||
$(LIBSTACK_OBJS)/libstack.a : $(LIBSTACK_OBJS) $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
|
||||
-$(DELETE) $@
|
||||
@$(AR) $@ $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
|
||||
@$(AR) $@ $(foreach file,$(MATH_LIB),$(LIBM_OBJS)/$(file))
|
||||
$(RANLIB) $@
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Individual build rules for libnet.a
|
||||
$(LIBNET_OBJS) :
|
||||
$(MAKEDIR) $@
|
||||
|
||||
@ -842,6 +905,7 @@ $(LIBNET_OBJS)/libnet.a : $(LIBNET_OBJS) $(foreach file,$(NET_LIB),$(LIBNET_OBJS
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Individual build rules for libdebug.a
|
||||
$(LIBDEBUG_OBJS) :
|
||||
$(MAKEDIR) $@
|
||||
|
||||
@ -852,6 +916,7 @@ $(LIBDEBUG_OBJS)/libdebug.a : $(LIBDEBUG_OBJS) $(foreach file,$(DEBUG_LIB),$(LIB
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Individual build rules for libamiga.a
|
||||
$(LIBAMIGA_OBJS) :
|
||||
$(MAKEDIR) $@
|
||||
|
||||
@ -862,6 +927,7 @@ $(LIBAMIGA_OBJS)/libamiga.a : $(LIBAMIGA_OBJS) $(foreach file,$(AMIGA_LIB),$(LIB
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Individual build rules for the startup code.
|
||||
crt0.o : crt0.S
|
||||
@echo "Assembling $<"
|
||||
@$(CC) -Wa,-mregnames -o crt0.o -c crt0.S
|
||||
@ -878,11 +944,8 @@ mainb.o : stdlib_main.c
|
||||
@echo "Compiling $<"
|
||||
@$(CC) -o mainb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA stdlib_main.c
|
||||
|
||||
##############################################################################
|
||||
bcrtbegin.o : crtbegin.c
|
||||
$(CC) -o bcrtbegin.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA crtbegin.c
|
||||
|
||||
mkid:
|
||||
# mkid -v #?.(c|h|asm|i) include/#?.(c|h|asm|i) include/sys/#?.(c|h|asm|i)
|
||||
mkid *.[ch] include/*.h include/sys/*.h
|
||||
|
||||
update:
|
||||
mkid -v -u
|
||||
bcrtend.o : crtend.c
|
||||
$(CC) -o bcrtend.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA crtend.c
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 171
|
||||
#define DATE "16.8.2004"
|
||||
#define VERS "amiga.lib 1.171"
|
||||
#define VSTRING "amiga.lib 1.171 (16.8.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: amiga.lib 1.171 (16.8.2004)"
|
||||
#define REVISION 184
|
||||
#define DATE "28.11.2004"
|
||||
#define VERS "amiga.lib 1.184"
|
||||
#define VSTRING "amiga.lib 1.184 (28.11.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: amiga.lib 1.184 (28.11.2004)"
|
||||
|
||||
@ -1 +1 @@
|
||||
171
|
||||
184
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: amiga_beginio.c,v 1.1.1.1 2004-07-26 16:30:17 obarthel Exp $
|
||||
* $Id: amiga_beginio.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -37,6 +37,14 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifndef __PPC__
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__SASC)
|
||||
|
||||
VOID __begin_io(struct IORequest * ior);
|
||||
@ -64,10 +72,6 @@ VOID __begin_io(struct IORequest * ior);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
BeginIO(struct IORequest *ior)
|
||||
{
|
||||
@ -82,3 +86,35 @@ BeginIO(struct IORequest *ior)
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#else
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#include <proto/exec.h>
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(BeginIO)
|
||||
#undef BeginIO
|
||||
#endif /* BeginIO */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
BeginIO(struct IORequest *ior)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
assert( ior != NULL && ior->io_Device != NULL );
|
||||
|
||||
IExec->BeginIO(ior);
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* __PPC__ */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: amiga_createextio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
||||
* $Id: amiga_createextio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -44,6 +44,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(CreateExtIO)
|
||||
#undef CreateExtIO
|
||||
#endif /* CreateExtIO */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct IORequest *
|
||||
CreateExtIO(CONST struct MsgPort * port, LONG io_size)
|
||||
{
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: amiga_createport.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
||||
* $Id: amiga_createport.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -44,6 +44,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(CreatePort)
|
||||
#undef CreatePort
|
||||
#endif /* CreatePort */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct MsgPort *
|
||||
CreatePort(CONST_STRPTR name, LONG pri)
|
||||
{
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: amiga_createstdio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
||||
* $Id: amiga_createstdio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -44,6 +44,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(CreateStdIO)
|
||||
#undef CreateStdIO
|
||||
#endif /* CreateStdIO */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct IOStdReq *
|
||||
CreateStdIO(CONST struct MsgPort * port)
|
||||
{
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: amiga_createtask.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
||||
* $Id: amiga_createtask.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -31,8 +31,6 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __PPC__
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#include <exec/libraries.h>
|
||||
@ -53,6 +51,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifndef __PPC__
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/*
|
||||
* Create a task with given name, priority, and stack size.
|
||||
* It will use the default exception and trap handlers for now.
|
||||
@ -191,4 +193,44 @@ CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#else
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(CreateTask)
|
||||
#undef CreateTask
|
||||
#endif /* CreateTask */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct Task *
|
||||
CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
|
||||
{
|
||||
struct Task * result = NULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
SHOWSTRING(name);
|
||||
SHOWVALUE(pri);
|
||||
SHOWPOINTER(init_pc);
|
||||
SHOWVALUE(stack_size);
|
||||
|
||||
assert( name != NULL && (-128 <= pri && pri <= 127) && init_pc != NULL && stack_size > 0 );
|
||||
|
||||
if(name == NULL || pri < -128 || pri > 127 || init_pc == NULL || stack_size == 0)
|
||||
{
|
||||
SHOWMSG("invalid parameters");
|
||||
goto out;
|
||||
}
|
||||
|
||||
result = IExec->CreateTask(name,pri,init_pc,stack_size,NULL);
|
||||
|
||||
out:
|
||||
|
||||
RETURN(result);
|
||||
return(result);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* __PPC__ */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: amiga_deleteextio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
||||
* $Id: amiga_deleteextio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -44,6 +44,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(DeleteExtIO)
|
||||
#undef DeleteExtIO
|
||||
#endif /* DeleteExtIO */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
DeleteExtIO(struct IORequest * io)
|
||||
{
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: amiga_deleteport.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
|
||||
* $Id: amiga_deleteport.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -44,6 +44,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(DeletePort)
|
||||
#undef DeletePort
|
||||
#endif /* DeletePort */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
DeletePort(struct MsgPort * port)
|
||||
{
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: amiga_deletestdio.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
|
||||
* $Id: amiga_deletestdio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -44,6 +44,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(DeleteStdIO)
|
||||
#undef DeleteStdIO
|
||||
#endif /* DeleteStdIO */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
DeleteStdIO(struct IOStdReq * io)
|
||||
{
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: amiga_deletetask.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
|
||||
* $Id: amiga_deletetask.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -41,8 +41,34 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifndef __PPC__
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
DeleteTask(struct Task *tc)
|
||||
{
|
||||
RemTask(tc);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#else
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(DeleteTask)
|
||||
#undef DeleteTask
|
||||
#endif /* DeleteTask */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VOID
|
||||
DeleteTask(struct Task *tc)
|
||||
{
|
||||
IExec->DeleteTask(tc);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* __PPC__ */
|
||||
|
||||
193
library/amiga_rexxvars.c
Normal file
193
library/amiga_rexxvars.c
Normal file
@ -0,0 +1,193 @@
|
||||
/*
|
||||
* $Id: amiga_rexxvars.c,v 1.1 2004-11-14 11:06:27 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||
* may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* We don't want to pull in <clib/alib_protos.h> */
|
||||
#define CLIB_ALIB_PROTOS_H
|
||||
|
||||
#ifndef _STDLIB_HEADERS_H
|
||||
#include "stdlib_headers.h"
|
||||
#endif /* _STDLIB_HEADERS_H */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#include <rexx/rxslib.h>
|
||||
#include <rexx/errors.h>
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#define __NOLIBBASE__
|
||||
#include <proto/rexxsyslib.h>
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
STATIC struct Library * RexxSysBase;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
STATIC struct RexxSysIFace * IRexxSys;
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
CLIB_CONSTRUCTOR(__rexxvars_init)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
RexxSysBase = OpenLibrary(RXSNAME,0);
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
{
|
||||
if(RexxSysBase != NULL)
|
||||
{
|
||||
IRexxSys = (struct RexxSysIFace *)GetInterface(RexxSysBase, "main", 1, 0);
|
||||
if(IRexxSys == NULL)
|
||||
{
|
||||
CloseLibrary(RexxSysBase);
|
||||
RexxSysBase = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
CONSTRUCTOR_SUCCEED();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
CLIB_DESTRUCTOR(__rexxvars_exit)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
{
|
||||
if(IRexxSys != NULL)
|
||||
DropInterface((struct Interface *)IRexxSys);
|
||||
|
||||
IRexxSys = NULL;
|
||||
}
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
if(RexxSysBase != NULL)
|
||||
{
|
||||
CloseLibrary(RexxSysBase);
|
||||
RexxSysBase = NULL;
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* This is modeled after the original assembly language code. Except for the
|
||||
fact that we compare the library base against a local, static variable
|
||||
rather then opening the library for each check. */
|
||||
BOOL
|
||||
CheckRexxMsg(struct RexxMsg *message)
|
||||
{
|
||||
BOOL result = FALSE;
|
||||
|
||||
if(RexxSysBase == NULL)
|
||||
goto out;
|
||||
|
||||
if(message->rm_LibBase != RexxSysBase)
|
||||
goto out;
|
||||
|
||||
if(message->rm_TaskBlock == NULL)
|
||||
goto out;
|
||||
|
||||
if(NOT IsRexxMsg(message))
|
||||
goto out;
|
||||
|
||||
result = TRUE;
|
||||
|
||||
out:
|
||||
|
||||
return(result);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* 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)
|
||||
{
|
||||
STATIC TEXT buffer[256];
|
||||
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;
|
||||
}
|
||||
|
||||
/* The 256 character limit isn't good. This should be done differently. */
|
||||
result = GetRexxVarFromMsg(variable_name,buffer,message);
|
||||
if(result != 0)
|
||||
goto out;
|
||||
|
||||
(*buffer_pointer) = buffer;
|
||||
|
||||
out:
|
||||
|
||||
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)
|
||||
{
|
||||
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 = SetRexxVarFromMsg(variable_name,value,message);
|
||||
|
||||
out:
|
||||
|
||||
return(result);
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 171
|
||||
#define DATE "16.8.2004"
|
||||
#define VERS "c.lib 1.171"
|
||||
#define VSTRING "c.lib 1.171 (16.8.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: c.lib 1.171 (16.8.2004)"
|
||||
#define REVISION 184
|
||||
#define DATE "28.11.2004"
|
||||
#define VERS "c.lib 1.184"
|
||||
#define VSTRING "c.lib 1.184 (28.11.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: c.lib 1.184 (28.11.2004)"
|
||||
|
||||
@ -1 +1 @@
|
||||
171
|
||||
184
|
||||
|
||||
221
library/changes
221
library/changes
@ -1,3 +1,224 @@
|
||||
c.lib 1.184 (28.11.2004)
|
||||
|
||||
- Added asctime_r(), ctime_r(), gmtime_r(), localtime_r() and strtok_r().
|
||||
|
||||
- Added stubs for the Rexx Variables Interface code that used to
|
||||
be part of amiga.lib. While comparable functionality is available
|
||||
in rexxsyslib.library V45, the new stubs might be helpful during
|
||||
porting. Care must be taken since these functions don't work
|
||||
exactly like the originals.
|
||||
|
||||
- Integrated strlcpy() and strlcat() which are intended to be safer
|
||||
replacements for strncpy() and strncat().
|
||||
|
||||
- The program's task priority is now configurable through an external
|
||||
variable '__priority'.
|
||||
|
||||
- The process name to be used when detaching can be configured through
|
||||
the new '__process_name' variable.
|
||||
|
||||
- The minimum required operating system version can be configured
|
||||
through the new '__minimum_os_lib_version' variable; a matching
|
||||
error message can be provided through the new '__minimum_os_lib_error'
|
||||
variable.
|
||||
|
||||
- The default console window specification can be overriden through
|
||||
the new '__stdio_window_specification' variable.
|
||||
|
||||
- The socket initialization code did not set up a reference to the
|
||||
'h_errno' variable correctly. This had the effect of making name
|
||||
and address resolution errors trash the 'errno' variable instead
|
||||
and leaving 'h_errno' always set to 0. Fixed.
|
||||
|
||||
- For sockets, ioctl() and fcntl() now interact on the FIONBIO/FIOASYNC
|
||||
requests (ioctl) and the O_NOBLOCK/O_ASYNC flags (fcntl).
|
||||
|
||||
- popen() now accepts "rb" and "wb" as mode parameters. However, "r+",
|
||||
"w+" and variants thereof are still unsupported due to the
|
||||
unidirectional pipe support in the standard "PIPE:" device.
|
||||
|
||||
|
||||
c.lib 1.183 (13.11.2004)
|
||||
|
||||
- Cleaned up the OS4 build makefile, losing redundant libraries,
|
||||
adding more startup object code and ultimatively making the whole
|
||||
rebuild logic work again: if code changes and dependencies are
|
||||
set up correctly, it will now get rebuilt. Previously, such
|
||||
changes went unnoticed and you had to rebuild the entire library
|
||||
from scratch.
|
||||
|
||||
- Added stubs for CreatePort(), DeletePort(), CreateTask(), DeleteTask()
|
||||
and NewList() which have equivalents in exec.library V50 but for which
|
||||
it might be useful if ported code didn't have to reference these
|
||||
explicitly.
|
||||
|
||||
- mktemp() was broken in libunix.a with Unix path semantics enabled.
|
||||
This was because the name template was translated and translated
|
||||
back again, overwriting the translation buffer. This, funny enough,
|
||||
broke Samba's printing feature. Fixed by translating the name only
|
||||
before each test for "uniqueness" is made. The new code also handles
|
||||
empty "" templates gracefully, which was a problem with both the
|
||||
"standard" and the Unix path semantics flavour.
|
||||
|
||||
Why is it that I find bugs like this always after having just
|
||||
released another library update?
|
||||
|
||||
|
||||
c.lib 1.182 (8.11.2004)
|
||||
|
||||
- Changed the error abort condition for the %s conversion of the
|
||||
scanf() family. It now matches the abort conditions for all other
|
||||
conversions and no longer ignores whether any other parameters were
|
||||
converted before. This was a quirk in the older implementation.
|
||||
|
||||
- The scanf() family now accepts %E and %G in place of %f and %X in
|
||||
place of %x.
|
||||
|
||||
- Simplified the common code that fopen(), freopen() and fdopen()
|
||||
share and which has to figure out by looking at a file access
|
||||
mode specification which parameters should be used.
|
||||
|
||||
- Dropped error detection in the scanf() family. The EOF has to be
|
||||
good enough. Also, ungetc() failure still leads to error handling.
|
||||
|
||||
|
||||
|
||||
c.lib 1.181 (26.10.2004)
|
||||
|
||||
- The scanf() family now always returns the number of assignments made
|
||||
unless an error occured or an EOF was hit during conversion before the
|
||||
first assignment could be made.
|
||||
|
||||
- strtok() did not terminate properly if the last token in the string
|
||||
did not end with a separator character but with a '\0' byte. Fixed.
|
||||
|
||||
- The directory scanning functions opendir/closedir did not get the global
|
||||
directory data tracking data structure initialized which later led to
|
||||
Enforcer hits and maybe trashed memory. Fixed.
|
||||
|
||||
|
||||
c.lib 1.180 (23.10.2004)
|
||||
|
||||
- The printf() family now produces no output at all for %e, %f and %g if the
|
||||
floating point support code is disabled. Previously, a minimum field width
|
||||
specification could take effect, printing a series of 0 or blank space
|
||||
characters where no output should have been produced.
|
||||
|
||||
|
||||
c.lib 1.179 (22.10.2004)
|
||||
|
||||
- The scanf() family no longer assumes that a leading '0' indicates that the
|
||||
following digits form an octal number if the conversion type has been
|
||||
specified as already '%x' already.
|
||||
|
||||
|
||||
c.lib 1.178 (7.10.2004)
|
||||
|
||||
- The OS4 version had floating point math support code enabled in all
|
||||
libraries and not just "libm.a". Fixed.
|
||||
|
||||
|
||||
c.lib 1.177 (29.9.2004)
|
||||
|
||||
- Moved the locale initialization/cleanup code into constructors
|
||||
and destructors.
|
||||
|
||||
- The socket cleanup function is now a destructor.
|
||||
|
||||
- The math cleanup function is now a destructor.
|
||||
|
||||
- The wildcard cleanup function is now a destructor.
|
||||
|
||||
- The stdio cleanup function is now a destructor.
|
||||
|
||||
- The stack extension cleanup function is now a destructor.
|
||||
|
||||
- The code that cleans up after the program's current directory
|
||||
was changed is now a destructor function.
|
||||
|
||||
- Moved the initialization/cleanup code for unlink() into constructors
|
||||
and destructors.
|
||||
|
||||
- Moved the initialization/cleanup code for usergroup.library into
|
||||
constructors and destructors.
|
||||
|
||||
- Added usleep(), and created wrapper code that both sleep() and
|
||||
usleep() can use.
|
||||
|
||||
- Added strtoll() and strtoull(), with further changes to <limits.h>
|
||||
and <stdlib.h>.
|
||||
|
||||
- The socket exit code now calls the common stdio function which
|
||||
flushes and shuts down all buffered and unbuffered files.
|
||||
|
||||
- Fixed the stack swapping function which, for reasons unknown, ceased
|
||||
to work...
|
||||
|
||||
- The start time used by clock() is now initialized by a constructor
|
||||
function.
|
||||
|
||||
- NOTE THAT ALL THE CHANGES WITH REGARD TO USE OF DESTRUCTOR AND
|
||||
CONSTRUCTOR FUNCTIONS REQUIRE A COMPLETE REBUILD OF THE LIBRARY! IF
|
||||
YOU DO NOT DO THIS, THE CONSTRUCTOR/DESTRUCTOR FUNCTIONS MAY NOT
|
||||
GET CALLED.
|
||||
|
||||
|
||||
c.lib 1.175 (10.9.2004)
|
||||
|
||||
- <stdarg.h> now tries to use the compiler supplied, machine specific
|
||||
<stdarg.h> file and also includes the OS4-specifc <sys/amigaos-va.h>
|
||||
file, if necessary.
|
||||
|
||||
- Added another test to <sys/time.h> to check if the "timeval" definition is
|
||||
already in place. If it is, <exec/types.h> will not be included.
|
||||
|
||||
- <sys/time.h> can be made to define the timeval data structure locally if
|
||||
the __USE_CLIB2_TIMEVAL preprocessor symbol is defined. In this case no
|
||||
<exec/types.h> or <devices/timer.h> file will be read.
|
||||
|
||||
- The sprintf() family did not properly handle empty strings as format
|
||||
specifications. This would result in a necessary buffer flush action
|
||||
getting skipped, which consequently did not put the string termination
|
||||
character into the output buffer.
|
||||
|
||||
|
||||
c.lib 1.174 (27.8.2004)
|
||||
|
||||
- The parameters of atan2() were swapped. Fixed.
|
||||
|
||||
- Merged fdlibm 5.3 changes with __kernel_tan(), __exp() and __pow()
|
||||
functions.
|
||||
|
||||
- Replaced the rint() and rintf() functions with the fdlibm code.
|
||||
|
||||
|
||||
c.lib 1.173 (25.8.2004)
|
||||
|
||||
- The <assert.h> header file was missing the C++ 'extern "C" { .. }'
|
||||
declarations.
|
||||
|
||||
- Added a new function __get_default_file() which allows direct access
|
||||
to the low level file handle/socket descriptor associated with a
|
||||
file descriptor.
|
||||
|
||||
|
||||
c.lib 1.172 (21.8.2004)
|
||||
|
||||
- acos() now returns 0 for a domain error.
|
||||
|
||||
- asin() now returns 0 for a domain error.
|
||||
|
||||
- atan2() now returns 0 for a domain error.
|
||||
|
||||
- fmod() now returns x if y == 0 and sets a
|
||||
domain error.
|
||||
|
||||
- sqrt() now returns 0 for a domain error.
|
||||
|
||||
- Added NaN and +Inf constants to the math library
|
||||
initialization code which could come in handy later.
|
||||
|
||||
|
||||
c.lib 1.171 (16.8.2004)
|
||||
|
||||
- Added "math_hypot.c"
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: crtbegin.c,v 1.1.1.1 2004-07-26 16:30:22 obarthel Exp $
|
||||
* $Id: crtbegin.c,v 1.3 2004-09-29 16:54:54 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: debug.h,v 1.1.1.1 2004-07-26 16:30:26 obarthel Exp $
|
||||
* $Id: debug.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
|
||||
*
|
||||
* :ts=8
|
||||
*
|
||||
@ -57,9 +57,17 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifndef _STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif /* _STDLIB_H */
|
||||
|
||||
#ifndef _DOS_H
|
||||
#include <dos.h>
|
||||
#endif /* _DOS_H */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern void kprintf(const char *format,...);
|
||||
extern void abort(void);
|
||||
extern char * __program_name;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 171
|
||||
#define DATE "16.8.2004"
|
||||
#define VERS "debug.lib 1.171"
|
||||
#define VSTRING "debug.lib 1.171 (16.8.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: debug.lib 1.171 (16.8.2004)"
|
||||
#define REVISION 184
|
||||
#define DATE "28.11.2004"
|
||||
#define VERS "debug.lib 1.184"
|
||||
#define VSTRING "debug.lib 1.184 (28.11.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: debug.lib 1.184 (28.11.2004)"
|
||||
|
||||
@ -1 +1 @@
|
||||
171
|
||||
184
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: dirent_data.c,v 1.3 2004-08-07 10:24:04 obarthel Exp $
|
||||
* $Id: dirent_data.c,v 1.4 2004-10-24 20:03:42 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -38,7 +38,7 @@
|
||||
/****************************************************************************/
|
||||
|
||||
/* Directories being scanned whose locks need to be freed when shutting down. */
|
||||
struct MinList __directory_list;
|
||||
struct MinList NOCOMMON __directory_list;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: dirent_headers.h,v 1.1.1.1 2004-07-26 16:30:30 obarthel Exp $
|
||||
* $Id: dirent_headers.h,v 1.2 2004-10-24 20:03:42 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -42,6 +42,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifndef _MACROS_H
|
||||
#include "macros.h"
|
||||
#endif /* _MACROS_H */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct DirectoryHandle
|
||||
{
|
||||
struct MinNode dh_MinNode;
|
||||
@ -56,7 +62,7 @@ struct DirectoryHandle
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern struct MinList __directory_list;
|
||||
extern struct MinList NOCOMMON __directory_list;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: fcntl_close.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
||||
* $Id: fcntl_close.c,v 1.3 2004-11-28 10:01:26 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -135,7 +135,7 @@ __close(int file_descriptor,int * error_ptr)
|
||||
SHOWMSG("resetting non-blocking access mode");
|
||||
|
||||
message.action = file_hook_action_set_blocking;
|
||||
message.block = 1;
|
||||
message.arg = 1;
|
||||
|
||||
assert( fd->fd_Hook != NULL );
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: fcntl_fcntl.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
||||
* $Id: fcntl_fcntl.c,v 1.4 2004-11-28 10:01:26 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -126,10 +126,13 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
||||
|
||||
SHOWMSG("cmd=F_GETFL");
|
||||
|
||||
result = 0;
|
||||
|
||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
|
||||
result = O_NONBLOCK;
|
||||
else
|
||||
result = 0;
|
||||
SET_FLAG(result,O_NONBLOCK);
|
||||
|
||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO))
|
||||
SET_FLAG(result,O_ASYNC);
|
||||
|
||||
break;
|
||||
|
||||
@ -147,7 +150,7 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
||||
(FLAG_IS_CLEAR(flags,O_NONBLOCK) && FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING)))
|
||||
{
|
||||
message.action = file_hook_action_set_blocking;
|
||||
message.block = FLAG_IS_CLEAR(flags,O_NONBLOCK);
|
||||
message.arg = FLAG_IS_CLEAR(flags,O_NONBLOCK);
|
||||
|
||||
assert( fd->fd_Hook != NULL );
|
||||
|
||||
@ -168,6 +171,31 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
||||
CLEAR_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
|
||||
}
|
||||
|
||||
if((FLAG_IS_SET(flags,O_ASYNC) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_ASYNC_IO)) ||
|
||||
(FLAG_IS_CLEAR(flags,O_ASYNC) && FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO)))
|
||||
{
|
||||
message.action = file_hook_action_set_async;
|
||||
message.arg = FLAG_IS_SET(flags,O_ASYNC);
|
||||
|
||||
assert( fd->fd_Hook != NULL );
|
||||
|
||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
||||
|
||||
result = message.result;
|
||||
if(result < 0)
|
||||
{
|
||||
errno = message.error;
|
||||
|
||||
va_end(arg);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if(FLAG_IS_SET(flags,O_ASYNC))
|
||||
SET_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||
else
|
||||
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||
}
|
||||
|
||||
va_end(arg);
|
||||
|
||||
break;
|
||||
|
||||
69
library/fcntl_get_default_file.c
Normal file
69
library/fcntl_get_default_file.c
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* $Id: fcntl_get_default_file.c,v 1.1 2004-08-25 15:27:27 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||
* may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _FCNTL_HEADERS_H
|
||||
#include "fcntl_headers.h"
|
||||
#endif /* _FCNTL_HEADERS_H */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
int
|
||||
__get_default_file(int file_descriptor,long * file_ptr)
|
||||
{
|
||||
struct fd * fd;
|
||||
int result = -1;
|
||||
|
||||
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
|
||||
assert( __fd[file_descriptor] != NULL );
|
||||
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
||||
assert( file_ptr != NULL );
|
||||
|
||||
fd = __get_file_descriptor(file_descriptor);
|
||||
if(fd == NULL)
|
||||
{
|
||||
errno = EBADF;
|
||||
goto out;
|
||||
}
|
||||
|
||||
(*file_ptr) = (long)fd->fd_DefaultFile;
|
||||
|
||||
result = 0;
|
||||
|
||||
out:
|
||||
|
||||
return(result);
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: assert.h,v 1.1.1.1 2004-07-26 16:32:49 obarthel Exp $
|
||||
* $Id: assert.h,v 1.2 2004-08-25 15:27:28 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -36,6 +36,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifndef assert
|
||||
|
||||
/****************************************************************************/
|
||||
@ -67,4 +73,10 @@ extern void __assertion_failure(const char *file_name,int line_number,const char
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* _ASSERT_H */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: dos.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
||||
* $Id: dos.h,v 1.4 2004-11-14 11:06:28 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -112,6 +112,18 @@ extern void __set_a4(unsigned long value);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/*
|
||||
* Obtain the low level 'file' handle or socket ID bound to a file
|
||||
* descriptor. This function returns 0 for success and non-zero
|
||||
* otherwise (if, for example, the file descriptor value you
|
||||
* provided is not valid; errno will be set to the appropriate
|
||||
* error code, too). Put a pointer to the file handle variable you
|
||||
* want to be filled in into the second parameter to this function.
|
||||
*/
|
||||
extern int __get_default_file(int file_descriptor,long * file_ptr);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/*
|
||||
* This will be set to TRUE if the current program was launched from
|
||||
* the internet superserver ('inetd') or an equivalent facility.
|
||||
@ -152,6 +164,28 @@ extern ULONG __free_memory_threshold;
|
||||
* them initialized to certain well-defined values to get the desired effect.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The minimum required operating system version number is 37, which
|
||||
* corresponds to Workbench/Kickstart 2.04. You may request a higher
|
||||
* version number by defining the following variable; if you do so,
|
||||
* please provide a fitting error message, too. Note that you cannot
|
||||
* request a minimum version number lower than 37.
|
||||
*/
|
||||
extern int __minimum_os_lib_version;
|
||||
extern char * __minimum_os_lib_error;
|
||||
|
||||
/*
|
||||
* If your program is launched from Workbench it will not necessarily
|
||||
* have a window to send console output to and from which console
|
||||
* input can be read. The startup code attempts to set up such a console
|
||||
* window for you, but it uses defaults for the window specification.
|
||||
* These defaults can be overridden by your program if you define a
|
||||
* variable to point to the specification string. Note that if you
|
||||
* request a specific window specification, this will also override
|
||||
* any tool window definition stored in the program's icon.
|
||||
*/
|
||||
extern char * __stdio_window_specification;
|
||||
|
||||
/*
|
||||
* If set to TRUE, your program's process->pr_WindowPtr will be set to -1
|
||||
* when it starts. The process->pr_WindowPtr will be automatically restored
|
||||
@ -180,6 +214,20 @@ extern BOOL __detach;
|
||||
*/
|
||||
extern BOOL (* __check_detach)(void);
|
||||
|
||||
/*
|
||||
* If this pointer is not NULL, it refers the name that will be given to
|
||||
* the process which is created when the program detaches. The default
|
||||
* is to reuse the program name instead.
|
||||
*/
|
||||
extern char * __process_name;
|
||||
|
||||
/*
|
||||
* This variable controls the task priority of the program, when running.
|
||||
* It must be in the range -128..127 to be useful. By default, the task
|
||||
* priority will not be changed.
|
||||
*/
|
||||
extern int __priority;
|
||||
|
||||
/*
|
||||
* This variable can be set up to contain the minimum stack size the program
|
||||
* should be launched with. If the startup code finds that there is not enough
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: fcntl.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
||||
* $Id: fcntl.h,v 1.3 2004-11-27 12:43:12 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -67,6 +67,7 @@ extern "C" {
|
||||
#define O_NONBLOCK (1<<6)
|
||||
#define O_SYNC (0)
|
||||
#define O_NOCTTY (0)
|
||||
#define O_ASYNC (1<<7)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: limits.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
||||
* $Id: limits.h,v 1.3 2004-09-20 17:16:07 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -58,6 +58,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#define LLONG_MIN (-0x7fffffffffffffffLL-1)
|
||||
#define LLONG_MAX 0x7fffffffffffffffLL
|
||||
#define ULLONG_MAX 0xffffffffffffffffULL
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#define PATH_MAX 1024
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdarg.h,v 1.1.1.1 2004-07-26 16:32:53 obarthel Exp $
|
||||
* $Id: stdarg.h,v 1.2 2004-09-09 08:25:30 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -57,12 +57,25 @@ typedef char * va_list;
|
||||
/****************************************************************************/
|
||||
|
||||
#else
|
||||
#if defined(__GNUC__)
|
||||
#undef _STDARG_H
|
||||
#include_next "stdarg.h"
|
||||
#else
|
||||
#error "Unknown compiler"
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__GNUC__)
|
||||
|
||||
/* Use the compiler supplied, machine specific <stdarg.h> file. */
|
||||
#undef _STDARG_H
|
||||
#include_next "stdarg.h"
|
||||
|
||||
#include <sys/amigaos-va.h>
|
||||
|
||||
#else
|
||||
|
||||
#error "Unknown compiler"
|
||||
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
||||
* $Id: stdio.h,v 1.3 2004-08-25 15:27:28 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -62,7 +62,7 @@ extern "C" {
|
||||
* correspond to a real limitation for this 'C' runtime library and is
|
||||
* included solely for ISO 'C' (1994) compliance.
|
||||
*/
|
||||
#define FOPEN_MAX 8
|
||||
#define FOPEN_MAX 64
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdlib.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
||||
* $Id: stdlib.h,v 1.3 2004-09-20 17:16:07 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -151,6 +151,11 @@ extern long atol(const char *str);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern long long strtoll(const char *str, char **ptr, int base);
|
||||
extern unsigned long long strtoull(const char *str, char **ptr, int base);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#if defined(alloca)
|
||||
#undef alloca
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: string.h,v 1.3 2004-08-07 09:15:33 obarthel Exp $
|
||||
* $Id: string.h,v 1.5 2004-11-17 19:07:26 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -122,6 +122,15 @@ extern int bcmp(const void *a,const void *b,size_t len);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern size_t strlcpy(char *dst, const char *src, size_t siz);
|
||||
extern size_t strlcat(char *dst, const char *src, size_t siz);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern char * strtok_r(char *str, const char *separator_set,char ** state_ptr);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: time.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
||||
* $Id: time.h,v 1.7 2004-09-29 10:15:57 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -52,7 +52,7 @@ extern "C" {
|
||||
structure and try to get by with this definition. Sometimes it works,
|
||||
sometimes it doesn't. Not sure if there really is a good solution for
|
||||
this problem... */
|
||||
#ifndef DEVICES_TIMER_H
|
||||
#if !defined(__TIMEVAL_ALREADY_DEFINED) && !defined(__USE_CLIB2_TIMEVAL)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -73,11 +73,26 @@ extern "C" {
|
||||
/****************************************************************************/
|
||||
|
||||
/* This will define the 'struct timeval' */
|
||||
#ifndef DEVICES_TIMER_H
|
||||
#include <devices/timer.h>
|
||||
#endif /* DEVICES_TIMER_H */
|
||||
|
||||
/* Assume that the 'struct timeval' definition is now in place. */
|
||||
#define __TIMEVAL_ALREADY_DEFINED
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#else
|
||||
#endif /* INCLUDE_VERSION */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* !__TIMEVAL_ALREADY_DEFINED && !__USE_CLIB2_TIMEVAL */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* If the timeval is still undefined or should be defined locally,
|
||||
define our own now... */
|
||||
#if !defined(__TIMEVAL_ALREADY_DEFINED)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -94,11 +109,7 @@ struct timeval
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* INCLUDE_VERSION */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* DEVICES_TIMER_H */
|
||||
#endif /* !__TIMEVAL_ALREADY_DEFINED */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: time.h,v 1.1.1.1 2004-07-26 16:32:56 obarthel Exp $
|
||||
* $Id: time.h,v 1.2 2004-11-17 19:07:26 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -95,6 +95,17 @@ extern size_t strftime(char *s, size_t maxsize, const char *format,
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern char * asctime_r(const struct tm *tm,char * buffer);
|
||||
extern char * ctime_r(const time_t *tptr,char * buffer);
|
||||
extern struct tm * gmtime_r(const time_t *t,struct tm * tm_ptr);
|
||||
extern struct tm * localtime_r(const time_t *t,struct tm * tm_ptr);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: unistd.h,v 1.4 2004-08-07 09:15:33 obarthel Exp $
|
||||
* $Id: unistd.h,v 1.6 2004-09-29 14:17:46 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -52,6 +52,13 @@ extern "C" {
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* Endianness: we assume a big endian memory layout (for 68k and PowerPC). */
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#define BIG_ENDIAN 4321
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#define STDIN_FILENO 0
|
||||
#define STDOUT_FILENO 1
|
||||
#define STDERR_FILENO 2
|
||||
@ -87,6 +94,7 @@ extern int symlink(const char * actual_path, const char * symbolic_path);
|
||||
extern int readlink(const char * path_name, char * buffer, int buffer_size);
|
||||
extern int chdir(const char * path_name);
|
||||
extern unsigned int sleep(unsigned int seconds);
|
||||
extern void usleep(unsigned long microseconds);
|
||||
extern int getopt(int argc, char * argv[], char *opts);
|
||||
extern pid_t getpid(void);
|
||||
extern char *realpath(const char *file_name, char *resolved_name);
|
||||
@ -200,28 +208,32 @@ extern int h_errno;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern int accept(int sockfd,struct sockaddr *cliaddr,int *addrlen);
|
||||
typedef int socklen_t;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen);
|
||||
extern int bind(int sockfd,struct sockaddr *name,int namelen);
|
||||
extern int connect(int sockfd,struct sockaddr *name,int namelen);
|
||||
extern struct hostent * gethostbyaddr(const char *addr, int len, int type);
|
||||
extern int connect(int sockfd,struct sockaddr *name,socklen_t namelen);
|
||||
extern struct hostent * gethostbyaddr(const char *addr, socklen_t len, int type);
|
||||
extern struct hostent * gethostbyname(const char *name);
|
||||
extern int gethostname(const char *name, int namelen);
|
||||
extern struct netent * getnetbyname(const char *name);
|
||||
extern int getpeername(int sockfd,struct sockaddr *name,int *namelen);
|
||||
extern int getsockname(int sockfd,struct sockaddr *name,int *namelen);
|
||||
extern int getsockopt(int sockfd,int level,int optname,void *optval,int *optlen);
|
||||
extern int getpeername(int sockfd,struct sockaddr *name,socklen_t *namelen);
|
||||
extern int getsockname(int sockfd,struct sockaddr *name,socklen_t *namelen);
|
||||
extern int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen);
|
||||
extern unsigned long inet_addr(const char *addr);
|
||||
extern char * inet_ntoa(struct in_addr in);
|
||||
extern int ioctl(int fd,unsigned long request, ... /* char *arg */);
|
||||
extern int listen(int sockfd,int backlog);
|
||||
extern int recv(int fd,void *buff,size_t nbytes,int flags);
|
||||
extern int recvfrom(int sockfd,void *buff,int len,int flags,struct sockaddr *from,int *fromlen);
|
||||
extern int recvfrom(int sockfd,void *buff,int len,int flags,struct sockaddr *from,socklen_t *fromlen);
|
||||
extern int recvmsg(int socket,struct msghdr *msg,int flags);
|
||||
extern int select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct timeval *timeout);
|
||||
extern int send(int fd,void *buff,size_t nbytes,int flags);
|
||||
extern int send(int fd,const void *buff,size_t nbytes,int flags);
|
||||
extern int sendmsg(int socket,struct msghdr *msg,int flags);
|
||||
extern int sendto(int sockfd,void *buff,int len,int flags,struct sockaddr *to,int tolen);
|
||||
extern int setsockopt(int sockfd,int level,int optname,void *optval,int optlen);
|
||||
extern int sendto(int sockfd,const void *buff,int len,int flags,struct sockaddr *to,socklen_t tolen);
|
||||
extern int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
|
||||
extern int shutdown(int socket, int how);
|
||||
extern int socket(int domain,int type,int protocol);
|
||||
extern long gethostid(void);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: locale_headers.h,v 1.1.1.1 2004-07-26 16:30:35 obarthel Exp $
|
||||
* $Id: locale_headers.h,v 1.2 2004-09-29 19:57:57 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -69,12 +69,12 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern struct Locale * __default_locale;
|
||||
extern struct Locale * __locale_table[NUM_LOCALES];
|
||||
extern struct Locale * NOCOMMON __default_locale;
|
||||
extern struct Locale * NOCOMMON __locale_table[NUM_LOCALES];
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern char __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
|
||||
extern char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: locale_init_exit.c,v 1.1.1.1 2004-07-26 16:30:35 obarthel Exp $
|
||||
* $Id: locale_init_exit.c,v 1.3 2004-09-29 19:57:57 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -41,6 +41,25 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct Library * NOCOMMON __LocaleBase;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
struct LocaleIFace * NOCOMMON __ILocale;
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct Locale * NOCOMMON __default_locale;
|
||||
struct Locale * NOCOMMON __locale_table[NUM_LOCALES];
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
__close_all_locales(void)
|
||||
{
|
||||
@ -71,8 +90,7 @@ __close_all_locales(void)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
__locale_exit(void)
|
||||
CLIB_DESTRUCTOR(__locale_exit)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
@ -107,8 +125,7 @@ __locale_exit(void)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
int
|
||||
__locale_init(void)
|
||||
CLIB_CONSTRUCTOR(__locale_init)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -145,5 +162,6 @@ __locale_init(void)
|
||||
PROFILE_ON();
|
||||
|
||||
RETURN(OK);
|
||||
return(OK);
|
||||
|
||||
CONSTRUCTOR_SUCCEED();
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 171
|
||||
#define DATE "16.8.2004"
|
||||
#define VERS "m.lib 1.171"
|
||||
#define VSTRING "m.lib 1.171 (16.8.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: m.lib 1.171 (16.8.2004)"
|
||||
#define REVISION 184
|
||||
#define DATE "28.11.2004"
|
||||
#define VERS "m.lib 1.184"
|
||||
#define VSTRING "m.lib 1.184 (28.11.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: m.lib 1.184 (28.11.2004)"
|
||||
|
||||
@ -1 +1 @@
|
||||
171
|
||||
184
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 171
|
||||
#define DATE "16.8.2004"
|
||||
#define VERS "m881.lib 1.171"
|
||||
#define VSTRING "m881.lib 1.171 (16.8.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: m881.lib 1.171 (16.8.2004)"
|
||||
#define REVISION 184
|
||||
#define DATE "28.11.2004"
|
||||
#define VERS "m881.lib 1.184"
|
||||
#define VSTRING "m881.lib 1.184 (28.11.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: m881.lib 1.184 (28.11.2004)"
|
||||
|
||||
@ -1 +1 @@
|
||||
171
|
||||
184
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: macros.h,v 1.1.1.1 2004-07-26 16:30:36 obarthel Exp $
|
||||
* $Id: macros.h,v 1.2 2004-09-29 19:57:57 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -148,8 +148,10 @@
|
||||
#ifndef UNUSED
|
||||
#ifdef __GNUC__
|
||||
#define UNUSED __attribute__((unused))
|
||||
#define NOCOMMON __attribute__((nocommon))
|
||||
#else
|
||||
#define UNUSED /* UNUSED */
|
||||
#define NOCOMMON /* NOCOMMON */
|
||||
#endif
|
||||
#endif /* UNUSED */
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_acos.c,v 1.1.1.1 2004-07-26 16:30:37 obarthel Exp $
|
||||
* $Id: math_acos.c,v 1.2 2004-08-21 18:57:40 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -226,7 +226,7 @@ acos(double x)
|
||||
}
|
||||
else
|
||||
{
|
||||
result = HUGE_VAL;
|
||||
result = 0;
|
||||
errno = EDOM;
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_asin.c,v 1.1.1.1 2004-07-26 16:30:38 obarthel Exp $
|
||||
* $Id: math_asin.c,v 1.2 2004-08-21 18:57:40 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -237,7 +237,7 @@ asin(double x)
|
||||
}
|
||||
else
|
||||
{
|
||||
result = HUGE_VAL;
|
||||
result = 0;
|
||||
errno = EDOM;
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_atan2.c,v 1.1.1.1 2004-07-26 16:30:39 obarthel Exp $
|
||||
* $Id: math_atan2.c,v 1.3 2004-08-27 11:40:49 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -63,7 +63,7 @@ extern double __atan(double x);
|
||||
/****************************************************************************/
|
||||
|
||||
INLINE static const double
|
||||
__atan2(double x,double y)
|
||||
__atan2(double y,double x)
|
||||
{
|
||||
const double pi = 3.14159265358979323846;
|
||||
const double pi_over_2 = pi / 2.0;
|
||||
@ -107,7 +107,7 @@ __atan2(double x,double y)
|
||||
}
|
||||
else
|
||||
{
|
||||
result = HUGE_VAL;
|
||||
result = 0;
|
||||
errno = EDOM;
|
||||
}
|
||||
}
|
||||
@ -135,7 +135,7 @@ __atan(double x)
|
||||
}
|
||||
|
||||
INLINE static const double
|
||||
__atan2(double x,double y)
|
||||
__atan2(double y,double x)
|
||||
{
|
||||
double pi,pi_over_2;
|
||||
double result;
|
||||
@ -186,7 +186,7 @@ __atan2(double x,double y)
|
||||
}
|
||||
else
|
||||
{
|
||||
result = HUGE_VAL;
|
||||
result = 0;
|
||||
errno = EDOM;
|
||||
}
|
||||
}
|
||||
@ -201,9 +201,6 @@ __atan2(double x,double y)
|
||||
|
||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||
|
||||
|
||||
|
||||
|
||||
static const double
|
||||
tiny = 1.0e-300,
|
||||
zero = 0.0,
|
||||
@ -213,7 +210,7 @@ pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
|
||||
pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
|
||||
|
||||
INLINE static const double
|
||||
__atan2(double x,double y)
|
||||
__atan2(double y,double x)
|
||||
{
|
||||
double z;
|
||||
int k,m,hx,hy,ix,iy;
|
||||
@ -322,19 +319,11 @@ __atan2(double x,double y)
|
||||
/****************************************************************************/
|
||||
|
||||
double
|
||||
atan2(double x,double y)
|
||||
atan2(double y,double x)
|
||||
{
|
||||
double result;
|
||||
|
||||
if(x != 0.0 && y != 0.0)
|
||||
{
|
||||
result = __atan2(x,y);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = HUGE_VAL;
|
||||
errno = EDOM;
|
||||
}
|
||||
result = __atan2(y,x);
|
||||
|
||||
return(result);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_data.c,v 1.1.1.1 2004-07-26 16:30:40 obarthel Exp $
|
||||
* $Id: math_data.c,v 1.2 2004-08-21 18:57:40 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -48,3 +48,5 @@ struct Library * MathIeeeDoubTransBase;
|
||||
/****************************************************************************/
|
||||
|
||||
double __huge_val;
|
||||
double __not_a_number;
|
||||
double __infinity;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_exp.c,v 1.1.1.1 2004-07-26 16:30:41 obarthel Exp $
|
||||
* $Id: math_exp.c,v 1.2 2004-08-27 11:40:49 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -194,7 +194,7 @@ __exp(double x)
|
||||
}
|
||||
else
|
||||
{
|
||||
k = invln2*x+halF[xsb];
|
||||
k = (int)(invln2*x+halF[xsb]);
|
||||
t = k;
|
||||
hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */
|
||||
lo = t*ln2LO[0];
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_fabs.c,v 1.1.1.1 2004-07-26 16:30:42 obarthel Exp $
|
||||
* $Id: math_fabs.c,v 1.4 2004-09-29 14:30:03 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -126,8 +126,14 @@ __fabs(double x)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__PPC__)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
INLINE static const double
|
||||
__fabs(double x)
|
||||
{
|
||||
@ -141,10 +147,35 @@ __fabs(double x)
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#else
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
INLINE static const double
|
||||
__fabs(double x)
|
||||
{
|
||||
double res;
|
||||
|
||||
if(x < 0)
|
||||
res = (-x);
|
||||
else
|
||||
res = x;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* __PPC__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
double
|
||||
fabs(double x)
|
||||
{
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_fmod.c,v 1.1.1.1 2004-07-26 16:30:44 obarthel Exp $
|
||||
* $Id: math_fmod.c,v 1.2 2004-08-21 18:57:40 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -284,7 +284,7 @@ fmod(double x,double y)
|
||||
}
|
||||
else
|
||||
{
|
||||
result = HUGE_VAL;
|
||||
result = x;
|
||||
errno = EDOM;
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_headers.h,v 1.2 2004-08-12 12:31:16 obarthel Exp $
|
||||
* $Id: math_headers.h,v 1.4 2004-08-27 13:49:17 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -148,6 +148,33 @@ do { \
|
||||
(d) = sl_u.value; \
|
||||
} while (0)
|
||||
|
||||
/* A union which permits us to convert between a float and a 32 bit
|
||||
int. */
|
||||
|
||||
typedef union
|
||||
{
|
||||
float value;
|
||||
unsigned int word;
|
||||
} ieee_float_shape_type;
|
||||
|
||||
/* Get a 32 bit int from a float. */
|
||||
|
||||
#define GET_FLOAT_WORD(i,d) \
|
||||
do { \
|
||||
ieee_float_shape_type gf_u; \
|
||||
gf_u.value = (d); \
|
||||
(i) = gf_u.word; \
|
||||
} while (0)
|
||||
|
||||
/* Set a float from a 32 bit int. */
|
||||
|
||||
#define SET_FLOAT_WORD(d,i) \
|
||||
do { \
|
||||
ieee_float_shape_type sf_u; \
|
||||
sf_u.word = (i); \
|
||||
(d) = sf_u.value; \
|
||||
} while (0)
|
||||
|
||||
extern double __kernel_cos(double x, double y);
|
||||
extern double __kernel_sin(double x, double y, int iy);
|
||||
extern int __rem_pio2(double x, double *y);
|
||||
@ -165,4 +192,9 @@ extern double __scalbn(double x, int n);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern double __not_a_number;
|
||||
extern double __infinity;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* _MATH_HEADERS_H */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_init_exit.c,v 1.2 2004-08-08 10:55:57 obarthel Exp $
|
||||
* $Id: math_init_exit.c,v 1.5 2004-09-29 19:57:57 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -53,9 +53,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
__math_exit(void)
|
||||
CLIB_DESTRUCTOR(__math_exit)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
#if defined(IEEE_FLOATING_POINT_SUPPORT)
|
||||
{
|
||||
if(MathIeeeSingBasBase != NULL)
|
||||
@ -77,6 +78,8 @@ __math_exit(void)
|
||||
}
|
||||
}
|
||||
#endif /* IEEE_FLOATING_POINT_SUPPORT */
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@ -130,9 +133,23 @@ __math_init(void)
|
||||
0x7f7fffff
|
||||
};
|
||||
|
||||
static const unsigned long not_a_number[1] =
|
||||
{
|
||||
/* Exponent = 255 and fraction != 0.0 */
|
||||
0x7fffffff
|
||||
};
|
||||
|
||||
static const unsigned long infinity[1] =
|
||||
{
|
||||
/* Exponent = 255 and fraction = 0.0 */
|
||||
0x7f800000
|
||||
};
|
||||
|
||||
assert( sizeof(largest_fp_value) == sizeof(__huge_val) );
|
||||
|
||||
memmove((void *)&__huge_val,largest_fp_value,sizeof(largest_fp_value));
|
||||
memmove((void *)&__not_a_number,not_a_number,sizeof(not_a_number));
|
||||
memmove((void *)&__infinity,infinity,sizeof(infinity));
|
||||
}
|
||||
else if (sizeof(__huge_val) == 8) /* double precision */
|
||||
{
|
||||
@ -142,9 +159,23 @@ __math_init(void)
|
||||
0x7fefffff,0xffffffff
|
||||
};
|
||||
|
||||
static const unsigned long not_a_number[2] =
|
||||
{
|
||||
/* Exponent = 2047 and fraction != 0.0 */
|
||||
0x7fffffff,0xffffffff
|
||||
};
|
||||
|
||||
static const unsigned long infinity[2] =
|
||||
{
|
||||
/* Exponent = 2047 and fraction = 0.0 */
|
||||
0x7ff00000,0x00000000
|
||||
};
|
||||
|
||||
assert( sizeof(largest_fp_value) == sizeof(__huge_val) );
|
||||
|
||||
memmove((void *)&__huge_val,largest_fp_value,sizeof(largest_fp_value));
|
||||
memmove((void *)&__not_a_number,not_a_number,sizeof(not_a_number));
|
||||
memmove((void *)&__infinity,infinity,sizeof(infinity));
|
||||
}
|
||||
#if defined(USE_LONG_DOUBLE)
|
||||
else if (sizeof(__huge_val) == 12) /* extended precision */
|
||||
@ -155,9 +186,23 @@ __math_init(void)
|
||||
0x7ffe0000,0xffffffff,0xffffffff
|
||||
};
|
||||
|
||||
static const unsigned long not_a_number[3] =
|
||||
{
|
||||
/* Exponent = 32767 and fraction != 0.0 */
|
||||
0x7fff0000,0xffffffff,0xffffffff
|
||||
};
|
||||
|
||||
static const unsigned long infinity[3] =
|
||||
{
|
||||
/* Exponent = 32767 and fraction = 0.0 */
|
||||
0x7fff0000,0x00000000,0x00000000
|
||||
};
|
||||
|
||||
assert( sizeof(largest_fp_value) == sizeof(__huge_val) );
|
||||
|
||||
memmove((void *)&__huge_val,largest_fp_value,sizeof(largest_fp_value));
|
||||
memmove((void *)&__not_a_number,not_a_number,sizeof(not_a_number));
|
||||
memmove((void *)&__infinity,infinity,sizeof(infinity));
|
||||
}
|
||||
#endif /* USE_LONG_DOUBLE */
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_kernel_tan.c,v 1.1.1.1 2004-07-26 16:30:48 obarthel Exp $
|
||||
* $Id: math_kernel_tan.c,v 1.2 2004-08-27 11:40:49 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -82,7 +82,21 @@ double __kernel_tan(double x, double y, int iy)
|
||||
unsigned int low;
|
||||
GET_LOW_WORD(low,x);
|
||||
if(((ix|low)|(iy+1))==0) return one/fabs(x);
|
||||
else return (iy==1)? x: -one/x;
|
||||
else {
|
||||
if (iy == 1)
|
||||
return x;
|
||||
else { /* compute -1 / (x+y) carefully */
|
||||
double a, t;
|
||||
|
||||
z = w = x + y;
|
||||
SET_LOW_WORD(z,0);
|
||||
v = y - (z - x);
|
||||
t = a = -one / w;
|
||||
SET_LOW_WORD(t,0);
|
||||
s = one + t * z;
|
||||
return t + a * (s + t * v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(ix>=0x3FE59428) { /* |x|>=0.6744 */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_log.c,v 1.1.1.1 2004-07-26 16:30:49 obarthel Exp $
|
||||
* $Id: math_log.c,v 1.2 2004-09-27 15:06:19 tfrieden Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -135,7 +135,7 @@ __log(double x)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||
#if defined(__PPC__)
|
||||
|
||||
static const double
|
||||
ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_modf.c,v 1.1.1.1 2004-07-26 16:30:50 obarthel Exp $
|
||||
* $Id: math_modf.c,v 1.2 2004-09-27 15:06:19 tfrieden Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -109,7 +109,7 @@ __modf(double x,double *nptr)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||
#if defined(__PPC__)
|
||||
|
||||
INLINE static const double
|
||||
__modf(double x,double *nptr)
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_pow.c,v 1.1.1.1 2004-07-26 16:30:52 obarthel Exp $
|
||||
* $Id: math_pow.c,v 1.3 2004-09-27 15:06:19 tfrieden Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -171,7 +171,7 @@ __pow(double x,double y)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||
#if defined(__PPC__)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -286,11 +286,12 @@ __pow(double x,double y)
|
||||
}
|
||||
|
||||
/* (x<0)**(non-int) is NaN */
|
||||
/* REDHAT LOCAL: This used to be
|
||||
if((((hx>>31)+1)|yisint)==0) return (x-x)/(x-x);
|
||||
but ANSI C says a right shift of a signed negative quantity is
|
||||
implementation defined. */
|
||||
if(((((unsigned int)hx>>31)-1)|yisint)==0) return (x-x)/(x-x);
|
||||
n = ((unsigned int)hx>>31)+1;
|
||||
if((n|yisint)==0) return (x-x)/(x-x);
|
||||
|
||||
s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
|
||||
if((n|(yisint-1))==0)
|
||||
s = -one;/* (-ve)**(odd int) */
|
||||
|
||||
/* |y| is huge */
|
||||
if(iy>0x41e00000) { /* if |y| > 2**31 */
|
||||
@ -299,11 +300,11 @@ __pow(double x,double y)
|
||||
if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
|
||||
}
|
||||
/* over/underflow if x is not close to one */
|
||||
if(ix<0x3fefffff) return (hy<0)? huge*huge:tiny*tiny;
|
||||
if(ix>0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
|
||||
if(ix<0x3fefffff) return (hy<0)? s*huge*huge:s*tiny*tiny;
|
||||
if(ix>0x3ff00000) return (hy>0)? s*huge*huge:s*tiny*tiny;
|
||||
/* now |1-x| is tiny <= 2**-20, suffice to compute
|
||||
log(x) by x-x^2/2+x^3/3-x^4/4 */
|
||||
t = ax-1; /* t has 20 trailing zeros */
|
||||
t = ax-one; /* t has 20 trailing zeros */
|
||||
w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25));
|
||||
u = ivln2_h*t; /* ivln2_h has 21 sig. bits */
|
||||
v = t*ivln2_l-w*ivln2;
|
||||
@ -311,7 +312,7 @@ __pow(double x,double y)
|
||||
SET_LOW_WORD(t1,0);
|
||||
t2 = v-(t1-u);
|
||||
} else {
|
||||
double s2,s_h,s_l,t_h,t_l;
|
||||
double ss,s2,s_h,s_l,t_h,t_l;
|
||||
n = 0;
|
||||
/* take care subnormal number */
|
||||
if(ix<0x00100000)
|
||||
@ -325,11 +326,11 @@ __pow(double x,double y)
|
||||
else {k=0;n+=1;ix -= 0x00100000;}
|
||||
SET_HIGH_WORD(ax,ix);
|
||||
|
||||
/* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
|
||||
/* compute ss = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
|
||||
u = ax-bp[k]; /* bp[0]=1.0, bp[1]=1.5 */
|
||||
v = one/(ax+bp[k]);
|
||||
s = u*v;
|
||||
s_h = s;
|
||||
ss = u*v;
|
||||
s_h = ss;
|
||||
SET_LOW_WORD(s_h,0);
|
||||
/* t_h=ax+bp[k] High */
|
||||
t_h = zero;
|
||||
@ -337,33 +338,29 @@ __pow(double x,double y)
|
||||
t_l = ax - (t_h-bp[k]);
|
||||
s_l = v*((u-s_h*t_h)-s_h*t_l);
|
||||
/* compute log(ax) */
|
||||
s2 = s*s;
|
||||
s2 = ss*ss;
|
||||
r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
|
||||
r += s_l*(s_h+s);
|
||||
r += s_l*(s_h+ss);
|
||||
s2 = s_h*s_h;
|
||||
t_h = 3.0+s2+r;
|
||||
SET_LOW_WORD(t_h,0);
|
||||
t_l = r-((t_h-3.0)-s2);
|
||||
/* u+v = s*(1+...) */
|
||||
/* u+v = ss*(1+...) */
|
||||
u = s_h*t_h;
|
||||
v = s_l*t_h+t_l*s;
|
||||
/* 2/(3log2)*(s+...) */
|
||||
v = s_l*t_h+t_l*ss;
|
||||
/* 2/(3log2)*(ss+...) */
|
||||
p_h = u+v;
|
||||
SET_LOW_WORD(p_h,0);
|
||||
p_l = v-(p_h-u);
|
||||
z_h = cp_h*p_h; /* cp_h+cp_l = 2/(3*log2) */
|
||||
z_l = cp_l*p_h+p_l*cp+dp_l[k];
|
||||
/* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
|
||||
/* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */
|
||||
t = (double)n;
|
||||
t1 = (((z_h+z_l)+dp_h[k])+t);
|
||||
SET_LOW_WORD(t1,0);
|
||||
t2 = z_l-(((t1-t)-dp_h[k])-z_h);
|
||||
}
|
||||
|
||||
s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
|
||||
if(((((unsigned int)hx>>31)-1)|(yisint-1))==0)
|
||||
s = -one;/* (-ve)**(odd int) */
|
||||
|
||||
/* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
|
||||
y1 = y;
|
||||
SET_LOW_WORD(y1,0);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_rint.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
||||
* $Id: math_rint.c,v 1.3 2004-08-27 13:49:17 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -54,6 +54,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(IEEE_FLOATING_POINT_SUPPORT) || defined(M68881_FLOATING_POINT_SUPPORT)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
double
|
||||
rint(double x)
|
||||
{
|
||||
@ -62,5 +66,71 @@ rint(double x)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* FLOATING_POINT_SUPPORT */
|
||||
#endif /* IEEE_FLOATING_POINT_SUPPORT || M68881_FLOATING_POINT_SUPPORT */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
static const double
|
||||
TWO52[2]={
|
||||
4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
|
||||
-4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
|
||||
};
|
||||
|
||||
double
|
||||
rint(double x)
|
||||
{
|
||||
int i0,j0,sx;
|
||||
unsigned i,i1;
|
||||
double w,t;
|
||||
GET_HIGH_WORD(i0,x);
|
||||
sx = (i0>>31)&1;
|
||||
GET_LOW_WORD(i1,x);
|
||||
j0 = ((i0>>20)&0x7ff)-0x3ff;
|
||||
if(j0<20) {
|
||||
if(j0<0) {
|
||||
if(((i0&0x7fffffff)|i1)==0) return x;
|
||||
i1 |= (i0&0x0fffff);
|
||||
i0 &= 0xfffe0000;
|
||||
i0 |= ((i1|-i1)>>12)&0x80000;
|
||||
SET_HIGH_WORD(x,i0);
|
||||
w = TWO52[sx]+x;
|
||||
t = w-TWO52[sx];
|
||||
GET_HIGH_WORD(i0,t);
|
||||
SET_HIGH_WORD(t,(i0&0x7fffffff)|(sx<<31));
|
||||
return t;
|
||||
} else {
|
||||
i = (0x000fffff)>>j0;
|
||||
if(((i0&i)|i1)==0) return x; /* x is integral */
|
||||
i>>=1;
|
||||
if(((i0&i)|i1)!=0) {
|
||||
if(j0==19) i1 = 0x40000000; else
|
||||
i0 = (i0&(~i))|((0x20000)>>j0);
|
||||
}
|
||||
}
|
||||
} else if (j0>51) {
|
||||
if(j0==0x400) return x+x; /* inf or NaN */
|
||||
else return x; /* x is integral */
|
||||
} else {
|
||||
i = ((unsigned)(0xffffffff))>>(j0-20);
|
||||
if((i1&i)==0) return x; /* x is integral */
|
||||
i>>=1;
|
||||
if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(j0-20));
|
||||
}
|
||||
|
||||
SET_HIGH_WORD(x,i0);
|
||||
SET_LOW_WORD(x,i1);
|
||||
w = TWO52[sx]+x;
|
||||
return w-TWO52[sx];
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* FLOATING_POINT_SUPPORT */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_rintf.c,v 1.1 2004-08-07 09:15:32 obarthel Exp $
|
||||
* $Id: math_rintf.c,v 1.2 2004-08-27 13:49:17 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -54,6 +54,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(IEEE_FLOATING_POINT_SUPPORT) || defined(M68881_FLOATING_POINT_SUPPORT)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
float
|
||||
rintf(float x)
|
||||
{
|
||||
@ -62,5 +66,64 @@ rintf(float x)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* FLOATING_POINT_SUPPORT */
|
||||
#endif /* IEEE_FLOATING_POINT_SUPPORT || M68881_FLOATING_POINT_SUPPORT */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
static const float
|
||||
TWO23[2]={
|
||||
8.3886080000e+06, /* 0x4b000000 */
|
||||
-8.3886080000e+06, /* 0xcb000000 */
|
||||
};
|
||||
|
||||
float
|
||||
rintf(float x)
|
||||
{
|
||||
int i0,j0,sx;
|
||||
unsigned int i,i1;
|
||||
float w,t;
|
||||
GET_FLOAT_WORD(i0,x);
|
||||
sx = (i0>>31)&1;
|
||||
j0 = ((i0>>23)&0xff)-0x7f;
|
||||
if(j0<23) {
|
||||
if(j0<0) {
|
||||
if((i0&0x7fffffff)==0) return x;
|
||||
i1 = (i0&0x07fffff);
|
||||
i0 &= 0xfff00000;
|
||||
i0 |= ((i1|-i1)>>9)&0x400000;
|
||||
SET_FLOAT_WORD(x,i0);
|
||||
w = TWO23[sx]+x;
|
||||
t = w-TWO23[sx];
|
||||
GET_FLOAT_WORD(i0,t);
|
||||
SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
|
||||
return t;
|
||||
} else {
|
||||
i = (0x007fffff)>>j0;
|
||||
if((i0&i)==0) return x; /* x is integral */
|
||||
i>>=1;
|
||||
if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0);
|
||||
}
|
||||
} else {
|
||||
if(j0==0x80) return x+x; /* inf or NaN */
|
||||
else return x; /* x is integral */
|
||||
}
|
||||
SET_FLOAT_WORD(x,i0);
|
||||
w = TWO23[sx]+x;
|
||||
return w-TWO23[sx];
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* FLOATING_POINT_SUPPORT */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: math_sqrt.c,v 1.1.1.1 2004-07-26 16:30:53 obarthel Exp $
|
||||
* $Id: math_sqrt.c,v 1.3 2004-09-27 15:06:19 tfrieden Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -135,7 +135,7 @@ __sqrt(double x)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||
#ifdef __PPC__
|
||||
|
||||
static const double one = 1.0, tiny=1.0e-300;
|
||||
|
||||
@ -236,7 +236,7 @@ __sqrt(double x)
|
||||
return z;
|
||||
}
|
||||
|
||||
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -251,7 +251,7 @@ sqrt(double x)
|
||||
}
|
||||
else
|
||||
{
|
||||
result = HUGE_VAL;
|
||||
result = 0;
|
||||
errno = EDOM;
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 171
|
||||
#define DATE "16.8.2004"
|
||||
#define VERS "net.lib 1.171"
|
||||
#define VSTRING "net.lib 1.171 (16.8.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: net.lib 1.171 (16.8.2004)"
|
||||
#define REVISION 184
|
||||
#define DATE "28.11.2004"
|
||||
#define VERS "net.lib 1.184"
|
||||
#define VSTRING "net.lib 1.184 (28.11.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: net.lib 1.184 (28.11.2004)"
|
||||
|
||||
@ -1 +1 @@
|
||||
171
|
||||
184
|
||||
|
||||
@ -1,6 +1,10 @@
|
||||
c.lib 1.171 (16.8.2004)
|
||||
c.lib 1.180 (23.10.2004)
|
||||
|
||||
- Added hypot()
|
||||
- The printf() family now produces no output at all for floating point
|
||||
numbers (%e, %f and %g) if the floating point support code is disabled.
|
||||
In previous versions of the library some output (series of 0 or blank
|
||||
space characters) could still be produced.
|
||||
|
||||
- vfprintf/vfscanf now support the %lld/%llu (64 bit integer) format
|
||||
by default
|
||||
- The scanf() family no longer ignores a conversion request of
|
||||
type '%x' (hexadecimal) and treats the number to be processed
|
||||
as in octal notation if that number begins with the digit 0.
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: signal_headers.h,v 1.1.1.1 2004-07-26 16:31:05 obarthel Exp $
|
||||
* $Id: signal_headers.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -68,20 +68,20 @@ typedef void (*signal_handler_t)(int sig);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern signal_handler_t __signal_handler_table[NUM_SIGNALS];
|
||||
extern signal_handler_t NOCOMMON __signal_handler_table[NUM_SIGNALS];
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern int __signals_blocked;
|
||||
extern int NOCOMMON __signals_blocked;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern BOOL __termination_message_printed;
|
||||
extern BOOL __termination_message_disabled;
|
||||
extern BOOL NOCOMMON __termination_message_printed;
|
||||
extern BOOL NOCOMMON __termination_message_disabled;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern const char __abnormal_program_termination[];
|
||||
extern const char NOCOMMON __abnormal_program_termination[];
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# $Id: smakefile,v 1.6 2004-08-16 09:33:12 obarthel Exp $
|
||||
# $Id: smakefile,v 1.12 2004-11-18 09:40:37 obarthel Exp $
|
||||
#
|
||||
# :ts=8
|
||||
#
|
||||
@ -88,6 +88,7 @@ AMIGA_OBJ = \
|
||||
amiga_newlist.o \
|
||||
amiga_rangerand.o \
|
||||
amiga_remtof.o \
|
||||
amiga_rexxvars.o \
|
||||
amiga_setsuperattrs.o \
|
||||
amiga_timedelay.o \
|
||||
amiga_waitbeam.o \
|
||||
@ -163,14 +164,14 @@ FCNTL_OBJ = \
|
||||
fcntl_lseek.o \
|
||||
fcntl_open.o \
|
||||
fcntl_read.o \
|
||||
fcntl_write.o
|
||||
fcntl_write.o \
|
||||
fcntl_get_default_file.o
|
||||
|
||||
LIBGEN_OBJ = \
|
||||
libgen_basename.o \
|
||||
libgen_dirname.o
|
||||
|
||||
LOCALE_OBJ = \
|
||||
locale_data.o \
|
||||
locale_init_exit.o \
|
||||
locale_localeconv.o \
|
||||
locale_setlocale.o
|
||||
@ -394,6 +395,10 @@ STDLIB_OBJ = \
|
||||
stdlib_mkstemp.o \
|
||||
stdlib_mktemp.o \
|
||||
stdlib_never_free.o \
|
||||
stdlib_osliberror.o \
|
||||
stdlib_oslibversion.o \
|
||||
stdlib_priority.o \
|
||||
stdlib_process_name.o \
|
||||
stdlib_putenv.o \
|
||||
stdlib_qsort.o \
|
||||
stdlib_rand.o \
|
||||
@ -414,10 +419,13 @@ STDLIB_OBJ = \
|
||||
stdlib_strtod.o \
|
||||
stdlib_strtol.o \
|
||||
stdlib_strtoul.o \
|
||||
stdlib_strtoll.o \
|
||||
stdlib_strtoull.o \
|
||||
stdlib_swapstack.o \
|
||||
stdlib_system.o \
|
||||
stdlib_unsetenv.o \
|
||||
stdlib_wildcard_expand.o
|
||||
stdlib_wildcard_expand.o \
|
||||
stdlib_stdio_window_spec.o
|
||||
|
||||
STRING_OBJ = \
|
||||
string_bcmp.o \
|
||||
@ -438,6 +446,8 @@ STRING_OBJ = \
|
||||
string_strcspn.o \
|
||||
string_strdup.o \
|
||||
string_strerror.o \
|
||||
string_strlcat.o \
|
||||
string_strlcpy.o \
|
||||
string_strlen.o \
|
||||
string_strncat.o \
|
||||
string_strncmp.o \
|
||||
@ -447,6 +457,7 @@ STRING_OBJ = \
|
||||
string_strspn.o \
|
||||
string_strstr.o \
|
||||
string_strtok.o \
|
||||
string_strtok_r.o \
|
||||
string_strxfrm.o
|
||||
|
||||
STRINGS_OBJ = \
|
||||
@ -455,14 +466,18 @@ STRINGS_OBJ = \
|
||||
|
||||
TIME_OBJ = \
|
||||
time_asctime.o \
|
||||
time_asctime_r.o \
|
||||
time_clock.o \
|
||||
time_converttime.o \
|
||||
time_ctime.o \
|
||||
time_ctime_r.o \
|
||||
time_data.o \
|
||||
time_difftime.o \
|
||||
time_gettimeofday.o \
|
||||
time_gmtime.o \
|
||||
time_gmtime_r.o \
|
||||
time_localtime.o \
|
||||
time_localtime_r.o \
|
||||
time_mktime.o \
|
||||
time_numbertostring.o \
|
||||
time_strftime.o \
|
||||
@ -471,9 +486,9 @@ TIME_OBJ = \
|
||||
UNISTD_OBJ = \
|
||||
unistd_access.o \
|
||||
unistd_chdir.o \
|
||||
unistd_chdir_exit.o \
|
||||
unistd_chown.o \
|
||||
unistd_currentpathname.o \
|
||||
unistd_data.o \
|
||||
unistd_dup.o \
|
||||
unistd_dup2.o \
|
||||
unistd_fchown.o \
|
||||
@ -494,12 +509,15 @@ UNISTD_OBJ = \
|
||||
unistd_sleep.o \
|
||||
unistd_strip_double_slash.o \
|
||||
unistd_symlink.o \
|
||||
unistd_time_delay.o \
|
||||
unistd_timer.o \
|
||||
unistd_translatea2u.o \
|
||||
unistd_translaterel.o \
|
||||
unistd_translateu2a.o \
|
||||
unistd_truncate.o \
|
||||
unistd_unix_path_semantics.o \
|
||||
unistd_unlink.o
|
||||
unistd_unlink.o \
|
||||
unistd_usleep.o
|
||||
# \
|
||||
# unistd_wildcard_expand.o
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_data.c,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
||||
* $Id: socket_data.c,v 1.3 2004-11-14 11:06:27 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -46,9 +46,7 @@ struct Library * __SocketBase;
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
|
||||
struct SocketIFace *__ISocket;
|
||||
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_headers.h,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
||||
* $Id: socket_headers.h,v 1.3 2004-11-14 11:06:27 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -48,19 +48,19 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern struct Library * __SocketBase;
|
||||
extern struct Library * NOCOMMON __SocketBase;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
|
||||
extern struct SocketIFace *__ISocket;
|
||||
extern struct SocketIFace * NOCOMMON __ISocket;
|
||||
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern int h_errno;
|
||||
extern int NOCOMMON h_errno;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_hook_entry.c,v 1.1.1.1 2004-07-26 16:31:14 obarthel Exp $
|
||||
* $Id: socket_hook_entry.c,v 1.3 2004-11-28 10:01:26 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -41,6 +41,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
__socket_hook_entry(
|
||||
struct Hook * UNUSED unused_hook,
|
||||
@ -49,6 +53,7 @@ __socket_hook_entry(
|
||||
{
|
||||
struct FileInfoBlock * fib;
|
||||
int error = OK;
|
||||
int param;
|
||||
int result;
|
||||
|
||||
assert( message != NULL && fd != NULL );
|
||||
@ -129,6 +134,28 @@ __socket_hook_entry(
|
||||
|
||||
break;
|
||||
|
||||
case file_hook_action_set_blocking:
|
||||
|
||||
SHOWMSG("file_hook_action_set_blocking");
|
||||
|
||||
param = (int)(message->arg == 0);
|
||||
|
||||
result = __IoctlSocket(fd->fd_DefaultFile,FIONBIO,¶m);
|
||||
error = errno;
|
||||
|
||||
break;
|
||||
|
||||
case file_hook_action_set_async:
|
||||
|
||||
SHOWMSG("file_hook_action_set_async");
|
||||
|
||||
param = (int)(message->arg != 0);
|
||||
|
||||
result = __IoctlSocket(fd->fd_DefaultFile,FIOASYNC,¶m);
|
||||
error = errno;
|
||||
|
||||
break;
|
||||
|
||||
case file_hook_action_examine:
|
||||
|
||||
SHOWMSG("file_hook_action_examine");
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_init_exit.c,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
||||
* $Id: socket_init_exit.c,v 1.5 2004-11-14 11:06:27 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -39,16 +39,16 @@
|
||||
#include "socket_headers.h"
|
||||
#endif /* _SOCKET_HEADERS_H */
|
||||
|
||||
#ifndef _SIGNAL_HEADERS_H
|
||||
#include "signal_headers.h"
|
||||
#endif /* _SIGNAL_HEADERS_H */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#include "stdlib_protos.h"
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern BOOL __detach;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* Code value. */
|
||||
#define SBTB_CODE 1
|
||||
#define SBTS_CODE 0x3FFF
|
||||
@ -78,22 +78,7 @@ struct DaemonMessage
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern BOOL __termination_message_disabled;
|
||||
extern char * __program_name;
|
||||
extern BOOL __is_daemon;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern void __show_error(const char * message);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern void __socket_hook_entry(struct Hook * hook,struct fd * fd,struct file_hook_message * message);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
__socket_exit(void)
|
||||
CLIB_DESTRUCTOR(__socket_exit)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
@ -116,16 +101,7 @@ __socket_exit(void)
|
||||
* does not happen, the stdio cleanup function will
|
||||
* crash (with bells on).
|
||||
*/
|
||||
if(__fd != NULL)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0 ; i < __num_fd ; i++)
|
||||
{
|
||||
if(FLAG_IS_SET(__fd[i]->fd_Flags,FDF_IS_SOCKET) && FLAG_IS_SET(__fd[i]->fd_Flags,FDF_IN_USE))
|
||||
close(i);
|
||||
}
|
||||
}
|
||||
__close_all_files();
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
{
|
||||
@ -206,7 +182,7 @@ __socket_init(void)
|
||||
|
||||
/* Wire the library's h_errno variable to our local h_errno. */
|
||||
tags[3].ti_Tag = SBTM_SETVAL(SBTC_HERRNOLONGPTR);
|
||||
tags[3].ti_Data = (ULONG)&errno;
|
||||
tags[3].ti_Data = (ULONG)&h_errno;
|
||||
|
||||
tags[4].ti_Tag = TAG_END;
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_ioctl.c,v 1.1.1.1 2004-07-26 16:31:16 obarthel Exp $
|
||||
* $Id: socket_ioctl.c,v 1.3 2004-11-28 10:01:26 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -47,6 +47,10 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
int
|
||||
ioctl(int sockfd,unsigned long request, ... /* char *arg */)
|
||||
{
|
||||
@ -81,6 +85,26 @@ ioctl(int sockfd,unsigned long request, ... /* char *arg */)
|
||||
result = __IoctlSocket((LONG)fd->fd_DefaultFile,request,param);
|
||||
PROFILE_ON();
|
||||
|
||||
if(result == OK)
|
||||
{
|
||||
int * option = (int *)param;
|
||||
|
||||
if(request == FIONBIO)
|
||||
{
|
||||
if((*option) != 0)
|
||||
SET_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
|
||||
else
|
||||
CLEAR_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
|
||||
}
|
||||
else if (request == FIOASYNC)
|
||||
{
|
||||
if((*option) != 0)
|
||||
SET_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||
else
|
||||
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||
}
|
||||
}
|
||||
|
||||
va_end(arg);
|
||||
|
||||
out:
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_send.c,v 1.1.1.1 2004-07-26 16:31:19 obarthel Exp $
|
||||
* $Id: socket_send.c,v 1.2 2004-09-29 14:31:57 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -48,7 +48,7 @@
|
||||
/****************************************************************************/
|
||||
|
||||
int
|
||||
send(int sockfd,void *buff,size_t nbytes,int flags)
|
||||
send(int sockfd,const void *buff,size_t nbytes,int flags)
|
||||
{
|
||||
struct fd * fd;
|
||||
int result = -1;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_sendto.c,v 1.1.1.1 2004-07-26 16:31:20 obarthel Exp $
|
||||
* $Id: socket_sendto.c,v 1.2 2004-09-29 14:31:57 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -48,7 +48,7 @@
|
||||
/****************************************************************************/
|
||||
|
||||
int
|
||||
sendto(int sockfd,void *buff,int len,int flags,struct sockaddr *to,int tolen)
|
||||
sendto(int sockfd,const void *buff,int len,int flags,struct sockaddr *to,int tolen)
|
||||
{
|
||||
struct fd * fd;
|
||||
int result = -1;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: socket_setsockopt.c,v 1.1.1.1 2004-07-26 16:31:20 obarthel Exp $
|
||||
* $Id: socket_setsockopt.c,v 1.2 2004-09-29 14:31:57 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -48,7 +48,7 @@
|
||||
/****************************************************************************/
|
||||
|
||||
int
|
||||
setsockopt(int sockfd,int level,int optname,void *optval,int optlen)
|
||||
setsockopt(int sockfd,int level,int optname,const void *optval,int optlen)
|
||||
{
|
||||
struct fd * fd;
|
||||
int result = -1;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#define VERSION 1
|
||||
#define REVISION 171
|
||||
#define DATE "16.8.2004"
|
||||
#define VERS "stack.lib 1.171"
|
||||
#define VSTRING "stack.lib 1.171 (16.8.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: stack.lib 1.171 (16.8.2004)"
|
||||
#define REVISION 184
|
||||
#define DATE "28.11.2004"
|
||||
#define VERS "stack.lib 1.184"
|
||||
#define VSTRING "stack.lib 1.184 (28.11.2004)\r\n"
|
||||
#define VERSTAG "\0$VER: stack.lib 1.184 (28.11.2004)"
|
||||
|
||||
@ -1 +1 @@
|
||||
171
|
||||
184
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stat_headers.h,v 1.1.1.1 2004-07-26 16:31:22 obarthel Exp $
|
||||
* $Id: stat_headers.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -42,7 +42,7 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern mode_t __current_umask;
|
||||
extern mode_t NOCOMMON __current_umask;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_fdhookentry.c,v 1.1.1.1 2004-07-26 16:31:28 obarthel Exp $
|
||||
* $Id: stdio_fdhookentry.c,v 1.2 2004-11-28 10:01:26 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -1829,7 +1829,7 @@ __fd_hook_entry(
|
||||
|
||||
SHOWMSG("changing the mode");
|
||||
|
||||
if(message->block)
|
||||
if(message->arg != 0)
|
||||
mode = 0; /* buffered mode */
|
||||
else
|
||||
mode = 1; /* single character mode */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_headers.h,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
||||
* $Id: stdio_headers.h,v 1.5 2004-11-28 10:01:26 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -252,6 +252,8 @@ struct iob
|
||||
to have its protection bits updated after
|
||||
it has been closed */
|
||||
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
|
||||
#define FDF_ASYNC_IO (1UL<<10) /* File was switched into asynchronous I/O
|
||||
mode (sockets only). */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -306,7 +308,8 @@ enum file_hook_action_t
|
||||
file_hook_action_info,
|
||||
file_hook_action_duplicate_fd,
|
||||
file_hook_action_seek_and_extend,
|
||||
file_hook_action_is_interactive
|
||||
file_hook_action_is_interactive,
|
||||
file_hook_action_set_async
|
||||
};
|
||||
|
||||
/****************************************************************************/
|
||||
@ -324,7 +327,7 @@ struct file_hook_message
|
||||
struct flock * lock; /* Record locking request */
|
||||
int command; /* What kind of locking command was sent */
|
||||
|
||||
int block; /* Whether or not this file should
|
||||
int arg; /* Whether or not this file should
|
||||
be set non-blocking */
|
||||
|
||||
uid_t owner;
|
||||
@ -347,22 +350,22 @@ struct file_hook_message
|
||||
/****************************************************************************/
|
||||
|
||||
/* The file handle table. */
|
||||
extern struct iob ** __iob;
|
||||
extern int __num_iob;
|
||||
extern struct iob ** NOCOMMON __iob;
|
||||
extern int NOCOMMON __num_iob;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* The file descriptor table. */
|
||||
extern struct fd ** __fd;
|
||||
extern int __num_fd;
|
||||
extern struct fd ** NOCOMMON __fd;
|
||||
extern int NOCOMMON __num_fd;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern char * __file_lock_semaphore_name;
|
||||
extern char * NOCOMMON __file_lock_semaphore_name;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
extern BOOL __no_standard_io;
|
||||
extern BOOL NOCOMMON __no_standard_io;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_init_exit.c,v 1.1.1.1 2004-07-26 16:31:36 obarthel Exp $
|
||||
* $Id: stdio_init_exit.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -52,7 +52,7 @@
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
__stdio_exit(void)
|
||||
__close_all_files(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -60,7 +60,7 @@ __stdio_exit(void)
|
||||
|
||||
__check_abort_enabled = FALSE;
|
||||
|
||||
if(__iob != NULL)
|
||||
if(__iob != NULL && __num_iob > 0)
|
||||
{
|
||||
for(i = 0 ; i < __num_iob ; i++)
|
||||
{
|
||||
@ -72,7 +72,7 @@ __stdio_exit(void)
|
||||
__iob = NULL;
|
||||
}
|
||||
|
||||
if(__fd != NULL)
|
||||
if(__fd != NULL && __num_fd > 0)
|
||||
{
|
||||
for(i = 0 ; i < __num_fd ; i++)
|
||||
{
|
||||
@ -89,6 +89,17 @@ __stdio_exit(void)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
CLIB_DESTRUCTOR(__stdio_exit)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
__close_all_files();
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
int
|
||||
__stdio_init(void)
|
||||
{
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_openiob.c,v 1.1.1.1 2004-07-26 16:31:37 obarthel Exp $
|
||||
* $Id: stdio_openiob.c,v 1.3 2004-11-03 15:39:04 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -48,9 +48,7 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
|
||||
{
|
||||
ULONG file_flags;
|
||||
int result = -1;
|
||||
char actual_mode[8];
|
||||
int open_mode;
|
||||
size_t mode_len,len,i;
|
||||
struct fd * fd = NULL;
|
||||
STRPTR buffer = NULL;
|
||||
STRPTR aligned_buffer;
|
||||
@ -86,76 +84,47 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
|
||||
}
|
||||
}
|
||||
|
||||
/* Options can follow the mode string, separated by a comma.
|
||||
* We don't support any of those.
|
||||
*/
|
||||
len = mode_len = strlen(mode);
|
||||
for(i = 0 ; i < len ; i++)
|
||||
/* The first character selects the access mode: read, write or append. */
|
||||
switch(mode[0])
|
||||
{
|
||||
if(mode[i] == ',')
|
||||
{
|
||||
mode_len = i;
|
||||
case 'r':
|
||||
|
||||
SHOWMSG("read mode");
|
||||
|
||||
open_mode = O_RDONLY;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'w':
|
||||
|
||||
SHOWMSG("write mode");
|
||||
|
||||
open_mode = O_WRONLY | O_CREAT | O_TRUNC;
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
|
||||
SHOWMSG("append mode");
|
||||
|
||||
open_mode = O_WRONLY | O_CREAT | O_APPEND;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
D(("unsupported file open mode '%lc'",mode[0]));
|
||||
|
||||
errno = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Keep only the first few letters of the mode string. */
|
||||
if(mode_len > sizeof(actual_mode)-1)
|
||||
mode_len = sizeof(actual_mode)-1;
|
||||
|
||||
memmove(actual_mode,mode,mode_len);
|
||||
actual_mode[mode_len] = '\0';
|
||||
|
||||
SHOWSTRING(actual_mode);
|
||||
|
||||
if(strcmp(actual_mode,"r") == SAME || strcmp(actual_mode,"rb") == SAME)
|
||||
/* If the second or third character is a '+', switch to read/write mode. */
|
||||
if((mode[1] == '+') || (mode[1] != '\0' && mode[2] == '+'))
|
||||
{
|
||||
SHOWMSG("read-only");
|
||||
SHOWMSG("read/write access");
|
||||
|
||||
open_mode = O_RDONLY;
|
||||
file_flags = IOBF_READ;
|
||||
}
|
||||
else if (strcmp(actual_mode,"w") == SAME || strcmp(actual_mode,"wb") == SAME)
|
||||
{
|
||||
SHOWMSG("write-only");
|
||||
CLEAR_FLAG(open_mode,O_RDONLY);
|
||||
CLEAR_FLAG(open_mode,O_WRONLY);
|
||||
|
||||
open_mode = O_WRONLY | O_CREAT | O_TRUNC;
|
||||
file_flags = IOBF_WRITE;
|
||||
}
|
||||
else if (strcmp(actual_mode,"a") == SAME || strcmp(actual_mode,"ab") == SAME)
|
||||
{
|
||||
SHOWMSG("write-only; append");
|
||||
|
||||
open_mode = O_WRONLY | O_CREAT | O_APPEND;
|
||||
file_flags = IOBF_WRITE;
|
||||
}
|
||||
else if (strcmp(actual_mode,"r+") == SAME || strcmp(actual_mode,"rb+") == SAME || strcmp(actual_mode,"r+b") == SAME)
|
||||
{
|
||||
SHOWMSG("read/write; don't overwrite");
|
||||
|
||||
open_mode = O_RDWR;
|
||||
file_flags = IOBF_READ | IOBF_WRITE;
|
||||
}
|
||||
else if (strcmp(actual_mode,"w+") == SAME || strcmp(actual_mode,"wb+") == SAME || strcmp(actual_mode,"w+b") == SAME)
|
||||
{
|
||||
SHOWMSG("read/write; overwrite");
|
||||
|
||||
open_mode = O_RDWR | O_CREAT | O_TRUNC;
|
||||
file_flags = IOBF_READ | IOBF_WRITE;
|
||||
}
|
||||
else if (strcmp(actual_mode,"a+") == SAME || strcmp(actual_mode,"ab+") == SAME || strcmp(actual_mode,"a+b") == SAME)
|
||||
{
|
||||
SHOWMSG("read/write; append; don't overwrite");
|
||||
|
||||
open_mode = O_RDWR | O_CREAT | O_APPEND;
|
||||
file_flags = IOBF_READ | IOBF_WRITE;
|
||||
}
|
||||
else
|
||||
{
|
||||
SHOWMSG("unsupported file open mode");
|
||||
|
||||
errno = EINVAL;
|
||||
goto out;
|
||||
SET_FLAG(open_mode,O_RDWR);
|
||||
}
|
||||
|
||||
SHOWMSG("allocating file buffer");
|
||||
@ -193,12 +162,21 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
|
||||
CLEAR_FLAG(fd->fd_Flags,FDF_APPEND);
|
||||
}
|
||||
|
||||
/* Figure out the buffered file access mode by looking at the open mode. */
|
||||
file_flags = IOBF_IN_USE | IOBF_NO_NUL;
|
||||
|
||||
if(FLAG_IS_SET(open_mode,O_RDONLY) || FLAG_IS_SET(open_mode,O_RDWR))
|
||||
SET_FLAG(file_flags,IOBF_READ);
|
||||
|
||||
if(FLAG_IS_SET(open_mode,O_WRONLY) || FLAG_IS_SET(open_mode,O_RDWR))
|
||||
SET_FLAG(file_flags,IOBF_WRITE);
|
||||
|
||||
__initialize_iob(file,(HOOKFUNC)__iob_hook_entry,
|
||||
buffer,
|
||||
aligned_buffer,BUFSIZ,
|
||||
file_descriptor,
|
||||
slot_number,
|
||||
IOBF_IN_USE | file_flags | IOBF_NO_NUL);
|
||||
file_flags);
|
||||
|
||||
buffer = NULL;
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_popen.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
||||
* $Id: stdio_popen.c,v 1.3 2004-11-28 09:33:19 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -94,20 +94,6 @@ pclose(FILE *stream)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#define SET_TAG(t,v,d) \
|
||||
do \
|
||||
{ \
|
||||
(t)->ti_Tag = (Tag)(v); \
|
||||
(t)->ti_Data = (ULONG)(d); \
|
||||
(t)++; \
|
||||
} \
|
||||
while(0)
|
||||
|
||||
#define END_TAG(t) \
|
||||
(void)((t)->ti_Tag = TAG_END)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
FILE *
|
||||
popen(const char *command, const char *type)
|
||||
{
|
||||
@ -118,14 +104,10 @@ popen(const char *command, const char *type)
|
||||
BPTR input = ZERO;
|
||||
BPTR output = ZERO;
|
||||
char pipe_file_name[40];
|
||||
struct TagItem tags[5];
|
||||
struct TagItem * tag;
|
||||
FILE * result = NULL;
|
||||
LONG status;
|
||||
unsigned long task_address;
|
||||
time_t now;
|
||||
size_t type_len;
|
||||
char actual_type[8];
|
||||
int i;
|
||||
|
||||
ENTER();
|
||||
@ -150,6 +132,36 @@ popen(const char *command, const char *type)
|
||||
if(__check_abort_enabled)
|
||||
__check_abort();
|
||||
|
||||
/* The first character selects the access mode: read or write. We don't
|
||||
support anything else. */
|
||||
switch(type[0])
|
||||
{
|
||||
case 'r':
|
||||
|
||||
SHOWMSG("read mode");
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
|
||||
SHOWMSG("write mode");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
D(("unsupported access mode '%lc'",type[0]));
|
||||
errno = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* The current PIPE: device only supports unidirectional connections. */
|
||||
if((type[1] == '+') || (type[1] != '\0' && type[2] == '+'))
|
||||
{
|
||||
D(("unsupported access mode '%s'",type));
|
||||
|
||||
errno = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
#if defined(UNIX_PATH_SEMANTICS)
|
||||
{
|
||||
if(__unix_path_semantics)
|
||||
@ -237,33 +249,10 @@ popen(const char *command, const char *type)
|
||||
}
|
||||
#endif /* UNIX_PATH_SEMANTICS */
|
||||
|
||||
/* Skip any options following the comma. */
|
||||
type_len = strlen(type);
|
||||
for(i = 0 ; i < (int)type_len ; i++)
|
||||
{
|
||||
if(type[i] == ',')
|
||||
{
|
||||
type_len = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Keep only the first few letters of the type string. */
|
||||
if(type_len > sizeof(actual_type)-1)
|
||||
type_len = sizeof(actual_type)-1;
|
||||
|
||||
memmove(actual_type,type,type_len);
|
||||
actual_type[type_len] = '\0';
|
||||
|
||||
/* The current PIPE: device only supports unidirectional connections. */
|
||||
if(strcmp(actual_type,"r+") == SAME)
|
||||
{
|
||||
SHOWMSG("unsupported access mode");
|
||||
|
||||
errno = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Build a (hopefully) unique name for the pipe stream to open. We
|
||||
construct it from the current process address, converted into
|
||||
an octal number, followed by the current time (in seconds),
|
||||
converted into another octal number. */
|
||||
strcpy(pipe_file_name,"PIPE:");
|
||||
|
||||
task_address = (unsigned long)FindTask(NULL);
|
||||
@ -290,26 +279,27 @@ popen(const char *command, const char *type)
|
||||
|
||||
PROFILE_OFF();
|
||||
|
||||
if(strcmp(actual_type,"r") == SAME)
|
||||
/* Now open the input and output streams for the program to launch. */
|
||||
if(type[0] == 'r')
|
||||
{
|
||||
/* Read mode: we want to read the output of the program; the program
|
||||
should read from "NIL:". */
|
||||
input = Open("NIL:",MODE_NEWFILE);
|
||||
if(input != ZERO)
|
||||
output = Open(pipe_file_name,MODE_NEWFILE);
|
||||
}
|
||||
else if (strcmp(actual_type,"w") == SAME)
|
||||
else
|
||||
{
|
||||
/* Write mode: we want to send data to the program; the program
|
||||
should write to "NIL:". */
|
||||
input = Open(pipe_file_name,MODE_NEWFILE);
|
||||
if(input != ZERO)
|
||||
output = Open("NIL:",MODE_NEWFILE);
|
||||
}
|
||||
else
|
||||
{
|
||||
errno = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
PROFILE_ON();
|
||||
|
||||
/* Check if both I/O streams could be opened. */
|
||||
if(input == ZERO || output == ZERO)
|
||||
{
|
||||
SHOWMSG("couldn't open the streams");
|
||||
@ -318,18 +308,20 @@ popen(const char *command, const char *type)
|
||||
goto out;
|
||||
}
|
||||
|
||||
tag = tags;
|
||||
|
||||
SET_TAG(tag,SYS_Input, input);
|
||||
SET_TAG(tag,SYS_Output, output);
|
||||
SET_TAG(tag,SYS_Asynch, TRUE);
|
||||
SET_TAG(tag,SYS_UserShell, TRUE);
|
||||
END_TAG(tag);
|
||||
|
||||
PROFILE_OFF();
|
||||
status = SystemTagList((STRPTR)command,tags);
|
||||
|
||||
/* Now try to launch the program. */
|
||||
status = SystemTags((STRPTR)command,
|
||||
SYS_Input, input,
|
||||
SYS_Output, output,
|
||||
SYS_Asynch, TRUE,
|
||||
SYS_UserShell, TRUE,
|
||||
TAG_END);
|
||||
|
||||
PROFILE_ON();
|
||||
|
||||
/* If launching the program returned -1 then it could not be started.
|
||||
We'll need to close the I/O streams we opened above. */
|
||||
if(status == -1)
|
||||
{
|
||||
SHOWMSG("SystemTagList() failed");
|
||||
@ -338,8 +330,11 @@ popen(const char *command, const char *type)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* OK, the program is running. Once it terminates, it will automatically
|
||||
shut down the streams we opened for it. */
|
||||
input = output = ZERO;
|
||||
|
||||
/* Now try to open the pipe we will use to exchange data with the program. */
|
||||
result = fopen(pipe_file_name,type);
|
||||
|
||||
out:
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_protos.h,v 1.2 2004-08-08 10:55:57 obarthel Exp $
|
||||
* $Id: stdio_protos.h,v 1.3 2004-09-29 14:17:44 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -65,6 +65,11 @@ struct fd;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* stdio_init_exit.c */
|
||||
void __close_all_files(void);
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/* stdio_translateioerror.c */
|
||||
extern void __translate_io_error_to_errno(LONG io_error,int * errno_ptr);
|
||||
extern void __translate_access_io_error_to_errno(LONG io_error,int * errno_ptr);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_puts.c,v 1.1.1.1 2004-07-26 16:31:40 obarthel Exp $
|
||||
* $Id: stdio_puts.c,v 1.2 2004-09-10 07:39:19 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -94,7 +94,7 @@ puts(const char *s)
|
||||
|
||||
out:
|
||||
|
||||
/* Note: if buffering is disabled for this stdout, then we still
|
||||
/* Note: if buffering is disabled for this stream, then we still
|
||||
may have buffered data around, queued to be printed right now.
|
||||
This is intended to improve performance as it takes more effort
|
||||
to write a single character to a file than to write a bunch. */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_vfprintf.c,v 1.4 2004-08-14 11:11:01 obarthel Exp $
|
||||
* $Id: stdio_vfprintf.c,v 1.6 2004-10-23 16:38:18 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -262,7 +262,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(arg == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -344,7 +343,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(arg == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -566,7 +564,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(arg == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -623,7 +620,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(arg == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -983,15 +979,8 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
else
|
||||
(void)va_arg(arg, double);
|
||||
|
||||
#ifndef NDEBUG
|
||||
{
|
||||
output_buffer = "*FLOATING POINT NUMBER*";
|
||||
output_len = strlen(output_buffer);
|
||||
}
|
||||
#endif /* NDEBUG */
|
||||
|
||||
CLEAR_FLAG(format_flags,FORMATF_ProduceSign);
|
||||
CLEAR_FLAG(format_flags,FORMATF_ProduceSpace);
|
||||
minimum_field_width = 0;
|
||||
format_flags = 0;
|
||||
}
|
||||
#endif /* FLOATING_POINT_SUPPORT */
|
||||
}
|
||||
@ -1013,7 +1002,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(arg == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -1168,7 +1156,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(arg == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -1224,7 +1211,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(arg == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -1243,7 +1229,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(short_ptr == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -1268,7 +1253,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(int_ptr == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -1289,7 +1273,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(int_ptr == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -1311,7 +1294,6 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
if(int_ptr == NULL)
|
||||
{
|
||||
errno = EFAULT;
|
||||
result = EOF;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -1524,7 +1506,7 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
||||
may have buffered data around, queued to be printed right now.
|
||||
This is intended to improve performance as it takes more effort
|
||||
to write a single character to a file than to write a bunch. */
|
||||
if(result > 0 && (iob->iob_Flags & IOBF_BUFFER_MODE) == IOBF_BUFFER_MODE_NONE)
|
||||
if(result != EOF && (iob->iob_Flags & IOBF_BUFFER_MODE) == IOBF_BUFFER_MODE_NONE)
|
||||
{
|
||||
if(__iob_write_buffer_is_valid(iob) && __flush_iob_write_buffer(iob) < 0)
|
||||
result = EOF;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdio_vfscanf.c,v 1.2 2004-08-08 10:55:57 obarthel Exp $
|
||||
* $Id: stdio_vfscanf.c,v 1.6 2004-11-08 17:57:52 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -105,24 +105,12 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
|
||||
if(isspace(c))
|
||||
{
|
||||
BOOL finished = FALSE;
|
||||
|
||||
/* Skip all blank spaces in the stream. */
|
||||
format++;
|
||||
|
||||
while(TRUE)
|
||||
while((c = __getc(stream)) != EOF)
|
||||
{
|
||||
c = __getc(stream);
|
||||
if(c == EOF)
|
||||
{
|
||||
/* Hit the end of the stream. Due to an error? */
|
||||
if(num_conversions == 0 || ferror(stream))
|
||||
goto out;
|
||||
|
||||
finished = TRUE;
|
||||
break;
|
||||
}
|
||||
else if (isspace(c))
|
||||
if(isspace(c))
|
||||
{
|
||||
total_num_chars_read++;
|
||||
}
|
||||
@ -139,8 +127,17 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
}
|
||||
}
|
||||
|
||||
if(finished)
|
||||
if(c == EOF)
|
||||
{
|
||||
SHOWMSG("end of file");
|
||||
|
||||
/* Hit the end of the stream? */
|
||||
if(num_conversions == 0)
|
||||
goto out;
|
||||
|
||||
/* Finished... */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Resume scanning. */
|
||||
continue;
|
||||
@ -159,8 +156,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
{
|
||||
SHOWMSG("end of file");
|
||||
|
||||
/* Hit the end of the stream. Due to an error? */
|
||||
if(num_conversions == 0 || ferror(stream))
|
||||
/* Hit the end of the stream. */
|
||||
if(num_conversions == 0)
|
||||
goto out;
|
||||
|
||||
break;
|
||||
@ -305,9 +302,11 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
break;
|
||||
|
||||
/* It's a floating point number. */
|
||||
case 'f':
|
||||
case 'e':
|
||||
case 'E':
|
||||
case 'f':
|
||||
case 'g':
|
||||
case 'G':
|
||||
|
||||
conversion_type = 'f';
|
||||
format++;
|
||||
@ -321,6 +320,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
case 's': /* string */
|
||||
case 'u': /* unsigned integer */
|
||||
case 'x': /* unsigned integer in hexadecimal format */
|
||||
case 'X': /* unsigned integer in hexadecimal format */
|
||||
case '%': /* the % character */
|
||||
case '[': /* a range of characters */
|
||||
|
||||
@ -339,21 +339,9 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
conversion_type != 'n' &&
|
||||
conversion_type != '[')
|
||||
{
|
||||
BOOL finished = FALSE;
|
||||
|
||||
while(TRUE)
|
||||
while((c = __getc(stream)) != EOF)
|
||||
{
|
||||
c = __getc(stream);
|
||||
if(c == EOF)
|
||||
{
|
||||
/* Hit the end of the stream. Due to an error? */
|
||||
if(num_conversions == 0 || ferror(stream))
|
||||
goto out;
|
||||
|
||||
finished = TRUE;
|
||||
break;
|
||||
}
|
||||
else if (isspace(c))
|
||||
if(isspace(c))
|
||||
{
|
||||
total_num_chars_read++;
|
||||
}
|
||||
@ -369,9 +357,6 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(finished)
|
||||
break;
|
||||
}
|
||||
|
||||
num_chars_processed = 0;
|
||||
@ -428,8 +413,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
c = __getc(stream);
|
||||
if(c == EOF)
|
||||
{
|
||||
/* Bail out if we hit the end of the stream or an error occured. */
|
||||
if(num_conversions == 0 || ferror(stream))
|
||||
/* Bail out if we hit the end of the stream. */
|
||||
if(num_conversions == 0)
|
||||
goto out;
|
||||
|
||||
break;
|
||||
@ -609,7 +594,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
maximum_field_width--;
|
||||
}
|
||||
|
||||
if(c == EOF && ((num_chars_processed == 0 && num_conversions == 0) || ferror(stream)))
|
||||
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1016,6 +1001,10 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
}
|
||||
}
|
||||
|
||||
/* Chose a base according to the conversion to be
|
||||
expected. For the 'x' and 'i' we examine the
|
||||
incoming data rather than commit ourselves to
|
||||
a peculiar data format now. */
|
||||
if(conversion_type == 'd' || conversion_type == 'u')
|
||||
base = 10;
|
||||
else if (conversion_type == 'o')
|
||||
@ -1060,7 +1049,11 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
* '0x' prefix or just a zero.
|
||||
*/
|
||||
c = __getc(stream);
|
||||
if (c == 'x' || c == 'X')
|
||||
|
||||
/* This takes care of the '0x' prefix for hexadecimal
|
||||
numbers ('%x') and also picks the right type of
|
||||
data for the '%i' type. */
|
||||
if ((c == 'x' || c == 'X') && (conversion_type == 'x' || conversion_type == 'i'))
|
||||
{
|
||||
/* It's the hex prefix. */
|
||||
base = 16;
|
||||
@ -1075,7 +1068,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
if(maximum_field_width > 0)
|
||||
maximum_field_width--;
|
||||
}
|
||||
else if (isdigit(c))
|
||||
else if (isdigit(c) && (conversion_type == 'i')) /* This could be the octal prefix for the '%i' format. */
|
||||
{
|
||||
/* The preceding '0' was part of the
|
||||
octal prefix. So we don't really know
|
||||
@ -1192,7 +1185,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
}
|
||||
}
|
||||
|
||||
if(c == EOF && ((num_chars_processed == 0 && num_conversions == 0) || ferror(stream)))
|
||||
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1298,8 +1291,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
|
||||
/* The conversion is considered to have failed if an EOF was
|
||||
encountered before any non-whitespace characters could be
|
||||
converted. We also bail out if we hit an error. */
|
||||
if(c == EOF && (num_chars_processed == 0 || ferror(stream)))
|
||||
converted. */
|
||||
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1422,8 +1415,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
{
|
||||
SHOWMSG("end of file");
|
||||
|
||||
/* Hit the end of the stream. Due to an error? */
|
||||
if(num_conversions == 0 || ferror(stream))
|
||||
/* Hit the end of the stream. */
|
||||
if(num_conversions == 0)
|
||||
goto out;
|
||||
|
||||
break;
|
||||
@ -1555,7 +1548,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
maximum_field_width--;
|
||||
}
|
||||
|
||||
if(c == EOF && ((num_chars_processed == 0 && num_conversions == 0) || ferror(stream)))
|
||||
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1569,8 +1562,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
||||
}
|
||||
}
|
||||
|
||||
if(num_conversions > 0)
|
||||
result = num_assignments;
|
||||
result = num_assignments;
|
||||
|
||||
out:
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdlib_constructor_begin.c,v 1.1.1.1 2004-07-26 16:31:52 obarthel Exp $
|
||||
* $Id: stdlib_constructor_begin.c,v 1.2 2004-09-29 19:57:57 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -42,80 +42,7 @@
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
/*
|
||||
* Dummy constructor and destructor array. The linker script will put these at the
|
||||
* very beginning of section ".ctors" and ".dtors". crtend.o contains a similar entry
|
||||
* with a NULL pointer entry and is put at the end of the sections. This way, the init
|
||||
* code can find the global constructor/destructor pointers
|
||||
*/
|
||||
static void (*__CTOR_LIST__[1]) (void) __attribute__((section(".ctors"))) = { (void *)-1 };
|
||||
static void (*__DTOR_LIST__[1]) (void) __attribute__((section(".dtors"))) = { (void *)-1 };
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
static void
|
||||
_do_ctors(void)
|
||||
{
|
||||
void (**pFuncPtr)(void);
|
||||
|
||||
/* Skip the first entry in the list (it's -1 anyway) */
|
||||
pFuncPtr = __CTOR_LIST__ + 1;
|
||||
|
||||
/* Call all constructors in forward order */
|
||||
while (*pFuncPtr != NULL)
|
||||
(**pFuncPtr++)();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
static void
|
||||
_do_dtors(void)
|
||||
{
|
||||
static ULONG i = ~0UL;
|
||||
void (**pFuncPtr)(void);
|
||||
|
||||
if(i == ~0UL)
|
||||
{
|
||||
ULONG j = (ULONG)__DTOR_LIST__[0];
|
||||
|
||||
if(j == ~0UL)
|
||||
{
|
||||
/* Find the end of the destructors list. */
|
||||
j = 1;
|
||||
|
||||
while(__DTOR_LIST__[j] != NULL)
|
||||
j++;
|
||||
|
||||
/* We're at the NULL entry now. Go back by one. */
|
||||
j--;
|
||||
}
|
||||
|
||||
i = j;
|
||||
}
|
||||
|
||||
/* If one of the destructors drops into
|
||||
* exit(), processing will continue with
|
||||
* the next following destructor.
|
||||
*/
|
||||
(void)setjmp(__exit_jmp_buf);
|
||||
|
||||
/* Call all destructors in reverse order. */
|
||||
pFuncPtr = &__DTOR_LIST__[i];
|
||||
while(i > 0)
|
||||
{
|
||||
i--;
|
||||
|
||||
(**pFuncPtr--)();
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#elif defined(__SASC)
|
||||
#if defined(__SASC)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -201,9 +128,21 @@ _do_ctors(void)
|
||||
ULONG nptrs = (ULONG)__CTOR_LIST__[0];
|
||||
ULONG i;
|
||||
|
||||
ENTER();
|
||||
|
||||
D(("there are %ld constructors to be called",nptrs));
|
||||
|
||||
/* Call all constructors in forward order */
|
||||
for(i = 0 ; i < nptrs ; i++)
|
||||
{
|
||||
D(("calling constructor #%ld, 0x%08lx",i,__CTOR_LIST__[1+i]));
|
||||
|
||||
__CTOR_LIST__[1+i]();
|
||||
}
|
||||
|
||||
SHOWMSG("all done.");
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@ -216,6 +155,10 @@ _do_dtors(void)
|
||||
ULONG nptrs = (ULONG)__DTOR_LIST__[0];
|
||||
static ULONG i;
|
||||
|
||||
ENTER();
|
||||
|
||||
D(("there are %ld destructors to be called",nptrs));
|
||||
|
||||
/* If one of the destructors drops into
|
||||
* exit(), processing will continue with
|
||||
* the next following destructor.
|
||||
@ -224,7 +167,15 @@ _do_dtors(void)
|
||||
|
||||
/* Call all destructors in reverse order */
|
||||
while(i++ < nptrs)
|
||||
{
|
||||
D(("calling destructor #%ld, 0x%08lx",i,__DTOR_LIST__[1+nptrs - i]));
|
||||
|
||||
__DTOR_LIST__[1+nptrs - i]();
|
||||
}
|
||||
|
||||
SHOWMSG("all done.");
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: stdlib_data.c,v 1.1.1.1 2004-07-26 16:31:53 obarthel Exp $
|
||||
* $Id: stdlib_data.c,v 1.3 2004-11-14 11:06:27 obarthel Exp $
|
||||
*
|
||||
* :ts=4
|
||||
*
|
||||
@ -84,22 +84,18 @@ ULONG __stk_extensions;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct Library * __UtilityBase;
|
||||
struct Library * __LocaleBase;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
|
||||
struct UtilityIFace * __IUtility;
|
||||
struct LocaleIFace * __ILocale;
|
||||
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__SASC)
|
||||
|
||||
UBYTE * __base;
|
||||
|
||||
#endif /* __SASC */
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct Library * __UtilityBase;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#if defined(__amigaos4__)
|
||||
struct UtilityIFace * __IUtility;
|
||||
#endif /* __amigaos4__ */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user