mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
Compare commits
88 Commits
V1_185
...
BEFORE_CON
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b35f5e0fdb | ||
|
|
86b7e5c429 | ||
|
|
42963b39c4 | ||
|
|
678cab02fb | ||
|
|
59d7f8d07f | ||
|
|
9a7c8a8705 | ||
|
|
96e74015f0 | ||
|
|
db8710d2ae | ||
|
|
91f12dd8f0 | ||
|
|
d2f157b0a1 | ||
|
|
e3e82b3657 | ||
|
|
4d3dc4a77f | ||
|
|
ee556fcb35 | ||
|
|
cc8a8e42c0 | ||
|
|
0fad53e56e | ||
|
|
d33e3e909e | ||
|
|
ef43011783 | ||
|
|
a9c8cdc554 | ||
|
|
d370bd123b | ||
|
|
6931123dc1 | ||
|
|
b2ddf28fa7 | ||
|
|
1bc19a04d3 | ||
|
|
1a0999bc1c | ||
|
|
1bf430d1d6 | ||
|
|
f2d1a3238d | ||
|
|
2c3bd39f71 | ||
|
|
0deb0e3e2d | ||
|
|
dd380f8479 | ||
|
|
ec3d921f7b | ||
|
|
ebd6cc3639 | ||
|
|
7690bb8399 | ||
|
|
2aba208878 | ||
|
|
593caccb38 | ||
|
|
ac0cc97924 | ||
|
|
ef44c75126 | ||
|
|
9a8fe330a9 | ||
|
|
17d81c12c0 | ||
|
|
c799b17bb9 | ||
|
|
1df294c07e | ||
|
|
f51faeb168 | ||
|
|
c0c70bfd99 | ||
|
|
b10d1ad38c | ||
|
|
1550c6fef3 | ||
|
|
53d99ac7a2 | ||
|
|
c4c25649f2 | ||
|
|
18f1f75479 | ||
|
|
410833d2ed | ||
|
|
cfa6f566db | ||
|
|
99547756fe | ||
|
|
ea638f0970 | ||
|
|
4aa85e1d12 | ||
|
|
fcb8cfc0dc | ||
|
|
a626336b7b | ||
|
|
07d09bb185 | ||
|
|
6ad88ff97f | ||
|
|
2ddfeab0cf | ||
|
|
91028c63bc | ||
|
|
209884bd1f | ||
|
|
3548d3cf7e | ||
|
|
50b8b623cc | ||
|
|
49bc1d6b13 | ||
|
|
fce21e21d6 | ||
|
|
f8b1e7516f | ||
|
|
8e2820e9b7 | ||
|
|
ab22a23f27 | ||
|
|
0ae8d68e64 | ||
|
|
0b1d21471d | ||
|
|
987316e638 | ||
|
|
e8d4187ea5 | ||
|
|
003faf7a24 | ||
|
|
d1aaa84bcc | ||
|
|
e1476c15b3 | ||
|
|
17fea5626a | ||
|
|
e4b70e946f | ||
|
|
56b0a74c61 | ||
|
|
d23f4318f9 | ||
|
|
23f70d0c53 | ||
|
|
c6fcede4ce | ||
|
|
5801d000d4 | ||
|
|
619b64e6f4 | ||
|
|
5191ee5660 | ||
|
|
64c1175f7b | ||
|
|
be827762de | ||
|
|
618299fb48 | ||
|
|
fbc6d94840 | ||
|
|
5cf80326bc | ||
|
|
e571888f4f | ||
|
|
f519aafaca |
@@ -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ï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' 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.19 2004-12-26 10:28:56 obarthel Exp $
|
# $Id: GNUmakefile.68k,v 1.40 2005-03-11 09:37:27 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -77,40 +77,47 @@ $(LIBAMIGA_OBJS)/%.o : %.c
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
ifeq (small_data_020,$(TYPE))
|
ifeq (small_data_020,$(TYPE))
|
||||||
CODE_TYPE := -fbaserel -DSMALL_DATA -m68020-60 -DM68020
|
CODE_TYPE := -m68020-60
|
||||||
|
CODE_FLAGS := -fbaserel -DSMALL_DATA -DM68020
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (small_data,$(TYPE))
|
ifeq (small_data,$(TYPE))
|
||||||
CODE_TYPE := -fbaserel -DSMALL_DATA -m68000
|
CODE_TYPE := -m68000
|
||||||
|
CODE_FLAGS := -fbaserel -DSMALL_DATA
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (small_data32,$(TYPE))
|
ifeq (small_data32,$(TYPE))
|
||||||
CODE_TYPE := -fbaserel32 -DSMALL_DATA32 -m68020-60 -DM68020
|
CODE_TYPE := -m68020-60
|
||||||
|
CODE_FLAGS := -fbaserel32 -DSMALL_DATA32 -DM68020
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (large_data_020,$(TYPE))
|
ifeq (large_data_020,$(TYPE))
|
||||||
CODE_TYPE := -m68020-60 -DM68020
|
CODE_TYPE := -m68020-60
|
||||||
|
CODE_FLAGS := -DM68020
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (large_data,$(TYPE))
|
ifeq (large_data,$(TYPE))
|
||||||
CODE_TYPE := -m68000
|
CODE_TYPE := -m68000
|
||||||
|
CODE_FLAGS :=
|
||||||
endif
|
endif
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
WARNINGS = \
|
WARNINGS = \
|
||||||
-Wall -W -Wshadow -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
|
-Wall -W -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
|
||||||
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
|
-Wundef -Wbad-function-cast -Wmissing-declarations -Wunused
|
||||||
|
|
||||||
|
# -Wconversion -Wshadow
|
||||||
|
|
||||||
INCLUDES = -Iinclude -I. -Inetinclude
|
INCLUDES = -Iinclude -I. -Inetinclude
|
||||||
OPTIONS = -DNDEBUG -fno-builtin
|
OPTIONS = -DNDEBUG -fno-builtin
|
||||||
#OPTIONS = -D__MEM_DEBUG -fno-builtin
|
#OPTIONS = -D__MEM_DEBUG -fno-builtin
|
||||||
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
|
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
|
||||||
#OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
|
OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
|
||||||
#OPTIMIZE = -O2 -fomit-frame-pointer
|
#OPTIMIZE = -O2 -fomit-frame-pointer
|
||||||
#DEBUG = -g2
|
#DEBUG = -g2
|
||||||
|
|
||||||
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDES)
|
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_FLAGS) $(CODE_TYPE) $(INCLUDES)
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
@@ -128,27 +135,30 @@ C_LIB = \
|
|||||||
ctype_isspace.o \
|
ctype_isspace.o \
|
||||||
ctype_isupper.o \
|
ctype_isupper.o \
|
||||||
ctype_isxdigit.o \
|
ctype_isxdigit.o \
|
||||||
|
ctype_table.o \
|
||||||
ctype_tolower.o \
|
ctype_tolower.o \
|
||||||
ctype_toupper.o \
|
ctype_toupper.o \
|
||||||
ctype_table.o \
|
|
||||||
dirent_closedir.o \
|
dirent_closedir.o \
|
||||||
dirent_data.o \
|
|
||||||
dirent_rewinddir.o \
|
|
||||||
dirent_opendir.o \
|
dirent_opendir.o \
|
||||||
dirent_readdir.o \
|
dirent_readdir.o \
|
||||||
|
dirent_rewinddir.o \
|
||||||
errno_data.o \
|
errno_data.o \
|
||||||
fcntl_close.o \
|
fcntl_close.o \
|
||||||
fcntl_creat.o \
|
fcntl_creat.o \
|
||||||
fcntl_fcntl.o \
|
fcntl_fcntl.o \
|
||||||
|
fcntl_get_default_file.o \
|
||||||
|
fcntl_lock.o \
|
||||||
fcntl_lseek.o \
|
fcntl_lseek.o \
|
||||||
fcntl_open.o \
|
fcntl_open.o \
|
||||||
fcntl_read.o \
|
fcntl_read.o \
|
||||||
fcntl_write.o \
|
fcntl_write.o \
|
||||||
fcntl_get_default_file.o \
|
ftw_ftw.o \
|
||||||
|
ftw_nftw.o \
|
||||||
libgen_basename.o \
|
libgen_basename.o \
|
||||||
libgen_dirname.o \
|
libgen_dirname.o \
|
||||||
locale_init_exit.o \
|
locale_init_exit.o \
|
||||||
locale_localeconv.o \
|
locale_localeconv.o \
|
||||||
|
locale_open_locale.o \
|
||||||
locale_setlocale.o \
|
locale_setlocale.o \
|
||||||
mount_convertinfo.o \
|
mount_convertinfo.o \
|
||||||
mount_fstatfs.o \
|
mount_fstatfs.o \
|
||||||
@@ -166,7 +176,6 @@ C_LIB = \
|
|||||||
signal_sigsetmask.o \
|
signal_sigsetmask.o \
|
||||||
stat_chmod.o \
|
stat_chmod.o \
|
||||||
stat_convertfileinfo.o \
|
stat_convertfileinfo.o \
|
||||||
stat_data.o \
|
|
||||||
stat_fchmod.o \
|
stat_fchmod.o \
|
||||||
stat_fstat.o \
|
stat_fstat.o \
|
||||||
stat_lstat.o \
|
stat_lstat.o \
|
||||||
@@ -176,21 +185,22 @@ C_LIB = \
|
|||||||
stat_umask.o \
|
stat_umask.o \
|
||||||
stdio_asprintf.o \
|
stdio_asprintf.o \
|
||||||
stdio_clearerr.o \
|
stdio_clearerr.o \
|
||||||
stdio_data.o \
|
|
||||||
stdio_dropiobreadbuffer.o \
|
stdio_dropiobreadbuffer.o \
|
||||||
stdio_duplicate_fd.o \
|
stdio_duplicate_fd.o \
|
||||||
|
stdio_examine_fh.o \
|
||||||
stdio_fclose.o \
|
stdio_fclose.o \
|
||||||
stdio_fdhookentry.o \
|
stdio_fdhookentry.o \
|
||||||
stdio_feof.o \
|
stdio_feof.o \
|
||||||
stdio_ferror.o \
|
stdio_ferror.o \
|
||||||
stdio_fflush.o \
|
stdio_fflush.o \
|
||||||
stdio_flush.o \
|
|
||||||
stdio_fgetc.o \
|
stdio_fgetc.o \
|
||||||
stdio_fgetpos.o \
|
stdio_fgetpos.o \
|
||||||
stdio_fgets.o \
|
stdio_fgets.o \
|
||||||
stdio_filliobreadbuffer.o \
|
stdio_filliobreadbuffer.o \
|
||||||
stdio_findvacantfdentry.o \
|
stdio_findvacantfdentry.o \
|
||||||
stdio_findvacantiobentry.o \
|
stdio_findvacantiobentry.o \
|
||||||
|
stdio_flockfile.o \
|
||||||
|
stdio_flush.o \
|
||||||
stdio_flushiobwritebuffer.o \
|
stdio_flushiobwritebuffer.o \
|
||||||
stdio_fopen.o \
|
stdio_fopen.o \
|
||||||
stdio_fprintf.o \
|
stdio_fprintf.o \
|
||||||
@@ -202,27 +212,38 @@ C_LIB = \
|
|||||||
stdio_fseek.o \
|
stdio_fseek.o \
|
||||||
stdio_fsetpos.o \
|
stdio_fsetpos.o \
|
||||||
stdio_ftell.o \
|
stdio_ftell.o \
|
||||||
|
stdio_ftrylockfile.o \
|
||||||
|
stdio_funlockfile.o \
|
||||||
stdio_fwrite.o \
|
stdio_fwrite.o \
|
||||||
stdio_getc.o \
|
stdio_getc.o \
|
||||||
|
stdio_getc_unlocked.o \
|
||||||
stdio_getchar.o \
|
stdio_getchar.o \
|
||||||
stdio_get_file_descriptor.o \
|
stdio_getchar_unlocked.o \
|
||||||
stdio_gets.o \
|
stdio_gets.o \
|
||||||
|
stdio_get_file_descriptor.o \
|
||||||
stdio_growfdtable.o \
|
stdio_growfdtable.o \
|
||||||
stdio_growiobtable.o \
|
stdio_growiobtable.o \
|
||||||
|
stdio_grow_file.o \
|
||||||
stdio_initializefd.o \
|
stdio_initializefd.o \
|
||||||
stdio_initializeiob.o \
|
stdio_initializeiob.o \
|
||||||
stdio_init_exit.o \
|
stdio_init_exit.o \
|
||||||
|
stdio_file_init.o \
|
||||||
stdio_iobhookentry.o \
|
stdio_iobhookentry.o \
|
||||||
|
stdio_lock.o \
|
||||||
stdio_locksemaphorename.o \
|
stdio_locksemaphorename.o \
|
||||||
stdio_nostdio.o \
|
stdio_nostdio.o \
|
||||||
stdio_openiob.o \
|
stdio_openiob.o \
|
||||||
|
stdio_parent_of_fh.o \
|
||||||
stdio_perror.o \
|
stdio_perror.o \
|
||||||
stdio_popen.o \
|
stdio_popen.o \
|
||||||
stdio_printf.o \
|
stdio_printf.o \
|
||||||
stdio_putc.o \
|
stdio_putc.o \
|
||||||
|
stdio_putc_unlocked.o \
|
||||||
stdio_putchar.o \
|
stdio_putchar.o \
|
||||||
|
stdio_putchar_unlocked.o \
|
||||||
stdio_puts.o \
|
stdio_puts.o \
|
||||||
stdio_remove.o \
|
stdio_remove.o \
|
||||||
|
stdio_remove_fd_alias.o \
|
||||||
stdio_rename.o \
|
stdio_rename.o \
|
||||||
stdio_rewind.o \
|
stdio_rewind.o \
|
||||||
stdio_scanf.o \
|
stdio_scanf.o \
|
||||||
@@ -236,6 +257,7 @@ C_LIB = \
|
|||||||
stdio_tmpnam.o \
|
stdio_tmpnam.o \
|
||||||
stdio_translateioerror.o \
|
stdio_translateioerror.o \
|
||||||
stdio_ungetc.o \
|
stdio_ungetc.o \
|
||||||
|
stdio_unlockfile.o \
|
||||||
stdio_vasprintf.o \
|
stdio_vasprintf.o \
|
||||||
stdio_vasprintf_hook_entry.o \
|
stdio_vasprintf_hook_entry.o \
|
||||||
stdio_vfprintf.o \
|
stdio_vfprintf.o \
|
||||||
@@ -252,13 +274,12 @@ C_LIB = \
|
|||||||
stdlib_atexit.o \
|
stdlib_atexit.o \
|
||||||
stdlib_atoi.o \
|
stdlib_atoi.o \
|
||||||
stdlib_atol.o \
|
stdlib_atol.o \
|
||||||
|
stdlib_atoll.o \
|
||||||
stdlib_bsearch.o \
|
stdlib_bsearch.o \
|
||||||
stdlib_calloc.o \
|
stdlib_calloc.o \
|
||||||
stdlib_checkdetach.o \
|
stdlib_checkdetach.o \
|
||||||
stdlib_constructor.o \
|
stdlib_constructor.o \
|
||||||
stdlib_constructor_begin.o \
|
stdlib_constructor_begin.o \
|
||||||
stdlib_constructor_end.o \
|
|
||||||
stdlib_data.o \
|
|
||||||
stdlib_default_pool_size.o \
|
stdlib_default_pool_size.o \
|
||||||
stdlib_default_puddle_size.o \
|
stdlib_default_puddle_size.o \
|
||||||
stdlib_destructor.o \
|
stdlib_destructor.o \
|
||||||
@@ -273,6 +294,7 @@ C_LIB = \
|
|||||||
stdlib_getdefstacksize.o \
|
stdlib_getdefstacksize.o \
|
||||||
stdlib_getenv.o \
|
stdlib_getenv.o \
|
||||||
stdlib_getsp.o \
|
stdlib_getsp.o \
|
||||||
|
stdlib_get_errno.o \
|
||||||
stdlib_init_exit.o \
|
stdlib_init_exit.o \
|
||||||
stdlib_isresident.o \
|
stdlib_isresident.o \
|
||||||
stdlib_labs.o \
|
stdlib_labs.o \
|
||||||
@@ -293,10 +315,13 @@ C_LIB = \
|
|||||||
stdlib_putenv.o \
|
stdlib_putenv.o \
|
||||||
stdlib_qsort.o \
|
stdlib_qsort.o \
|
||||||
stdlib_rand.o \
|
stdlib_rand.o \
|
||||||
|
stdlib_rand_r.o \
|
||||||
stdlib_realloc.o \
|
stdlib_realloc.o \
|
||||||
stdlib_red_black.o \
|
stdlib_red_black.o \
|
||||||
|
stdlib_semaphore.o \
|
||||||
stdlib_setenv.o \
|
stdlib_setenv.o \
|
||||||
stdlib_setjmp.o \
|
stdlib_setjmp.o \
|
||||||
|
stdlib_set_errno.o \
|
||||||
stdlib_set_process_window.o \
|
stdlib_set_process_window.o \
|
||||||
stdlib_shell_escape.o \
|
stdlib_shell_escape.o \
|
||||||
stdlib_showerror.o \
|
stdlib_showerror.o \
|
||||||
@@ -308,10 +333,11 @@ C_LIB = \
|
|||||||
stdlib_stacksafezone.o \
|
stdlib_stacksafezone.o \
|
||||||
stdlib_stacksize.o \
|
stdlib_stacksize.o \
|
||||||
stdlib_stack_usage.o \
|
stdlib_stack_usage.o \
|
||||||
stdlib_startup.o \
|
stdlib_arg.o \
|
||||||
|
stdlib_stdio_window_spec.o \
|
||||||
stdlib_strtol.o \
|
stdlib_strtol.o \
|
||||||
stdlib_strtoul.o \
|
|
||||||
stdlib_strtoll.o \
|
stdlib_strtoll.o \
|
||||||
|
stdlib_strtoul.o \
|
||||||
stdlib_strtoull.o \
|
stdlib_strtoull.o \
|
||||||
stdlib_swapstack.o \
|
stdlib_swapstack.o \
|
||||||
stdlib_sysbase.o \
|
stdlib_sysbase.o \
|
||||||
@@ -323,7 +349,7 @@ C_LIB = \
|
|||||||
stdlib_umodsi3.o \
|
stdlib_umodsi3.o \
|
||||||
stdlib_unsetenv.o \
|
stdlib_unsetenv.o \
|
||||||
stdlib_wildcard_expand.o \
|
stdlib_wildcard_expand.o \
|
||||||
stdlib_stdio_window_spec.o \
|
strings_ffs.o \
|
||||||
strings_strcasecmp.o \
|
strings_strcasecmp.o \
|
||||||
strings_strncasecmp.o \
|
strings_strncasecmp.o \
|
||||||
string_bcmp.o \
|
string_bcmp.o \
|
||||||
@@ -361,9 +387,12 @@ C_LIB = \
|
|||||||
time_asctime_r.o \
|
time_asctime_r.o \
|
||||||
time_clock.o \
|
time_clock.o \
|
||||||
time_converttime.o \
|
time_converttime.o \
|
||||||
|
time_convert_datestamp.o \
|
||||||
|
time_convert_time.o \
|
||||||
time_ctime.o \
|
time_ctime.o \
|
||||||
time_ctime_r.o \
|
time_ctime_r.o \
|
||||||
time_data.o \
|
time_data.o \
|
||||||
|
time_days_per_date.o \
|
||||||
time_gettimeofday.o \
|
time_gettimeofday.o \
|
||||||
time_gmtime.o \
|
time_gmtime.o \
|
||||||
time_gmtime_r.o \
|
time_gmtime_r.o \
|
||||||
@@ -373,6 +402,7 @@ C_LIB = \
|
|||||||
time_numbertostring.o \
|
time_numbertostring.o \
|
||||||
time_strftime.o \
|
time_strftime.o \
|
||||||
time_time.o \
|
time_time.o \
|
||||||
|
time_weekday.o \
|
||||||
unistd_access.o \
|
unistd_access.o \
|
||||||
unistd_chdir.o \
|
unistd_chdir.o \
|
||||||
unistd_chdir_exit.o \
|
unistd_chdir_exit.o \
|
||||||
@@ -381,8 +411,10 @@ C_LIB = \
|
|||||||
unistd_dup.o \
|
unistd_dup.o \
|
||||||
unistd_dup2.o \
|
unistd_dup2.o \
|
||||||
unistd_fchown.o \
|
unistd_fchown.o \
|
||||||
|
unistd_fdatasync.o \
|
||||||
unistd_fdopen.o \
|
unistd_fdopen.o \
|
||||||
unistd_fileno.o \
|
unistd_fileno.o \
|
||||||
|
unistd_fsync.o \
|
||||||
unistd_ftruncate.o \
|
unistd_ftruncate.o \
|
||||||
unistd_getcwd.o \
|
unistd_getcwd.o \
|
||||||
unistd_getopt.o \
|
unistd_getopt.o \
|
||||||
@@ -395,17 +427,18 @@ C_LIB = \
|
|||||||
unistd_realpath.o \
|
unistd_realpath.o \
|
||||||
unistd_sleep.o \
|
unistd_sleep.o \
|
||||||
unistd_symlink.o \
|
unistd_symlink.o \
|
||||||
|
unistd_sync_fd.o \
|
||||||
unistd_timer.o \
|
unistd_timer.o \
|
||||||
unistd_time_delay.o \
|
unistd_time_delay.o \
|
||||||
unistd_truncate.o \
|
unistd_truncate.o \
|
||||||
unistd_unlink.o \
|
unistd_unlink.o \
|
||||||
unistd_usleep.o \
|
unistd_usleep.o \
|
||||||
utime_utime.o
|
utime_utime.o \
|
||||||
|
utsname_uname.o
|
||||||
|
|
||||||
UNIX_LIB = \
|
UNIX_LIB = \
|
||||||
unix.lib_rev.o \
|
unix.lib_rev.o \
|
||||||
dirent_closedir.o \
|
dirent_closedir.o \
|
||||||
dirent_data.o \
|
|
||||||
dirent_rewinddir.o \
|
dirent_rewinddir.o \
|
||||||
dirent_opendir.o \
|
dirent_opendir.o \
|
||||||
dirent_readdir.o \
|
dirent_readdir.o \
|
||||||
@@ -425,9 +458,11 @@ UNIX_LIB = \
|
|||||||
stdio_fflush.o \
|
stdio_fflush.o \
|
||||||
stdio_fopen.o \
|
stdio_fopen.o \
|
||||||
stdio_init_exit.o \
|
stdio_init_exit.o \
|
||||||
|
stdio_file_init.o \
|
||||||
stdio_locksemaphorename.o \
|
stdio_locksemaphorename.o \
|
||||||
stdio_openiob.o \
|
stdio_openiob.o \
|
||||||
stdio_popen.o \
|
stdio_popen.o \
|
||||||
|
stdio_record_locking.o \
|
||||||
stdio_remove.o \
|
stdio_remove.o \
|
||||||
stdio_rename.o \
|
stdio_rename.o \
|
||||||
stdlib_mkdtemp.o \
|
stdlib_mkdtemp.o \
|
||||||
@@ -463,12 +498,12 @@ MATH_LIB = \
|
|||||||
math_ceil.o \
|
math_ceil.o \
|
||||||
math_cos.o \
|
math_cos.o \
|
||||||
math_cosh.o \
|
math_cosh.o \
|
||||||
math_data.o \
|
|
||||||
math_exp.o \
|
math_exp.o \
|
||||||
math_fabs.o \
|
math_fabs.o \
|
||||||
math_floor.o \
|
math_floor.o \
|
||||||
math_fmod.o \
|
math_fmod.o \
|
||||||
math_frexp.o \
|
math_frexp.o \
|
||||||
|
math_huge_val.o \
|
||||||
math_hypot.o \
|
math_hypot.o \
|
||||||
math_init_exit.o \
|
math_init_exit.o \
|
||||||
math_isinf.o \
|
math_isinf.o \
|
||||||
@@ -502,12 +537,12 @@ MATH_LIB = \
|
|||||||
stdio_vsnprintf.o \
|
stdio_vsnprintf.o \
|
||||||
stdio_vsprintf.o \
|
stdio_vsprintf.o \
|
||||||
stdlib_atof.o \
|
stdlib_atof.o \
|
||||||
stdlib_machine_test.o \
|
|
||||||
stdlib_strtod.o \
|
stdlib_strtod.o \
|
||||||
time_difftime.o
|
time_difftime.o
|
||||||
|
|
||||||
MATH_LIB_881 = \
|
MATH_LIB_881 = \
|
||||||
m881.lib_rev.o \
|
m881.lib_rev.o \
|
||||||
|
stdlib_machine_test.o \
|
||||||
$(MATH_LIB)
|
$(MATH_LIB)
|
||||||
|
|
||||||
MATH_LIB_IEEE = \
|
MATH_LIB_IEEE = \
|
||||||
@@ -557,7 +592,6 @@ NET_LIB = \
|
|||||||
socket_accept.o \
|
socket_accept.o \
|
||||||
socket_bind.o \
|
socket_bind.o \
|
||||||
socket_connect.o \
|
socket_connect.o \
|
||||||
socket_data.o \
|
|
||||||
socket_gethostbyaddr.o \
|
socket_gethostbyaddr.o \
|
||||||
socket_gethostbyname.o \
|
socket_gethostbyname.o \
|
||||||
socket_gethostid.o \
|
socket_gethostid.o \
|
||||||
@@ -624,7 +658,8 @@ NET_LIB = \
|
|||||||
usergroup_setregid.o \
|
usergroup_setregid.o \
|
||||||
usergroup_setreuid.o \
|
usergroup_setreuid.o \
|
||||||
usergroup_setsid.o \
|
usergroup_setsid.o \
|
||||||
usergroup_setuid.o
|
usergroup_setuid.o \
|
||||||
|
utsname_uname.o
|
||||||
|
|
||||||
DEBUG_LIB = \
|
DEBUG_LIB = \
|
||||||
debug.lib_rev.o \
|
debug.lib_rev.o \
|
||||||
@@ -714,7 +749,7 @@ LIBS_020 := $(LIBM881_OBJS)/libm881.a $(LIBS_68K)
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# The 881 math library won't build in plain 68k mode
|
# The 881 math library won't build in plain 68k mode
|
||||||
ifneq (,$(findstring 68020,$(CODE_TYPE)))
|
ifneq (,$(findstring 68020,$(CODE_FLAGS)))
|
||||||
LIBS := $(LIBS_020)
|
LIBS := $(LIBS_020)
|
||||||
else
|
else
|
||||||
LIBS := $(LIBS_68K)
|
LIBS := $(LIBS_68K)
|
||||||
@@ -811,47 +846,47 @@ lib/libm020 : lib
|
|||||||
|
|
||||||
lib/libb/libm020/libm.a: lib lib/libb/libm020
|
lib/libb/libm020/libm.a: lib lib/libb/libm020
|
||||||
$(MAKE) TYPE=small_data_020 kitchen_sink
|
$(MAKE) TYPE=small_data_020 kitchen_sink
|
||||||
$(COPY) $(foreach file,$(LIBS_020),small_data_020/$(file)) lib/libb/libm020
|
@$(COPY) $(foreach file,$(LIBS_020),small_data_020/$(file)) lib/libb/libm020
|
||||||
|
|
||||||
lib/libb/libm.a: lib lib/libb
|
lib/libb/libm.a: lib lib/libb
|
||||||
$(MAKE) TYPE=small_data kitchen_sink
|
$(MAKE) TYPE=small_data kitchen_sink
|
||||||
$(COPY) $(foreach file,$(LIBS_68K),small_data/$(file)) lib/libb
|
@$(COPY) $(foreach file,$(LIBS_68K),small_data/$(file)) lib/libb
|
||||||
|
|
||||||
lib/libb32/libm020/libm.a: lib lib/libb32 lib/libb32/libm020
|
lib/libb32/libm020/libm.a: lib lib/libb32 lib/libb32/libm020
|
||||||
$(MAKE) TYPE=small_data32 kitchen_sink
|
$(MAKE) TYPE=small_data32 kitchen_sink
|
||||||
$(COPY) $(foreach file,$(LIBS_020),small_data32/$(file)) lib/libb32/libm020
|
@$(COPY) $(foreach file,$(LIBS_020),small_data32/$(file)) lib/libb32/libm020
|
||||||
|
|
||||||
lib/libm020/libm.a: lib lib/libm020
|
lib/libm020/libm.a: lib lib/libm020
|
||||||
$(MAKE) TYPE=large_data_020 kitchen_sink
|
$(MAKE) TYPE=large_data_020 kitchen_sink
|
||||||
$(COPY) $(foreach file,$(LIBS_020),large_data_020/$(file)) lib/libm020
|
@$(COPY) $(foreach file,$(LIBS_020),large_data_020/$(file)) lib/libm020
|
||||||
|
|
||||||
lib/libm.a: lib
|
lib/libm.a: lib
|
||||||
$(MAKE) TYPE=large_data kitchen_sink
|
$(MAKE) TYPE=large_data kitchen_sink
|
||||||
$(COPY) $(foreach file,$(LIBS_68K),large_data/$(file)) lib
|
@$(COPY) $(foreach file,$(LIBS_68K),large_data/$(file)) lib
|
||||||
|
|
||||||
lib/nrcrt0.o : lib nrcrt0.o
|
lib/nrcrt0.o : lib nrcrt0.o
|
||||||
$(COPY) nrcrt0.o lib
|
@$(COPY) nrcrt0.o lib
|
||||||
|
|
||||||
lib/nbcrt0.o : lib nbcrt0.o
|
lib/nbcrt0.o : lib nbcrt0.o
|
||||||
$(COPY) nbcrt0.o lib
|
@$(COPY) nbcrt0.o lib
|
||||||
|
|
||||||
lib/ncrt0.o : lib ncrt0.o
|
lib/ncrt0.o : lib ncrt0.o
|
||||||
$(COPY) ncrt0.o lib
|
@$(COPY) ncrt0.o lib
|
||||||
|
|
||||||
lib/n32bcrt0.o : lib nb32crt0.o
|
lib/n32bcrt0.o : lib nb32crt0.o
|
||||||
$(COPY) nb32crt0.o lib
|
@$(COPY) nb32crt0.o lib
|
||||||
|
|
||||||
lib/n32rcrt0.o : lib nr32crt0.o
|
lib/n32rcrt0.o : lib nr32crt0.o
|
||||||
$(COPY) nr32crt0.o lib
|
@$(COPY) nr32crt0.o lib
|
||||||
|
|
||||||
lib/mainnb.o : lib mainnb.o
|
lib/mainnb.o : lib mainnb.o
|
||||||
$(COPY) mainnb.o lib
|
@$(COPY) mainnb.o lib
|
||||||
|
|
||||||
lib/mainb.o : lib mainb.o
|
lib/mainb.o : lib mainb.o
|
||||||
$(COPY) mainb.o lib
|
@$(COPY) mainb.o lib
|
||||||
|
|
||||||
lib/mainb32.o : lib mainb32.o
|
lib/mainb32.o : lib mainb32.o
|
||||||
$(COPY) mainb32.o lib
|
@$(COPY) mainb32.o lib
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
@@ -905,6 +940,27 @@ $(LIBC_OBJS)/stdlib_red_black.o : stdlib_red_black.c stdlib_mem_debug.h
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# The -fbaserel32 option requires the CPU type to be 68010/68020, too.
|
||||||
|
ifneq (,$(findstring fbaserel32,$(CODE_FLAGS)))
|
||||||
|
LOCAL_CODE_FLAGS := $(CODE_FLAGS) $(CODE_TYPE)
|
||||||
|
else
|
||||||
|
LOCAL_CODE_FLAGS := $(CODE_FLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(LIBC_OBJS)/stdlib_machine_test.o : stdlib_machine_test.c
|
||||||
|
@echo "Compiling $< [$(TYPE):c]"
|
||||||
|
@$(CC) -o $(LIBC_OBJS)/stdlib_machine_test.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(LOCAL_CODE_FLAGS) $(INCLUDES) $<
|
||||||
|
|
||||||
|
$(LIBM881_OBJS)/stdlib_machine_test.o : stdlib_machine_test.c
|
||||||
|
@echo "Compiling $< [$(TYPE):c]"
|
||||||
|
@$(CC) -o $(LIBM881_OBJS)/stdlib_machine_test.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(LOCAL_CODE_FLAGS) $(INCLUDES) -DM68881_FLOATING_POINT_SUPPORT $<
|
||||||
|
|
||||||
|
$(LIBC_OBJS)/stdlib_showerror.o : stdlib_showerror.c
|
||||||
|
@echo "Compiling $< [$(TYPE):c]"
|
||||||
|
@$(CC) -o $(LIBC_OBJS)/stdlib_showerror.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(LOCAL_CODE_FLAGS) $(INCLUDES) $<
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
$(LIBC_OBJS)/stdlib_alloca_debug.o : stdlib_alloca.c
|
$(LIBC_OBJS)/stdlib_alloca_debug.o : stdlib_alloca.c
|
||||||
@echo "Compiling $< [$(TYPE):c debug]"
|
@echo "Compiling $< [$(TYPE):c debug]"
|
||||||
@$(CC) -o $(LIBC_OBJS)/stdlib_alloca_debug.o -c $(CFLAGS) -D__USE_MEM_TREES -D__MEM_DEBUG stdlib_alloca.c
|
@$(CC) -o $(LIBC_OBJS)/stdlib_alloca_debug.o -c $(CFLAGS) -D__USE_MEM_TREES -D__MEM_DEBUG stdlib_alloca.c
|
||||||
@@ -1032,25 +1088,56 @@ $(LIBAMIGA_OBJS)/libamiga.a : $(LIBAMIGA_OBJS) $(foreach file,$(AMIGA_LIB),$(LIB
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
nrcrt0.o : nrcrt0.S
|
nrcrt0.o : nrcrt0.S
|
||||||
$(CC) -traditional -o $@ -c nrcrt0.S
|
@echo "Assembling $< [resident]"
|
||||||
|
@$(CC) -traditional -o $@ -c nrcrt0.S
|
||||||
|
|
||||||
nr32crt0.o : nrcrt0.S
|
nr32crt0.o : nrcrt0.S
|
||||||
$(CC) -traditional -m68020 -DSMALL_DATA32 -o $@ -c nrcrt0.S
|
@echo "Assembling $< [resident32]"
|
||||||
|
@$(CC) -traditional -m68020 -DSMALL_DATA32 -o $@ -c nrcrt0.S
|
||||||
|
|
||||||
nbcrt0.o : ncrt0.S
|
nbcrt0.o : ncrt0.S
|
||||||
$(CC) -traditional -DSMALL_DATA -o $@ -c ncrt0.S
|
@echo "Assembling $< [small_data]"
|
||||||
|
@$(CC) -traditional -DSMALL_DATA -o $@ -c ncrt0.S
|
||||||
|
|
||||||
nb32crt0.o : ncrt0.S
|
nb32crt0.o : ncrt0.S
|
||||||
$(CC) -traditional -m68020 -DSMALL_DATA32 -o $@ -c ncrt0.S
|
@echo "Assembling $< [small_data32]"
|
||||||
|
@$(CC) -traditional -m68020 -DSMALL_DATA32 -o $@ -c ncrt0.S
|
||||||
|
|
||||||
ncrt0.o : ncrt0.S
|
ncrt0.o : ncrt0.S
|
||||||
$(CC) -traditional -o $@ -c ncrt0.S
|
@echo "Assembling $< [large_data]"
|
||||||
|
@$(CC) -traditional -o $@ -c ncrt0.S
|
||||||
|
|
||||||
mainb32.o : stdlib_main.c
|
mainb32.o : stdlib_main.c
|
||||||
$(CC) -o mainb32.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -fbaserel32 -DSMALL_DATA32 -m68020-60 -DM68020 stdlib_main.c
|
@echo "Compiling $< [small_data32]"
|
||||||
|
@$(CC) -o mainb32.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -fbaserel32 -DSMALL_DATA32 -m68020-60 -DM68020 stdlib_main.c
|
||||||
|
|
||||||
mainb.o : stdlib_main.c
|
mainb.o : stdlib_main.c
|
||||||
$(CC) -o mainb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -fbaserel -DSMALL_DATA -m68000 stdlib_main.c
|
@echo "Compiling $< [small_data]"
|
||||||
|
@$(CC) -o mainb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -fbaserel -DSMALL_DATA -m68000 stdlib_main.c
|
||||||
|
|
||||||
mainnb.o : stdlib_main.c
|
mainnb.o : stdlib_main.c
|
||||||
$(CC) -o mainnb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -m68000 stdlib_main.c
|
@echo "Compiling $< [large_data]"
|
||||||
|
@$(CC) -o mainnb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -m68000 stdlib_main.c
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
CONSTRUCTOR_FILES = \
|
||||||
|
amiga_rexxvars.c \
|
||||||
|
dirent_closedir.c \
|
||||||
|
locale_init_exit.c \
|
||||||
|
math_init_exit.c \
|
||||||
|
socket_init_exit.c \
|
||||||
|
stdio_file_init.c \
|
||||||
|
stdio_init_exit.c \
|
||||||
|
stdlib_alloca.c \
|
||||||
|
stdlib_setenv.c \
|
||||||
|
stdlib_stackextension.c \
|
||||||
|
time_clock.c \
|
||||||
|
unistd_chdir_exit.c \
|
||||||
|
unistd_init_exit.c \
|
||||||
|
unistd_timer.c \
|
||||||
|
unistd_wildcard_expand.c \
|
||||||
|
usergroup_init_exit.c
|
||||||
|
|
||||||
|
touch_constructor_files:
|
||||||
|
touch $(CONSTRUCTOR_FILES)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: GNUmakefile.os4,v 1.19 2004-12-26 10:28:56 obarthel Exp $
|
# $Id: GNUmakefile.os4,v 1.41 2005-03-11 09:37:28 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -15,7 +15,7 @@ NET_INCLUDE = netinclude
|
|||||||
CC = ppc-amigaos-gcc
|
CC = ppc-amigaos-gcc
|
||||||
AR = ppc-amigaos-ar -q
|
AR = ppc-amigaos-ar -q
|
||||||
RANLIB = ppc-amigaos-ranlib
|
RANLIB = ppc-amigaos-ranlib
|
||||||
COPY = cp
|
COPY = cp -a
|
||||||
DELETE = rm -r
|
DELETE = rm -r
|
||||||
MAKEDIR = mkdir
|
MAKEDIR = mkdir
|
||||||
|
|
||||||
@@ -105,11 +105,13 @@ endif
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
WARNINGS = \
|
WARNINGS = \
|
||||||
-Wall -W -Wshadow -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
|
-Wall -W -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
|
||||||
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
|
-Wundef -Wbad-function-cast -Wmissing-declarations -Wunused
|
||||||
|
|
||||||
|
# -Wconversion -Wshadow
|
||||||
|
|
||||||
INCLUDES = -Iinclude -I. -I$(SDK_INCLUDE)
|
INCLUDES = -Iinclude -I. -I$(SDK_INCLUDE)
|
||||||
OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames
|
OPTIONS = -D__THREAD_SAFE -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames
|
||||||
OPTIMIZE = -O -fomit-frame-pointer -funroll-loops
|
OPTIMIZE = -O -fomit-frame-pointer -funroll-loops
|
||||||
#DEBUG = -g
|
#DEBUG = -g
|
||||||
|
|
||||||
@@ -132,27 +134,30 @@ C_LIB = \
|
|||||||
ctype_isspace.o \
|
ctype_isspace.o \
|
||||||
ctype_isupper.o \
|
ctype_isupper.o \
|
||||||
ctype_isxdigit.o \
|
ctype_isxdigit.o \
|
||||||
|
ctype_table.o \
|
||||||
ctype_tolower.o \
|
ctype_tolower.o \
|
||||||
ctype_toupper.o \
|
ctype_toupper.o \
|
||||||
ctype_table.o \
|
|
||||||
dirent_closedir.o \
|
dirent_closedir.o \
|
||||||
dirent_data.o \
|
|
||||||
dirent_rewinddir.o \
|
|
||||||
dirent_opendir.o \
|
dirent_opendir.o \
|
||||||
dirent_readdir.o \
|
dirent_readdir.o \
|
||||||
|
dirent_rewinddir.o \
|
||||||
errno_data.o \
|
errno_data.o \
|
||||||
fcntl_close.o \
|
fcntl_close.o \
|
||||||
fcntl_creat.o \
|
fcntl_creat.o \
|
||||||
fcntl_fcntl.o \
|
fcntl_fcntl.o \
|
||||||
|
fcntl_get_default_file.o \
|
||||||
|
fcntl_lock.o \
|
||||||
fcntl_lseek.o \
|
fcntl_lseek.o \
|
||||||
fcntl_open.o \
|
fcntl_open.o \
|
||||||
fcntl_read.o \
|
fcntl_read.o \
|
||||||
fcntl_write.o \
|
fcntl_write.o \
|
||||||
fcntl_get_default_file.o \
|
ftw_ftw.o \
|
||||||
|
ftw_nftw.o \
|
||||||
libgen_basename.o \
|
libgen_basename.o \
|
||||||
libgen_dirname.o \
|
libgen_dirname.o \
|
||||||
locale_init_exit.o \
|
locale_init_exit.o \
|
||||||
locale_localeconv.o \
|
locale_localeconv.o \
|
||||||
|
locale_open_locale.o \
|
||||||
locale_setlocale.o \
|
locale_setlocale.o \
|
||||||
mount_convertinfo.o \
|
mount_convertinfo.o \
|
||||||
mount_fstatfs.o \
|
mount_fstatfs.o \
|
||||||
@@ -170,7 +175,6 @@ C_LIB = \
|
|||||||
signal_sigsetmask.o \
|
signal_sigsetmask.o \
|
||||||
stat_chmod.o \
|
stat_chmod.o \
|
||||||
stat_convertfileinfo.o \
|
stat_convertfileinfo.o \
|
||||||
stat_data.o \
|
|
||||||
stat_fchmod.o \
|
stat_fchmod.o \
|
||||||
stat_fstat.o \
|
stat_fstat.o \
|
||||||
stat_lstat.o \
|
stat_lstat.o \
|
||||||
@@ -180,21 +184,22 @@ C_LIB = \
|
|||||||
stat_umask.o \
|
stat_umask.o \
|
||||||
stdio_asprintf.o \
|
stdio_asprintf.o \
|
||||||
stdio_clearerr.o \
|
stdio_clearerr.o \
|
||||||
stdio_data.o \
|
|
||||||
stdio_dropiobreadbuffer.o \
|
stdio_dropiobreadbuffer.o \
|
||||||
stdio_duplicate_fd.o \
|
stdio_duplicate_fd.o \
|
||||||
|
stdio_examine_fh.o \
|
||||||
stdio_fclose.o \
|
stdio_fclose.o \
|
||||||
stdio_fdhookentry.o \
|
stdio_fdhookentry.o \
|
||||||
stdio_feof.o \
|
stdio_feof.o \
|
||||||
stdio_ferror.o \
|
stdio_ferror.o \
|
||||||
stdio_fflush.o \
|
stdio_fflush.o \
|
||||||
stdio_flush.o \
|
|
||||||
stdio_fgetc.o \
|
stdio_fgetc.o \
|
||||||
stdio_fgetpos.o \
|
stdio_fgetpos.o \
|
||||||
stdio_fgets.o \
|
stdio_fgets.o \
|
||||||
stdio_filliobreadbuffer.o \
|
stdio_filliobreadbuffer.o \
|
||||||
stdio_findvacantfdentry.o \
|
stdio_findvacantfdentry.o \
|
||||||
stdio_findvacantiobentry.o \
|
stdio_findvacantiobentry.o \
|
||||||
|
stdio_flockfile.o \
|
||||||
|
stdio_flush.o \
|
||||||
stdio_flushiobwritebuffer.o \
|
stdio_flushiobwritebuffer.o \
|
||||||
stdio_fopen.o \
|
stdio_fopen.o \
|
||||||
stdio_fprintf.o \
|
stdio_fprintf.o \
|
||||||
@@ -206,27 +211,38 @@ C_LIB = \
|
|||||||
stdio_fseek.o \
|
stdio_fseek.o \
|
||||||
stdio_fsetpos.o \
|
stdio_fsetpos.o \
|
||||||
stdio_ftell.o \
|
stdio_ftell.o \
|
||||||
|
stdio_ftrylockfile.o \
|
||||||
|
stdio_funlockfile.o \
|
||||||
stdio_fwrite.o \
|
stdio_fwrite.o \
|
||||||
stdio_getc.o \
|
stdio_getc.o \
|
||||||
|
stdio_getc_unlocked.o \
|
||||||
stdio_getchar.o \
|
stdio_getchar.o \
|
||||||
stdio_get_file_descriptor.o \
|
stdio_getchar_unlocked.o \
|
||||||
stdio_gets.o \
|
stdio_gets.o \
|
||||||
|
stdio_get_file_descriptor.o \
|
||||||
stdio_growfdtable.o \
|
stdio_growfdtable.o \
|
||||||
stdio_growiobtable.o \
|
stdio_growiobtable.o \
|
||||||
|
stdio_grow_file.o \
|
||||||
stdio_initializefd.o \
|
stdio_initializefd.o \
|
||||||
stdio_initializeiob.o \
|
stdio_initializeiob.o \
|
||||||
stdio_init_exit.o \
|
stdio_init_exit.o \
|
||||||
|
stdio_file_init.o \
|
||||||
stdio_iobhookentry.o \
|
stdio_iobhookentry.o \
|
||||||
|
stdio_lock.o \
|
||||||
stdio_locksemaphorename.o \
|
stdio_locksemaphorename.o \
|
||||||
stdio_nostdio.o \
|
stdio_nostdio.o \
|
||||||
stdio_openiob.o \
|
stdio_openiob.o \
|
||||||
|
stdio_parent_of_fh.o \
|
||||||
stdio_perror.o \
|
stdio_perror.o \
|
||||||
stdio_popen.o \
|
stdio_popen.o \
|
||||||
stdio_printf.o \
|
stdio_printf.o \
|
||||||
stdio_putc.o \
|
stdio_putc.o \
|
||||||
|
stdio_putc_unlocked.o \
|
||||||
stdio_putchar.o \
|
stdio_putchar.o \
|
||||||
|
stdio_putchar_unlocked.o \
|
||||||
stdio_puts.o \
|
stdio_puts.o \
|
||||||
stdio_remove.o \
|
stdio_remove.o \
|
||||||
|
stdio_remove_fd_alias.o \
|
||||||
stdio_rename.o \
|
stdio_rename.o \
|
||||||
stdio_rewind.o \
|
stdio_rewind.o \
|
||||||
stdio_scanf.o \
|
stdio_scanf.o \
|
||||||
@@ -240,6 +256,7 @@ C_LIB = \
|
|||||||
stdio_tmpnam.o \
|
stdio_tmpnam.o \
|
||||||
stdio_translateioerror.o \
|
stdio_translateioerror.o \
|
||||||
stdio_ungetc.o \
|
stdio_ungetc.o \
|
||||||
|
stdio_unlockfile.o \
|
||||||
stdio_vasprintf.o \
|
stdio_vasprintf.o \
|
||||||
stdio_vasprintf_hook_entry.o \
|
stdio_vasprintf_hook_entry.o \
|
||||||
stdio_vfprintf.o \
|
stdio_vfprintf.o \
|
||||||
@@ -256,13 +273,12 @@ C_LIB = \
|
|||||||
stdlib_atexit.o \
|
stdlib_atexit.o \
|
||||||
stdlib_atoi.o \
|
stdlib_atoi.o \
|
||||||
stdlib_atol.o \
|
stdlib_atol.o \
|
||||||
|
stdlib_atoll.o \
|
||||||
stdlib_bsearch.o \
|
stdlib_bsearch.o \
|
||||||
stdlib_calloc.o \
|
stdlib_calloc.o \
|
||||||
stdlib_checkdetach.o \
|
stdlib_checkdetach.o \
|
||||||
stdlib_constructor.o \
|
stdlib_constructor.o \
|
||||||
stdlib_constructor_begin.o \
|
stdlib_constructor_begin.o \
|
||||||
stdlib_constructor_end.o \
|
|
||||||
stdlib_data.o \
|
|
||||||
stdlib_default_pool_size.o \
|
stdlib_default_pool_size.o \
|
||||||
stdlib_default_puddle_size.o \
|
stdlib_default_puddle_size.o \
|
||||||
stdlib_destructor.o \
|
stdlib_destructor.o \
|
||||||
@@ -277,6 +293,7 @@ C_LIB = \
|
|||||||
stdlib_getdefstacksize.o \
|
stdlib_getdefstacksize.o \
|
||||||
stdlib_getenv.o \
|
stdlib_getenv.o \
|
||||||
stdlib_getsp.o \
|
stdlib_getsp.o \
|
||||||
|
stdlib_get_errno.o \
|
||||||
stdlib_init_exit.o \
|
stdlib_init_exit.o \
|
||||||
stdlib_isresident.o \
|
stdlib_isresident.o \
|
||||||
stdlib_labs.o \
|
stdlib_labs.o \
|
||||||
@@ -297,10 +314,13 @@ C_LIB = \
|
|||||||
stdlib_putenv.o \
|
stdlib_putenv.o \
|
||||||
stdlib_qsort.o \
|
stdlib_qsort.o \
|
||||||
stdlib_rand.o \
|
stdlib_rand.o \
|
||||||
|
stdlib_rand_r.o \
|
||||||
stdlib_realloc.o \
|
stdlib_realloc.o \
|
||||||
stdlib_red_black.o \
|
stdlib_red_black.o \
|
||||||
|
stdlib_semaphore.o \
|
||||||
stdlib_setenv.o \
|
stdlib_setenv.o \
|
||||||
stdlib_setjmp.o \
|
stdlib_setjmp.o \
|
||||||
|
stdlib_set_errno.o \
|
||||||
stdlib_set_process_window.o \
|
stdlib_set_process_window.o \
|
||||||
stdlib_shell_escape.o \
|
stdlib_shell_escape.o \
|
||||||
stdlib_showerror.o \
|
stdlib_showerror.o \
|
||||||
@@ -312,10 +332,11 @@ C_LIB = \
|
|||||||
stdlib_stacksafezone.o \
|
stdlib_stacksafezone.o \
|
||||||
stdlib_stacksize.o \
|
stdlib_stacksize.o \
|
||||||
stdlib_stack_usage.o \
|
stdlib_stack_usage.o \
|
||||||
stdlib_startup.o \
|
stdlib_arg.o \
|
||||||
|
stdlib_stdio_window_spec.o \
|
||||||
stdlib_strtol.o \
|
stdlib_strtol.o \
|
||||||
stdlib_strtoul.o \
|
|
||||||
stdlib_strtoll.o \
|
stdlib_strtoll.o \
|
||||||
|
stdlib_strtoul.o \
|
||||||
stdlib_strtoull.o \
|
stdlib_strtoull.o \
|
||||||
stdlib_swapstack.o \
|
stdlib_swapstack.o \
|
||||||
stdlib_sysbase.o \
|
stdlib_sysbase.o \
|
||||||
@@ -327,7 +348,7 @@ C_LIB = \
|
|||||||
stdlib_umodsi3.o \
|
stdlib_umodsi3.o \
|
||||||
stdlib_unsetenv.o \
|
stdlib_unsetenv.o \
|
||||||
stdlib_wildcard_expand.o \
|
stdlib_wildcard_expand.o \
|
||||||
stdlib_stdio_window_spec.o \
|
strings_ffs.o \
|
||||||
strings_strcasecmp.o \
|
strings_strcasecmp.o \
|
||||||
strings_strncasecmp.o \
|
strings_strncasecmp.o \
|
||||||
string_bcmp.o \
|
string_bcmp.o \
|
||||||
@@ -365,9 +386,12 @@ C_LIB = \
|
|||||||
time_asctime_r.o \
|
time_asctime_r.o \
|
||||||
time_clock.o \
|
time_clock.o \
|
||||||
time_converttime.o \
|
time_converttime.o \
|
||||||
|
time_convert_datestamp.o \
|
||||||
|
time_convert_time.o \
|
||||||
time_ctime.o \
|
time_ctime.o \
|
||||||
time_ctime_r.o \
|
time_ctime_r.o \
|
||||||
time_data.o \
|
time_data.o \
|
||||||
|
time_days_per_date.o \
|
||||||
time_gettimeofday.o \
|
time_gettimeofday.o \
|
||||||
time_gmtime.o \
|
time_gmtime.o \
|
||||||
time_gmtime_r.o \
|
time_gmtime_r.o \
|
||||||
@@ -377,6 +401,7 @@ C_LIB = \
|
|||||||
time_numbertostring.o \
|
time_numbertostring.o \
|
||||||
time_strftime.o \
|
time_strftime.o \
|
||||||
time_time.o \
|
time_time.o \
|
||||||
|
time_weekday.o \
|
||||||
unistd_access.o \
|
unistd_access.o \
|
||||||
unistd_chdir.o \
|
unistd_chdir.o \
|
||||||
unistd_chdir_exit.o \
|
unistd_chdir_exit.o \
|
||||||
@@ -385,8 +410,10 @@ C_LIB = \
|
|||||||
unistd_dup.o \
|
unistd_dup.o \
|
||||||
unistd_dup2.o \
|
unistd_dup2.o \
|
||||||
unistd_fchown.o \
|
unistd_fchown.o \
|
||||||
|
unistd_fdatasync.o \
|
||||||
unistd_fdopen.o \
|
unistd_fdopen.o \
|
||||||
unistd_fileno.o \
|
unistd_fileno.o \
|
||||||
|
unistd_fsync.o \
|
||||||
unistd_ftruncate.o \
|
unistd_ftruncate.o \
|
||||||
unistd_getcwd.o \
|
unistd_getcwd.o \
|
||||||
unistd_getopt.o \
|
unistd_getopt.o \
|
||||||
@@ -399,18 +426,19 @@ C_LIB = \
|
|||||||
unistd_realpath.o \
|
unistd_realpath.o \
|
||||||
unistd_sleep.o \
|
unistd_sleep.o \
|
||||||
unistd_symlink.o \
|
unistd_symlink.o \
|
||||||
|
unistd_sync_fd.o \
|
||||||
unistd_timer.o \
|
unistd_timer.o \
|
||||||
unistd_time_delay.o \
|
unistd_time_delay.o \
|
||||||
unistd_truncate.o \
|
unistd_truncate.o \
|
||||||
unistd_unlink.o \
|
unistd_unlink.o \
|
||||||
unistd_usleep.o \
|
unistd_usleep.o \
|
||||||
utime_utime.o
|
utime_utime.o \
|
||||||
|
utsname_uname.o
|
||||||
|
|
||||||
# All objects files which make up libunix.a
|
# All objects files which make up libunix.a
|
||||||
UNIX_LIB = \
|
UNIX_LIB = \
|
||||||
unix.lib_rev.o \
|
unix.lib_rev.o \
|
||||||
dirent_closedir.o \
|
dirent_closedir.o \
|
||||||
dirent_data.o \
|
|
||||||
dirent_rewinddir.o \
|
dirent_rewinddir.o \
|
||||||
dirent_opendir.o \
|
dirent_opendir.o \
|
||||||
dirent_readdir.o \
|
dirent_readdir.o \
|
||||||
@@ -429,10 +457,12 @@ UNIX_LIB = \
|
|||||||
stdio_fdhookentry.o \
|
stdio_fdhookentry.o \
|
||||||
stdio_fflush.o \
|
stdio_fflush.o \
|
||||||
stdio_fopen.o \
|
stdio_fopen.o \
|
||||||
|
stdio_file_init.o \
|
||||||
stdio_init_exit.o \
|
stdio_init_exit.o \
|
||||||
stdio_locksemaphorename.o \
|
stdio_locksemaphorename.o \
|
||||||
stdio_openiob.o \
|
stdio_openiob.o \
|
||||||
stdio_popen.o \
|
stdio_popen.o \
|
||||||
|
stdio_record_locking.o \
|
||||||
stdio_remove.o \
|
stdio_remove.o \
|
||||||
stdio_rename.o \
|
stdio_rename.o \
|
||||||
stdlib_mkdtemp.o \
|
stdlib_mkdtemp.o \
|
||||||
@@ -469,12 +499,12 @@ MATH_LIB = \
|
|||||||
math_ceil.o \
|
math_ceil.o \
|
||||||
math_cos.o \
|
math_cos.o \
|
||||||
math_cosh.o \
|
math_cosh.o \
|
||||||
math_data.o \
|
|
||||||
math_exp.o \
|
math_exp.o \
|
||||||
math_fabs.o \
|
math_fabs.o \
|
||||||
math_floor.o \
|
math_floor.o \
|
||||||
math_fmod.o \
|
math_fmod.o \
|
||||||
math_frexp.o \
|
math_frexp.o \
|
||||||
|
math_huge_val.o \
|
||||||
math_hypot.o \
|
math_hypot.o \
|
||||||
math_init_exit.o \
|
math_init_exit.o \
|
||||||
math_isnan.o \
|
math_isnan.o \
|
||||||
@@ -524,7 +554,6 @@ NET_LIB = \
|
|||||||
socket_accept.o \
|
socket_accept.o \
|
||||||
socket_bind.o \
|
socket_bind.o \
|
||||||
socket_connect.o \
|
socket_connect.o \
|
||||||
socket_data.o \
|
|
||||||
socket_gethostbyaddr.o \
|
socket_gethostbyaddr.o \
|
||||||
socket_gethostbyname.o \
|
socket_gethostbyname.o \
|
||||||
socket_gethostid.o \
|
socket_gethostid.o \
|
||||||
@@ -591,7 +620,8 @@ NET_LIB = \
|
|||||||
usergroup_setregid.o \
|
usergroup_setregid.o \
|
||||||
usergroup_setreuid.o \
|
usergroup_setreuid.o \
|
||||||
usergroup_setsid.o \
|
usergroup_setsid.o \
|
||||||
usergroup_setuid.o
|
usergroup_setuid.o \
|
||||||
|
utsname_uname.o
|
||||||
|
|
||||||
# All objects files which make up libdebug.a
|
# All objects files which make up libdebug.a
|
||||||
DEBUG_LIB = \
|
DEBUG_LIB = \
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 185
|
#define REVISION 189
|
||||||
#define DATE "2.1.2005"
|
#define DATE "5.3.2005"
|
||||||
#define VERS "amiga.lib 1.185"
|
#define VERS "amiga.lib 1.189"
|
||||||
#define VSTRING "amiga.lib 1.185 (2.1.2005)\r\n"
|
#define VSTRING "amiga.lib 1.189 (5.3.2005)\r\n"
|
||||||
#define VERSTAG "\0$VER: amiga.lib 1.185 (2.1.2005)"
|
#define VERSTAG "\0$VER: amiga.lib 1.189 (5.3.2005)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
185
|
189
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_addtof.c,v 1.2 2005-01-02 09:07:06 obarthel Exp $
|
* $Id: amiga_addtof.c,v 1.3 2005-02-25 10:14:20 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -57,7 +57,7 @@ typedef LONG (* CFUNC)(APTR arg);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
static LONG INTERRUPT ASM
|
STATIC LONG INTERRUPT ASM
|
||||||
call_routine(REG(a1,struct Isrvstr *i))
|
call_routine(REG(a1,struct Isrvstr *i))
|
||||||
{
|
{
|
||||||
CFUNC p = (CFUNC)i->ccode;
|
CFUNC p = (CFUNC)i->ccode;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_dotimer.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: amiga_dotimer.c,v 1.3 2005-03-06 09:00:16 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -58,18 +58,37 @@ DoTimer(struct timeval *tv,LONG unit,LONG command)
|
|||||||
|
|
||||||
assert( tv != NULL );
|
assert( tv != NULL );
|
||||||
|
|
||||||
mp = AllocVec(sizeof(*mp),MEMF_ANY|MEMF_PUBLIC|MEMF_CLEAR);
|
#if defined(__amigaos4__)
|
||||||
if(mp == NULL)
|
|
||||||
{
|
{
|
||||||
error = IOERR_OPENFAIL;
|
mp = AllocSysObjectTags(ASOT_PORT,
|
||||||
goto out;
|
ASOPORT_Action, PA_SIGNAL,
|
||||||
}
|
ASOPORT_Signal, SIGB_SINGLE,
|
||||||
|
ASOPORT_Target, FindTask(NULL),
|
||||||
|
TAG_DONE);
|
||||||
|
|
||||||
mp->mp_Node.ln_Type = NT_MSGPORT;
|
if(mp == NULL)
|
||||||
mp->mp_Flags = PA_SIGNAL;
|
{
|
||||||
mp->mp_SigBit = SIGB_SINGLE;
|
error = IOERR_OPENFAIL;
|
||||||
mp->mp_SigTask = FindTask(NULL);
|
goto out;
|
||||||
NewList(&mp->mp_MsgList);
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
mp = AllocVec(sizeof(*mp),MEMF_ANY|MEMF_PUBLIC|MEMF_CLEAR);
|
||||||
|
if(mp == NULL)
|
||||||
|
{
|
||||||
|
error = IOERR_OPENFAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp->mp_Node.ln_Type = NT_MSGPORT;
|
||||||
|
mp->mp_Flags = PA_SIGNAL;
|
||||||
|
mp->mp_SigBit = SIGB_SINGLE;
|
||||||
|
mp->mp_SigTask = FindTask(NULL);
|
||||||
|
|
||||||
|
NewList(&mp->mp_MsgList);
|
||||||
|
}
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
tr = (struct timerequest *)CreateIORequest(mp,sizeof(*tr));
|
tr = (struct timerequest *)CreateIORequest(mp,sizeof(*tr));
|
||||||
if(tr == NULL)
|
if(tr == NULL)
|
||||||
@@ -107,7 +126,16 @@ DoTimer(struct timeval *tv,LONG unit,LONG command)
|
|||||||
DeleteIORequest((struct IORequest *)tr);
|
DeleteIORequest((struct IORequest *)tr);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreeVec(mp);
|
#if defined(__amigaos4__)
|
||||||
|
{
|
||||||
|
if(mp != NULL)
|
||||||
|
FreeSysObject(ASOT_PORT,mp);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
FreeVec(mp);
|
||||||
|
}
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_invertstring.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: amiga_invertstring.c,v 1.3 2005-02-25 10:14:20 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
static int
|
STATIC int
|
||||||
do_escape(int cc)
|
do_escape(int cc)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
@@ -91,7 +91,7 @@ do_escape(int cc)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
static ULONG
|
STATIC ULONG
|
||||||
do_angle(STRPTR * strp, struct InputEvent *ie)
|
do_angle(STRPTR * strp, struct InputEvent *ie)
|
||||||
{
|
{
|
||||||
ULONG result;
|
ULONG result;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_rexxvars.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: amiga_rexxvars.c,v 1.3 2005-01-09 10:10:40 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -50,12 +50,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
STATIC struct Library * RexxSysBase;
|
static struct Library * RexxSysBase;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
#if defined(__amigaos4__)
|
||||||
STATIC struct RexxSysIFace * IRexxSys;
|
static struct RexxSysIFace * IRexxSys;
|
||||||
#endif /* __amigaos4__ */
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@@ -144,7 +144,7 @@ CheckRexxMsg(struct RexxMsg *message)
|
|||||||
LONG
|
LONG
|
||||||
GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer)
|
GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer)
|
||||||
{
|
{
|
||||||
STATIC TEXT buffer[256];
|
static UBYTE buffer[256];
|
||||||
LONG result;
|
LONG result;
|
||||||
|
|
||||||
/* The following uses a function which was added to rexxsyslib.library V45.
|
/* The following uses a function which was added to rexxsyslib.library V45.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_setsuperattrs.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: amiga_setsuperattrs.c,v 1.4 2005-02-25 10:14:20 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 185
|
#define REVISION 189
|
||||||
#define DATE "2.1.2005"
|
#define DATE "5.3.2005"
|
||||||
#define VERS "c.lib 1.185"
|
#define VERS "c.lib 1.189"
|
||||||
#define VSTRING "c.lib 1.185 (2.1.2005)\r\n"
|
#define VSTRING "c.lib 1.189 (5.3.2005)\r\n"
|
||||||
#define VERSTAG "\0$VER: c.lib 1.185 (2.1.2005)"
|
#define VERSTAG "\0$VER: c.lib 1.189 (5.3.2005)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
185
|
189
|
||||||
|
|||||||
326
library/changes
326
library/changes
@@ -1,3 +1,329 @@
|
|||||||
|
- DoTimer() now calls AllocSysObject() rather than making up
|
||||||
|
a MsgPort locally.
|
||||||
|
|
||||||
|
- The record locking semaphore code now builds a semaphore to add
|
||||||
|
before it tries to find the public one in memory. That way, the
|
||||||
|
code can spend less time in Forbid() state and, heaven forbid,
|
||||||
|
refrain from allocating memory while in that state.
|
||||||
|
|
||||||
|
- Split the general stdio initialization/cleanup code from the
|
||||||
|
initialization of the stdin/stdout/stderr streams.
|
||||||
|
|
||||||
|
- Moved the Workbench console stream initialization into the
|
||||||
|
initialization code for the stdin/stdout/stderr streams and
|
||||||
|
out of the program parameter setup.
|
||||||
|
|
||||||
|
- The current program name is now set up in the stdlib
|
||||||
|
initialization function.
|
||||||
|
|
||||||
|
- Simplified the machine test code; moved the FPU check into
|
||||||
|
the math initialization code.
|
||||||
|
|
||||||
|
- Added more safety checks to verify that file descriptor
|
||||||
|
file handles are valid.
|
||||||
|
|
||||||
|
- Made the file descriptor checks in the fsync() and fdatasync()
|
||||||
|
functions more robust.
|
||||||
|
|
||||||
|
- Cleaned up the 68k build makefile, so that the CPU and FPU
|
||||||
|
tests and the error message display can run safely even
|
||||||
|
on plain 68000 machines. This won't work for the 32 bit small
|
||||||
|
data model, which implies 68020 code, but so there...
|
||||||
|
|
||||||
|
- Moved the CPU/FPU type tests into the respective linker
|
||||||
|
libraries.
|
||||||
|
|
||||||
|
- Moved the data declarations out of math_data.c, stat_data.c,
|
||||||
|
socket_data.c, dirent_data.c and stdio_data.c and into the
|
||||||
|
code that initializes them.
|
||||||
|
|
||||||
|
- Moved a few __delete_semaphore() calls into conditional compilation
|
||||||
|
sections where they should have been in the first place.
|
||||||
|
|
||||||
|
- Thanks to Jörg Strohmayer, the GCC library build now manages to
|
||||||
|
invoke the library's constructor/destructor functions in a
|
||||||
|
very particular order. That way, you can use constructor/destructor
|
||||||
|
functions in your own code and not have them clash with the library's
|
||||||
|
own functions.
|
||||||
|
|
||||||
|
- Reimplemented the constructor/destructor invocation code for GCC.
|
||||||
|
Both the 68k and PowerPC platform now invoke them in the same order
|
||||||
|
and the 68k code uses the designated invocation priorities. The
|
||||||
|
PowerPC destructor function now sets up the exit() jmp_buf before
|
||||||
|
the destructor functions are called.
|
||||||
|
|
||||||
|
- Added S_IREAD, S_IWRITE and S_IEXEC aliases to <sys/stat.h>.
|
||||||
|
|
||||||
|
- Moved data out of stdlib_data.c and into the code that references
|
||||||
|
or initializes it.
|
||||||
|
|
||||||
|
- The stdlib constructor now performs the CPU/FPU compatibility test.
|
||||||
|
|
||||||
|
- Introduced new constructor types and changed the overall priority
|
||||||
|
order.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.189 (5.3.2005)
|
||||||
|
|
||||||
|
- Rewrote the __translate_unix_to_amiga_path_name() function to
|
||||||
|
translate patterns such as "foo/bar/../../baz" properly, and to
|
||||||
|
use strlen() a lot less.
|
||||||
|
|
||||||
|
- Major, major changes! Moved most of the monolithic code out of
|
||||||
|
the file descriptor hook and into the respective functions,
|
||||||
|
such as dup2(), fchmod(), fchown(), fcntl(), fdatasync(), fstatfs(),
|
||||||
|
fsync(), ftruncate() and lseek(). Code which is not strictly
|
||||||
|
required will no longer find its way into your programs if you
|
||||||
|
link with the updated library.
|
||||||
|
|
||||||
|
NOTE: these changes require that the entire library is rebuilt!
|
||||||
|
|
||||||
|
- The buffered and unbuffered file hook code is now invoked through
|
||||||
|
function pointers alone. The utility.library/CallHookPkt mechanism
|
||||||
|
is no longer required.
|
||||||
|
|
||||||
|
- Moved the entire lseek() code relevant for files into the hook
|
||||||
|
function.
|
||||||
|
|
||||||
|
- Simplified the close() function which now just calls into the
|
||||||
|
hook code to perform whatever is necessary. The hook code is
|
||||||
|
responsible for cleaning up after aliases, etc. This change in
|
||||||
|
turn made it possible to greatly simplify the hook code for
|
||||||
|
buffered files which now bypasses close/read/write/lseek and
|
||||||
|
directly invokes the hook code for unbuffered files.
|
||||||
|
|
||||||
|
- Added various floating point constants to <math.h>, courtesy
|
||||||
|
of Henning Nielsen Lund. Thank you very much!
|
||||||
|
|
||||||
|
- When using the wildcard expansion code for command line
|
||||||
|
parameters (which is by default linked in with libunix.a),
|
||||||
|
regular expressions can no longer prompt dos.library requesters
|
||||||
|
to appear. However, to be on the safe side, if you are expecting
|
||||||
|
to pass regular expressions on the command line, do not use
|
||||||
|
the wildcard expansion code such as by overriding the library
|
||||||
|
symbols with dummy functions such as are used in the file
|
||||||
|
"stdlib_wildcard_expand.c".
|
||||||
|
|
||||||
|
- Added a new variable '__open_locale' which can be used to
|
||||||
|
restrict all library functions to use the "C" language locale
|
||||||
|
rather than the current system locale settings. In addition
|
||||||
|
to that, two new functions __locale_exit() and __locale_init()
|
||||||
|
can be used to close and (re-)open the system locale at a
|
||||||
|
later time.
|
||||||
|
|
||||||
|
- Local ("static") functions are now identified by the STATIC
|
||||||
|
qualifier. This was done in preparation for changes that will
|
||||||
|
deal with global and local data and the issue of thread safety.
|
||||||
|
|
||||||
|
- Added stdio thread locking functions flockfile(), funlockfile(),
|
||||||
|
and ftrylockfile().
|
||||||
|
|
||||||
|
- Modified the internal FILE structure to allow for thread locking.
|
||||||
|
Note that this again requires that the library is rebuilt!
|
||||||
|
|
||||||
|
- Added or modified macros for getc_unlocked(), getchar_unlocked(),
|
||||||
|
putc_unlocked() and putchar_unlocked().
|
||||||
|
|
||||||
|
- Added rand_r().
|
||||||
|
|
||||||
|
- Added flockfile()/funlockfile() wrappers around all stdio
|
||||||
|
functions.
|
||||||
|
|
||||||
|
- Added more semaphore locking around the basic stdio, memory, locale
|
||||||
|
and dirent data operations. That should do it! While the library is
|
||||||
|
not reentrant (this is not ixemul.library) it should be thread-safe
|
||||||
|
now. Thread-safe in the sense of POSIX 1003.1c-1995.
|
||||||
|
|
||||||
|
- The thread-safety code is now subject to conditional compilation.
|
||||||
|
Both the library and the user code need to be rebuilt with the
|
||||||
|
preprocessor symbol __THREAD_SAFE defined to get thread-safe
|
||||||
|
code.
|
||||||
|
|
||||||
|
- Extended the thread-safety locking to the file descriptors.
|
||||||
|
|
||||||
|
NOTE: these changes require that the entire library is rebuilt!
|
||||||
|
|
||||||
|
- The translation of Unix to Amiga path names now silently accepts
|
||||||
|
absolute Amiga path names passed to it and will use them without
|
||||||
|
changing them.
|
||||||
|
|
||||||
|
- Added atoll(), ffs(), ftw(), nftw(), lstat() and uname() code
|
||||||
|
contributed by Peter Bengtsson. Thank you very much!
|
||||||
|
|
||||||
|
- Reworked the code that handles quoting for the wildcard expansion
|
||||||
|
routine. We no longer allocate memory and then modify it, but
|
||||||
|
call a function for each quoted parameter which does whatever is
|
||||||
|
necessary.
|
||||||
|
|
||||||
|
- The shell command parameter parser now considers the non-breaking
|
||||||
|
space character (ISO code 160) to be a blank space character, too.
|
||||||
|
|
||||||
|
- Moved the signal semaphore allocation/initialization/deallocation
|
||||||
|
into a dedicated module. This also has the advantage that it's
|
||||||
|
harder to break code by accidentally forgetting to call
|
||||||
|
InitSemaphore() after having allocated the memory for it.
|
||||||
|
|
||||||
|
- Rewrote the code that allocates the file descriptor and file
|
||||||
|
buffer tables so that all the memory allocations are in one
|
||||||
|
place and it's possible to specify exactly how many table
|
||||||
|
entries are required at a time.
|
||||||
|
|
||||||
|
- Creation and initialization of semaphores now uses the AmigaOS4
|
||||||
|
specific functions for this purpose, if available.
|
||||||
|
|
||||||
|
- In the thread-safe variant, the library now tries to allow
|
||||||
|
multiple concurrent callers to use the socket functions. Note
|
||||||
|
that this works only with the Roadshow TCP/IP stack, and the
|
||||||
|
results with other TCP/IP stacks are rather unpredictable.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.188 (7.2.2005)
|
||||||
|
|
||||||
|
- Folded duplicate code in "stdio_init_exit.c" into a common function.
|
||||||
|
|
||||||
|
- Simplified the code in "time_asctime_r.c" which builds the time
|
||||||
|
string. It gracefully handles buffer sizes which are too short
|
||||||
|
by returning an empty string.
|
||||||
|
|
||||||
|
- Moved the "tm->tm_wday" initialization out of the hook function
|
||||||
|
in "time_strftime.c" since it was to be called only once anyway.
|
||||||
|
|
||||||
|
- Lost a few compiler warnings in "unistd_time_delay.c" and
|
||||||
|
"time_gettimeofday.c".
|
||||||
|
|
||||||
|
- Folded duplicate code in "time_mktime.c"; also, errno is no longer
|
||||||
|
modified unless the library is built with the "CHECK_FOR_NULL_POINTERS"
|
||||||
|
option.
|
||||||
|
|
||||||
|
- We now allocate the AnchorPath used in the unistd_wildcard_expand.c
|
||||||
|
code. Also, the contents of the AnchorPath structure are no longer
|
||||||
|
modified between calls. MatchEnd() has to be sufficient.
|
||||||
|
|
||||||
|
- Moved redundant code out of the readdir()/opendir()/closedir()
|
||||||
|
functions which is not required unless the code is built for
|
||||||
|
Unix compatibility mode.
|
||||||
|
|
||||||
|
- Lost the __not_a_number and __infinity variables, including the
|
||||||
|
code which initialized them.
|
||||||
|
|
||||||
|
- Reading/changing the errno variable is no longer done directly, but
|
||||||
|
involves accessor functions.
|
||||||
|
|
||||||
|
- References to the HUGE_VAL quantity now involve an accessor function, too.
|
||||||
|
|
||||||
|
- Changed the manner in which the __huge_val constant is initialized by
|
||||||
|
the __math_init() function. The new approach should be more portable.
|
||||||
|
|
||||||
|
- The library no longer sends ACTION_DISK_INFO packets to the console
|
||||||
|
handler. The side-effects were too varied and irritating after all.
|
||||||
|
|
||||||
|
- Added the fsync() and fdatasync() functions and the <stdint.h> and
|
||||||
|
<inttypes.h> header files contributed by Peter Bengtsson. Thank
|
||||||
|
you very much!
|
||||||
|
|
||||||
|
- Tweaked the build makefiles to produce fewer meaningless warnings.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.187 (29.1.2005)
|
||||||
|
|
||||||
|
- The default console output window opened when a program is launched
|
||||||
|
from Workbench would open and stay open. This was not intended to
|
||||||
|
happen and is a side-effect of the new stdio initialization code which
|
||||||
|
checks if the stdio streams are in non-blocking mode. Fixed.
|
||||||
|
|
||||||
|
- Moved the common DateStamp to time_t conversion code into a shared
|
||||||
|
function.
|
||||||
|
|
||||||
|
- The fall-back function for converting time into a string in strftime()
|
||||||
|
now calls itself for the "%c", "%x" and "%X" format specifiers.
|
||||||
|
|
||||||
|
- mktime() is supposed to convert the time specification, given as local
|
||||||
|
time, into the number of seconds since January 1st, 1970, relative to
|
||||||
|
UTC. This didn't really work up until now since the time value returned
|
||||||
|
was given as local time.
|
||||||
|
|
||||||
|
- Plugged in a different algorithm for calculating the day of the week in
|
||||||
|
strftime() and asctime_r(). This one isn't sensitive to the effects of
|
||||||
|
adding/subtracting the local time zone.
|
||||||
|
|
||||||
|
- Changed the algorithm that calculates the number of days that have passed
|
||||||
|
so far as used by the the __convert_time() function and the conversion
|
||||||
|
code in strftime().
|
||||||
|
|
||||||
|
- Also changed the algorithm used by strftime() to produce the week numbers
|
||||||
|
(the '%U' and '%W' format specifiers). The new method is much simpler
|
||||||
|
than the old one.
|
||||||
|
|
||||||
|
- Made the code that converts a 'time_t' value into the 'struct DateStamp',
|
||||||
|
as used by strftime() and utime(), into its own function. This also
|
||||||
|
fixes a bug in the code strftime() would use which was completely
|
||||||
|
unaware of the local time zone settings.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.186 (14.1.2005)
|
||||||
|
|
||||||
|
- Redirecting stderr to a file no longer has the effect of showing error
|
||||||
|
messages and assertion failure notifications as requesters. The exception
|
||||||
|
is in redirecting stderr to NIL: which will prompt the requester use.
|
||||||
|
|
||||||
|
- gettimeofday() now calls GetSysTime() rather than DateStamp() to obtain
|
||||||
|
the current system time. This resolves granularity issues since the
|
||||||
|
DateStamp() result was only accurate by 1/50 of a second.
|
||||||
|
|
||||||
|
- The "ptrdiff_t" definition in <stddef.h> now defaults to type 'int' rather
|
||||||
|
than 'long int'.
|
||||||
|
|
||||||
|
- The "char" limits in <limits.h> are now set up according to the current
|
||||||
|
compiler settings, which can either default to an unsigned or
|
||||||
|
signed definition.
|
||||||
|
|
||||||
|
- Changed the rules again for the use of stderr/stdout redirection when
|
||||||
|
printing error messages. It is always safe to redirect them now and
|
||||||
|
no requester will appear unless you specifically set the value of the
|
||||||
|
"__no_standard_io" variable to TRUE in your program.
|
||||||
|
|
||||||
|
- Removed a misplaced IsInteractive() from the stdio initialization
|
||||||
|
function. Now this could have been big trouble...
|
||||||
|
|
||||||
|
- Removed tests for FileHandle->fh_Type != NULL which used to precede
|
||||||
|
all IsInterative() tests. I verified that IsInteractive() will always
|
||||||
|
return FALSE for NIL: type file handles.
|
||||||
|
|
||||||
|
- Dropped the special flag variable used by the abort() function that
|
||||||
|
tracks whether or not console output is possible. We now use the
|
||||||
|
global "__no_standard_io" instead.
|
||||||
|
|
||||||
|
- Made the <ctype.h> macros more robust.
|
||||||
|
|
||||||
|
- Removed the "NIL:" file handle tests preceding the Open("CONSOLE:",..)
|
||||||
|
calls. As of Kickstart 2.x and beyond these are no longer a source of
|
||||||
|
trouble.
|
||||||
|
|
||||||
|
- The V37/V40 compatibility code is no longer built for the AmigaOS4
|
||||||
|
version of the library.
|
||||||
|
|
||||||
|
- Switched over the last use of DeviceProc() to GetDeviceProc(), etc.
|
||||||
|
|
||||||
|
- open() no longer examines a file after opening it in order to figure
|
||||||
|
out whether read/write accesses are permitted. This decision is now
|
||||||
|
for the file system to make.
|
||||||
|
|
||||||
|
- Whether or not stdio console streams are blocking or non-blocking
|
||||||
|
is now determined at initialization time. The I/O mode is restored before
|
||||||
|
the program exits. Previously, any changes to the I/O mode would persist.
|
||||||
|
|
||||||
|
- Lost some more code that is not required for AmigaOS 4.x and can be
|
||||||
|
handled conveniently through conditional compilation.
|
||||||
|
|
||||||
|
- close() did not reset the non-blocking file property, as it should
|
||||||
|
have. This only worked for files which were closed anyway, but not
|
||||||
|
for the stdio streams. Fixed.
|
||||||
|
|
||||||
|
- Added a missing definition to stdio_init_exit.c which is part of
|
||||||
|
the OS4 header files, but not of the older header file distributions.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
c.lib 1.185 (2.1.2005)
|
c.lib 1.185 (2.1.2005)
|
||||||
|
|
||||||
- Moved the environment variable cleanup code into a destructor function.
|
- Moved the environment variable cleanup code into a destructor function.
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: crtbegin.c,v 1.3 2004-09-29 16:54:54 obarthel Exp $
|
* $Id: crtbegin.c,v 1.8 2005-03-10 13:30:11 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
* Handles global constructors and destructors.
|
* Handles global constructors and destructors for the OS4 GCC build.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#include <exec/types.h>
|
#include <exec/types.h>
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@@ -15,118 +19,28 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dummy constructor and destructor array. The linker script will put these at the
|
* 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
|
* 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
|
* 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
|
* code can find the global constructor/destructor pointers
|
||||||
*/
|
*/
|
||||||
static void (*__CTOR_LIST__[1]) (void) __attribute__((section(".ctors"))) = { (void *)-1 };
|
static void (*__CTOR_LIST__[1]) (void) __attribute__(( used, section(".ctors"), aligned(sizeof(void (*)(void))) ));
|
||||||
static void (*__DTOR_LIST__[1]) (void) __attribute__((section(".dtors"))) = { (void *)-1 };
|
static void (*__DTOR_LIST__[1]) (void) __attribute__(( used, section(".dtors"), aligned(sizeof(void (*)(void))) ));
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
_do_ctors(void)
|
|
||||||
{
|
|
||||||
void (**pFuncPtr)(void);
|
|
||||||
|
|
||||||
/* Skip the first entry in the list (it's -1 anyway) */
|
|
||||||
pFuncPtr = __CTOR_LIST__ + 1;
|
|
||||||
|
|
||||||
/* Call all constructors in forward order */
|
|
||||||
while (*pFuncPtr != NULL)
|
|
||||||
(**pFuncPtr++)();
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
_do_dtors(void)
|
|
||||||
{
|
|
||||||
ULONG i = (ULONG)__DTOR_LIST__[0];
|
|
||||||
void (**pFuncPtr)(void);
|
|
||||||
|
|
||||||
if (i == ~0UL)
|
|
||||||
{
|
|
||||||
/* Find the end of the destructors list */
|
|
||||||
i = 1;
|
|
||||||
|
|
||||||
while (__DTOR_LIST__[i] != NULL)
|
|
||||||
i++;
|
|
||||||
|
|
||||||
/* We're at the NULL entry now. Go back by one */
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Call all destructors in reverse order */
|
|
||||||
pFuncPtr = __DTOR_LIST__ + i;
|
|
||||||
while (i-- > 0)
|
|
||||||
(**pFuncPtr--)();
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
typedef void (*func_ptr)(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
_do_ctors(void)
|
|
||||||
{
|
|
||||||
extern func_ptr __CTOR_LIST__[];
|
|
||||||
ULONG nptrs = (ULONG)__CTOR_LIST__[0];
|
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
for(i = nptrs ; i > 0 ; i--)
|
|
||||||
__CTOR_LIST__[i]();
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
_do_dtors(void)
|
|
||||||
{
|
|
||||||
extern func_ptr __DTOR_LIST__[];
|
|
||||||
extern jmp_buf __exit_jmp_buf;
|
|
||||||
ULONG nptrs = (ULONG)__DTOR_LIST__[0];
|
|
||||||
static ULONG i;
|
|
||||||
|
|
||||||
/* If one of the destructors drops into
|
|
||||||
* exit(), processing will continue with
|
|
||||||
* the next following destructor.
|
|
||||||
*/
|
|
||||||
(void)setjmp(__exit_jmp_buf);
|
|
||||||
|
|
||||||
while(i++ < nptrs)
|
|
||||||
__DTOR_LIST__[i]();
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#endif /*__amigaos4__ */
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* FIXME: Do we need to put these in .init/.fini sections? */
|
|
||||||
|
|
||||||
//void _init(void) __attribute__((section(".init")));
|
|
||||||
//void _fini(void) __attribute__((section(".fini")));
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
void
|
||||||
_init(void)
|
_init(void)
|
||||||
{
|
{
|
||||||
_do_ctors();
|
int num_ctors,i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for(i = 1, num_ctors = 0 ; __CTOR_LIST__[i] != NULL ; i++)
|
||||||
|
num_ctors++;
|
||||||
|
|
||||||
|
for(j = 0 ; j < num_ctors ; j++)
|
||||||
|
__CTOR_LIST__[num_ctors - j]();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@@ -134,5 +48,23 @@ _init(void)
|
|||||||
void
|
void
|
||||||
_fini(void)
|
_fini(void)
|
||||||
{
|
{
|
||||||
_do_dtors();
|
extern jmp_buf __exit_jmp_buf;
|
||||||
|
|
||||||
|
int num_dtors,i;
|
||||||
|
static int j;
|
||||||
|
|
||||||
|
/* If one of the destructors drops into
|
||||||
|
exit(), processing will continue with
|
||||||
|
the next following destructor. */
|
||||||
|
(void)setjmp(__exit_jmp_buf);
|
||||||
|
|
||||||
|
for(i = 1, num_dtors = 0 ; __DTOR_LIST__[i] != NULL ; i++)
|
||||||
|
num_dtors++;
|
||||||
|
|
||||||
|
while(j++ < num_dtors)
|
||||||
|
__DTOR_LIST__[j]();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /*__amigaos4__ */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: crtend.c,v 1.1.1.1 2004-07-26 16:30:22 obarthel Exp $
|
* $Id: crtend.c,v 1.2 2005-03-09 21:07:25 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -10,9 +10,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
static volatile void (*__CTOR_LIST__[1]) (void) __attribute__((used,section(".ctors"))) = { (void *)0 };
|
static void (*__CTOR_LIST__[1]) (void) __attribute__((used, section(".ctors"), aligned(sizeof(void (*)(void))) ));
|
||||||
static volatile void (*__DTOR_LIST__[1]) (void) __attribute__((used,section(".dtors"))) = { (void *)0 };
|
static void (*__DTOR_LIST__[1]) (void) __attribute__((used, section(".dtors"), aligned(sizeof(void (*)(void))) ));
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /*__amigaos4__ */
|
#endif /*__amigaos4__ */
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_isalnum.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_isalnum.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -49,6 +49,8 @@ isalnum(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -60,5 +62,7 @@ isalnum(int c)
|
|||||||
result = isalpha(c) || isdigit(c);
|
result = isalpha(c) || isdigit(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_isalpha.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_isalpha.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ isalpha(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -59,5 +61,7 @@ isalpha(int c)
|
|||||||
('A' <= c && c <= 'Z'));
|
('A' <= c && c <= 'Z'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_iscntrl.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_iscntrl.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ iscntrl(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -58,5 +60,7 @@ iscntrl(int c)
|
|||||||
result = (('\0' <= c && c < ' ') || (c == 127));
|
result = (('\0' <= c && c < ' ') || (c == 127));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_isdigit.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_isdigit.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ isdigit(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -58,5 +60,7 @@ isdigit(int c)
|
|||||||
result = ('0' <= c && c <= '9');
|
result = ('0' <= c && c <= '9');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_isgraph.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_isgraph.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ isgraph(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -58,5 +60,7 @@ isgraph(int c)
|
|||||||
result = (' ' < c && c < 127);
|
result = (' ' < c && c < 127);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_islower.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_islower.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ islower(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -58,5 +60,7 @@ islower(int c)
|
|||||||
result = ('a' <= c && c <= 'z');
|
result = ('a' <= c && c <= 'z');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_isprint.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_isprint.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ isprint(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -58,5 +60,7 @@ isprint(int c)
|
|||||||
result = (' ' <= c && c <= '~');
|
result = (' ' <= c && c <= '~');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_ispunct.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_ispunct.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ ispunct(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -61,5 +63,7 @@ ispunct(int c)
|
|||||||
('{' <= c && c <= '~'));
|
('{' <= c && c <= '~'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_isspace.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_isspace.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ isspace(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -63,5 +65,7 @@ isspace(int c)
|
|||||||
c == ' ');
|
c == ' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_isupper.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_isupper.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ isupper(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -58,5 +60,7 @@ isupper(int c)
|
|||||||
result = ('A' <= c && c <= 'Z');
|
result = ('A' <= c && c <= 'Z');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_isxdigit.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_isxdigit.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,8 @@ isxdigit(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -60,5 +62,7 @@ isxdigit(int c)
|
|||||||
('A' <= c && c <= 'F'));
|
('A' <= c && c <= 'F'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_table.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_table.c,v 1.3 2005-01-09 15:20:31 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -36,22 +36,8 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* The construction of this table is rather peculiar. The assumption is that
|
const unsigned char __ctype_table[2 * 128] =
|
||||||
the table index from which a flag value could be fetched is in the range
|
|
||||||
-128..255 since the character to be tested could be a signed or unsigned
|
|
||||||
8 bit value. The table access pointer (declared below) therefore points
|
|
||||||
to the 128th byte of '__ctype_data[]'. */
|
|
||||||
static const unsigned char __ctype_data[3 * 128] =
|
|
||||||
{
|
{
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
/* 0 */ __CTYPE_CONTROL,
|
/* 0 */ __CTYPE_CONTROL,
|
||||||
/* 1 */ __CTYPE_CONTROL,
|
/* 1 */ __CTYPE_CONTROL,
|
||||||
/* 2 */ __CTYPE_CONTROL,
|
/* 2 */ __CTYPE_CONTROL,
|
||||||
@@ -190,7 +176,3 @@ static const unsigned char __ctype_data[3 * 128] =
|
|||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
const unsigned char * const __ctype_table = &__ctype_data[128];
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_tolower.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_tolower.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -43,6 +43,8 @@ tolower(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -54,5 +56,7 @@ tolower(int c)
|
|||||||
result = ('A' <= c && c <= 'Z') ? (c + ('a' - 'A')) : c;
|
result = ('A' <= c && c <= 'Z') ? (c + ('a' - 'A')) : c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype_toupper.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: ctype_toupper.c,v 1.3 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -43,6 +43,8 @@ toupper(int c)
|
|||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__locale_table[LC_CTYPE] != NULL)
|
if(__locale_table[LC_CTYPE] != NULL)
|
||||||
{
|
{
|
||||||
assert( LocaleBase != NULL );
|
assert( LocaleBase != NULL );
|
||||||
@@ -54,5 +56,7 @@ toupper(int c)
|
|||||||
result = ('a' <= c && c <= 'z') ? (c - ('a' - 'A')) : c;
|
result = ('a' <= c && c <= 'z') ? (c - ('a' - 'A')) : c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: debug.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: debug.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=8
|
* :ts=8
|
||||||
*
|
*
|
||||||
@@ -133,7 +133,7 @@ _POPDEBUGLEVEL(void)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
static void
|
STATIC VOID
|
||||||
_INDENT(void)
|
_INDENT(void)
|
||||||
{
|
{
|
||||||
if(program_name_len > 0)
|
if(program_name_len > 0)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 185
|
#define REVISION 189
|
||||||
#define DATE "2.1.2005"
|
#define DATE "5.3.2005"
|
||||||
#define VERS "debug.lib 1.185"
|
#define VERS "debug.lib 1.189"
|
||||||
#define VSTRING "debug.lib 1.185 (2.1.2005)\r\n"
|
#define VSTRING "debug.lib 1.189 (5.3.2005)\r\n"
|
||||||
#define VERSTAG "\0$VER: debug.lib 1.185 (2.1.2005)"
|
#define VERSTAG "\0$VER: debug.lib 1.189 (5.3.2005)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
185
|
189
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: debug_kputfmt.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: debug_kputfmt.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
parameter table is provided, pick up the parameters and store them in
|
parameter table is provided, pick up the parameters and store them in
|
||||||
the table. The table layout follows the format string and can include
|
the table. The table layout follows the format string and can include
|
||||||
both 16 and 32 bit data. */
|
both 16 and 32 bit data. */
|
||||||
static size_t
|
STATIC size_t
|
||||||
process_var_args(char *format_string,va_list argument_list,unsigned short * table)
|
process_var_args(char *format_string,va_list argument_list,unsigned short * table)
|
||||||
{
|
{
|
||||||
size_t num_args = 0;
|
size_t num_args = 0;
|
||||||
@@ -150,7 +150,7 @@ process_var_args(char *format_string,va_list argument_list,unsigned short * tabl
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
static VOID ASM
|
STATIC VOID ASM
|
||||||
raw_put_char(REG(d0,UBYTE c))
|
raw_put_char(REG(d0,UBYTE c))
|
||||||
{
|
{
|
||||||
kputc(c);
|
kputc(c);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dirent_closedir.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: dirent_closedir.c,v 1.8 2005-03-09 10:48:59 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,11 +47,97 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Directories being scanned whose locks need to be freed when shutting down. */
|
||||||
|
struct MinList NOCOMMON __directory_list;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
static struct SignalSemaphore * dirent_lock;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
|
__dirent_lock(void)
|
||||||
|
{
|
||||||
|
if(dirent_lock != NULL)
|
||||||
|
ObtainSemaphore(dirent_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
|
__dirent_unlock(void)
|
||||||
|
{
|
||||||
|
if(dirent_lock != NULL)
|
||||||
|
ReleaseSemaphore(dirent_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_CONSTRUCTOR(__dirent_init)
|
||||||
|
{
|
||||||
|
BOOL success = FALSE;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
NewList((struct List *)&__directory_list);
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
{
|
||||||
|
dirent_lock = __create_semaphore();
|
||||||
|
if(dirent_lock == NULL)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
success = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(success);
|
||||||
|
|
||||||
|
if(success)
|
||||||
|
CONSTRUCTOR_SUCCEED();
|
||||||
|
else
|
||||||
|
CONSTRUCTOR_FAIL();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_DESTRUCTOR(__dirent_exit)
|
||||||
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if(__directory_list.mlh_Head != NULL)
|
||||||
|
{
|
||||||
|
while(NOT IsListEmpty((struct List *)&__directory_list))
|
||||||
|
closedir((DIR *)__directory_list.mlh_Head);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
{
|
||||||
|
__delete_semaphore(dirent_lock);
|
||||||
|
dirent_lock = NULL;
|
||||||
|
}
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
closedir(DIR * directory_pointer)
|
closedir(DIR * directory_pointer)
|
||||||
{
|
{
|
||||||
struct DirectoryHandle * dh;
|
struct DirectoryHandle * dh;
|
||||||
struct Node * node;
|
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
@@ -61,9 +147,11 @@ closedir(DIR * directory_pointer)
|
|||||||
if(__check_abort_enabled)
|
if(__check_abort_enabled)
|
||||||
__check_abort();
|
__check_abort();
|
||||||
|
|
||||||
|
__dirent_lock();
|
||||||
|
|
||||||
if(directory_pointer == NULL)
|
if(directory_pointer == NULL)
|
||||||
{
|
{
|
||||||
errno = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +172,7 @@ closedir(DIR * directory_pointer)
|
|||||||
|
|
||||||
if(NOT directory_pointer_is_valid)
|
if(NOT directory_pointer_is_valid)
|
||||||
{
|
{
|
||||||
errno = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -94,8 +182,14 @@ closedir(DIR * directory_pointer)
|
|||||||
|
|
||||||
Remove((struct Node *)dh);
|
Remove((struct Node *)dh);
|
||||||
|
|
||||||
while((node = RemHead(&dh->dh_VolumeList)) != NULL)
|
#if defined(UNIX_PATH_SEMANTICS)
|
||||||
free(node);
|
{
|
||||||
|
struct Node * node;
|
||||||
|
|
||||||
|
while((node = RemHead((struct List *)&dh->dh_VolumeList)) != NULL)
|
||||||
|
free(node);
|
||||||
|
}
|
||||||
|
#endif /* UNIX_PATH_SEMANTICS */
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
UnLock(dh->dh_DirLock);
|
UnLock(dh->dh_DirLock);
|
||||||
@@ -107,6 +201,8 @@ closedir(DIR * directory_pointer)
|
|||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
|
__dirent_unlock();
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dirent_headers.h,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: dirent_headers.h,v 1.7 2005-02-28 10:07:30 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,6 +42,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STDLIB_HEADERS_H
|
||||||
|
#include "stdlib_headers.h"
|
||||||
|
#endif /* _STDLIB_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#ifndef _MACROS_H
|
#ifndef _MACROS_H
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
#endif /* _MACROS_H */
|
#endif /* _MACROS_H */
|
||||||
@@ -54,9 +60,10 @@ struct DirectoryHandle
|
|||||||
BPTR dh_DirLock;
|
BPTR dh_DirLock;
|
||||||
struct FileInfoBlock dh_FileInfo;
|
struct FileInfoBlock dh_FileInfo;
|
||||||
struct dirent dh_DirectoryEntry;
|
struct dirent dh_DirectoryEntry;
|
||||||
|
|
||||||
int dh_Position;
|
int dh_Position;
|
||||||
struct Node * dh_VolumeNode;
|
struct Node * dh_VolumeNode;
|
||||||
struct List dh_VolumeList;
|
struct MinList dh_VolumeList;
|
||||||
BOOL dh_ScanVolumeList;
|
BOOL dh_ScanVolumeList;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -66,4 +73,26 @@ extern struct MinList NOCOMMON __directory_list;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern void __dirent_lock(void);
|
||||||
|
extern void __dirent_unlock(void);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define __dirent_lock() ((void)0)
|
||||||
|
#define __dirent_unlock() ((void)0)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /* _DIRENT_HEADERS_H */
|
#endif /* _DIRENT_HEADERS_H */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dirent_opendir.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: dirent_opendir.c,v 1.8 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
static struct Node *
|
STATIC struct Node *
|
||||||
find_by_name(struct List * list,const char * name)
|
find_by_name(struct List * list,const char * name)
|
||||||
{
|
{
|
||||||
struct Node * result = NULL;
|
struct Node * result = NULL;
|
||||||
@@ -89,7 +89,6 @@ opendir(const char * path_name)
|
|||||||
#endif /* UNIX_PATH_SEMANTICS */
|
#endif /* UNIX_PATH_SEMANTICS */
|
||||||
struct DirectoryHandle * dh = NULL;
|
struct DirectoryHandle * dh = NULL;
|
||||||
DIR * result = NULL;
|
DIR * result = NULL;
|
||||||
struct Node * node;
|
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -106,7 +105,7 @@ opendir(const char * path_name)
|
|||||||
{
|
{
|
||||||
SHOWMSG("invalid parameter");
|
SHOWMSG("invalid parameter");
|
||||||
|
|
||||||
errno = EFAULT;
|
__set_errno(EFAULT);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -121,10 +120,12 @@ opendir(const char * path_name)
|
|||||||
|
|
||||||
memset(dh,0,sizeof(*dh));
|
memset(dh,0,sizeof(*dh));
|
||||||
|
|
||||||
NewList(&dh->dh_VolumeList);
|
|
||||||
|
|
||||||
#if defined(UNIX_PATH_SEMANTICS)
|
#if defined(UNIX_PATH_SEMANTICS)
|
||||||
{
|
{
|
||||||
|
struct Node * node;
|
||||||
|
|
||||||
|
NewList((struct List *)&dh->dh_VolumeList);
|
||||||
|
|
||||||
if(__unix_path_semantics)
|
if(__unix_path_semantics)
|
||||||
{
|
{
|
||||||
if(__translate_unix_to_amiga_path_name(&path_name,&path_name_nti) != 0)
|
if(__translate_unix_to_amiga_path_name(&path_name,&path_name_nti) != 0)
|
||||||
@@ -159,7 +160,7 @@ opendir(const char * path_name)
|
|||||||
{
|
{
|
||||||
UnLockDosList(LDF_VOLUMES|LDF_READ);
|
UnLockDosList(LDF_VOLUMES|LDF_READ);
|
||||||
|
|
||||||
errno = ENOMEM;
|
__set_errno(ENOMEM);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,7 +173,7 @@ opendir(const char * path_name)
|
|||||||
/* Check if the name is already on the list. Mind you,
|
/* Check if the name is already on the list. Mind you,
|
||||||
this is not the most sophisticated algorithm but then
|
this is not the most sophisticated algorithm but then
|
||||||
the number of volumes should be small. */
|
the number of volumes should be small. */
|
||||||
if(find_by_name(&dh->dh_VolumeList,node->ln_Name) != NULL)
|
if(find_by_name((struct List *)&dh->dh_VolumeList,node->ln_Name) != NULL)
|
||||||
{
|
{
|
||||||
free(node);
|
free(node);
|
||||||
continue;
|
continue;
|
||||||
@@ -180,16 +181,16 @@ opendir(const char * path_name)
|
|||||||
|
|
||||||
D(("adding '%s'",node->ln_Name));
|
D(("adding '%s'",node->ln_Name));
|
||||||
|
|
||||||
AddTail(&dh->dh_VolumeList,node);
|
AddTail((struct List *)&dh->dh_VolumeList,node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UnLockDosList(LDF_VOLUMES|LDF_READ);
|
UnLockDosList(LDF_VOLUMES|LDF_READ);
|
||||||
|
|
||||||
/* Bail out if we cannot present anything. */
|
/* Bail out if we cannot present anything. */
|
||||||
if(IsListEmpty(&dh->dh_VolumeList))
|
if(IsListEmpty((struct List *)&dh->dh_VolumeList))
|
||||||
{
|
{
|
||||||
errno = ENOMEM;
|
__set_errno(ENOMEM);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -212,7 +213,7 @@ opendir(const char * path_name)
|
|||||||
{
|
{
|
||||||
SHOWMSG("couldn't get a lock on it");
|
SHOWMSG("couldn't get a lock on it");
|
||||||
|
|
||||||
__translate_access_io_error_to_errno(IoErr(),&errno);
|
__set_errno(__translate_access_io_error_to_errno(IoErr()));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,7 +227,7 @@ opendir(const char * path_name)
|
|||||||
{
|
{
|
||||||
SHOWMSG("couldn't examine it");
|
SHOWMSG("couldn't examine it");
|
||||||
|
|
||||||
__translate_io_error_to_errno(IoErr(),&errno);
|
__set_errno(__translate_io_error_to_errno(IoErr()));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,7 +235,7 @@ opendir(const char * path_name)
|
|||||||
{
|
{
|
||||||
SHOWMSG("this isn't a directory");
|
SHOWMSG("this isn't a directory");
|
||||||
|
|
||||||
errno = ENOTDIR;
|
__set_errno(ENOTDIR);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -243,8 +244,12 @@ opendir(const char * path_name)
|
|||||||
|
|
||||||
assert( __directory_list.mlh_Head != NULL );
|
assert( __directory_list.mlh_Head != NULL );
|
||||||
|
|
||||||
|
__dirent_lock();
|
||||||
|
|
||||||
AddTail((struct List *)&__directory_list,(struct Node *)dh);
|
AddTail((struct List *)&__directory_list,(struct Node *)dh);
|
||||||
|
|
||||||
|
__dirent_unlock();
|
||||||
|
|
||||||
result = (DIR *)dh;
|
result = (DIR *)dh;
|
||||||
dh = NULL;
|
dh = NULL;
|
||||||
|
|
||||||
@@ -254,8 +259,14 @@ opendir(const char * path_name)
|
|||||||
{
|
{
|
||||||
SHOWMSG("ouch. cleaning up");
|
SHOWMSG("ouch. cleaning up");
|
||||||
|
|
||||||
while((node = RemHead(&dh->dh_VolumeList)) != NULL)
|
#if defined(UNIX_PATH_SEMANTICS)
|
||||||
free(node);
|
{
|
||||||
|
struct Node * node;
|
||||||
|
|
||||||
|
while((node = RemHead((struct List *)&dh->dh_VolumeList)) != NULL)
|
||||||
|
free(node);
|
||||||
|
}
|
||||||
|
#endif /* UNIX_PATH_SEMANTICS */
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
UnLock(dh->dh_DirLock);
|
UnLock(dh->dh_DirLock);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dirent_readdir.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: dirent_readdir.c,v 1.7 2005-02-03 16:56:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -61,7 +61,7 @@ readdir(DIR * directory_pointer)
|
|||||||
{
|
{
|
||||||
SHOWMSG("ouch. invalid parameter");
|
SHOWMSG("ouch. invalid parameter");
|
||||||
|
|
||||||
errno = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,13 +89,12 @@ readdir(DIR * directory_pointer)
|
|||||||
D_S(struct FileInfoBlock,fib);
|
D_S(struct FileInfoBlock,fib);
|
||||||
D_S(struct bcpl_name,bcpl_name);
|
D_S(struct bcpl_name,bcpl_name);
|
||||||
UBYTE * name = bcpl_name->name;
|
UBYTE * name = bcpl_name->name;
|
||||||
struct MsgPort * port;
|
|
||||||
BPTR dir_lock;
|
BPTR dir_lock;
|
||||||
|
|
||||||
assert( (((ULONG)name) & 3) == 0 );
|
assert( (((ULONG)name) & 3) == 0 );
|
||||||
|
|
||||||
if(dh->dh_VolumeNode == NULL && NOT IsListEmpty(&dh->dh_VolumeList))
|
if(dh->dh_VolumeNode == NULL && NOT IsListEmpty((struct List *)&dh->dh_VolumeList))
|
||||||
dh->dh_VolumeNode = dh->dh_VolumeList.lh_Head;
|
dh->dh_VolumeNode = (struct Node *)dh->dh_VolumeList.mlh_Head;
|
||||||
|
|
||||||
strcpy(name,"\1:"); /* BSTR for ":" */
|
strcpy(name,"\1:"); /* BSTR for ":" */
|
||||||
|
|
||||||
@@ -103,10 +102,12 @@ readdir(DIR * directory_pointer)
|
|||||||
{
|
{
|
||||||
if(IsFileSystem(dh->dh_VolumeNode->ln_Name))
|
if(IsFileSystem(dh->dh_VolumeNode->ln_Name))
|
||||||
{
|
{
|
||||||
port = DeviceProc(dh->dh_VolumeNode->ln_Name);
|
struct DevProc * dvp;
|
||||||
if(port != NULL)
|
|
||||||
|
dvp = GetDeviceProc(dh->dh_VolumeNode->ln_Name,NULL);
|
||||||
|
if(dvp != NULL)
|
||||||
{
|
{
|
||||||
dir_lock = DoPkt(port,ACTION_LOCATE_OBJECT,ZERO,MKBADDR(name),SHARED_LOCK, 0,0);
|
dir_lock = DoPkt(dvp->dvp_Port,ACTION_LOCATE_OBJECT,ZERO,MKBADDR(name),SHARED_LOCK, 0,0);
|
||||||
if(dir_lock != ZERO)
|
if(dir_lock != ZERO)
|
||||||
{
|
{
|
||||||
if(Examine(dir_lock,fib))
|
if(Examine(dir_lock,fib))
|
||||||
@@ -122,6 +123,8 @@ readdir(DIR * directory_pointer)
|
|||||||
|
|
||||||
UnLock(dir_lock);
|
UnLock(dir_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FreeDeviceProc(dvp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +164,7 @@ readdir(DIR * directory_pointer)
|
|||||||
{
|
{
|
||||||
if(CANNOT Examine(parent_directory,fib))
|
if(CANNOT Examine(parent_directory,fib))
|
||||||
{
|
{
|
||||||
__translate_io_error_to_errno(IoErr(),&errno);
|
__set_errno(__translate_io_error_to_errno(IoErr()));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -203,7 +206,7 @@ readdir(DIR * directory_pointer)
|
|||||||
{
|
{
|
||||||
SHOWMSG("error scanning directory");
|
SHOWMSG("error scanning directory");
|
||||||
|
|
||||||
__translate_io_error_to_errno(IoErr(),&errno);
|
__set_errno(__translate_io_error_to_errno(IoErr()));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dirent_rewinddir.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: dirent_rewinddir.c,v 1.4 2005-02-03 16:56:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -76,7 +76,7 @@ rewinddir(DIR * directory_pointer)
|
|||||||
if(CANNOT Examine(dh->dh_DirLock,&dh->dh_FileInfo))
|
if(CANNOT Examine(dh->dh_DirLock,&dh->dh_FileInfo))
|
||||||
{
|
{
|
||||||
SHOWMSG("ouch. that didn't work");
|
SHOWMSG("ouch. that didn't work");
|
||||||
__translate_io_error_to_errno(IoErr(),&errno);
|
__set_errno(__translate_io_error_to_errno(IoErr()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_close.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: fcntl_close.c,v 1.10 2005-02-20 15:46:52 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,20 +42,16 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
__close(int file_descriptor,int * error_ptr)
|
close(int file_descriptor)
|
||||||
{
|
{
|
||||||
DECLARE_UTILITYBASE();
|
struct file_action_message fam;
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
BOOL no_close;
|
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
SHOWVALUE(file_descriptor);
|
SHOWVALUE(file_descriptor);
|
||||||
|
|
||||||
assert( UtilityBase != NULL );
|
|
||||||
|
|
||||||
assert( error_ptr != NULL );
|
|
||||||
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
|
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
|
||||||
assert( __fd[file_descriptor] != NULL );
|
assert( __fd[file_descriptor] != NULL );
|
||||||
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
||||||
@@ -66,114 +62,24 @@ __close(int file_descriptor,int * error_ptr)
|
|||||||
fd = __get_file_descriptor(file_descriptor);
|
fd = __get_file_descriptor(file_descriptor);
|
||||||
if(fd == NULL)
|
if(fd == NULL)
|
||||||
{
|
{
|
||||||
(*error_ptr) = EBADF;
|
__set_errno(EBADF);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
fam.fam_Action = file_action_close;
|
||||||
|
|
||||||
|
assert( fd->fd_Action != NULL );
|
||||||
|
|
||||||
|
if((*fd->fd_Action)(fd,&fam) < 0)
|
||||||
|
{
|
||||||
|
__set_errno(fam.fam_Error);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
SHOWMSG("last customer; cleaning up");
|
|
||||||
|
|
||||||
if(fd->fd_Original != NULL) /* this is an alias */
|
|
||||||
{
|
|
||||||
struct fd * list_fd;
|
|
||||||
|
|
||||||
SHOWMSG("taking out the alias");
|
|
||||||
|
|
||||||
assert( fd->fd_Original != fd );
|
|
||||||
assert( fd->fd_Original->fd_Original == NULL );
|
|
||||||
|
|
||||||
/* Remove this alias from the list. */
|
|
||||||
for(list_fd = fd->fd_Original ;
|
|
||||||
list_fd != NULL ;
|
|
||||||
list_fd = list_fd->fd_NextLink)
|
|
||||||
{
|
|
||||||
if(list_fd->fd_NextLink == fd)
|
|
||||||
{
|
|
||||||
list_fd->fd_NextLink = fd->fd_NextLink;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
no_close = TRUE;
|
|
||||||
}
|
|
||||||
else if (fd->fd_NextLink != NULL) /* this one has aliases attached; it is the 'original' resource */
|
|
||||||
{
|
|
||||||
struct fd * first_alias;
|
|
||||||
struct fd * list_fd;
|
|
||||||
|
|
||||||
SHOWMSG("closing original descriptor; migrating it to first alias");
|
|
||||||
|
|
||||||
/* The first link now becomes the original resource */
|
|
||||||
first_alias = fd->fd_NextLink;
|
|
||||||
first_alias->fd_Original = NULL;
|
|
||||||
|
|
||||||
/* The resources are migrated to the first link. */
|
|
||||||
for(list_fd = first_alias->fd_NextLink ;
|
|
||||||
list_fd != NULL ;
|
|
||||||
list_fd = list_fd->fd_NextLink)
|
|
||||||
{
|
|
||||||
list_fd->fd_Original = first_alias;
|
|
||||||
}
|
|
||||||
|
|
||||||
no_close = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
no_close = FLAG_IS_SET(fd->fd_Flags,FDF_NO_CLOSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
(*error_ptr) = OK;
|
|
||||||
|
|
||||||
if(NOT no_close)
|
|
||||||
{
|
|
||||||
struct file_hook_message message;
|
|
||||||
|
|
||||||
/* Reset the console to regular buffered input. */
|
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
|
|
||||||
{
|
|
||||||
SHOWMSG("resetting non-blocking access mode");
|
|
||||||
|
|
||||||
message.action = file_hook_action_set_blocking;
|
|
||||||
message.arg = 1;
|
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
|
||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
|
||||||
}
|
|
||||||
|
|
||||||
SHOWMSG("shutting down");
|
|
||||||
|
|
||||||
message.action = file_hook_action_close;
|
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
|
||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
|
||||||
|
|
||||||
result = message.result;
|
|
||||||
|
|
||||||
(*error_ptr) = message.error;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(fd,0,sizeof(*fd));
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
int
|
|
||||||
close(int file_descriptor)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
ENTER();
|
|
||||||
|
|
||||||
result = __close(file_descriptor,&errno);
|
|
||||||
|
|
||||||
RETURN(result);
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_creat.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: fcntl_creat.c,v 1.4 2005-02-03 16:56:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -66,7 +66,7 @@ creat(const char * path_name, mode_t mode)
|
|||||||
{
|
{
|
||||||
if(path_name == NULL)
|
if(path_name == NULL)
|
||||||
{
|
{
|
||||||
errno = EFAULT;
|
__set_errno(EFAULT);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_fcntl.c,v 1.5 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: fcntl_fcntl.c,v 1.12 2005-03-04 09:07:09 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -44,12 +44,13 @@
|
|||||||
int
|
int
|
||||||
fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
||||||
{
|
{
|
||||||
DECLARE_UTILITYBASE();
|
struct file_action_message fam;
|
||||||
struct file_hook_message message;
|
|
||||||
struct flock * l;
|
struct flock * l;
|
||||||
|
int vacant_slot;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
struct fd * fd;
|
struct fd * fd = NULL;
|
||||||
va_list arg;
|
va_list arg;
|
||||||
|
int error;
|
||||||
int flags;
|
int flags;
|
||||||
int fdbase;
|
int fdbase;
|
||||||
int i;
|
int i;
|
||||||
@@ -59,8 +60,6 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
SHOWVALUE(file_descriptor);
|
SHOWVALUE(file_descriptor);
|
||||||
SHOWVALUE(cmd);
|
SHOWVALUE(cmd);
|
||||||
|
|
||||||
assert( UtilityBase != NULL );
|
|
||||||
|
|
||||||
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
|
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
|
||||||
assert( __fd[file_descriptor] != NULL );
|
assert( __fd[file_descriptor] != NULL );
|
||||||
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
||||||
@@ -71,10 +70,12 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
fd = __get_file_descriptor(file_descriptor);
|
fd = __get_file_descriptor(file_descriptor);
|
||||||
if(fd == NULL)
|
if(fd == NULL)
|
||||||
{
|
{
|
||||||
errno = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__fd_lock(fd);
|
||||||
|
|
||||||
switch(cmd)
|
switch(cmd)
|
||||||
{
|
{
|
||||||
case F_GETLK:
|
case F_GETLK:
|
||||||
@@ -83,42 +84,41 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
|
|
||||||
SHOWMSG("cmd=F_GETLK/F_SETLK/F_SETLKW");
|
SHOWMSG("cmd=F_GETLK/F_SETLK/F_SETLKW");
|
||||||
|
|
||||||
va_start(arg,cmd);
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
|
||||||
|
{
|
||||||
|
__set_errno(EINVAL);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
va_start(arg,cmd);
|
||||||
l = va_arg(arg,struct flock *);
|
l = va_arg(arg,struct flock *);
|
||||||
|
va_end(arg);
|
||||||
|
|
||||||
assert( l != NULL );
|
assert( l != NULL );
|
||||||
|
|
||||||
if(l->l_type < F_RDLCK || l->l_type > F_WRLCK)
|
if(l->l_type < F_RDLCK || l->l_type > F_WRLCK)
|
||||||
{
|
{
|
||||||
SHOWMSG("invalid flock type");
|
SHOWMSG("invalid flock type");
|
||||||
va_end(arg);
|
|
||||||
|
|
||||||
errno = EINVAL;
|
__set_errno(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(l->l_whence < SEEK_SET || l->l_whence > SEEK_END)
|
if(l->l_whence < SEEK_SET || l->l_whence > SEEK_END)
|
||||||
{
|
{
|
||||||
SHOWMSG("invalid flock offset");
|
SHOWMSG("invalid flock offset");
|
||||||
va_end(arg);
|
|
||||||
|
|
||||||
errno = EINVAL;
|
__set_errno(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
message.action = file_hook_action_lock_record;
|
if(__handle_record_locking(cmd,l,fd,&error) < 0)
|
||||||
message.lock = l;
|
{
|
||||||
message.command = cmd;
|
__set_errno(error);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
result = 0;
|
||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
|
||||||
|
|
||||||
result = message.result;
|
|
||||||
errno = message.error;
|
|
||||||
|
|
||||||
va_end(arg);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -126,7 +126,11 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
|
|
||||||
SHOWMSG("cmd=F_GETFL");
|
SHOWMSG("cmd=F_GETFL");
|
||||||
|
|
||||||
result = 0;
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
|
||||||
|
{
|
||||||
|
__set_errno(EINVAL);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
|
||||||
SET_FLAG(result,O_NONBLOCK);
|
SET_FLAG(result,O_NONBLOCK);
|
||||||
@@ -134,34 +138,36 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO))
|
||||||
SET_FLAG(result,O_ASYNC);
|
SET_FLAG(result,O_ASYNC);
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F_SETFL:
|
case F_SETFL:
|
||||||
|
|
||||||
SHOWMSG("cmd=F_SETFL");
|
SHOWMSG("cmd=F_SETFL");
|
||||||
|
|
||||||
result = 0;
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_IS_SOCKET))
|
||||||
|
{
|
||||||
|
__set_errno(EINVAL);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
va_start(arg,cmd);
|
va_start(arg,cmd);
|
||||||
|
|
||||||
flags = va_arg(arg,int);
|
flags = va_arg(arg,int);
|
||||||
|
va_end(arg);
|
||||||
|
|
||||||
if((FLAG_IS_SET(flags,O_NONBLOCK) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_NON_BLOCKING)) ||
|
if((FLAG_IS_SET(flags,O_NONBLOCK) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_NON_BLOCKING)) ||
|
||||||
(FLAG_IS_CLEAR(flags,O_NONBLOCK) && FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING)))
|
(FLAG_IS_CLEAR(flags,O_NONBLOCK) && FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING)))
|
||||||
{
|
{
|
||||||
message.action = file_hook_action_set_blocking;
|
fam.fam_Action = file_action_set_blocking;
|
||||||
message.arg = FLAG_IS_CLEAR(flags,O_NONBLOCK);
|
fam.fam_Arg = FLAG_IS_CLEAR(flags,O_NONBLOCK);
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
assert( fd->fd_Action != NULL );
|
||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
if((*fd->fd_Action)(fd,&fam) < 0)
|
||||||
|
|
||||||
result = message.result;
|
|
||||||
if(result < 0)
|
|
||||||
{
|
{
|
||||||
errno = message.error;
|
__set_errno(fam.fam_Error);
|
||||||
|
|
||||||
va_end(arg);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,19 +180,15 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
if((FLAG_IS_SET(flags,O_ASYNC) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_ASYNC_IO)) ||
|
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)))
|
(FLAG_IS_CLEAR(flags,O_ASYNC) && FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO)))
|
||||||
{
|
{
|
||||||
message.action = file_hook_action_set_async;
|
fam.fam_Action = file_action_set_async;
|
||||||
message.arg = FLAG_IS_SET(flags,O_ASYNC);
|
fam.fam_Arg = FLAG_IS_SET(flags,O_ASYNC);
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
assert( fd->fd_Action != NULL );
|
||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
if((*fd->fd_Action)(fd,&fam) < 0)
|
||||||
|
|
||||||
result = message.result;
|
|
||||||
if(result < 0)
|
|
||||||
{
|
{
|
||||||
errno = message.error;
|
__set_errno(fam.fam_Error);
|
||||||
|
|
||||||
va_end(arg);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,80 +198,75 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(arg);
|
result = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F_DUPFD:
|
case F_DUPFD:
|
||||||
|
|
||||||
SHOWMSG("cmd=F_DUPFD");
|
SHOWMSG("cmd=F_DUPFD");
|
||||||
|
|
||||||
va_start(arg, cmd);
|
va_start(arg, cmd);
|
||||||
fdbase = va_arg(arg, int);
|
fdbase = va_arg(arg, int);
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
|
|
||||||
if(fdbase < 0)
|
if(fdbase < 0)
|
||||||
{
|
{
|
||||||
errno = EINVAL;
|
__set_errno(EINVAL);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if we have that many fd's already */
|
|
||||||
while(fdbase >= __num_fd)
|
|
||||||
{
|
|
||||||
if(__check_abort_enabled)
|
|
||||||
__check_abort();
|
|
||||||
|
|
||||||
/* No; enlarge it */
|
/* Make sure that we have the required number of file
|
||||||
if(__grow_fd_table() < 0)
|
descriptors available. */
|
||||||
goto out;
|
if(__grow_fd_table(fdbase + 1) < 0)
|
||||||
}
|
goto out;
|
||||||
|
|
||||||
|
vacant_slot = -1;
|
||||||
|
|
||||||
/* Guaranteed to have enough here */
|
/* Guaranteed to have enough here */
|
||||||
while(TRUE)
|
do
|
||||||
{
|
{
|
||||||
|
__stdio_unlock();
|
||||||
|
|
||||||
if(__check_abort_enabled)
|
if(__check_abort_enabled)
|
||||||
__check_abort();
|
__check_abort();
|
||||||
|
|
||||||
|
__stdio_lock();
|
||||||
|
|
||||||
for(i = fdbase ; i < __num_fd ; i++)
|
for(i = fdbase ; i < __num_fd ; i++)
|
||||||
{
|
{
|
||||||
if(FLAG_IS_CLEAR(__fd[i]->fd_Flags,FDF_IN_USE))
|
if(FLAG_IS_CLEAR(__fd[i]->fd_Flags,FDF_IN_USE))
|
||||||
{
|
{
|
||||||
/* Got a file descriptor, duplicate it */
|
vacant_slot = i;
|
||||||
message.action = file_hook_action_duplicate_fd;
|
break;
|
||||||
message.duplicate_fd = __fd[i];
|
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
|
||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
|
||||||
|
|
||||||
/* If it worked, leave */
|
|
||||||
if (message.result == 0)
|
|
||||||
{
|
|
||||||
result = i;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Didn't really find any, grow the table further */
|
/* Didn't really find any, grow the table further */
|
||||||
if (__grow_fd_table() < 0)
|
if(vacant_slot < 0 && __grow_fd_table(0) < 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
while(vacant_slot < 0);
|
||||||
|
|
||||||
|
/* Got a file descriptor, duplicate it */
|
||||||
|
__duplicate_fd(__fd[vacant_slot],fd);
|
||||||
|
|
||||||
|
result = vacant_slot;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
errno = EMFILE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
SHOWMSG("something else");
|
SHOWMSG("something else");
|
||||||
|
|
||||||
errno = ENOSYS;
|
__set_errno(ENOSYS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
|
__fd_unlock(fd);
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_get_default_file.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: fcntl_get_default_file.c,v 1.3 2005-02-03 16:56:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -55,7 +55,7 @@ __get_default_file(int file_descriptor,long * file_ptr)
|
|||||||
fd = __get_file_descriptor(file_descriptor);
|
fd = __get_file_descriptor(file_descriptor);
|
||||||
if(fd == NULL)
|
if(fd == NULL)
|
||||||
{
|
{
|
||||||
errno = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_headers.h,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: fcntl_headers.h,v 1.3 2005-02-03 16:56:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,4 +42,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STDLIB_HEADERS_H
|
||||||
|
#include "stdlib_headers.h"
|
||||||
|
#endif /* _STDLIB_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /* _FCNTL_HEADERS_H */
|
#endif /* _FCNTL_HEADERS_H */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_data.c,v 1.4 2005-01-02 09:07:08 obarthel Exp $
|
* $Id: fcntl_lock.c,v 1.1 2005-02-28 13:22:53 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -31,28 +31,32 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(SOCKET_SUPPORT)
|
#ifndef _STDIO_HEADERS_H
|
||||||
|
#include "stdio_headers.h"
|
||||||
|
#endif /* _STDIO_HEADERS_H */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#ifndef _SOCKET_HEADERS_H
|
#if defined(__THREAD_SAFE)
|
||||||
#include "socket_headers.h"
|
|
||||||
#endif /* _SOCKET_HEADERS_H */
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
struct Library * __SocketBase;
|
void
|
||||||
|
__fd_lock(struct fd * fd)
|
||||||
|
{
|
||||||
|
if(fd != NULL && fd->fd_Lock != NULL)
|
||||||
|
ObtainSemaphore(fd->fd_Lock);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
void
|
||||||
struct SocketIFace *__ISocket;
|
__fd_unlock(struct fd * fd)
|
||||||
#endif /* __amigaos4__ */
|
{
|
||||||
|
if(fd != NULL && fd->fd_Lock != NULL)
|
||||||
|
ReleaseSemaphore(fd->fd_Lock);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
int h_errno;
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#endif /* SOCKET_SUPPORT */
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_lseek.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: fcntl_lseek.c,v 1.7 2005-02-20 15:46:52 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,11 +42,11 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
off_t
|
off_t
|
||||||
__lseek(int file_descriptor, off_t offset, int mode, int * error_ptr)
|
lseek(int file_descriptor, off_t offset, int mode)
|
||||||
{
|
{
|
||||||
DECLARE_UTILITYBASE();
|
struct file_action_message fam;
|
||||||
struct file_hook_message message;
|
|
||||||
off_t result = -1;
|
off_t result = -1;
|
||||||
|
off_t position;
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
@@ -55,9 +55,6 @@ __lseek(int file_descriptor, off_t offset, int mode, int * error_ptr)
|
|||||||
SHOWVALUE(offset);
|
SHOWVALUE(offset);
|
||||||
SHOWVALUE(mode);
|
SHOWVALUE(mode);
|
||||||
|
|
||||||
assert( UtilityBase != NULL );
|
|
||||||
|
|
||||||
assert( error_ptr != NULL );
|
|
||||||
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
|
assert( file_descriptor >= 0 && file_descriptor < __num_fd );
|
||||||
assert( __fd[file_descriptor] != NULL );
|
assert( __fd[file_descriptor] != NULL );
|
||||||
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
||||||
@@ -68,7 +65,7 @@ __lseek(int file_descriptor, off_t offset, int mode, int * error_ptr)
|
|||||||
fd = __get_file_descriptor(file_descriptor);
|
fd = __get_file_descriptor(file_descriptor);
|
||||||
if(fd == NULL)
|
if(fd == NULL)
|
||||||
{
|
{
|
||||||
(*error_ptr) = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,50 +73,27 @@ __lseek(int file_descriptor, off_t offset, int mode, int * error_ptr)
|
|||||||
{
|
{
|
||||||
SHOWMSG("seek mode is invalid");
|
SHOWMSG("seek mode is invalid");
|
||||||
|
|
||||||
(*error_ptr) = EINVAL;
|
__set_errno(EINVAL);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHOWMSG("calling the hook");
|
fam.fam_Action = file_action_seek;
|
||||||
|
fam.fam_Offset = offset;
|
||||||
|
fam.fam_Mode = mode;
|
||||||
|
|
||||||
#if defined(UNIX_PATH_SEMANTICS)
|
assert( fd->fd_Action != NULL );
|
||||||
|
|
||||||
|
position = (*fd->fd_Action)(fd,&fam);
|
||||||
|
if(position < 0)
|
||||||
{
|
{
|
||||||
message.action = file_hook_action_seek_and_extend;
|
__set_errno(fam.fam_Error);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
{
|
|
||||||
message.action = file_hook_action_seek;
|
|
||||||
}
|
|
||||||
#endif /* UNIX_PATH_SEMANTICS */
|
|
||||||
|
|
||||||
message.position = offset;
|
result = position;
|
||||||
message.mode = mode;
|
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
|
||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
|
||||||
|
|
||||||
(*error_ptr) = message.error;
|
|
||||||
|
|
||||||
result = message.result;
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
off_t
|
|
||||||
lseek(int file_descriptor, off_t offset, int mode)
|
|
||||||
{
|
|
||||||
off_t result;
|
|
||||||
|
|
||||||
ENTER();
|
|
||||||
|
|
||||||
result = __lseek(file_descriptor,offset,mode,&errno);
|
|
||||||
|
|
||||||
RETURN(result);
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_open.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: fcntl_open.c,v 1.14 2005-03-04 09:07:09 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -53,6 +53,39 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* This is used in place of ChangeMode() in order to work around a bug in
|
||||||
|
dos.library V40 and below: a "NIL:" file handle will crash the
|
||||||
|
caller of the ChangeMode() function. */
|
||||||
|
STATIC LONG
|
||||||
|
safe_change_mode(LONG type,BPTR file_handle,LONG mode)
|
||||||
|
{
|
||||||
|
LONG result = DOSFALSE;
|
||||||
|
|
||||||
|
#ifndef __amigaos4__
|
||||||
|
{
|
||||||
|
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
|
||||||
|
|
||||||
|
assert( type == CHANGE_FH );
|
||||||
|
|
||||||
|
if(fh == NULL || fh->fh_Type == NULL)
|
||||||
|
{
|
||||||
|
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
PROFILE_OFF();
|
||||||
|
result = ChangeMode(type,file_handle,mode);
|
||||||
|
PROFILE_ON();
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
||||||
{
|
{
|
||||||
@@ -61,13 +94,13 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
struct name_translation_info path_name_nti;
|
struct name_translation_info path_name_nti;
|
||||||
#endif /* UNIX_PATH_SEMANTICS */
|
#endif /* UNIX_PATH_SEMANTICS */
|
||||||
D_S(struct FileInfoBlock,fib);
|
D_S(struct FileInfoBlock,fib);
|
||||||
|
struct SignalSemaphore * fd_lock;
|
||||||
LONG is_file_system = FALSE;
|
LONG is_file_system = FALSE;
|
||||||
LONG open_mode;
|
LONG open_mode;
|
||||||
BPTR lock = ZERO;
|
BPTR lock = ZERO;
|
||||||
struct FileHandle * file_handle;
|
|
||||||
BPTR handle = ZERO;
|
BPTR handle = ZERO;
|
||||||
BOOL create_new_file = FALSE;
|
BOOL create_new_file = FALSE;
|
||||||
LONG is_interactive = FALSE;
|
LONG is_interactive;
|
||||||
int fd_slot_number;
|
int fd_slot_number;
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
int access_mode;
|
int access_mode;
|
||||||
@@ -85,13 +118,15 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
if(__check_abort_enabled)
|
if(__check_abort_enabled)
|
||||||
__check_abort();
|
__check_abort();
|
||||||
|
|
||||||
|
__stdio_lock();
|
||||||
|
|
||||||
#if defined(CHECK_FOR_NULL_POINTERS)
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
{
|
{
|
||||||
if(path_name == NULL)
|
if(path_name == NULL)
|
||||||
{
|
{
|
||||||
SHOWMSG("path name is invalid");
|
SHOWMSG("path name is invalid");
|
||||||
|
|
||||||
errno = EFAULT;
|
__set_errno(EFAULT);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -102,14 +137,14 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
{
|
{
|
||||||
SHOWMSG("access mode is invalid");
|
SHOWMSG("access mode is invalid");
|
||||||
|
|
||||||
errno = EINVAL;
|
__set_errno(EINVAL);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd_slot_number = __find_vacant_fd_entry();
|
fd_slot_number = __find_vacant_fd_entry();
|
||||||
if(fd_slot_number < 0)
|
if(fd_slot_number < 0)
|
||||||
{
|
{
|
||||||
if(__grow_fd_table() < 0)
|
if(__grow_fd_table(0) < 0)
|
||||||
{
|
{
|
||||||
SHOWMSG("couldn't find a vacant file descriptor, and couldn't allocate one either");
|
SHOWMSG("couldn't find a vacant file descriptor, and couldn't allocate one either");
|
||||||
goto out;
|
goto out;
|
||||||
@@ -128,7 +163,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
|
|
||||||
if(path_name_nti.is_root)
|
if(path_name_nti.is_root)
|
||||||
{
|
{
|
||||||
errno = EACCES;
|
__set_errno(EACCES);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -155,7 +190,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
{
|
{
|
||||||
SHOWMSG("the file already exists");
|
SHOWMSG("the file already exists");
|
||||||
|
|
||||||
errno = EEXIST;
|
__set_errno(EEXIST);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,14 +200,14 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
{
|
{
|
||||||
SHOWMSG("there's something not a directory on the path");
|
SHOWMSG("there's something not a directory on the path");
|
||||||
|
|
||||||
errno = ENOTDIR;
|
__set_errno(ENOTDIR);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
else if (error != ERROR_OBJECT_NOT_FOUND && error != ERROR_ACTION_NOT_KNOWN)
|
else if (error != ERROR_OBJECT_NOT_FOUND && error != ERROR_ACTION_NOT_KNOWN)
|
||||||
{
|
{
|
||||||
SHOWMSG("error accessing the object");
|
SHOWMSG("error accessing the object");
|
||||||
|
|
||||||
__translate_io_error_to_errno(IoErr(),&errno);
|
__set_errno(__translate_io_error_to_errno(IoErr()));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,7 +236,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
{
|
{
|
||||||
SHOWMSG("could not examine the object");
|
SHOWMSG("could not examine the object");
|
||||||
|
|
||||||
__translate_io_error_to_errno(IoErr(),&errno);
|
__set_errno(__translate_io_error_to_errno(IoErr()));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +245,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
{
|
{
|
||||||
SHOWMSG("can't open a directory");
|
SHOWMSG("can't open a directory");
|
||||||
|
|
||||||
errno = EISDIR;
|
__set_errno(EISDIR);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,7 +254,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
{
|
{
|
||||||
SHOWMSG("this object is not write enabled");
|
SHOWMSG("this object is not write enabled");
|
||||||
|
|
||||||
errno = EACCES;
|
__set_errno(EACCES);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,14 +277,14 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
{
|
{
|
||||||
SHOWMSG("there's something not a directory on the path");
|
SHOWMSG("there's something not a directory on the path");
|
||||||
|
|
||||||
errno = ENOTDIR;
|
__set_errno(ENOTDIR);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
else if (error != ERROR_OBJECT_NOT_FOUND && error != ERROR_ACTION_NOT_KNOWN)
|
else if (error != ERROR_OBJECT_NOT_FOUND && error != ERROR_ACTION_NOT_KNOWN)
|
||||||
{
|
{
|
||||||
SHOWMSG("error accessing the object");
|
SHOWMSG("error accessing the object");
|
||||||
|
|
||||||
__translate_io_error_to_errno(IoErr(),&errno);
|
__set_errno(__translate_io_error_to_errno(IoErr()));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -273,7 +308,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
LONG io_err = IoErr();
|
LONG io_err = IoErr();
|
||||||
|
|
||||||
D(("the file '%s' didn't open in mode %ld",path_name,open_mode));
|
D(("the file '%s' didn't open in mode %ld",path_name,open_mode));
|
||||||
__translate_access_io_error_to_errno(IoErr(),&errno);
|
__set_errno(__translate_access_io_error_to_errno(io_err));
|
||||||
|
|
||||||
/* Check if ended up trying to open a directory as if
|
/* Check if ended up trying to open a directory as if
|
||||||
it were a plain file. */
|
it were a plain file. */
|
||||||
@@ -285,7 +320,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
if(lock != ZERO)
|
if(lock != ZERO)
|
||||||
{
|
{
|
||||||
if(Examine(lock,fib) && fib->fib_DirEntryType >= 0)
|
if(Examine(lock,fib) && fib->fib_DirEntryType >= 0)
|
||||||
errno = EISDIR;
|
__set_errno(EISDIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
@@ -294,60 +329,28 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
file_handle = BADDR(handle);
|
#if defined(__THREAD_SAFE)
|
||||||
|
|
||||||
/* NOTE: workaround for a bug in dos.library V40 and below which will
|
|
||||||
* crash the caller if the file handle refers to "NIL:".
|
|
||||||
*/
|
|
||||||
if(file_handle->fh_Type != NULL)
|
|
||||||
{
|
{
|
||||||
LONG status;
|
fd_lock = __create_semaphore();
|
||||||
|
if(fd_lock == NULL)
|
||||||
PROFILE_OFF();
|
|
||||||
status = ExamineFH(handle,fib);
|
|
||||||
PROFILE_ON();
|
|
||||||
|
|
||||||
if(status != DOSFALSE)
|
|
||||||
{
|
{
|
||||||
BOOL operation_permitted = TRUE;
|
__set_errno(ENOMEM);
|
||||||
|
goto out;
|
||||||
/* Check if the file is readable. */
|
|
||||||
if(FLAG_IS_SET(fib->fib_Protection,FIBF_READ))
|
|
||||||
{
|
|
||||||
if(access_mode == O_RDONLY ||
|
|
||||||
access_mode == O_RDWR)
|
|
||||||
{
|
|
||||||
operation_permitted = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if the file can be written to. */
|
|
||||||
if(FLAG_IS_SET(fib->fib_Protection,FIBF_WRITE))
|
|
||||||
{
|
|
||||||
if(access_mode == O_WRONLY)
|
|
||||||
operation_permitted = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(NOT operation_permitted)
|
|
||||||
{
|
|
||||||
SHOWMSG("this object must not be opened");
|
|
||||||
|
|
||||||
errno = EACCES;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
fd_lock = NULL;
|
||||||
|
}
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
fd = __fd[fd_slot_number];
|
fd = __fd[fd_slot_number];
|
||||||
|
|
||||||
__initialize_fd(fd,(HOOKFUNC)__fd_hook_entry,handle,0);
|
__initialize_fd(fd,__fd_hook_entry,handle,0,fd_lock);
|
||||||
|
|
||||||
/* Figure out if this stream is attached to a console. */
|
/* Figure out if this stream is attached to a console. */
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
is_interactive = IsInteractive(handle);
|
||||||
if(file_handle->fh_Type != NULL)
|
|
||||||
is_interactive = IsInteractive(handle);
|
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
if(is_interactive)
|
if(is_interactive)
|
||||||
@@ -358,7 +361,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
{
|
{
|
||||||
SHOWMSG("enabling non-blocking mode");
|
SHOWMSG("enabling non-blocking mode");
|
||||||
|
|
||||||
if(SetMode(handle,1)) /* single character mode */
|
if(SetMode(handle,DOSTRUE)) /* single character mode */
|
||||||
SET_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
|
SET_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -368,7 +371,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
|
|
||||||
len = 0;
|
len = 0;
|
||||||
|
|
||||||
for(i = 0 ; i < (int)strlen(path_name) ; i++)
|
for(i = 0 ; path_name[i] != '\0' ; i++)
|
||||||
{
|
{
|
||||||
if(path_name[i] == ':')
|
if(path_name[i] == ':')
|
||||||
{
|
{
|
||||||
@@ -403,21 +406,11 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
|
|
||||||
if(is_file_system)
|
if(is_file_system)
|
||||||
{
|
{
|
||||||
/* NOTE: workaround for a bug in dos.library V40 and below which will
|
/* We opened the file in exclusive access mode. Switch it back
|
||||||
* crash the caller if the file handle refers to "NIL:".
|
into shared access mode so that its contents can be read
|
||||||
*/
|
while it's still open. */
|
||||||
if(file_handle->fh_Type != NULL)
|
if(open_mode == MODE_NEWFILE)
|
||||||
{
|
safe_change_mode(CHANGE_FH,handle,SHARED_LOCK);
|
||||||
/* We opened the file in exclusive access mode. Switch it back
|
|
||||||
into shared access mode so that its contents can be read
|
|
||||||
while it's still open. */
|
|
||||||
if(open_mode == MODE_NEWFILE)
|
|
||||||
{
|
|
||||||
PROFILE_OFF();
|
|
||||||
ChangeMode(CHANGE_FH,handle,SHARED_LOCK);
|
|
||||||
PROFILE_ON();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We should be able to seek in this file. */
|
/* We should be able to seek in this file. */
|
||||||
SET_FLAG(fd->fd_Flags,FDF_CACHE_POSITION);
|
SET_FLAG(fd->fd_Flags,FDF_CACHE_POSITION);
|
||||||
@@ -474,6 +467,8 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
|
|||||||
|
|
||||||
UnLock(lock);
|
UnLock(lock);
|
||||||
|
|
||||||
|
__stdio_unlock();
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_read.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: fcntl_read.c,v 1.7 2005-02-28 10:07:30 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -48,11 +48,11 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
__read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
|
read(int file_descriptor, void * buffer, size_t num_bytes)
|
||||||
{
|
{
|
||||||
DECLARE_UTILITYBASE();
|
ssize_t num_bytes_read;
|
||||||
|
ssize_t result = -1;
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
off_t result = -1;
|
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -60,10 +60,11 @@ __read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
|
|||||||
SHOWPOINTER(buffer);
|
SHOWPOINTER(buffer);
|
||||||
SHOWVALUE(num_bytes);
|
SHOWVALUE(num_bytes);
|
||||||
|
|
||||||
assert( error_ptr != NULL );
|
|
||||||
assert( buffer != NULL );
|
assert( buffer != NULL );
|
||||||
assert( (int)num_bytes >= 0);
|
assert( (int)num_bytes >= 0);
|
||||||
assert( UtilityBase != NULL );
|
|
||||||
|
if(__check_abort_enabled)
|
||||||
|
__check_abort();
|
||||||
|
|
||||||
#if defined(CHECK_FOR_NULL_POINTERS)
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
{
|
{
|
||||||
@@ -71,7 +72,7 @@ __read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
|
|||||||
{
|
{
|
||||||
SHOWMSG("invalid buffer");
|
SHOWMSG("invalid buffer");
|
||||||
|
|
||||||
(*error_ptr) = EFAULT;
|
__set_errno(EFAULT);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,13 +82,10 @@ __read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
|
|||||||
assert( __fd[file_descriptor] != NULL );
|
assert( __fd[file_descriptor] != NULL );
|
||||||
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
||||||
|
|
||||||
if(__check_abort_enabled)
|
|
||||||
__check_abort();
|
|
||||||
|
|
||||||
fd = __get_file_descriptor(file_descriptor);
|
fd = __get_file_descriptor(file_descriptor);
|
||||||
if(fd == NULL)
|
if(fd == NULL)
|
||||||
{
|
{
|
||||||
(*error_ptr) = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,52 +93,38 @@ __read(int file_descriptor, void * buffer, size_t num_bytes, int * error_ptr)
|
|||||||
{
|
{
|
||||||
SHOWMSG("this descriptor is not read-enabled");
|
SHOWMSG("this descriptor is not read-enabled");
|
||||||
|
|
||||||
(*error_ptr) = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(num_bytes > 0)
|
if(num_bytes > 0)
|
||||||
{
|
{
|
||||||
struct file_hook_message message;
|
struct file_action_message fam;
|
||||||
|
|
||||||
SHOWMSG("calling the hook");
|
SHOWMSG("calling the hook");
|
||||||
|
|
||||||
message.action = file_hook_action_read;
|
fam.fam_Action = file_action_read;
|
||||||
message.data = buffer;
|
fam.fam_Data = buffer;
|
||||||
message.size = num_bytes;
|
fam.fam_Size = num_bytes;
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
assert( fd->fd_Action != NULL );
|
||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
num_bytes_read = (*fd->fd_Action)(fd,&fam);
|
||||||
|
if(num_bytes_read < 0)
|
||||||
(*error_ptr) = message.error;
|
{
|
||||||
|
__set_errno(fam.fam_Error);
|
||||||
result = message.result;
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(*error_ptr) = 0;
|
num_bytes_read = 0;
|
||||||
|
|
||||||
result = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = num_bytes_read;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
ssize_t
|
|
||||||
read(int file_descriptor, void * buffer, size_t num_bytes)
|
|
||||||
{
|
|
||||||
ssize_t result;
|
|
||||||
|
|
||||||
ENTER();
|
|
||||||
|
|
||||||
result = __read(file_descriptor,buffer,num_bytes,&errno);
|
|
||||||
|
|
||||||
RETURN(result);
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_write.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: fcntl_write.c,v 1.7 2005-02-28 10:07:30 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -48,11 +48,11 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
__write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_ptr)
|
write(int file_descriptor, const void * buffer, size_t num_bytes)
|
||||||
{
|
{
|
||||||
DECLARE_UTILITYBASE();
|
ssize_t num_bytes_written;
|
||||||
|
ssize_t result = -1;
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
off_t result = -1;
|
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -60,10 +60,11 @@ __write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_
|
|||||||
SHOWPOINTER(buffer);
|
SHOWPOINTER(buffer);
|
||||||
SHOWVALUE(num_bytes);
|
SHOWVALUE(num_bytes);
|
||||||
|
|
||||||
assert( error_ptr != NULL );
|
|
||||||
assert( buffer != NULL );
|
assert( buffer != NULL );
|
||||||
assert( (int)num_bytes >= 0 );
|
assert( (int)num_bytes >= 0 );
|
||||||
assert( UtilityBase != NULL );
|
|
||||||
|
if(__check_abort_enabled)
|
||||||
|
__check_abort();
|
||||||
|
|
||||||
#if defined(CHECK_FOR_NULL_POINTERS)
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
{
|
{
|
||||||
@@ -71,7 +72,7 @@ __write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_
|
|||||||
{
|
{
|
||||||
SHOWMSG("invalid buffer address");
|
SHOWMSG("invalid buffer address");
|
||||||
|
|
||||||
(*error_ptr) = EFAULT;
|
__set_errno(EFAULT);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,13 +82,10 @@ __write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_
|
|||||||
assert( __fd[file_descriptor] != NULL );
|
assert( __fd[file_descriptor] != NULL );
|
||||||
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
assert( FLAG_IS_SET(__fd[file_descriptor]->fd_Flags,FDF_IN_USE) );
|
||||||
|
|
||||||
if(__check_abort_enabled)
|
|
||||||
__check_abort();
|
|
||||||
|
|
||||||
fd = __get_file_descriptor(file_descriptor);
|
fd = __get_file_descriptor(file_descriptor);
|
||||||
if(fd == NULL)
|
if(fd == NULL)
|
||||||
{
|
{
|
||||||
(*error_ptr) = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,52 +93,38 @@ __write(int file_descriptor, const void * buffer, size_t num_bytes, int * error_
|
|||||||
{
|
{
|
||||||
SHOWMSG("file descriptor is not write-enabled");
|
SHOWMSG("file descriptor is not write-enabled");
|
||||||
|
|
||||||
(*error_ptr) = EBADF;
|
__set_errno(EBADF);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(num_bytes > 0)
|
if(num_bytes > 0)
|
||||||
{
|
{
|
||||||
struct file_hook_message message;
|
struct file_action_message fam;
|
||||||
|
|
||||||
SHOWMSG("calling the hook");
|
SHOWMSG("calling the hook");
|
||||||
|
|
||||||
message.action = file_hook_action_write;
|
fam.fam_Action = file_action_write;
|
||||||
message.data = (void *)buffer;
|
fam.fam_Data = (void *)buffer;
|
||||||
message.size = num_bytes;
|
fam.fam_Size = num_bytes;
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
assert( fd->fd_Action != NULL );
|
||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
num_bytes_written = (*fd->fd_Action)(fd,&fam);
|
||||||
|
if(num_bytes_written < 0)
|
||||||
(*error_ptr) = message.error;
|
{
|
||||||
|
__set_errno(fam.fam_Error);
|
||||||
result = message.result;
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(*error_ptr) = 0;
|
num_bytes_written = 0;
|
||||||
|
|
||||||
result = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = num_bytes_written;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
ssize_t
|
|
||||||
write(int file_descriptor, const void * buffer, size_t num_bytes)
|
|
||||||
{
|
|
||||||
ssize_t result;
|
|
||||||
|
|
||||||
ENTER();
|
|
||||||
|
|
||||||
result = __write(file_descriptor,buffer,num_bytes,&errno);
|
|
||||||
|
|
||||||
RETURN(result);
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|||||||
240
library/ftw_ftw.c
Normal file
240
library/ftw_ftw.c
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
/*
|
||||||
|
* $Id: ftw_ftw.c,v 1.2 2005-03-03 10:59:17 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This ftw() implementation builds heavily on existing functionality and could certainly
|
||||||
|
* be made more efficient (e.g. by combining walk & stat using ExAll()/ExNext()) but this
|
||||||
|
* way the Unix pathname translation is free.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <ftw.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <dos.h>
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _DEBUG_H
|
||||||
|
#include "debug.h"
|
||||||
|
#endif /* _DEBUG_H */
|
||||||
|
|
||||||
|
#ifndef _FTW_HEADERS_H
|
||||||
|
#include "ftw_headers.h"
|
||||||
|
#endif /* _FTW_HEADERS_H */
|
||||||
|
|
||||||
|
#ifndef _STDLIB_PROTOS_H
|
||||||
|
#include "stdlib_protos.h" /* get/set errno. */
|
||||||
|
#endif /* _STDLIB_PROTOS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
static int
|
||||||
|
walk(const char *path,int (*func)(const char *,const struct stat *,int),int depth,int level)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
DIR *dp;
|
||||||
|
struct dirent *de;
|
||||||
|
struct stat st;
|
||||||
|
char *next_name;
|
||||||
|
int type;
|
||||||
|
int old_length;
|
||||||
|
int errtmp;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
SHOWSTRING(path);
|
||||||
|
SHOWPOINTER(func);
|
||||||
|
SHOWVALUE(depth);
|
||||||
|
SHOWVALUE(level);
|
||||||
|
|
||||||
|
if(__check_abort_enabled)
|
||||||
|
__check_abort();
|
||||||
|
|
||||||
|
if(level > depth)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if(stat(path,&st) == OK)
|
||||||
|
{
|
||||||
|
if (S_ISDIR(st.st_mode))
|
||||||
|
{
|
||||||
|
if(FLAG_IS_SET(st.st_mode,S_IRUSR))
|
||||||
|
type = FTW_D; /* Directory */
|
||||||
|
else
|
||||||
|
type = FTW_DNR; /* Directory No Read-permission */
|
||||||
|
}
|
||||||
|
else if (S_ISREG(st.st_mode))
|
||||||
|
{
|
||||||
|
type = FTW_F; /* File */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Skip */
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
type = FTW_NS; /* No Stat */
|
||||||
|
}
|
||||||
|
|
||||||
|
result = (*func)(path,&st,type);
|
||||||
|
if(result != 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if(type == FTW_D)
|
||||||
|
{
|
||||||
|
dp = opendir(path); /* Also takes care of Unix->Amiga pathname conversion. */
|
||||||
|
if(dp == NULL)
|
||||||
|
{
|
||||||
|
result = -1; /* Pass errno from opendir() */
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
old_length = strlen(path);
|
||||||
|
|
||||||
|
next_name = malloc(old_length + NAME_MAX + 2); /* Allocate new for each recursive step to handle extremely long path names. */
|
||||||
|
if(next_name == NULL)
|
||||||
|
{
|
||||||
|
__set_errno(ENOMEM);
|
||||||
|
|
||||||
|
result = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(next_name,path);
|
||||||
|
|
||||||
|
if(old_length > 0 && next_name[old_length - 1] != ':' && next_name[old_length-1] != '/')
|
||||||
|
next_name[old_length++] = '/';
|
||||||
|
|
||||||
|
while((result == 0) && (de = readdir(dp)) != NULL)
|
||||||
|
{
|
||||||
|
strlcpy(&next_name[old_length],de->d_name,NAME_MAX + 2);
|
||||||
|
|
||||||
|
result = walk(next_name,func,depth,level+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
errtmp = __get_errno();
|
||||||
|
|
||||||
|
closedir(dp);
|
||||||
|
free(next_name);
|
||||||
|
|
||||||
|
__set_errno(errtmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ftw(const char *path,int (*func)(const char *,const struct stat *,int),int depth)
|
||||||
|
{
|
||||||
|
int result = -1;
|
||||||
|
char *base;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
SHOWSTRING(path);
|
||||||
|
SHOWPOINTER(func);
|
||||||
|
SHOWVALUE(depth);
|
||||||
|
|
||||||
|
if(path == NULL)
|
||||||
|
{
|
||||||
|
SHOWMSG("NULL pathname to ftw().");
|
||||||
|
|
||||||
|
__set_errno(EFAULT);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(func == NULL)
|
||||||
|
{
|
||||||
|
SHOWMSG("No function supplied.");
|
||||||
|
|
||||||
|
__set_errno(EFAULT);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(depth < 0)
|
||||||
|
{
|
||||||
|
SHOWMSG("Invalid depth.\n");
|
||||||
|
|
||||||
|
__set_errno(EINVAL);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure the path never ends with '/' unless used to indicate parent directory. */
|
||||||
|
len = strlen(path);
|
||||||
|
if(len > 1 && path[len - 1] == '/' && path[len - 2] != '/')
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
base = strdup(path);
|
||||||
|
if(base == NULL)
|
||||||
|
{
|
||||||
|
__set_errno(ENOMEM);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
base[len - 1] = '\0';
|
||||||
|
|
||||||
|
result = walk(base,func,depth,0);
|
||||||
|
|
||||||
|
error = __get_errno();
|
||||||
|
|
||||||
|
free(base);
|
||||||
|
|
||||||
|
__set_errno(error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = walk(path,func,depth,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_constructor_end.c,v 1.2 2005-01-02 09:07:08 obarthel Exp $
|
* $Id: ftw_headers.h,v 1.1 2005-03-02 12:57:53 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -31,14 +31,17 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
#ifndef _FTW_HEADERS_H
|
||||||
|
#define _FTW_HEADERS_H
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* End markers for the CTOR and DTOR list. */
|
#include <sys/stat.h>
|
||||||
static volatile void (*__CTOR_LIST__[1]) (void) __attribute__((section(".ctors"))) = { (void *)0 };
|
|
||||||
static volatile void (*__DTOR_LIST__[1]) (void) __attribute__((section(".dtors"))) = { (void *)0 };
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /*__amigaos4__ */
|
#include "macros.h"
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* _FTW_HEADERS_H */
|
||||||
336
library/ftw_nftw.c
Normal file
336
library/ftw_nftw.c
Normal file
@@ -0,0 +1,336 @@
|
|||||||
|
/*
|
||||||
|
* $Id: ftw_nftw.c,v 1.2 2005-03-03 10:59:17 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This nftw() implementation builds heavily on existing functionality and could certainly
|
||||||
|
* be made more efficient.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <ftw.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <dos.h>
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _DEBUG_H
|
||||||
|
#include "debug.h"
|
||||||
|
#endif /* _DEBUG_H */
|
||||||
|
|
||||||
|
#ifndef _FTW_HEADERS_H
|
||||||
|
#include "ftw_headers.h"
|
||||||
|
#endif /* _FTW_HEADERS_H */
|
||||||
|
|
||||||
|
#ifndef _STDLIB_PROTOS_H
|
||||||
|
#include "stdlib_protos.h" /* get/set errno. */
|
||||||
|
#endif /* _STDLIB_PROTOS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
static int
|
||||||
|
walk(const char *path,int (*func)(const char *,const struct stat *,int,struct FTW *),const int depth,int level,const int flags,const int base,int * const prune)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
DIR *dp;
|
||||||
|
struct dirent *de;
|
||||||
|
struct stat st;
|
||||||
|
char *next_name;
|
||||||
|
char *old_cwd = 0;
|
||||||
|
int type;
|
||||||
|
int old_length;
|
||||||
|
int errtmp;
|
||||||
|
struct FTW extra_info;
|
||||||
|
int stat_result;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
SHOWSTRING(path);
|
||||||
|
SHOWPOINTER(func);
|
||||||
|
SHOWVALUE(depth);
|
||||||
|
SHOWVALUE(level);
|
||||||
|
SHOWVALUE(flags);
|
||||||
|
|
||||||
|
if(__check_abort_enabled)
|
||||||
|
__check_abort();
|
||||||
|
|
||||||
|
if(level > depth)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if(FLAG_IS_SET(flags,FTW_PHYS))
|
||||||
|
stat_result = lstat(path,&st);
|
||||||
|
else
|
||||||
|
stat_result = stat(path,&st);
|
||||||
|
|
||||||
|
if(stat_result == OK)
|
||||||
|
{
|
||||||
|
if (S_ISLNK(st.st_mode)) /* Should only be possible if lstat() is used. */
|
||||||
|
{
|
||||||
|
type = FTW_SL;
|
||||||
|
}
|
||||||
|
else if (S_ISDIR(st.st_mode))
|
||||||
|
{
|
||||||
|
if(FLAG_IS_SET(st.st_mode,S_IRUSR))
|
||||||
|
type = FTW_D; /* Directory */
|
||||||
|
else
|
||||||
|
type = FTW_DNR; /* Directory No Read-permission */
|
||||||
|
}
|
||||||
|
else if (S_ISREG(st.st_mode))
|
||||||
|
{
|
||||||
|
type = FTW_F; /* File */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Skip */
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(FLAG_IS_CLEAR(flags,FTW_PHYS) && lstat(path,&st) == OK)
|
||||||
|
type = FTW_SLN; /* Broken link. */
|
||||||
|
else
|
||||||
|
type = FTW_NS; /* No Stat */
|
||||||
|
}
|
||||||
|
|
||||||
|
extra_info.quit = 0;
|
||||||
|
extra_info.base = base;
|
||||||
|
extra_info.level = level;
|
||||||
|
|
||||||
|
if(type == FTW_D)
|
||||||
|
{
|
||||||
|
old_length = strlen(path);
|
||||||
|
|
||||||
|
if(FLAG_IS_CLEAR(flags,FTW_DEPTH))
|
||||||
|
result = (*func)(path,&st,type,&extra_info);
|
||||||
|
|
||||||
|
if(extra_info.quit == 0)
|
||||||
|
{
|
||||||
|
dp = opendir(path); /* Also takes care of Unix->Amiga pathname conversion. */
|
||||||
|
if(dp == NULL)
|
||||||
|
{
|
||||||
|
result = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(FLAG_IS_SET(flags,FTW_CHDIR)) /* Change to directory before traversing. */
|
||||||
|
{
|
||||||
|
old_cwd = malloc(old_length + NAME_MAX);
|
||||||
|
if(old_cwd == NULL)
|
||||||
|
{
|
||||||
|
__set_errno(ENOMEM);
|
||||||
|
|
||||||
|
result = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
getcwd(old_cwd,old_length + NAME_MAX);
|
||||||
|
chdir(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
next_name = malloc(old_length + NAME_MAX + 2); /* Allocate new for each recursive step to handle extremely long path names. */
|
||||||
|
if(next_name == NULL)
|
||||||
|
{
|
||||||
|
__set_errno(ENOMEM);
|
||||||
|
|
||||||
|
result = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(next_name,path);
|
||||||
|
if(old_length > 0 && next_name[old_length - 1] != ':' && next_name[old_length - 1] != '/')
|
||||||
|
next_name[old_length++] = '/';
|
||||||
|
|
||||||
|
while((result == 0) && (de = readdir(dp)) != NULL)
|
||||||
|
{
|
||||||
|
strlcpy(&next_name[old_length],de->d_name,NAME_MAX + 2);
|
||||||
|
|
||||||
|
result = walk(next_name,func,depth,level + 1,flags,old_length,prune);
|
||||||
|
if((*prune) != 0)
|
||||||
|
{
|
||||||
|
(*prune) = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
errtmp = __get_errno();
|
||||||
|
|
||||||
|
closedir(dp);
|
||||||
|
|
||||||
|
__set_errno(errtmp);
|
||||||
|
|
||||||
|
free(next_name);
|
||||||
|
|
||||||
|
if((result == 0) && FLAG_IS_SET(flags,FTW_DEPTH))
|
||||||
|
result = (*func)(path,&st,FTW_DP,&extra_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(extra_info.quit == FTW_PRUNE) /* Abort traversal of current directory. */
|
||||||
|
(*prune) = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = (*func)(path,&st,type,&extra_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
if(old_cwd != NULL)
|
||||||
|
{
|
||||||
|
errtmp = __get_errno();
|
||||||
|
|
||||||
|
chdir(old_cwd); /* Restore (pop) old directory. */
|
||||||
|
free(old_cwd);
|
||||||
|
|
||||||
|
__set_errno(errtmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************/
|
||||||
|
|
||||||
|
static int
|
||||||
|
index_of_end_part(const char *path)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = strlen(path) - 1;
|
||||||
|
while(i-- > 0)
|
||||||
|
{
|
||||||
|
if(path[i] == '/' || path[i] == ':')
|
||||||
|
{
|
||||||
|
result = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************/
|
||||||
|
|
||||||
|
int
|
||||||
|
nftw(const char *path,int (*func)(const char *,const struct stat *,int,struct FTW *),int depth,int flags)
|
||||||
|
{
|
||||||
|
char *base;
|
||||||
|
int len;
|
||||||
|
int base_index;
|
||||||
|
int prune = 0;
|
||||||
|
int result = -1;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
SHOWSTRING(path);
|
||||||
|
SHOWPOINTER(func);
|
||||||
|
SHOWVALUE(depth);
|
||||||
|
SHOWVALUE(flags);
|
||||||
|
|
||||||
|
if(path == NULL)
|
||||||
|
{
|
||||||
|
SHOWMSG("NULL pathname to nftw().");
|
||||||
|
__set_errno(EFAULT);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(func == NULL)
|
||||||
|
{
|
||||||
|
SHOWMSG("No function supplied.");
|
||||||
|
__set_errno(EFAULT);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(depth < 0)
|
||||||
|
{
|
||||||
|
SHOWMSG("Invalid depth.\n");
|
||||||
|
__set_errno(EINVAL);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((flags & ~FTW_ALL_FLAGS) != 0)
|
||||||
|
{
|
||||||
|
SHOWMSG("Bogus flags.");
|
||||||
|
|
||||||
|
__set_errno(EINVAL);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure the path never ends with '/' unless used to indicate parent directory. */
|
||||||
|
|
||||||
|
len = strlen(path);
|
||||||
|
if(len > 1 && path[len - 1] == '/' && path[len - 2] != '/')
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
base = strdup(path);
|
||||||
|
if(base == NULL)
|
||||||
|
{
|
||||||
|
__set_errno(ENOMEM);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
base[len - 1] = '\0';
|
||||||
|
|
||||||
|
base_index = index_of_end_part(base);
|
||||||
|
|
||||||
|
result = walk(base,func,depth,0,flags,base_index,&prune);
|
||||||
|
|
||||||
|
error = __get_errno();
|
||||||
|
free(base);
|
||||||
|
__set_errno(error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
base_index = index_of_end_part(path);
|
||||||
|
|
||||||
|
result = walk(path,func,depth,0,flags,base_index,&prune);
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: ctype.h,v 1.4 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: ctype.h,v 1.5 2005-01-09 15:20:33 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -66,15 +66,14 @@ extern int toupper(int c);
|
|||||||
/*
|
/*
|
||||||
* If requested, reimplement the character classification functions as macros;
|
* If requested, reimplement the character classification functions as macros;
|
||||||
* note that the macro variants ignore the current locale and default to the
|
* note that the macro variants ignore the current locale and default to the
|
||||||
* 'C' locale rules. Note that the characters to be tested must be either
|
* 'C' locale rules.
|
||||||
* signed or unsigned 8 bit values.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __C_MACROS__
|
#ifdef __C_MACROS__
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern const unsigned char * const __ctype_table;
|
extern const unsigned char __ctype_table[];
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -89,17 +88,17 @@ extern const unsigned char * const __ctype_table;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#define isalnum(c) ((__ctype_table[c] & (__CTYPE_DIGIT|__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
|
#define isalnum(c) ((__ctype_table[(c) & 255] & (__CTYPE_DIGIT|__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
|
||||||
#define isalpha(c) ((__ctype_table[c] & (__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
|
#define isalpha(c) ((__ctype_table[(c) & 255] & (__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
|
||||||
#define iscntrl(c) ((__ctype_table[c] & __CTYPE_CONTROL) != 0)
|
#define iscntrl(c) ((__ctype_table[(c) & 255] & __CTYPE_CONTROL) != 0)
|
||||||
#define isdigit(c) ((__ctype_table[c] & __CTYPE_DIGIT) != 0)
|
#define isdigit(c) ((__ctype_table[(c) & 255] & __CTYPE_DIGIT) != 0)
|
||||||
#define isxdigit(c) ((__ctype_table[c] & __CTYPE_HEX_DIGIT) != 0)
|
#define isxdigit(c) ((__ctype_table[(c) & 255] & __CTYPE_HEX_DIGIT) != 0)
|
||||||
#define isgraph(c) ((__ctype_table[c] & (__CTYPE_DIGIT|__CTYPE_PUNCTUATION|__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
|
#define isgraph(c) ((__ctype_table[(c) & 255] & (__CTYPE_DIGIT|__CTYPE_PUNCTUATION|__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
|
||||||
#define ispunct(c) ((__ctype_table[c] & __CTYPE_PUNCTUATION) != 0)
|
#define ispunct(c) ((__ctype_table[(c) & 255] & __CTYPE_PUNCTUATION) != 0)
|
||||||
#define isprint(c) ((__ctype_table[c] & __CTYPE_PRINTABLE) != 0)
|
#define isprint(c) ((__ctype_table[(c) & 255] & __CTYPE_PRINTABLE) != 0)
|
||||||
#define islower(c) ((__ctype_table[c] & __CTYPE_LOWER_CASE) != 0)
|
#define islower(c) ((__ctype_table[(c) & 255] & __CTYPE_LOWER_CASE) != 0)
|
||||||
#define isupper(c) ((__ctype_table[c] & __CTYPE_UPPER_CASE) != 0)
|
#define isupper(c) ((__ctype_table[(c) & 255] & __CTYPE_UPPER_CASE) != 0)
|
||||||
#define isspace(c) ((__ctype_table[c] & __CTYPE_WHITE_SPACE) != 0)
|
#define isspace(c) ((__ctype_table[(c) & 255] & __CTYPE_WHITE_SPACE) != 0)
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dos.h,v 1.5 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: dos.h,v 1.9 2005-03-06 09:04:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -66,6 +66,26 @@ extern "C" {
|
|||||||
* ISO 'C' standard context. It is redefined to WBenchMsg to make it
|
* ISO 'C' standard context. It is redefined to WBenchMsg to make it
|
||||||
* compatible with the original Amiga program startup code which would
|
* compatible with the original Amiga program startup code which would
|
||||||
* refer to the variable under that name.
|
* refer to the variable under that name.
|
||||||
|
*
|
||||||
|
* It is recommended to access the Workbench startup message as part of your
|
||||||
|
* program's main() function, like this:
|
||||||
|
*
|
||||||
|
* int
|
||||||
|
* main(int argc,char ** argv)
|
||||||
|
* {
|
||||||
|
* struct WBStartup * wb_startup_message;
|
||||||
|
*
|
||||||
|
* if(argc == 0)
|
||||||
|
* wb_startup_message = (struct WBStartup *)argv;
|
||||||
|
* else
|
||||||
|
* wb_startup_message = NULL;
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* This approach has the advantage that your program does not rely upon a
|
||||||
|
* global variable initialized by the startup code, whose name you might
|
||||||
|
* not even know exactly.
|
||||||
*/
|
*/
|
||||||
extern struct WBStartup * __WBenchMsg;
|
extern struct WBStartup * __WBenchMsg;
|
||||||
#define WBenchMsg __WBenchMsg
|
#define WBenchMsg __WBenchMsg
|
||||||
@@ -252,6 +272,32 @@ extern unsigned int (* __get_default_stack_size)(void);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This library falls back onto locale.library to perform string collation
|
||||||
|
* in strcoll(), character conversion in toupper() and various other
|
||||||
|
* functions. This may not your intention. To restrict the library to use
|
||||||
|
* only the "C" language locale, declare the following variable in your
|
||||||
|
* code and set it to FALSE, so that it overrides the default settings.
|
||||||
|
* The variable value is checked during program startup and, if set to
|
||||||
|
* TRUE, has the effect of opening locale.library and obtaining the
|
||||||
|
* default locale.
|
||||||
|
*/
|
||||||
|
extern BOOL __open_locale;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Two functions control how this library uses the locale.library API to
|
||||||
|
* perform string collation, character and time conversion, etc.
|
||||||
|
*
|
||||||
|
* __locale_init() opens locale.library and attempts to open the default
|
||||||
|
* locale. If it succeeds, it will return 0 and -1 otherwise.
|
||||||
|
*
|
||||||
|
* __locale_exit() releases the default locale and closes locale.library.
|
||||||
|
*/
|
||||||
|
extern int __locale_init(void);
|
||||||
|
extern void __locale_exit(void);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If linked with -lunix, Unix path names are translated to Amiga path
|
* If linked with -lunix, Unix path names are translated to Amiga path
|
||||||
* names (and the other way round). If you wish to disable this, set the
|
* names (and the other way round). If you wish to disable this, set the
|
||||||
@@ -278,7 +324,7 @@ extern int __translate_relative_path_name(char const ** name_ptr,char *replace,s
|
|||||||
extern void __restore_path_name(char const ** name_ptr,struct name_translation_info * nti);
|
extern void __restore_path_name(char const ** name_ptr,struct name_translation_info * nti);
|
||||||
extern int __translate_amiga_to_unix_path_name(char const ** name_ptr,struct name_translation_info * nti);
|
extern int __translate_amiga_to_unix_path_name(char const ** name_ptr,struct name_translation_info * nti);
|
||||||
extern int __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translation_info * nti);
|
extern int __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translation_info * nti);
|
||||||
extern void __translate_io_error_to_errno(LONG io_error,int * errno_ptr);
|
extern int __translate_io_error_to_errno(LONG io_error);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
102
library/include/ftw.h
Normal file
102
library/include/ftw.h
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* $Id: ftw.h,v 1.1 2005-03-02 12:57:56 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FTW_H
|
||||||
|
#define _FTW_H
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Values passed to the user function (argument #3). */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FTW_F, /* Regular file. */
|
||||||
|
FTW_D, /* Directory. */
|
||||||
|
FTW_DP, /* Directory, already visited. (nftw() only) */
|
||||||
|
FTW_SL, /* Symlink. (nftw() only) */
|
||||||
|
FTW_SLN, /* Broken Symlink. (does not point to an existing file, nftw() only) */
|
||||||
|
FTW_DNR, /* Directory which can not be read (e.g. not enough permissions) */
|
||||||
|
FTW_NS /* Stat failed. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Flags for FTW.quit */
|
||||||
|
#define FTW_SKD (1L<<0) /* Skip directory. */
|
||||||
|
#define FTW_PRUNE (1L<<1) /* Prune traversal. (skip up) */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Flags for nftw() */
|
||||||
|
#define FTW_PHYS (1L<<0)
|
||||||
|
#define FTW_MOUNT (1L<<1) /* Currently unsupported. */
|
||||||
|
#define FTW_DEPTH (1L<<2)
|
||||||
|
#define FTW_CHDIR (1L<<3)
|
||||||
|
#define FTW_ALL_FLAGS (0x0000000f)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct FTW
|
||||||
|
{
|
||||||
|
int quit; /* Flags passed out from the user function to ftw()/nftw() */
|
||||||
|
int base; /* Index of current item from start of string. e.g. 4 for "foo/bar" */
|
||||||
|
int level; /* Current depth. (counted from 0) */
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern int ftw(const char *path,int (*func)(const char *,const struct stat *,int),int depth);
|
||||||
|
extern int nftw(const char *path,int (*func)(const char *,const struct stat *,int,struct FTW *),int depth,int flags);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* _FTW_H */
|
||||||
296
library/include/inttypes.h
Normal file
296
library/include/inttypes.h
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
/*
|
||||||
|
* $Id: inttypes.h,v 1.1 2005-02-04 15:03:13 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INTTYPES_H
|
||||||
|
#define _INTTYPES_H
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Integral types with specified size; contributed by Peter Bengtsson */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STDINT_H
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif /* _STDINT_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* printf() format specifications for different types. */
|
||||||
|
|
||||||
|
/* "Decimal" */
|
||||||
|
#define PRId8 "d"
|
||||||
|
#define PRId16 "d"
|
||||||
|
#define PRId32 "d"
|
||||||
|
#define PRId64 "lld"
|
||||||
|
|
||||||
|
#define PRIdLEAST8 "d"
|
||||||
|
#define PRIdLEAST16 "d"
|
||||||
|
#define PRIdLEAST32 "d"
|
||||||
|
#define PRIdLEAST64 "lld"
|
||||||
|
|
||||||
|
#define PRIdFAST8 "d"
|
||||||
|
#define PRIdFAST16 "d"
|
||||||
|
#define PRIdFAST32 "d"
|
||||||
|
#define PRIdFAST64 "lld"
|
||||||
|
|
||||||
|
#define PRIdPTR "ld"
|
||||||
|
|
||||||
|
/* "Integer" */
|
||||||
|
#define PRIi8 "i"
|
||||||
|
#define PRIi16 "i"
|
||||||
|
#define PRIi32 "i"
|
||||||
|
#define PRIi64 "lli"
|
||||||
|
|
||||||
|
#define PRIiLEAST8 "i"
|
||||||
|
#define PRIiLEAST16 "i"
|
||||||
|
#define PRIiLEAST32 "i"
|
||||||
|
#define PRIiLEAST64 "lli"
|
||||||
|
|
||||||
|
#define PRIiFAST8 "i"
|
||||||
|
#define PRIiFAST16 "i"
|
||||||
|
#define PRIiFAST32 "i"
|
||||||
|
#define PRIiFAST64 "lli"
|
||||||
|
|
||||||
|
#define PRIiPTR "li"
|
||||||
|
|
||||||
|
/* "Unsigned" */
|
||||||
|
#define PRIu8 "u"
|
||||||
|
#define PRIu16 "u"
|
||||||
|
#define PRIu32 "u"
|
||||||
|
#define PRIu64 "llu"
|
||||||
|
|
||||||
|
#define PRIuLEAST8 "u"
|
||||||
|
#define PRIuLEAST16 "u"
|
||||||
|
#define PRIuLEAST32 "u"
|
||||||
|
#define PRIuLEAST64 "llu"
|
||||||
|
|
||||||
|
#define PRIuFAST8 "u"
|
||||||
|
#define PRIuFAST16 "u"
|
||||||
|
#define PRIuFAST32 "u"
|
||||||
|
#define PRIuFAST64 "llu"
|
||||||
|
|
||||||
|
#define PRIuPTR "lu"
|
||||||
|
|
||||||
|
/* "Hexadecimal - lowercase " */
|
||||||
|
#define PRIx8 "x"
|
||||||
|
#define PRIx16 "x"
|
||||||
|
#define PRIx32 "x"
|
||||||
|
#define PRIx64 "llx"
|
||||||
|
|
||||||
|
#define PRIxLEAST8 "x"
|
||||||
|
#define PRIxLEAST16 "x"
|
||||||
|
#define PRIxLEAST32 "x"
|
||||||
|
#define PRIxLEAST64 "llx"
|
||||||
|
|
||||||
|
#define PRIxFAST8 "x"
|
||||||
|
#define PRIxFAST16 "x"
|
||||||
|
#define PRIxFAST32 "x"
|
||||||
|
#define PRIxFAST64 "llx"
|
||||||
|
|
||||||
|
#define PRIxPTR "lx"
|
||||||
|
|
||||||
|
/* "Hexadecimal - Uppercase" */
|
||||||
|
#define PRIX8 "X"
|
||||||
|
#define PRIX16 "X"
|
||||||
|
#define PRIX32 "X"
|
||||||
|
#define PRIX64 "llX"
|
||||||
|
|
||||||
|
#define PRIXLEAST8 "X"
|
||||||
|
#define PRIXLEAST16 "X"
|
||||||
|
#define PRIXLEAST32 "X"
|
||||||
|
#define PRIXLEAST64 "llX"
|
||||||
|
|
||||||
|
#define PRIXFAST8 "X"
|
||||||
|
#define PRIXFAST16 "X"
|
||||||
|
#define PRIXFAST32 "X"
|
||||||
|
#define PRIXFAST64 "llX"
|
||||||
|
|
||||||
|
#define PRIXPTR "lX"
|
||||||
|
|
||||||
|
/* "Octal" */
|
||||||
|
#define PRIo8 "o"
|
||||||
|
#define PRIo16 "o"
|
||||||
|
#define PRIo32 "o"
|
||||||
|
#define PRIo64 "llo"
|
||||||
|
|
||||||
|
#define PRIoLEAST8 "o"
|
||||||
|
#define PRIoLEAST16 "o"
|
||||||
|
#define PRIoLEAST32 "o"
|
||||||
|
#define PRIoLEAST64 "llo"
|
||||||
|
|
||||||
|
#define PRIoFAST8 "o"
|
||||||
|
#define PRIoFAST16 "o"
|
||||||
|
#define PRIoFAST32 "o"
|
||||||
|
#define PRIoFAST64 "llo"
|
||||||
|
|
||||||
|
#define PRIoPTR "lo"
|
||||||
|
|
||||||
|
/* intmax_t is 32 bits for SAS/C, 64-bits for GCC or if using a conforming C99 compiler. */
|
||||||
|
|
||||||
|
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
|
||||||
|
#define PRIdMAX "lld"
|
||||||
|
#define PRIiMAX "lli"
|
||||||
|
#define PRIuMAX "llu"
|
||||||
|
#define PRIxMAX "llx"
|
||||||
|
#define PRIXMAX "llX"
|
||||||
|
#define PRIoMAX "llo"
|
||||||
|
#else
|
||||||
|
#define PRIdMAX "ld"
|
||||||
|
#define PRIiMAX "li"
|
||||||
|
#define PRIuMAX "lu"
|
||||||
|
#define PRIxMAX "lx"
|
||||||
|
#define PRIXMAX "lX"
|
||||||
|
#define PRIoMAX "lo"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* scanf() format specifiers. */
|
||||||
|
|
||||||
|
/* "Decimal" */
|
||||||
|
/* #define SCNd8 "hhd" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNd16 "hd"
|
||||||
|
#define SCNd32 "d"
|
||||||
|
#define SCNd64 "lld"
|
||||||
|
|
||||||
|
/* #define SCNdLEAST8 "hhd" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNdLEAST16 "hd"
|
||||||
|
#define SCNdLEAST32 "d"
|
||||||
|
#define SCNdLEAST64 "lld"
|
||||||
|
|
||||||
|
/* #define SCNdFAST8 "hhd" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNdFAST16 "d"
|
||||||
|
#define SCNdFAST32 "d"
|
||||||
|
#define SCNdFAST64 "lld"
|
||||||
|
|
||||||
|
#define SCNdPTR "d"
|
||||||
|
|
||||||
|
/* "Integer" */
|
||||||
|
/* #define SCNi8 "hhi" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNi16 "hi"
|
||||||
|
#define SCNi32 "i"
|
||||||
|
#define SCNi64 "lli"
|
||||||
|
|
||||||
|
/* #define SCNiLEAST8 "hhi" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNiLEAST16 "hi"
|
||||||
|
#define SCNiLEAST32 "i"
|
||||||
|
#define SCNiLEAST64 "lli"
|
||||||
|
|
||||||
|
/* #define SCNiFAST8 "hhi" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNiFAST16 "i"
|
||||||
|
#define SCNiFAST32 "i"
|
||||||
|
#define SCNiFAST64 "lli"
|
||||||
|
|
||||||
|
#define SCNiPTR "i"
|
||||||
|
|
||||||
|
/* "Unsigned" */
|
||||||
|
/* #define SCNu8 "hhu" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNu16 "hu"
|
||||||
|
#define SCNu32 "u"
|
||||||
|
#define SCNu64 "llu"
|
||||||
|
|
||||||
|
/* #define SCNuLEAST8 "hhu" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNuLEAST16 "hu"
|
||||||
|
#define SCNuLEAST32 "u"
|
||||||
|
#define SCNuLEAST64 "llu"
|
||||||
|
|
||||||
|
/* #define SCNuFAST8 "hhu" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNuFAST16 "u"
|
||||||
|
#define SCNuFAST32 "u"
|
||||||
|
#define SCNuFAST64 "llu"
|
||||||
|
|
||||||
|
#define SCNuPTR "u"
|
||||||
|
|
||||||
|
/* "Hexadecimal" */
|
||||||
|
/* #define SCNx8 "hhx" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNx16 "hx"
|
||||||
|
#define SCNx32 "x"
|
||||||
|
#define SCNx64 "llx"
|
||||||
|
|
||||||
|
/* #define SCNxLEAST8 "hhx" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNxLEAST16 "hx"
|
||||||
|
#define SCNxLEAST32 "x"
|
||||||
|
#define SCNxLEAST64 "llx"
|
||||||
|
|
||||||
|
/* #define SCNxFAST8 "hhx" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNxFAST16 "x"
|
||||||
|
#define SCNxFAST32 "x"
|
||||||
|
#define SCNxFAST64 "llx"
|
||||||
|
|
||||||
|
#define SCNxPTR "x"
|
||||||
|
|
||||||
|
/* "Octal" */
|
||||||
|
/* #define SCNo8 "hho" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNo16 "ho"
|
||||||
|
#define SCNo32 "o"
|
||||||
|
#define SCNo64 "llo"
|
||||||
|
|
||||||
|
/* #define SCNoLEAST8 "hho" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNoLEAST16 "ho"
|
||||||
|
#define SCNoLEAST32 "o"
|
||||||
|
#define SCNoLEAST64 "llo"
|
||||||
|
|
||||||
|
/* #define SCNoFAST8 "hho" */ /* Missing. TODO: Add support for char conversions in scanf() */
|
||||||
|
#define SCNoFAST16 "o"
|
||||||
|
#define SCNoFAST32 "o"
|
||||||
|
#define SCNoFAST64 "llo"
|
||||||
|
|
||||||
|
#define SCNoPTR "o"
|
||||||
|
|
||||||
|
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
|
||||||
|
#define SCNdMAX "lld"
|
||||||
|
#define SCNiMAX "lli"
|
||||||
|
#define SCNuMAX "llu"
|
||||||
|
#define SCNxMAX "llx"
|
||||||
|
#define SCNoMAX "llo"
|
||||||
|
#else
|
||||||
|
#define SCNdMAX "ld"
|
||||||
|
#define SCNiMAX "li"
|
||||||
|
#define SCNuMAX "lu"
|
||||||
|
#define SCNxMAX "lx"
|
||||||
|
#define SCNoMAX "lo"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* TODO: Add the rest of inttypes.h here + in the library. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Missing stuff is among other things atoll(), strtoll(), ...
|
||||||
|
* Then there is the matter of wchar support - Zzzz.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* _INTTYPES_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: limits.h,v 1.4 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: limits.h,v 1.5 2005-01-09 09:40:33 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -36,24 +36,53 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#define CHAR_BIT 8
|
#define CHAR_BIT 8
|
||||||
#define CHAR_MAX 127
|
|
||||||
#define CHAR_MIN -128
|
/****************************************************************************/
|
||||||
#define INT_MAX 2147483647L
|
|
||||||
#define INT_MIN (-2147483647L - 1)
|
#define SCHAR_MIN -128
|
||||||
#define LONG_MAX 2147483647L
|
#define SCHAR_MAX 127
|
||||||
#define LONG_MIN (-2147483647L - 1)
|
#define UCHAR_MAX 255
|
||||||
#define SCHAR_MAX 127
|
|
||||||
#define SCHAR_MIN -128
|
/****************************************************************************/
|
||||||
#define SHRT_MAX 32767
|
|
||||||
|
/*
|
||||||
|
* The following defines the range a 'char' can cover by checking a
|
||||||
|
* preprocessor symbol; we support both SAS/C and GCC here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if (defined(__GNUC__) && defined(__CHAR_UNSIGNED__)) || (defined(__SASC) && defined(_UNSCHAR))
|
||||||
|
|
||||||
|
#define CHAR_MIN 0
|
||||||
|
#define CHAR_MAX 255
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define CHAR_MIN -128
|
||||||
|
#define CHAR_MAX 127
|
||||||
|
|
||||||
|
#endif /* (__GNUC__ && __CHAR_UNSIGNED) || (__SASC && _UNSCHAR) */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#define SHRT_MIN -32768
|
#define SHRT_MIN -32768
|
||||||
#define UCHAR_MAX 255
|
#define SHRT_MAX 32767
|
||||||
#define UINT_MAX 4294967295UL
|
|
||||||
#define ULONG_MAX 4294967295UL
|
|
||||||
#define USHRT_MAX 65535
|
#define USHRT_MAX 65535
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define INT_MIN (-2147483647L - 1)
|
||||||
|
#define INT_MAX 2147483647L
|
||||||
|
#define UINT_MAX 4294967295UL
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define LONG_MIN (-2147483647L - 1)
|
||||||
|
#define LONG_MAX 2147483647L
|
||||||
|
#define ULONG_MAX 4294967295UL
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
/* The following is not part of the ISO 'C' (1994) standard. */
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math.h,v 1.5 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: math.h,v 1.6 2005-02-25 10:14:22 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -85,6 +85,22 @@ extern double tanh(double x);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define M_E 2.7182818284590452354
|
||||||
|
#define M_LOG2E 1.4426950408889634074
|
||||||
|
#define M_LOG10E 0.43429448190325182765
|
||||||
|
#define M_LN2 0.69314718055994530942
|
||||||
|
#define M_LN10 2.30258509299404568402
|
||||||
|
#define M_PI 3.14159265358979323846
|
||||||
|
#define M_PI_2 1.57079632679489661923
|
||||||
|
#define M_PI_4 0.78539816339744830962
|
||||||
|
#define M_1_PI 0.31830988618379067154
|
||||||
|
#define M_2_PI 0.63661977236758134308
|
||||||
|
#define M_2_SQRTPI 1.12837916709551257390
|
||||||
|
#define M_SQRT2 1.41421356237309504880
|
||||||
|
#define M_SQRT1_2 0.70710678118654752440
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
extern double rint(double x);
|
extern double rint(double x);
|
||||||
extern float rintf(float x);
|
extern float rintf(float x);
|
||||||
extern int isinf(double x);
|
extern int isinf(double x);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stddef.h,v 1.2 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: stddef.h,v 1.3 2005-01-08 10:21:28 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -52,7 +52,7 @@ extern "C" {
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
typedef long int ptrdiff_t;
|
typedef int ptrdiff_t;
|
||||||
typedef unsigned int size_t;
|
typedef unsigned int size_t;
|
||||||
typedef unsigned int wchar_t;
|
typedef unsigned int wchar_t;
|
||||||
|
|
||||||
|
|||||||
186
library/include/stdint.h
Normal file
186
library/include/stdint.h
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdint.h,v 1.1 2005-02-04 15:03:14 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _STDINT_H
|
||||||
|
#define _STDINT_H
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* C99 integer type definitions; contributed by Peter Bengtsson */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _LIMITS_H
|
||||||
|
#include <limits.h>
|
||||||
|
#endif /* _LIMITS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Common for all supported compilers. */
|
||||||
|
|
||||||
|
typedef signed char int8_t;
|
||||||
|
typedef signed short int16_t;
|
||||||
|
typedef signed int int32_t;
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
typedef unsigned short uint16_t;
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
|
||||||
|
typedef signed char int_least8_t;
|
||||||
|
typedef signed short int_least16_t;
|
||||||
|
typedef signed int int_least32_t;
|
||||||
|
typedef unsigned char uint_least8_t;
|
||||||
|
typedef unsigned short uint_least16_t;
|
||||||
|
typedef unsigned int uint_least32_t;
|
||||||
|
|
||||||
|
/* This is mostly guesswork. */
|
||||||
|
typedef signed char int_fast8_t;
|
||||||
|
typedef signed int int_fast16_t;
|
||||||
|
typedef signed int int_fast32_t;
|
||||||
|
typedef unsigned char uint_fast8_t;
|
||||||
|
typedef unsigned int uint_fast16_t;
|
||||||
|
typedef unsigned int uint_fast32_t;
|
||||||
|
|
||||||
|
typedef signed long intptr_t;
|
||||||
|
typedef unsigned long uintptr_t;
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
|
||||||
|
typedef signed long long int64_t;
|
||||||
|
typedef unsigned long long uint64_t;
|
||||||
|
typedef signed long long int_least64_t;
|
||||||
|
typedef unsigned long long uint_least64_t;
|
||||||
|
typedef signed long long int_fast64_t;
|
||||||
|
typedef unsigned long long uint_fast64_t;
|
||||||
|
typedef signed long long intmax_t;
|
||||||
|
typedef unsigned long long uintmax_t;
|
||||||
|
#else /* No 64-bit types for SAS/C */
|
||||||
|
typedef signed long intmax_t;
|
||||||
|
typedef unsigned long uintmax_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define INT8_MIN SCHAR_MIN
|
||||||
|
#define INT8_MAX SCHAR_MAX
|
||||||
|
#define UINT8_MAX UCHAR_MAX
|
||||||
|
#define INT16_MIN SHRT_MIN
|
||||||
|
#define INT16_MAX SHRT_MAX
|
||||||
|
#define UINT16_MAX USHRT_MAX
|
||||||
|
#define INT32_MIN INT_MIN
|
||||||
|
#define INT32_MAX INT_MAX
|
||||||
|
#define UINT32_MAX UINT_MAX
|
||||||
|
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
|
||||||
|
#define INT64_MIN LLONG_MIN
|
||||||
|
#define INT64_MAX LLONG_MAX
|
||||||
|
#define UINT64_MAX ULLONG_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define INT_LEAST8_MIN SCHAR_MIN
|
||||||
|
#define INT_LEAST8_MAX SCHAR_MAX
|
||||||
|
#define UINT_LEAST8_MAX UCHAR_MAX
|
||||||
|
#define INT_LEAST16_MIN SHRT_MIN
|
||||||
|
#define INT_LEAST16_MAX SHRT_MAX
|
||||||
|
#define UINT_LEAST16_MAX USHRT_MAX
|
||||||
|
#define INT_LEAST32_MIN INT_MIN
|
||||||
|
#define INT_LEAST32_MAX INT_MAX
|
||||||
|
#define UINT_LEAST32_MAX UINT_MAX
|
||||||
|
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
|
||||||
|
#define INT_LEAST64_MIN LLONG_MIN
|
||||||
|
#define INT_LEAST64_MAX LLONG_MAX
|
||||||
|
#define UINT_LEAST64_MAX ULLONG_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define INT_FAST8_MIN SCHAR_MIN
|
||||||
|
#define INT_FAST8_MAX SCHAR_MAX
|
||||||
|
#define UINT_FAST8_MAX UCHAR_MAX
|
||||||
|
#define INT_FAST16_MIN INT_MIN
|
||||||
|
#define INT_FAST16_MAX INT_MAX
|
||||||
|
#define UINT_FAST16_MAX UINT_MAX
|
||||||
|
#define INT_FAST32_MIN INT_MIN
|
||||||
|
#define INT_FAST32_MAX INT_MAX
|
||||||
|
#define UINT_FAST32_MAX UINT_MAX
|
||||||
|
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
|
||||||
|
#define INT_FAST64_MIN LLONG_MIN
|
||||||
|
#define INT_FAST64_MAX LLONG_MAX
|
||||||
|
#define UINT_FAST64_MAX ULLONG_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define INTPTR_MIN LONG_MIN
|
||||||
|
#define INTPTR_MAX LONG_MAX
|
||||||
|
#define UINTPTR_MAX ULONG_MAX
|
||||||
|
|
||||||
|
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
|
||||||
|
#define INTMAX_MIN LLONG_MIN
|
||||||
|
#define INTMAX_MAX LLONG_MAX
|
||||||
|
#define UINTMAX_MAX ULLONG_MAX
|
||||||
|
#else
|
||||||
|
#define INTMAX_MIN LONG_MIN
|
||||||
|
#define INTMAX_MAX LONG_MAX
|
||||||
|
#define UINTMAX_MAX ULONG_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__cpluspluis) || defined(__STDC_LIMIT_MACROS)
|
||||||
|
/* sigatomic_t is an int. */
|
||||||
|
#define SIG_ATOMIC_MIN INT_MIN
|
||||||
|
#define SIG_ATOMIC_MAX INT_MAX
|
||||||
|
|
||||||
|
/* Maximum value of size_t */
|
||||||
|
#define SIZE_MAX UINT_MAX
|
||||||
|
#endif /* not C++ or LIMIT_MACROS */
|
||||||
|
|
||||||
|
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS)
|
||||||
|
#define INT8_C(x) x
|
||||||
|
#define INT16_C(x) x
|
||||||
|
#define INT32_C(x) x
|
||||||
|
#define INT64_C(x) x ## LL
|
||||||
|
|
||||||
|
#define UINT8_C(x) x ## U
|
||||||
|
#define UINT16_C(x) x ## U
|
||||||
|
#define UINT32_C(x) x ## U
|
||||||
|
#define UINT64_C(x) x ## ULL
|
||||||
|
|
||||||
|
#if defined(__GNUC__) || ((__STDC_VERSION__ +0) >= 199901L)
|
||||||
|
#define INTMAX_C(x) x ## LL
|
||||||
|
#define UINTMAX_C(x) x ## ULL
|
||||||
|
#else
|
||||||
|
#define INTMAX_C(x) x ## L
|
||||||
|
#define UINTMAX_C(x) x ## UL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* not C++ or CONSTANT_MACROS */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* _STDINT_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio.h,v 1.5 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: stdio.h,v 1.9 2005-03-06 09:04:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -249,20 +249,11 @@ extern char *tmpnam(char *buf);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* A special buffer flush routine which returns the last character written
|
|
||||||
* in case of success and EOF in case of failure. This is used by the
|
|
||||||
* putc() macro defined below.
|
|
||||||
*/
|
|
||||||
extern int __flush(FILE *stream);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* fgetc() implemented as a "simple" macro; note that fgetc() does much more than
|
* fgetc() implemented as a "simple" macro; note that fgetc() does much more than
|
||||||
* can be conveniently expressed as a macro!
|
* can be conveniently expressed as a macro!
|
||||||
*/
|
*/
|
||||||
#define getc(f) \
|
#define __getc_unlocked(f) \
|
||||||
(((((FILE *)(f))->flags & (__FILE_IN_USE|__FILE_READABLE|__FILE_EOF)) == (__FILE_IN_USE|__FILE_READABLE) && \
|
(((((FILE *)(f))->flags & (__FILE_IN_USE|__FILE_READABLE|__FILE_EOF)) == (__FILE_IN_USE|__FILE_READABLE) && \
|
||||||
(((FILE *)(f))->flags & __FILE_BUFFER_MASK) != _IONBF && \
|
(((FILE *)(f))->flags & __FILE_BUFFER_MASK) != _IONBF && \
|
||||||
((FILE *)(f))->position < ((FILE *)(f))->num_read_bytes) ? \
|
((FILE *)(f))->position < ((FILE *)(f))->num_read_bytes) ? \
|
||||||
@@ -275,7 +266,7 @@ extern int __flush(FILE *stream);
|
|||||||
* fputc() implemented as a "simple" macro; note that fputc() does much more than
|
* fputc() implemented as a "simple" macro; note that fputc() does much more than
|
||||||
* can be conveniently expressed as a macro!
|
* can be conveniently expressed as a macro!
|
||||||
*/
|
*/
|
||||||
#define putc(c,f) \
|
#define __putc_unlocked(c,f) \
|
||||||
(((((FILE *)(f))->flags & (__FILE_IN_USE|__FILE_WRITABLE)) == (__FILE_IN_USE|__FILE_WRITABLE) && \
|
(((((FILE *)(f))->flags & (__FILE_IN_USE|__FILE_WRITABLE)) == (__FILE_IN_USE|__FILE_WRITABLE) && \
|
||||||
(((FILE *)(f))->flags & __FILE_BUFFER_MASK) != _IONBF && \
|
(((FILE *)(f))->flags & __FILE_BUFFER_MASK) != _IONBF && \
|
||||||
(((FILE *)(f))->num_write_bytes < ((FILE *)(f))->size)) ? \
|
(((FILE *)(f))->num_write_bytes < ((FILE *)(f))->size)) ? \
|
||||||
@@ -288,6 +279,25 @@ extern int __flush(FILE *stream);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
|
||||||
|
#define getc(f) (flockfile(f), __unlockfile((f),__getc_unlocked(f)))
|
||||||
|
#define putc(c,f) (flockfile(f), __unlockfile((f),__putc_unlocked((c),(f))))
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define getc(f) __getc_unlocked(f)
|
||||||
|
#define putc(c,f) __putc_unlocked((c),(f))
|
||||||
|
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define getchar() getc(stdin)
|
||||||
|
#define putchar(c) putc((c),stdout)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If requested, reimplement some of the file I/O routines as macros.
|
* If requested, reimplement some of the file I/O routines as macros.
|
||||||
*/
|
*/
|
||||||
@@ -296,8 +306,6 @@ extern int __flush(FILE *stream);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#define getchar() getc(stdin)
|
|
||||||
#define putchar(c) putc((c),stdout)
|
|
||||||
#define clearerr(file) ((void)((file)->flags &= ~(__FILE_EOF|__FILE_ERROR)))
|
#define clearerr(file) ((void)((file)->flags &= ~(__FILE_EOF|__FILE_ERROR)))
|
||||||
#define feof(file) (((file)->flags & __FILE_EOF) != 0)
|
#define feof(file) (((file)->flags & __FILE_EOF) != 0)
|
||||||
#define ferror(file) (((file)->flags & __FILE_ERROR) != 0)
|
#define ferror(file) (((file)->flags & __FILE_ERROR) != 0)
|
||||||
@@ -316,6 +324,38 @@ extern int __flush(FILE *stream);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A special buffer flush routine which returns the last character written
|
||||||
|
* in case of success and EOF in case of failure. This is used by the
|
||||||
|
* __putc_unlocked() macro defined above.
|
||||||
|
*/
|
||||||
|
extern int __flush(FILE *stream);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A special function which returns the input character. This is used by
|
||||||
|
* the __getc_unlocked() macro defined above.
|
||||||
|
*/
|
||||||
|
extern int __unlockfile(FILE *stream,int c);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern int getc_unlocked(FILE *stream);
|
||||||
|
extern int getchar_unlocked(void);
|
||||||
|
extern int putc_unlocked(int c,FILE *stream);
|
||||||
|
extern int putchar_unlocked(int c);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define getc_unlocked(f) __getc_unlocked(f)
|
||||||
|
#define putc_unlocked(c,f) __putc_unlocked((c),(f))
|
||||||
|
|
||||||
|
#define getchar_unlocked() __getc_unlocked(stdin)
|
||||||
|
#define putchar_unlocked(c) __putc_unlocked((c),stdout)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
extern FILE * fdopen(int file_descriptor, const char * type);
|
extern FILE * fdopen(int file_descriptor, const char * type);
|
||||||
extern int fileno(FILE * file);
|
extern int fileno(FILE * file);
|
||||||
extern int asprintf(char **ret, const char *format, ...);
|
extern int asprintf(char **ret, const char *format, ...);
|
||||||
@@ -326,6 +366,30 @@ extern FILE * popen(const char *command, const char *type);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern void flockfile(FILE * file);
|
||||||
|
extern void funlockfile(FILE * file);
|
||||||
|
extern int ftrylockfile(FILE * file);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define flockfile(file) ((void)0)
|
||||||
|
#define funlockfile(file) ((void)0)
|
||||||
|
#define ftrylockfile(file) (0)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
extern int vasprintf(char **ret,const char *format,va_list arg);
|
extern int vasprintf(char **ret,const char *format,va_list arg);
|
||||||
|
|
||||||
#ifdef __MEM_DEBUG
|
#ifdef __MEM_DEBUG
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib.h,v 1.5 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: stdlib.h,v 1.8 2005-03-02 12:57:56 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -149,8 +149,17 @@ extern long atol(const char *str);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern int rand_r(unsigned int * seed);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* These functions are unavailable under SAS/C for lack of a
|
||||||
|
"long long" data type. */
|
||||||
|
#if ! defined(__SASC)
|
||||||
extern long long strtoll(const char *str, char **ptr, int base);
|
extern long long strtoll(const char *str, char **ptr, int base);
|
||||||
extern unsigned long long strtoull(const char *str, char **ptr, int base);
|
extern unsigned long long strtoull(const char *str, char **ptr, int base);
|
||||||
|
extern long long atoll(const char *str);
|
||||||
|
#endif /* __SASC */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: strings.h,v 1.3 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: strings.h,v 1.4 2005-03-02 12:57:56 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -52,9 +52,10 @@ extern "C" {
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* These two come from 4.4BSD. */
|
/* These come from 4.4BSD. */
|
||||||
extern int strcasecmp(const char *s1, const char *s2);
|
extern int strcasecmp(const char *s1, const char *s2);
|
||||||
extern int strncasecmp(const char *s1, const char *s2, size_t len);
|
extern int strncasecmp(const char *s1, const char *s2, size_t len);
|
||||||
|
extern int ffs(int i);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stat.h,v 1.3 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: stat.h,v 1.4 2005-03-10 11:40:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -79,6 +79,15 @@ extern "C" {
|
|||||||
#define S_IWOTH 0000002 /* W for other */
|
#define S_IWOTH 0000002 /* W for other */
|
||||||
#define S_IXOTH 0000001 /* X for other */
|
#define S_IXOTH 0000001 /* X for other */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Aliases for the owner RWX mask. */
|
||||||
|
#define S_IREAD S_IRUSR
|
||||||
|
#define S_IWRITE S_IWUSR
|
||||||
|
#define S_IEXEC S_IXUSR
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#define S_IFMT 0170000 /* type of file */
|
#define S_IFMT 0170000 /* type of file */
|
||||||
#define S_IFIFO 0010000 /* named pipe (fifo) */
|
#define S_IFIFO 0010000 /* named pipe (fifo) */
|
||||||
#define S_IFDIR 0040000 /* directory */
|
#define S_IFDIR 0040000 /* directory */
|
||||||
@@ -87,6 +96,8 @@ extern "C" {
|
|||||||
#define S_IFLNK 0120000 /* symbolic link */
|
#define S_IFLNK 0120000 /* symbolic link */
|
||||||
#define S_IFSOCK 0140000 /* socket */
|
#define S_IFSOCK 0140000 /* socket */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) /* directory */
|
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) /* directory */
|
||||||
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) /* regular file */
|
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) /* regular file */
|
||||||
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) /* symbolic link */
|
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) /* symbolic link */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: types.h,v 1.3 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: types.h,v 1.4 2005-02-20 15:46:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -53,7 +53,7 @@ typedef unsigned int gid_t;
|
|||||||
typedef unsigned int ino_t;
|
typedef unsigned int ino_t;
|
||||||
typedef unsigned int mode_t;
|
typedef unsigned int mode_t;
|
||||||
typedef unsigned int nlink_t;
|
typedef unsigned int nlink_t;
|
||||||
typedef int off_t;
|
typedef long int off_t;
|
||||||
typedef int pid_t;
|
typedef int pid_t;
|
||||||
typedef unsigned int rlim_t;
|
typedef unsigned int rlim_t;
|
||||||
typedef int ssize_t;
|
typedef int ssize_t;
|
||||||
|
|||||||
74
library/include/sys/utsname.h
Normal file
74
library/include/sys/utsname.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* $Id: utsname.h,v 1.1 2005-03-02 12:57:56 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SYS_UTSNAME_H
|
||||||
|
#define _SYS_UTSNAME_H
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define SYS_NMLN 32
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct utsname
|
||||||
|
{
|
||||||
|
char sysname[SYS_NMLN]; /* OS Name ("AmigaOS") */
|
||||||
|
char nodename[SYS_NMLN]; /* Usually Hostname, but there appears to be no standard. */
|
||||||
|
char release[SYS_NMLN]; /* Release e.g. "51.1" (The Version of version.library) */
|
||||||
|
char version[SYS_NMLN]; /* Version e.h. "4.0" (OS Version) */
|
||||||
|
char machine[SYS_NMLN]; /* Machine e.g. "m68k" or "ppc" */
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern int uname(struct utsname *);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* _SYS_UTSNAME_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd.h,v 1.8 2005-01-02 09:07:21 obarthel Exp $
|
* $Id: unistd.h,v 1.9 2005-02-04 15:03:14 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -98,6 +98,8 @@ extern void usleep(unsigned long microseconds);
|
|||||||
extern int getopt(int argc, char * argv[], char *opts);
|
extern int getopt(int argc, char * argv[], char *opts);
|
||||||
extern pid_t getpid(void);
|
extern pid_t getpid(void);
|
||||||
extern char *realpath(const char *file_name, char *resolved_name);
|
extern char *realpath(const char *file_name, char *resolved_name);
|
||||||
|
extern int fsync(int file_descriptor);
|
||||||
|
extern int fdatasync(int file_descriptor);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: locale_headers.h,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: locale_headers.h,v 1.6 2005-02-28 10:07:30 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -53,9 +53,9 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#ifndef _STDLIB_LOCALE_UTILITY_H
|
#ifndef _STDLIB_HEADERS_H
|
||||||
#include "stdlib_locale_utility.h"
|
#include "stdlib_headers.h"
|
||||||
#endif /* _STDLIB_LOCALE_UTILITY_H */
|
#endif /* _STDLIB_HEADERS_H */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -78,6 +78,28 @@ extern char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern void __locale_lock(void);
|
||||||
|
extern void __locale_unlock(void);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define __locale_lock() ((void)0)
|
||||||
|
#define __locale_unlock() ((void)0)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
extern void __close_all_locales(void);
|
extern void __close_all_locales(void);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: locale_init_exit.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: locale_init_exit.c,v 1.8 2005-03-03 14:20:55 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -63,6 +63,8 @@ char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
|
|||||||
void
|
void
|
||||||
__close_all_locales(void)
|
__close_all_locales(void)
|
||||||
{
|
{
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__LocaleBase != NULL)
|
if(__LocaleBase != NULL)
|
||||||
{
|
{
|
||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
@@ -86,14 +88,19 @@ __close_all_locales(void)
|
|||||||
CloseLocale(__locale_table[LC_ALL]);
|
CloseLocale(__locale_table[LC_ALL]);
|
||||||
__locale_table[LC_ALL] = NULL;
|
__locale_table[LC_ALL] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
CLIB_DESTRUCTOR(__locale_exit)
|
void
|
||||||
|
__locale_exit(void)
|
||||||
{
|
{
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(__LocaleBase != NULL)
|
if(__LocaleBase != NULL)
|
||||||
{
|
{
|
||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
@@ -120,48 +127,140 @@ CLIB_DESTRUCTOR(__locale_exit)
|
|||||||
__LocaleBase = NULL;
|
__LocaleBase = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
LEAVE();
|
LEAVE();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
CLIB_CONSTRUCTOR(__locale_init)
|
int
|
||||||
|
__locale_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int result = -1;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
for(i = 0 ; i < NUM_LOCALES ; i++)
|
|
||||||
strcpy(__locale_name_table[i],"C");
|
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
|
||||||
__LocaleBase = OpenLibrary("locale.library",38);
|
__locale_lock();
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
if(__LocaleBase == NULL)
|
||||||
{
|
{
|
||||||
if (__LocaleBase != NULL)
|
__LocaleBase = OpenLibrary("locale.library",38);
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
{
|
{
|
||||||
__ILocale = (struct LocaleIFace *)GetInterface(__LocaleBase, "main", 1, 0);
|
if (__LocaleBase != NULL)
|
||||||
if(__ILocale == NULL)
|
|
||||||
{
|
{
|
||||||
CloseLibrary(__LocaleBase);
|
__ILocale = (struct LocaleIFace *)GetInterface(__LocaleBase, "main", 1, 0);
|
||||||
__LocaleBase = NULL;
|
if(__ILocale == NULL)
|
||||||
|
{
|
||||||
|
CloseLibrary(__LocaleBase);
|
||||||
|
__LocaleBase = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
}
|
}
|
||||||
#endif /* __amigaos4__ */
|
|
||||||
|
|
||||||
if(__LocaleBase != NULL)
|
if(__LocaleBase != NULL && __default_locale == NULL)
|
||||||
{
|
{
|
||||||
DECLARE_LOCALEBASE();
|
DECLARE_LOCALEBASE();
|
||||||
|
|
||||||
__default_locale = OpenLocale(NULL);
|
__default_locale = OpenLocale(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(__default_locale != NULL)
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
RETURN(OK);
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
CONSTRUCTOR_SUCCEED();
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
static struct SignalSemaphore * locale_lock;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
|
__locale_lock(void)
|
||||||
|
{
|
||||||
|
if(locale_lock != NULL)
|
||||||
|
ObtainSemaphore(locale_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
|
__locale_unlock(void)
|
||||||
|
{
|
||||||
|
if(locale_lock != NULL)
|
||||||
|
ReleaseSemaphore(locale_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_DESTRUCTOR(__locale_exit_destructor)
|
||||||
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
__locale_exit();
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
{
|
||||||
|
__delete_semaphore(locale_lock);
|
||||||
|
locale_lock = NULL;
|
||||||
|
}
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_CONSTRUCTOR(__locale_init_constructor)
|
||||||
|
{
|
||||||
|
BOOL success = FALSE;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
#if defined(__THREAD_SAFE)
|
||||||
|
{
|
||||||
|
locale_lock = __create_semaphore();
|
||||||
|
if(locale_lock == NULL)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
#endif /* __THREAD_SAFE */
|
||||||
|
|
||||||
|
for(i = 0 ; i < NUM_LOCALES ; i++)
|
||||||
|
strcpy(__locale_name_table[i],"C");
|
||||||
|
|
||||||
|
if(__open_locale)
|
||||||
|
__locale_init();
|
||||||
|
|
||||||
|
success = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(success);
|
||||||
|
|
||||||
|
if(success)
|
||||||
|
CONSTRUCTOR_SUCCEED();
|
||||||
|
else
|
||||||
|
CONSTRUCTOR_FAIL();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: locale_localeconv.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: locale_localeconv.c,v 1.4 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -41,12 +41,18 @@ struct lconv *
|
|||||||
localeconv(void)
|
localeconv(void)
|
||||||
{
|
{
|
||||||
static struct lconv loc;
|
static struct lconv loc;
|
||||||
struct Locale * numeric_locale = __locale_table[LC_NUMERIC];
|
|
||||||
struct Locale * monetary_locale = __locale_table[LC_MONETARY];
|
struct Locale * numeric_locale;
|
||||||
|
struct Locale * monetary_locale;
|
||||||
struct lconv * result;
|
struct lconv * result;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
|
numeric_locale = __locale_table[LC_NUMERIC];
|
||||||
|
monetary_locale = __locale_table[LC_MONETARY];
|
||||||
|
|
||||||
/* This makes up the current locale settings from the various
|
/* This makes up the current locale settings from the various
|
||||||
* components in use.
|
* components in use.
|
||||||
*/
|
*/
|
||||||
@@ -71,6 +77,8 @@ localeconv(void)
|
|||||||
|
|
||||||
result = &loc;
|
result = &loc;
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stat_data.c,v 1.2 2005-01-02 09:07:08 obarthel Exp $
|
* $Id: locale_open_locale.c,v 1.1 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -31,10 +31,10 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _STAT_HEADERS_H
|
#ifndef _LOCALE_HEADERS_H
|
||||||
#include "stat_headers.h"
|
#include "locale_headers.h"
|
||||||
#endif /* _STAT_HEADERS_H */
|
#endif /* _LOCALE_HEADERS_H */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
mode_t __current_umask = S_IWGRP | S_IWOTH;
|
BOOL __open_locale = TRUE;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: locale_setlocale.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: locale_setlocale.c,v 1.4 2005-02-27 21:58:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -52,11 +52,13 @@ setlocale(int category, const char *locale)
|
|||||||
else
|
else
|
||||||
SHOWSTRING(locale);
|
SHOWSTRING(locale);
|
||||||
|
|
||||||
|
__locale_lock();
|
||||||
|
|
||||||
if(category < LC_ALL || category > LC_TIME)
|
if(category < LC_ALL || category > LC_TIME)
|
||||||
{
|
{
|
||||||
SHOWMSG("invalid category");
|
SHOWMSG("invalid category");
|
||||||
|
|
||||||
errno = EINVAL;
|
__set_errno(EINVAL);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,7 +77,7 @@ setlocale(int category, const char *locale)
|
|||||||
{
|
{
|
||||||
SHOWMSG("locale name is too long");
|
SHOWMSG("locale name is too long");
|
||||||
|
|
||||||
errno = ENAMETOOLONG;
|
__set_errno(ENAMETOOLONG);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,7 +105,7 @@ setlocale(int category, const char *locale)
|
|||||||
{
|
{
|
||||||
SHOWMSG("couldn't open the locale");
|
SHOWMSG("couldn't open the locale");
|
||||||
|
|
||||||
errno = ENOENT;
|
__set_errno(ENOENT);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -155,6 +157,8 @@ setlocale(int category, const char *locale)
|
|||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
|
__locale_unlock();
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 185
|
#define REVISION 189
|
||||||
#define DATE "2.1.2005"
|
#define DATE "5.3.2005"
|
||||||
#define VERS "m.lib 1.185"
|
#define VERS "m.lib 1.189"
|
||||||
#define VSTRING "m.lib 1.185 (2.1.2005)\r\n"
|
#define VSTRING "m.lib 1.189 (5.3.2005)\r\n"
|
||||||
#define VERSTAG "\0$VER: m.lib 1.185 (2.1.2005)"
|
#define VERSTAG "\0$VER: m.lib 1.189 (5.3.2005)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
185
|
189
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 185
|
#define REVISION 189
|
||||||
#define DATE "2.1.2005"
|
#define DATE "5.3.2005"
|
||||||
#define VERS "m881.lib 1.185"
|
#define VERS "m881.lib 1.189"
|
||||||
#define VSTRING "m881.lib 1.185 (2.1.2005)\r\n"
|
#define VSTRING "m881.lib 1.189 (5.3.2005)\r\n"
|
||||||
#define VERSTAG "\0$VER: m881.lib 1.185 (2.1.2005)"
|
#define VERSTAG "\0$VER: m881.lib 1.189 (5.3.2005)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
185
|
189
|
||||||
|
|||||||
206
library/macros.h
206
library/macros.h
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: macros.h,v 1.4 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: macros.h,v 1.15 2005-03-11 11:35:31 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -54,16 +54,6 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#ifndef ZERO
|
|
||||||
#define ZERO ((BPTR)NULL)
|
|
||||||
#endif /* ZERO */
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#define UNIX_TIME_OFFSET 252460800
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#define NUM_ENTRIES(t) (sizeof(t) / sizeof(t[0]))
|
#define NUM_ENTRIES(t) (sizeof(t) / sizeof(t[0]))
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@@ -79,17 +69,157 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Macro to get longword-aligned stack space for a structure
|
/* Macro to get longword-aligned stack space for a structure
|
||||||
* Uses ANSI token catenation to form a name for the char array
|
Uses ANSI token catenation to form a name for the char array
|
||||||
* based on the variable name, then creates an appropriately
|
based on the variable name, then creates an appropriately
|
||||||
* typed pointer to point to the first longword boundary in the
|
typed pointer to point to the first longword boundary in the
|
||||||
* char array allocated.
|
char array allocated. */
|
||||||
*/
|
|
||||||
#define D_S(type, name) \
|
#define D_S(type, name) \
|
||||||
char a_##name[sizeof(type)+3]; \
|
char a_##name[sizeof(type)+3]; \
|
||||||
type *name = (type *)((LONG)(a_##name+3) & ~3)
|
type *name = (type *)((LONG)(a_##name+3) & ~3)
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* BCPL style "NULL"; this should be in <dos/dos.h>. */
|
||||||
|
#ifndef ZERO
|
||||||
|
#define ZERO ((BPTR)NULL)
|
||||||
|
#endif /* ZERO */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Constructor and destructor functions, as used by the library for data
|
||||||
|
initialization and cleanup. These particular functions are invoked by
|
||||||
|
the startup code before and after the main() function is/was called.
|
||||||
|
How this works is very compiler specific. We support three flavours
|
||||||
|
below. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __SASC
|
||||||
|
|
||||||
|
#define CONSTRUCTOR(name,pri) \
|
||||||
|
int __stdargs _STI_##pri##_##name(void); \
|
||||||
|
int __stdargs _STI_##pri##_##name(void)
|
||||||
|
|
||||||
|
#define DESTRUCTOR(name,pri) \
|
||||||
|
int __stdargs _STD_##pri##_##name(void); \
|
||||||
|
int __stdargs _STD_##pri##_##name(void)
|
||||||
|
|
||||||
|
#define CONSTRUCTOR_SUCCEED() \
|
||||||
|
return(0)
|
||||||
|
|
||||||
|
#define CONSTRUCTOR_FAIL() \
|
||||||
|
return(1)
|
||||||
|
|
||||||
|
#endif /* __SASC */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
|
||||||
|
#define CONSTRUCTOR(name,pri) \
|
||||||
|
STATIC VOID __attribute__((used)) name##_ctor(VOID); \
|
||||||
|
STATIC VOID (*__##name##_ctor)(VOID) __attribute__((used,section(".ctors._" #pri))) = name##_ctor; \
|
||||||
|
STATIC VOID name##_ctor(VOID)
|
||||||
|
|
||||||
|
#define DESTRUCTOR(name,pri) \
|
||||||
|
STATIC VOID __attribute__((used)) name##_dtor(VOID); \
|
||||||
|
STATIC VOID (*__##name##_dtor)(VOID) __attribute__((used,section(".dtors._" #pri))) = name##_dtor; \
|
||||||
|
STATIC VOID name##_dtor(VOID)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define CONSTRUCTOR(name,pri) \
|
||||||
|
STATIC VOID __attribute__((constructor)) __ctor##pri##_##name##(VOID); \
|
||||||
|
STATIC void __ctor##pri##_##name##(VOID)
|
||||||
|
|
||||||
|
#define DESTRUCTOR(name,pri) \
|
||||||
|
STATIC VOID __attribute__((destructor)) __dtor##pri##_##name##(VOID); \
|
||||||
|
STATIC VOID __dtor##pri##_##name##(VOID)
|
||||||
|
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
#define CONSTRUCTOR_SUCCEED() \
|
||||||
|
return
|
||||||
|
|
||||||
|
#define CONSTRUCTOR_FAIL() \
|
||||||
|
exit(RETURN_FAIL)
|
||||||
|
|
||||||
|
#endif /* __GNUC__ */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* These macros are for declaring functions to serve as constructors or
|
||||||
|
destructors. In which order these should be invoked is defined by the
|
||||||
|
priority, which is a number in the range 0-999. User-supplied
|
||||||
|
constructor/destructor functions should have priority 0. That way,
|
||||||
|
the user-supplied constructors will be invoked after the library
|
||||||
|
constructors and the user-supplied destructors before the library
|
||||||
|
destructors. */
|
||||||
|
|
||||||
|
#define STDLIB_CONSTRUCTOR(name) CONSTRUCTOR(name, 100)
|
||||||
|
#define STDLIB_DESTRUCTOR(name) DESTRUCTOR(name, 100)
|
||||||
|
|
||||||
|
#define STK_CONSTRUCTOR(name) CONSTRUCTOR(name, 110)
|
||||||
|
#define STK_DESTRUCTOR(name) DESTRUCTOR(name, 110)
|
||||||
|
|
||||||
|
#define STDIO_CONSTRUCTOR(name) CONSTRUCTOR(name, 120)
|
||||||
|
#define STDIO_DESTRUCTOR(name) DESTRUCTOR(name, 120)
|
||||||
|
|
||||||
|
#define FILE_CONSTRUCTOR(name) CONSTRUCTOR(name, 130)
|
||||||
|
#define FILE_DESTRUCTOR(name) DESTRUCTOR(name, 130)
|
||||||
|
|
||||||
|
#define MATH_CONSTRUCTOR(name) CONSTRUCTOR(name, 140)
|
||||||
|
#define MATH_DESTRUCTOR(name) DESTRUCTOR(name, 140)
|
||||||
|
|
||||||
|
#define SOCKET_CONSTRUCTOR(name) CONSTRUCTOR(name, 150)
|
||||||
|
#define SOCKET_DESTRUCTOR(name) DESTRUCTOR(name, 150)
|
||||||
|
|
||||||
|
#define ARG_CONSTRUCTOR(name) CONSTRUCTOR(name, 160)
|
||||||
|
#define ARG_DESTRUCTOR(name) DESTRUCTOR(name, 160)
|
||||||
|
|
||||||
|
#define CLIB_CONSTRUCTOR(name) CONSTRUCTOR(name, 170)
|
||||||
|
#define CLIB_DESTRUCTOR(name) DESTRUCTOR(name, 170)
|
||||||
|
|
||||||
|
#define PROFILE_CONSTRUCTOR(name) CONSTRUCTOR(name, 180)
|
||||||
|
#define PROFILE_DESTRUCTOR(name) DESTRUCTOR(name, 180)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Magic macros for code profiling, SAS/C style. Normally, you would find
|
||||||
|
these in <sprof.h>, which is SAS/C-specific. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __SASC
|
||||||
|
extern void ASM _PROLOG(REG(a0,char *));
|
||||||
|
extern void ASM _EPILOG(REG(a0,char *));
|
||||||
|
|
||||||
|
#if _PROFILE
|
||||||
|
#define PROFILE_OFF() _PROLOG(0L)
|
||||||
|
#define PROFILE_ON() _EPILOG(0L)
|
||||||
|
#else
|
||||||
|
#define PROFILE_OFF() ((void)0)
|
||||||
|
#define PROFILE_ON() ((void)0)
|
||||||
|
#endif /* _PROFILE */
|
||||||
|
#endif /* __SASC */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define PROFILE_OFF() ((void)0)
|
||||||
|
#define PROFILE_ON() ((void)0)
|
||||||
|
#endif /* __GNUC__ */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Special data and function attributes; for OS4 most, if not all of them
|
||||||
|
are in a file called <amiga_compiler.h> which is pulled in by the
|
||||||
|
<exec/types.h> header file. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#ifndef AMIGA_COMPILER_H
|
#ifndef AMIGA_COMPILER_H
|
||||||
|
|
||||||
#ifdef __SASC
|
#ifdef __SASC
|
||||||
@@ -140,7 +270,7 @@
|
|||||||
#define WEAK __attribute__((weak))
|
#define WEAK __attribute__((weak))
|
||||||
#else
|
#else
|
||||||
#define WEAK /* WEAK */
|
#define WEAK /* WEAK */
|
||||||
#endif
|
#endif /* __GNUC__ */
|
||||||
#endif /* WEAK */
|
#endif /* WEAK */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@@ -148,52 +278,20 @@
|
|||||||
#ifndef UNUSED
|
#ifndef UNUSED
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define UNUSED __attribute__((unused))
|
#define UNUSED __attribute__((unused))
|
||||||
#define NOCOMMON __attribute__((nocommon))
|
|
||||||
#else
|
#else
|
||||||
#define UNUSED /* UNUSED */
|
#define UNUSED /* UNUSED */
|
||||||
#define NOCOMMON /* NOCOMMON */
|
#endif /* __GNUC__ */
|
||||||
#endif
|
|
||||||
#endif /* UNUSED */
|
#endif /* UNUSED */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#ifdef __SASC
|
#ifndef NOCOMMON
|
||||||
#define CLIB_CONSTRUCTOR(name) int __stdargs _STI_500_##name(void)
|
|
||||||
#define CLIB_DESTRUCTOR(name) void __stdargs _STD_500_##name(void)
|
|
||||||
#define PROFILE_CONSTRUCTOR(name) int __stdargs _STI_150_##name(void)
|
|
||||||
#define PROFILE_DESTRUCTOR(name) void __stdargs _STD_150_##name(void)
|
|
||||||
#define CONSTRUCTOR_SUCCEED() return(0)
|
|
||||||
#define CONSTRUCTOR_FAIL() return(1)
|
|
||||||
#endif /* __SASC */
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define CLIB_CONSTRUCTOR(name) static void __attribute__((constructor)) name##_ctor(void)
|
#define NOCOMMON __attribute__((nocommon))
|
||||||
#define CLIB_DESTRUCTOR(name) static void __attribute__((destructor)) name##_dtor(void)
|
|
||||||
#define PROFILE_CONSTRUCTOR(name) static void __attribute__((constructor)) name##_ctor(void)
|
|
||||||
#define PROFILE_DESTRUCTOR(name) static void __attribute__((destructor)) name##_dtor(void)
|
|
||||||
#define CONSTRUCTOR_SUCCEED() return
|
|
||||||
#define CONSTRUCTOR_FAIL() exit(RETURN_FAIL) /* ZZZ not a nice thing to do; fix the constructor invocation code! */
|
|
||||||
#endif /* __GNUC__ */
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#ifdef __SASC
|
|
||||||
extern void ASM _PROLOG(REG(a0,char *));
|
|
||||||
extern void ASM _EPILOG(REG(a0,char *));
|
|
||||||
|
|
||||||
#if _PROFILE
|
|
||||||
#define PROFILE_OFF() _PROLOG(0L)
|
|
||||||
#define PROFILE_ON() _EPILOG(0L)
|
|
||||||
#else
|
#else
|
||||||
#define PROFILE_OFF() ((void)0)
|
#define NOCOMMON /* NOCOMMON */
|
||||||
#define PROFILE_ON() ((void)0)
|
|
||||||
#endif /* _PROFILE */
|
|
||||||
#endif /* __SASC */
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define PROFILE_OFF() ((void)0)
|
|
||||||
#define PROFILE_ON() ((void)0)
|
|
||||||
#endif /* __GNUC__ */
|
#endif /* __GNUC__ */
|
||||||
|
#endif /* NOCOMMON */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_acos.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_acos.c,v 1.5 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -97,7 +97,7 @@ ___acos:
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__acos(double x)
|
__acos(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -119,7 +119,7 @@ __acos(double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__acos(double x)
|
__acos(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -153,7 +153,7 @@ qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
|
|||||||
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
|
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
|
||||||
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
|
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__acos(double x)
|
__acos(double x)
|
||||||
{
|
{
|
||||||
double z,p,q,r,w,s,c,df;
|
double z,p,q,r,w,s,c,df;
|
||||||
@@ -227,7 +227,7 @@ acos(double x)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = 0;
|
result = 0;
|
||||||
errno = EDOM;
|
__set_errno(EDOM);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_asin.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_asin.c,v 1.5 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -97,7 +97,7 @@ ___asin:
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__asin(double x)
|
__asin(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -119,7 +119,7 @@ __asin(double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__asin(double x)
|
__asin(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -156,7 +156,7 @@ qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
|
|||||||
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
|
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
|
||||||
|
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__asin(double x)
|
__asin(double x)
|
||||||
{
|
{
|
||||||
double t,w,p,q,c,r,s;
|
double t,w,p,q,c,r,s;
|
||||||
@@ -238,7 +238,7 @@ asin(double x)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = 0;
|
result = 0;
|
||||||
errno = EDOM;
|
__set_errno(EDOM);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_atan.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_atan.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -97,7 +97,7 @@ ___atan:
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__atan(double x)
|
__atan(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -119,7 +119,7 @@ __atan(double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__atan(double x)
|
__atan(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -169,7 +169,7 @@ static const double
|
|||||||
one = 1.0,
|
one = 1.0,
|
||||||
huge = 1.0e300;
|
huge = 1.0e300;
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__atan(double x)
|
__atan(double x)
|
||||||
{
|
{
|
||||||
double w,s1,s2,z;
|
double w,s1,s2,z;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_atan2.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_atan2.c,v 1.6 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -62,7 +62,7 @@ extern double __atan(double x);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__atan2(double y,double x)
|
__atan2(double y,double x)
|
||||||
{
|
{
|
||||||
const double pi = 3.14159265358979323846;
|
const double pi = 3.14159265358979323846;
|
||||||
@@ -108,7 +108,7 @@ __atan2(double y,double x)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = 0;
|
result = 0;
|
||||||
errno = EDOM;
|
__set_errno(EDOM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,7 @@ __atan2(double y,double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__atan(double x)
|
__atan(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -134,7 +134,7 @@ __atan(double x)
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__atan2(double y,double x)
|
__atan2(double y,double x)
|
||||||
{
|
{
|
||||||
double pi,pi_over_2;
|
double pi,pi_over_2;
|
||||||
@@ -187,7 +187,7 @@ __atan2(double y,double x)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = 0;
|
result = 0;
|
||||||
errno = EDOM;
|
__set_errno(EDOM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -209,7 +209,7 @@ pi_o_2 = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */
|
|||||||
pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
|
pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
|
||||||
pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
|
pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__atan2(double y,double x)
|
__atan2(double y,double x)
|
||||||
{
|
{
|
||||||
double z;
|
double z;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_ceil.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_ceil.c,v 1.4 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -97,7 +97,7 @@ ___ceil:
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__ceil(double x)
|
__ceil(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -119,7 +119,7 @@ __ceil(double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__ceil(double x)
|
__ceil(double x)
|
||||||
{
|
{
|
||||||
int rounding_mode, round_up;
|
int rounding_mode, round_up;
|
||||||
@@ -150,10 +150,9 @@ __ceil(double x)
|
|||||||
|
|
||||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
|
|
||||||
static const double huge = 1.0e300;
|
static const double huge = 1.0e300;
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__ceil(double x)
|
__ceil(double x)
|
||||||
{
|
{
|
||||||
int i0,i1,j0;
|
int i0,i1,j0;
|
||||||
@@ -233,6 +232,7 @@ __ceil(double x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
double
|
double
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_cos.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_cos.c,v 1.4 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -97,7 +97,7 @@ ___cos:
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__cos(double x)
|
__cos(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -119,7 +119,7 @@ __cos(double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__cos(double x)
|
__cos(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -137,7 +137,7 @@ __cos(double x)
|
|||||||
|
|
||||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__cos(double x)
|
__cos(double x)
|
||||||
{
|
{
|
||||||
double y[2],z=0.0;
|
double y[2],z=0.0;
|
||||||
@@ -172,6 +172,7 @@ __cos(double x)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_cosh.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_cosh.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -97,7 +97,7 @@ ___cosh:
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__cosh(double x)
|
__cosh(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -119,7 +119,7 @@ __cosh(double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__cosh(double x)
|
__cosh(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -139,7 +139,7 @@ __cosh(double x)
|
|||||||
|
|
||||||
static const double one = 1.0, half=0.5, huge = 1.0e300;
|
static const double one = 1.0, half=0.5, huge = 1.0e300;
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__cosh(double x)
|
__cosh(double x)
|
||||||
{
|
{
|
||||||
double t,w;
|
double t,w;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_exp.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_exp.c,v 1.4 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -97,7 +97,7 @@ ___exp:
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__exp(double x)
|
__exp(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -119,7 +119,7 @@ __exp(double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__exp(double x)
|
__exp(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -155,7 +155,7 @@ P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
|
|||||||
P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
|
P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
|
||||||
P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */
|
P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__exp(double x)
|
__exp(double x)
|
||||||
{
|
{
|
||||||
double y,hi,lo,c,t;
|
double y,hi,lo,c,t;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_fabs.c,v 1.5 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_fabs.c,v 1.6 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -88,7 +88,7 @@ ___fabs:
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__fabs(double x)
|
__fabs(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -110,7 +110,7 @@ __fabs(double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__fabs(double x)
|
__fabs(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -134,7 +134,7 @@ __fabs(double x)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__fabs(double x)
|
__fabs(double x)
|
||||||
{
|
{
|
||||||
double res;
|
double res;
|
||||||
@@ -153,7 +153,7 @@ __fabs(double x)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__fabs(double x)
|
__fabs(double x)
|
||||||
{
|
{
|
||||||
double res;
|
double res;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_floor.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_floor.c,v 1.3 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -97,7 +97,7 @@ ___floor:
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__floor(double x)
|
__floor(double x)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -119,7 +119,7 @@ __floor(double x)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__floor(double x)
|
__floor(double x)
|
||||||
{
|
{
|
||||||
int rounding_mode, round_down;
|
int rounding_mode, round_down;
|
||||||
@@ -153,7 +153,7 @@ __floor(double x)
|
|||||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
static const double huge = 1.0e300;
|
static const double huge = 1.0e300;
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__floor(double x)
|
__floor(double x)
|
||||||
{
|
{
|
||||||
int i0,i1,j0;
|
int i0,i1,j0;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_fmod.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_fmod.c,v 1.5 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__fmod(double x,double y)
|
__fmod(double x,double y)
|
||||||
{
|
{
|
||||||
double q,p,result;
|
double q,p,result;
|
||||||
@@ -79,7 +79,7 @@ __fmod(double x,double y)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__fmod(double x,double y)
|
__fmod(double x,double y)
|
||||||
{
|
{
|
||||||
double result;
|
double result;
|
||||||
@@ -102,7 +102,7 @@ static const double
|
|||||||
one = 1.0,
|
one = 1.0,
|
||||||
Zero[] = {0.0, -0.0,};
|
Zero[] = {0.0, -0.0,};
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__fmod(double x,double y)
|
__fmod(double x,double y)
|
||||||
{
|
{
|
||||||
int n,hx,hy,hz,ix,iy,sx,i;
|
int n,hx,hy,hz,ix,iy,sx,i;
|
||||||
@@ -285,7 +285,7 @@ fmod(double x,double y)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = x;
|
result = x;
|
||||||
errno = EDOM;
|
__set_errno(EDOM);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_frexp.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
|
* $Id: math_frexp.c,v 1.4 2005-02-25 10:14:21 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
|
|
||||||
#if defined(IEEE_FLOATING_POINT_SUPPORT)
|
#if defined(IEEE_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__frexp(double x,int * nptr)
|
__frexp(double x,int * nptr)
|
||||||
{
|
{
|
||||||
int int_exponent = 0;
|
int int_exponent = 0;
|
||||||
@@ -106,7 +106,7 @@ __frexp(double x,int * nptr)
|
|||||||
|
|
||||||
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
#if defined(M68881_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__frexp(double x,int * nptr)
|
__frexp(double x,int * nptr)
|
||||||
{
|
{
|
||||||
double float_exponent;
|
double float_exponent;
|
||||||
@@ -146,7 +146,7 @@ __frexp(double x,int * nptr)
|
|||||||
static const double
|
static const double
|
||||||
two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */
|
two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */
|
||||||
|
|
||||||
INLINE static const double
|
INLINE STATIC const double
|
||||||
__frexp(double x,int * eptr)
|
__frexp(double x,int * eptr)
|
||||||
{
|
{
|
||||||
int hx, ix, lx;
|
int hx, ix, lx;
|
||||||
@@ -189,8 +189,9 @@ frexp(double x,int *nptr)
|
|||||||
{
|
{
|
||||||
if(nptr == NULL)
|
if(nptr == NULL)
|
||||||
{
|
{
|
||||||
result = HUGE_VAL;
|
__set_errno(EFAULT);
|
||||||
errno = EFAULT;
|
|
||||||
|
result = __get_huge_val();
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user