mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
308b1321d5 | ||
|
|
99e6856c11 | ||
|
|
b252f90d66 | ||
|
|
1ed26d0a60 | ||
|
|
4dd74de299 | ||
|
|
3b5a4a32a4 | ||
|
|
7f7ca50d06 | ||
|
|
0ed8ef67ed | ||
|
|
267bdc4be6 | ||
|
|
a7bac89279 | ||
|
|
95f0617964 | ||
|
|
4b3dbd3546 | ||
|
|
b8663a4240 | ||
|
|
aa3ccda8de | ||
|
|
8062f49f1c | ||
|
|
1310865c33 | ||
|
|
2ed76311fd | ||
|
|
3f19d52557 | ||
|
|
7038751f6b | ||
|
|
5d9e4c07a6 | ||
|
|
f49a45f6a8 | ||
|
|
fef99a0181 | ||
|
|
17a0e794c5 | ||
|
|
64f39b51ae | ||
|
|
a7e0bc8e16 | ||
|
|
14595cc0a8 | ||
|
|
8555296691 | ||
|
|
53bb602493 | ||
|
|
a048eadf09 | ||
|
|
51e20cee1d | ||
|
|
618af18519 | ||
|
|
0cbc101798 | ||
|
|
5d508c6e6d | ||
|
|
a4b138e406 | ||
|
|
7d21a272cc | ||
|
|
7ae8399e43 | ||
|
|
0d101fd928 | ||
|
|
6a2db55fc2 |
@@ -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.8 2004-08-25 15:27:27 obarthel Exp $
|
# $Id: GNUmakefile.68k,v 1.13 2004-10-26 16:25:03 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
AR = ar -q
|
AR = ar -q
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
COPY = copy clone
|
COPY = copy clone buf=0
|
||||||
DELETE = delete all quiet
|
DELETE = delete all quiet
|
||||||
MAKEDIR = makedir
|
MAKEDIR = makedir
|
||||||
MAKE = make -f GNUmakefile.68k
|
MAKE = make -f GNUmakefile.68k
|
||||||
@@ -40,7 +40,7 @@ endif
|
|||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
@echo "Compiling $<"
|
@echo "Compiling $<"
|
||||||
@$(CC) -c $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT $<
|
@$(CC) -c $(CFLAGS) $<
|
||||||
|
|
||||||
$(LIBC_OBJS)/%.o : %.c
|
$(LIBC_OBJS)/%.o : %.c
|
||||||
@echo "Compiling $< [$(TYPE):c]"
|
@echo "Compiling $< [$(TYPE):c]"
|
||||||
@@ -147,7 +147,6 @@ C_LIB = \
|
|||||||
fcntl_get_default_file.o \
|
fcntl_get_default_file.o \
|
||||||
libgen_basename.o \
|
libgen_basename.o \
|
||||||
libgen_dirname.o \
|
libgen_dirname.o \
|
||||||
locale_data.o \
|
|
||||||
locale_init_exit.o \
|
locale_init_exit.o \
|
||||||
locale_localeconv.o \
|
locale_localeconv.o \
|
||||||
locale_setlocale.o \
|
locale_setlocale.o \
|
||||||
@@ -307,6 +306,8 @@ C_LIB = \
|
|||||||
stdlib_startup.o \
|
stdlib_startup.o \
|
||||||
stdlib_strtol.o \
|
stdlib_strtol.o \
|
||||||
stdlib_strtoul.o \
|
stdlib_strtoul.o \
|
||||||
|
stdlib_strtoll.o \
|
||||||
|
stdlib_strtoull.o \
|
||||||
stdlib_swapstack.o \
|
stdlib_swapstack.o \
|
||||||
stdlib_sysbase.o \
|
stdlib_sysbase.o \
|
||||||
stdlib_system.o \
|
stdlib_system.o \
|
||||||
@@ -316,7 +317,6 @@ C_LIB = \
|
|||||||
stdlib_udivsi4.o \
|
stdlib_udivsi4.o \
|
||||||
stdlib_umodsi3.o \
|
stdlib_umodsi3.o \
|
||||||
stdlib_unsetenv.o \
|
stdlib_unsetenv.o \
|
||||||
stdlib_usergroup.o \
|
|
||||||
stdlib_wildcard_expand.o \
|
stdlib_wildcard_expand.o \
|
||||||
strings_strcasecmp.o \
|
strings_strcasecmp.o \
|
||||||
strings_strncasecmp.o \
|
strings_strncasecmp.o \
|
||||||
@@ -362,9 +362,9 @@ C_LIB = \
|
|||||||
time_time.o \
|
time_time.o \
|
||||||
unistd_access.o \
|
unistd_access.o \
|
||||||
unistd_chdir.o \
|
unistd_chdir.o \
|
||||||
|
unistd_chdir_exit.o \
|
||||||
unistd_chown.o \
|
unistd_chown.o \
|
||||||
unistd_currentpathname.o \
|
unistd_currentpathname.o \
|
||||||
unistd_data.o \
|
|
||||||
unistd_dup.o \
|
unistd_dup.o \
|
||||||
unistd_dup2.o \
|
unistd_dup2.o \
|
||||||
unistd_fchown.o \
|
unistd_fchown.o \
|
||||||
@@ -382,8 +382,11 @@ C_LIB = \
|
|||||||
unistd_realpath.o \
|
unistd_realpath.o \
|
||||||
unistd_sleep.o \
|
unistd_sleep.o \
|
||||||
unistd_symlink.o \
|
unistd_symlink.o \
|
||||||
|
unistd_timer.o \
|
||||||
|
unistd_time_delay.o \
|
||||||
unistd_truncate.o \
|
unistd_truncate.o \
|
||||||
unistd_unlink.o \
|
unistd_unlink.o \
|
||||||
|
unistd_usleep.o \
|
||||||
utime_utime.o
|
utime_utime.o
|
||||||
|
|
||||||
UNIX_LIB = \
|
UNIX_LIB = \
|
||||||
@@ -422,6 +425,7 @@ UNIX_LIB = \
|
|||||||
stdlib_system.o \
|
stdlib_system.o \
|
||||||
unistd_access.o \
|
unistd_access.o \
|
||||||
unistd_chdir.o \
|
unistd_chdir.o \
|
||||||
|
unistd_chdir_exit.o \
|
||||||
unistd_chown.o \
|
unistd_chown.o \
|
||||||
unistd_getcwd.o \
|
unistd_getcwd.o \
|
||||||
unistd_lchown.o \
|
unistd_lchown.o \
|
||||||
@@ -684,7 +688,6 @@ LIBS_68K := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libu
|
|||||||
$(LIBNET_OBJS)/libnet.a $(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
|
$(LIBNET_OBJS)/libnet.a $(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
|
||||||
$(LIBM_OBJS)/libm.a
|
$(LIBM_OBJS)/libm.a
|
||||||
LIBS_020 := $(LIBM881_OBJS)/libm881.a $(LIBS_68K)
|
LIBS_020 := $(LIBM881_OBJS)/libm881.a $(LIBS_68K)
|
||||||
#LIBS_020 := $(LIBS_68K)
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
@@ -710,8 +713,8 @@ all: \
|
|||||||
lib/mainnb.o \
|
lib/mainnb.o \
|
||||||
lib/mainb.o \
|
lib/mainb.o \
|
||||||
lib/mainb32.o \
|
lib/mainb32.o \
|
||||||
lib/libm.a \
|
|
||||||
lib/libm020/libm.a \
|
lib/libm020/libm.a \
|
||||||
|
lib/libm.a \
|
||||||
lib/libb/libm.a \
|
lib/libb/libm.a \
|
||||||
lib/libb/libm020/libm.a \
|
lib/libb/libm020/libm.a \
|
||||||
lib/libb32/libm020/libm.a
|
lib/libb32/libm020/libm.a
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: GNUmakefile.os4,v 1.6 2004-08-25 15:27:27 obarthel Exp $
|
# $Id: GNUmakefile.os4,v 1.12 2004-10-07 11:03:46 tfrieden Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -53,7 +53,7 @@ endif
|
|||||||
|
|
||||||
%.o : %.c
|
%.o : %.c
|
||||||
@echo "Compiling $<"
|
@echo "Compiling $<"
|
||||||
@$(CC) -c $(CFLAGS) -DPPC_FLOATING_POINT_SUPPORT $<
|
@$(CC) -c $(CFLAGS) $<
|
||||||
|
|
||||||
$(LIBC_OBJS)/%.o : %.c
|
$(LIBC_OBJS)/%.o : %.c
|
||||||
@echo "Compiling $< [$(TYPE):c]"
|
@echo "Compiling $< [$(TYPE):c]"
|
||||||
@@ -65,7 +65,7 @@ $(LIBUNIX_OBJS)/%.o : %.c
|
|||||||
|
|
||||||
$(LIBM_OBJS)/%.o : %.c
|
$(LIBM_OBJS)/%.o : %.c
|
||||||
@echo "Compiling $< [$(TYPE):m]"
|
@echo "Compiling $< [$(TYPE):m]"
|
||||||
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) -DPPC_FLOATING_POINT_SUPPORT $<
|
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) $(FLOAT_TYPE) $<
|
||||||
|
|
||||||
$(LIBSTACK_OBJS)/%.o : %.c
|
$(LIBSTACK_OBJS)/%.o : %.c
|
||||||
@echo "Compiling $< [$(TYPE):stack]"
|
@echo "Compiling $< [$(TYPE):stack]"
|
||||||
@@ -87,10 +87,17 @@ $(LIBAMIGA_OBJS)/%.o : %.c
|
|||||||
|
|
||||||
ifeq (small_data,$(TYPE))
|
ifeq (small_data,$(TYPE))
|
||||||
CODE_TYPE := -msdata=sysv -DSMALL_DATA
|
CODE_TYPE := -msdata=sysv -DSMALL_DATA
|
||||||
|
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (large_data,$(TYPE))
|
ifeq (large_data,$(TYPE))
|
||||||
CODE_TYPE := -msdata=data
|
CODE_TYPE := -msdata=data
|
||||||
|
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq (large_data_softfloat, $(TYPE))
|
||||||
|
CODE_TYPE := -msdata=data -msoft-float
|
||||||
|
FLOAT_TYPE :=
|
||||||
endif
|
endif
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
@@ -101,7 +108,7 @@ WARNINGS = \
|
|||||||
|
|
||||||
INCLUDES = -Iinclude -I. -I$(SDK_INCLUDE)
|
INCLUDES = -Iinclude -I. -I$(SDK_INCLUDE)
|
||||||
OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -fno-builtin -D__USE_INLINE__ -Wa,-mregnames
|
OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -fno-builtin -D__USE_INLINE__ -Wa,-mregnames
|
||||||
OPTIMIZE = -O3 -fomit-frame-pointer -funroll-loops
|
OPTIMIZE = -O -fomit-frame-pointer -funroll-loops
|
||||||
#DEBUG = -g
|
#DEBUG = -g
|
||||||
|
|
||||||
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDES)
|
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDES)
|
||||||
@@ -141,7 +148,6 @@ C_LIB = \
|
|||||||
fcntl_get_default_file.o \
|
fcntl_get_default_file.o \
|
||||||
libgen_basename.o \
|
libgen_basename.o \
|
||||||
libgen_dirname.o \
|
libgen_dirname.o \
|
||||||
locale_data.o \
|
|
||||||
locale_init_exit.o \
|
locale_init_exit.o \
|
||||||
locale_localeconv.o \
|
locale_localeconv.o \
|
||||||
locale_setlocale.o \
|
locale_setlocale.o \
|
||||||
@@ -302,12 +308,13 @@ C_LIB = \
|
|||||||
stdlib_startup.o \
|
stdlib_startup.o \
|
||||||
stdlib_strtol.o \
|
stdlib_strtol.o \
|
||||||
stdlib_strtoul.o \
|
stdlib_strtoul.o \
|
||||||
|
stdlib_strtoll.o \
|
||||||
|
stdlib_strtoull.o \
|
||||||
stdlib_swapstack.o \
|
stdlib_swapstack.o \
|
||||||
stdlib_system.o \
|
stdlib_system.o \
|
||||||
stdlib_termination_message.o \
|
stdlib_termination_message.o \
|
||||||
stdlib_threshold.o \
|
stdlib_threshold.o \
|
||||||
stdlib_unsetenv.o \
|
stdlib_unsetenv.o \
|
||||||
stdlib_usergroup.o \
|
|
||||||
stdlib_wildcard_expand.o \
|
stdlib_wildcard_expand.o \
|
||||||
strings_strcasecmp.o \
|
strings_strcasecmp.o \
|
||||||
strings_strncasecmp.o \
|
strings_strncasecmp.o \
|
||||||
@@ -353,9 +360,9 @@ C_LIB = \
|
|||||||
time_time.o \
|
time_time.o \
|
||||||
unistd_access.o \
|
unistd_access.o \
|
||||||
unistd_chdir.o \
|
unistd_chdir.o \
|
||||||
|
unistd_chdir_exit.o \
|
||||||
unistd_chown.o \
|
unistd_chown.o \
|
||||||
unistd_currentpathname.o \
|
unistd_currentpathname.o \
|
||||||
unistd_data.o \
|
|
||||||
unistd_dup.o \
|
unistd_dup.o \
|
||||||
unistd_dup2.o \
|
unistd_dup2.o \
|
||||||
unistd_fchown.o \
|
unistd_fchown.o \
|
||||||
@@ -373,8 +380,11 @@ C_LIB = \
|
|||||||
unistd_realpath.o \
|
unistd_realpath.o \
|
||||||
unistd_sleep.o \
|
unistd_sleep.o \
|
||||||
unistd_symlink.o \
|
unistd_symlink.o \
|
||||||
|
unistd_time_delay.o \
|
||||||
|
unistd_timer.o \
|
||||||
unistd_truncate.o \
|
unistd_truncate.o \
|
||||||
unistd_unlink.o \
|
unistd_unlink.o \
|
||||||
|
unistd_usleep.o \
|
||||||
utime_utime.o
|
utime_utime.o
|
||||||
|
|
||||||
|
|
||||||
@@ -414,6 +424,7 @@ UNIX_LIB = \
|
|||||||
stdlib_system.o \
|
stdlib_system.o \
|
||||||
unistd_access.o \
|
unistd_access.o \
|
||||||
unistd_chdir.o \
|
unistd_chdir.o \
|
||||||
|
unistd_chdir_exit.o \
|
||||||
unistd_chown.o \
|
unistd_chown.o \
|
||||||
unistd_getcwd.o \
|
unistd_getcwd.o \
|
||||||
unistd_lchown.o \
|
unistd_lchown.o \
|
||||||
@@ -682,7 +693,12 @@ all: \
|
|||||||
lib/crtbegin.o \
|
lib/crtbegin.o \
|
||||||
lib/crtend.o \
|
lib/crtend.o \
|
||||||
lib/mainnb.o \
|
lib/mainnb.o \
|
||||||
lib/libm.a
|
lib/libm.a \
|
||||||
|
lib/small-data/libm.a \
|
||||||
|
lib/bcrt0.o \
|
||||||
|
lib/bcrtbegin.o \
|
||||||
|
lib/bcrtend.o \
|
||||||
|
lib/soft-float/libc.a
|
||||||
|
|
||||||
copy:
|
copy:
|
||||||
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
|
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
|
||||||
@@ -695,7 +711,7 @@ clean:
|
|||||||
|
|
||||||
realclean:
|
realclean:
|
||||||
$(MAKE) clean
|
$(MAKE) clean
|
||||||
-$(DELETE) lib small_data large_data
|
-$(DELETE) lib small_data large_data large_data_softfloat
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
@@ -737,6 +753,12 @@ endif
|
|||||||
lib:
|
lib:
|
||||||
-$(MAKEDIR) $@
|
-$(MAKEDIR) $@
|
||||||
|
|
||||||
|
lib/small-data:
|
||||||
|
-$(MAKEDIR) $@
|
||||||
|
|
||||||
|
lib/soft-float:
|
||||||
|
-$(MAKEDIR) $@
|
||||||
|
|
||||||
lib/libm.a: lib
|
lib/libm.a: lib
|
||||||
$(MAKE) TYPE=large_data kitchen_sink
|
$(MAKE) TYPE=large_data kitchen_sink
|
||||||
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
|
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
|
||||||
@@ -745,6 +767,10 @@ lib/small-data/libm.a: lib lib/small-data
|
|||||||
$(MAKE) TYPE=small_data kitchen_sink
|
$(MAKE) TYPE=small_data kitchen_sink
|
||||||
$(COPY) $(foreach file,$(LIBS),small_data/$(file)) lib/small-data
|
$(COPY) $(foreach file,$(LIBS),small_data/$(file)) lib/small-data
|
||||||
|
|
||||||
|
lib/soft-float/libc.a: lib lib/soft-float
|
||||||
|
$(MAKE) TYPE=large_data_softfloat kitchen_sink
|
||||||
|
$(COPY) $(foreach file,$(LIBS),large_data_softfloat/$(file)) lib/soft-float
|
||||||
|
|
||||||
lib/crt0.o : lib crt0.o
|
lib/crt0.o : lib crt0.o
|
||||||
$(COPY) crt0.o lib
|
$(COPY) crt0.o lib
|
||||||
|
|
||||||
@@ -760,6 +786,15 @@ lib/mainnb.o : lib mainnb.o
|
|||||||
lib/mainb.o : lib mainb.o
|
lib/mainb.o : lib mainb.o
|
||||||
$(COPY) mainb.o lib
|
$(COPY) mainb.o lib
|
||||||
|
|
||||||
|
lib/bcrt0.o : lib bcrt0.o
|
||||||
|
$(COPY) bcrt0.o lib
|
||||||
|
|
||||||
|
lib/bcrtbegin.o : lib bcrtbegin.o
|
||||||
|
$(COPY) bcrtbegin.o lib
|
||||||
|
|
||||||
|
lib/bcrtend.o : lib bcrtend.o
|
||||||
|
$(COPY) bcrtend.o lib
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
$(LIBAMIGA_OBJS)/amiga_hookentry.o : amiga_hookentry.c
|
$(LIBAMIGA_OBJS)/amiga_hookentry.o : amiga_hookentry.c
|
||||||
@@ -880,6 +915,13 @@ mainb.o : stdlib_main.c
|
|||||||
@echo "Compiling $<"
|
@echo "Compiling $<"
|
||||||
@$(CC) -o mainb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA stdlib_main.c
|
@$(CC) -o mainb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA stdlib_main.c
|
||||||
|
|
||||||
|
bcrtbegin.o : crtbegin.c
|
||||||
|
$(CC) -o bcrtbegin.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA crtbegin.c
|
||||||
|
|
||||||
|
bcrtend.o : crtend.c
|
||||||
|
$(CC) -o bcrtend.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA crtend.c
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
mkid:
|
mkid:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 175
|
#define REVISION 182
|
||||||
#define DATE "10.9.2004"
|
#define DATE "8.11.2004"
|
||||||
#define VERS "amiga.lib 1.175"
|
#define VERS "amiga.lib 1.182"
|
||||||
#define VSTRING "amiga.lib 1.175 (10.9.2004)\r\n"
|
#define VSTRING "amiga.lib 1.182 (8.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: amiga.lib 1.175 (10.9.2004)"
|
#define VERSTAG "\0$VER: amiga.lib 1.182 (8.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
175
|
182
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 175
|
#define REVISION 182
|
||||||
#define DATE "10.9.2004"
|
#define DATE "8.11.2004"
|
||||||
#define VERS "c.lib 1.175"
|
#define VERS "c.lib 1.182"
|
||||||
#define VSTRING "c.lib 1.175 (10.9.2004)\r\n"
|
#define VSTRING "c.lib 1.182 (8.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: c.lib 1.175 (10.9.2004)"
|
#define VERSTAG "\0$VER: c.lib 1.182 (8.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
175
|
182
|
||||||
|
|||||||
@@ -1,3 +1,102 @@
|
|||||||
|
c.lib 1.182 (8.11.2004)
|
||||||
|
|
||||||
|
- Changed the error abort condition for the %s conversion of the
|
||||||
|
scanf() family. It now matches the abort conditions for all other
|
||||||
|
conversions and no longer ignores whether any other parameters were
|
||||||
|
converted before. This was a quirk in the older implementation.
|
||||||
|
|
||||||
|
- The scanf() family now accepts %E and %G in place of %f and %X in
|
||||||
|
place of %x.
|
||||||
|
|
||||||
|
- Simplified the common code that fopen(), freopen() and fdopen()
|
||||||
|
share and which has to figure out by looking at a file access
|
||||||
|
mode specification which parameters should be used.
|
||||||
|
|
||||||
|
- Dropped error detection in the scanf() family. The EOF has to be
|
||||||
|
good enough. Also, ungetc() failure still leads to error handling.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.181 (26.10.2004)
|
||||||
|
|
||||||
|
- The scanf() family now always returns the number of assignments made
|
||||||
|
unless an error occured or an EOF was hit during conversion before the
|
||||||
|
first assignment could be made.
|
||||||
|
|
||||||
|
- strtok() did not terminate properly if the last token in the string
|
||||||
|
did not end with a separator character but with a '\0' byte. Fixed.
|
||||||
|
|
||||||
|
- The directory scanning functions opendir/closedir did not get the global
|
||||||
|
directory data tracking data structure initialized which later led to
|
||||||
|
Enforcer hits and maybe trashed memory. Fixed.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.180 (23.10.2004)
|
||||||
|
|
||||||
|
- The printf() family now produces no output at all for %e, %f and %g if the
|
||||||
|
floating point support code is disabled. Previously, a minimum field width
|
||||||
|
specification could take effect, printing a series of 0 or blank space
|
||||||
|
characters where no output should have been produced.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.179 (22.10.2004)
|
||||||
|
|
||||||
|
- The scanf() family no longer assumes that a leading '0' indicates that the
|
||||||
|
following digits form an octal number if the conversion type has been
|
||||||
|
specified as already '%x' already.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.178 (7.10.2004)
|
||||||
|
|
||||||
|
- The OS4 version had floating point math support code enabled in all
|
||||||
|
libraries and not just "libm.a". Fixed.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.177 (29.9.2004)
|
||||||
|
|
||||||
|
- Moved the locale initialization/cleanup code into constructors
|
||||||
|
and destructors.
|
||||||
|
|
||||||
|
- The socket cleanup function is now a destructor.
|
||||||
|
|
||||||
|
- The math cleanup function is now a destructor.
|
||||||
|
|
||||||
|
- The wildcard cleanup function is now a destructor.
|
||||||
|
|
||||||
|
- The stdio cleanup function is now a destructor.
|
||||||
|
|
||||||
|
- The stack extension cleanup function is now a destructor.
|
||||||
|
|
||||||
|
- The code that cleans up after the program's current directory
|
||||||
|
was changed is now a destructor function.
|
||||||
|
|
||||||
|
- Moved the initialization/cleanup code for unlink() into constructors
|
||||||
|
and destructors.
|
||||||
|
|
||||||
|
- Moved the initialization/cleanup code for usergroup.library into
|
||||||
|
constructors and destructors.
|
||||||
|
|
||||||
|
- Added usleep(), and created wrapper code that both sleep() and
|
||||||
|
usleep() can use.
|
||||||
|
|
||||||
|
- Added strtoll() and strtoull(), with further changes to <limits.h>
|
||||||
|
and <stdlib.h>.
|
||||||
|
|
||||||
|
- The socket exit code now calls the common stdio function which
|
||||||
|
flushes and shuts down all buffered and unbuffered files.
|
||||||
|
|
||||||
|
- Fixed the stack swapping function which, for reasons unknown, ceased
|
||||||
|
to work...
|
||||||
|
|
||||||
|
- The start time used by clock() is now initialized by a constructor
|
||||||
|
function.
|
||||||
|
|
||||||
|
- NOTE THAT ALL THE CHANGES WITH REGARD TO USE OF DESTRUCTOR AND
|
||||||
|
CONSTRUCTOR FUNCTIONS REQUIRE A COMPLETE REBUILD OF THE LIBRARY! IF
|
||||||
|
YOU DO NOT DO THIS, THE CONSTRUCTOR/DESTRUCTOR FUNCTIONS MAY NOT
|
||||||
|
GET CALLED.
|
||||||
|
|
||||||
|
|
||||||
c.lib 1.175 (10.9.2004)
|
c.lib 1.175 (10.9.2004)
|
||||||
|
|
||||||
- <stdarg.h> now tries to use the compiler supplied, machine specific
|
- <stdarg.h> now tries to use the compiler supplied, machine specific
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: crtbegin.c,v 1.1.1.1 2004-07-26 16:30:22 obarthel Exp $
|
* $Id: crtbegin.c,v 1.3 2004-09-29 16:54:54 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 175
|
#define REVISION 182
|
||||||
#define DATE "10.9.2004"
|
#define DATE "8.11.2004"
|
||||||
#define VERS "debug.lib 1.175"
|
#define VERS "debug.lib 1.182"
|
||||||
#define VSTRING "debug.lib 1.175 (10.9.2004)\r\n"
|
#define VSTRING "debug.lib 1.182 (8.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: debug.lib 1.175 (10.9.2004)"
|
#define VERSTAG "\0$VER: debug.lib 1.182 (8.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
175
|
182
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dirent_data.c,v 1.3 2004-08-07 10:24:04 obarthel Exp $
|
* $Id: dirent_data.c,v 1.4 2004-10-24 20:03:42 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Directories being scanned whose locks need to be freed when shutting down. */
|
/* Directories being scanned whose locks need to be freed when shutting down. */
|
||||||
struct MinList __directory_list;
|
struct MinList NOCOMMON __directory_list;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dirent_headers.h,v 1.1.1.1 2004-07-26 16:30:30 obarthel Exp $
|
* $Id: dirent_headers.h,v 1.2 2004-10-24 20:03:42 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,6 +42,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _MACROS_H
|
||||||
|
#include "macros.h"
|
||||||
|
#endif /* _MACROS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
struct DirectoryHandle
|
struct DirectoryHandle
|
||||||
{
|
{
|
||||||
struct MinNode dh_MinNode;
|
struct MinNode dh_MinNode;
|
||||||
@@ -56,7 +62,7 @@ struct DirectoryHandle
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct MinList __directory_list;
|
extern struct MinList NOCOMMON __directory_list;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: limits.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
* $Id: limits.h,v 1.3 2004-09-20 17:16:07 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -58,6 +58,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define LLONG_MIN (-0x7fffffffffffffffLL-1)
|
||||||
|
#define LLONG_MAX 0x7fffffffffffffffLL
|
||||||
|
#define ULLONG_MAX 0xffffffffffffffffULL
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#define PATH_MAX 1024
|
#define PATH_MAX 1024
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
* $Id: stdlib.h,v 1.3 2004-09-20 17:16:07 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -151,6 +151,11 @@ extern long atol(const char *str);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern long long strtoll(const char *str, char **ptr, int base);
|
||||||
|
extern unsigned long long strtoull(const char *str, char **ptr, int base);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
#if defined(alloca)
|
#if defined(alloca)
|
||||||
#undef alloca
|
#undef alloca
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time.h,v 1.6 2004-09-10 07:39:20 obarthel Exp $
|
* $Id: time.h,v 1.7 2004-09-29 10:15:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -77,6 +77,9 @@ extern "C" {
|
|||||||
#include <devices/timer.h>
|
#include <devices/timer.h>
|
||||||
#endif /* DEVICES_TIMER_H */
|
#endif /* DEVICES_TIMER_H */
|
||||||
|
|
||||||
|
/* Assume that the 'struct timeval' definition is now in place. */
|
||||||
|
#define __TIMEVAL_ALREADY_DEFINED
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /* INCLUDE_VERSION */
|
#endif /* INCLUDE_VERSION */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd.h,v 1.4 2004-08-07 09:15:33 obarthel Exp $
|
* $Id: unistd.h,v 1.6 2004-09-29 14:17:46 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -52,6 +52,13 @@ extern "C" {
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Endianness: we assume a big endian memory layout (for 68k and PowerPC). */
|
||||||
|
#define LITTLE_ENDIAN 1234
|
||||||
|
#define BIG_ENDIAN 4321
|
||||||
|
#define BYTE_ORDER BIG_ENDIAN
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#define STDIN_FILENO 0
|
#define STDIN_FILENO 0
|
||||||
#define STDOUT_FILENO 1
|
#define STDOUT_FILENO 1
|
||||||
#define STDERR_FILENO 2
|
#define STDERR_FILENO 2
|
||||||
@@ -87,6 +94,7 @@ extern int symlink(const char * actual_path, const char * symbolic_path);
|
|||||||
extern int readlink(const char * path_name, char * buffer, int buffer_size);
|
extern int readlink(const char * path_name, char * buffer, int buffer_size);
|
||||||
extern int chdir(const char * path_name);
|
extern int chdir(const char * path_name);
|
||||||
extern unsigned int sleep(unsigned int seconds);
|
extern unsigned int sleep(unsigned int seconds);
|
||||||
|
extern void usleep(unsigned long microseconds);
|
||||||
extern int getopt(int argc, char * argv[], char *opts);
|
extern int getopt(int argc, char * 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);
|
||||||
@@ -200,28 +208,32 @@ extern int h_errno;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern int accept(int sockfd,struct sockaddr *cliaddr,int *addrlen);
|
typedef int socklen_t;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen);
|
||||||
extern int bind(int sockfd,struct sockaddr *name,int namelen);
|
extern int bind(int sockfd,struct sockaddr *name,int namelen);
|
||||||
extern int connect(int sockfd,struct sockaddr *name,int namelen);
|
extern int connect(int sockfd,struct sockaddr *name,socklen_t namelen);
|
||||||
extern struct hostent * gethostbyaddr(const char *addr, int len, int type);
|
extern struct hostent * gethostbyaddr(const char *addr, socklen_t len, int type);
|
||||||
extern struct hostent * gethostbyname(const char *name);
|
extern struct hostent * gethostbyname(const char *name);
|
||||||
extern int gethostname(const char *name, int namelen);
|
extern int gethostname(const char *name, int namelen);
|
||||||
extern struct netent * getnetbyname(const char *name);
|
extern struct netent * getnetbyname(const char *name);
|
||||||
extern int getpeername(int sockfd,struct sockaddr *name,int *namelen);
|
extern int getpeername(int sockfd,struct sockaddr *name,socklen_t *namelen);
|
||||||
extern int getsockname(int sockfd,struct sockaddr *name,int *namelen);
|
extern int getsockname(int sockfd,struct sockaddr *name,socklen_t *namelen);
|
||||||
extern int getsockopt(int sockfd,int level,int optname,void *optval,int *optlen);
|
extern int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen);
|
||||||
extern unsigned long inet_addr(const char *addr);
|
extern unsigned long inet_addr(const char *addr);
|
||||||
extern char * inet_ntoa(struct in_addr in);
|
extern char * inet_ntoa(struct in_addr in);
|
||||||
extern int ioctl(int fd,unsigned long request, ... /* char *arg */);
|
extern int ioctl(int fd,unsigned long request, ... /* char *arg */);
|
||||||
extern int listen(int sockfd,int backlog);
|
extern int listen(int sockfd,int backlog);
|
||||||
extern int recv(int fd,void *buff,size_t nbytes,int flags);
|
extern int recv(int fd,void *buff,size_t nbytes,int flags);
|
||||||
extern int recvfrom(int sockfd,void *buff,int len,int flags,struct sockaddr *from,int *fromlen);
|
extern int recvfrom(int sockfd,void *buff,int len,int flags,struct sockaddr *from,socklen_t *fromlen);
|
||||||
extern int recvmsg(int socket,struct msghdr *msg,int flags);
|
extern int recvmsg(int socket,struct msghdr *msg,int flags);
|
||||||
extern int select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct timeval *timeout);
|
extern int select(int num_fds,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct timeval *timeout);
|
||||||
extern int send(int fd,void *buff,size_t nbytes,int flags);
|
extern int send(int fd,const void *buff,size_t nbytes,int flags);
|
||||||
extern int sendmsg(int socket,struct msghdr *msg,int flags);
|
extern int sendmsg(int socket,struct msghdr *msg,int flags);
|
||||||
extern int sendto(int sockfd,void *buff,int len,int flags,struct sockaddr *to,int tolen);
|
extern int sendto(int sockfd,const void *buff,int len,int flags,struct sockaddr *to,socklen_t tolen);
|
||||||
extern int setsockopt(int sockfd,int level,int optname,void *optval,int optlen);
|
extern int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
|
||||||
extern int shutdown(int socket, int how);
|
extern int shutdown(int socket, int how);
|
||||||
extern int socket(int domain,int type,int protocol);
|
extern int socket(int domain,int type,int protocol);
|
||||||
extern long gethostid(void);
|
extern long gethostid(void);
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* $Id: locale_data.c,v 1.1.1.1 2004-07-26 16:30:35 obarthel Exp $
|
|
||||||
*
|
|
||||||
* :ts=4
|
|
||||||
*
|
|
||||||
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
|
||||||
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* - Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* - Neither the name of Olaf Barthel nor the names of contributors
|
|
||||||
* may be used to endorse or promote products derived from this
|
|
||||||
* software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _LOCALE_HEADERS_H
|
|
||||||
#include "locale_headers.h"
|
|
||||||
#endif /* _LOCALE_HEADERS_H */
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
struct Locale * __default_locale;
|
|
||||||
struct Locale * __locale_table[NUM_LOCALES];
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
char __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: locale_headers.h,v 1.1.1.1 2004-07-26 16:30:35 obarthel Exp $
|
* $Id: locale_headers.h,v 1.2 2004-09-29 19:57:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -69,12 +69,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct Locale * __default_locale;
|
extern struct Locale * NOCOMMON __default_locale;
|
||||||
extern struct Locale * __locale_table[NUM_LOCALES];
|
extern struct Locale * NOCOMMON __locale_table[NUM_LOCALES];
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern char __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
|
extern char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: locale_init_exit.c,v 1.1.1.1 2004-07-26 16:30:35 obarthel Exp $
|
* $Id: locale_init_exit.c,v 1.3 2004-09-29 19:57:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -41,6 +41,25 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct Library * NOCOMMON __LocaleBase;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
struct LocaleIFace * NOCOMMON __ILocale;
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct Locale * NOCOMMON __default_locale;
|
||||||
|
struct Locale * NOCOMMON __locale_table[NUM_LOCALES];
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
char NOCOMMON __locale_name_table[NUM_LOCALES][MAX_LOCALE_NAME_LEN];
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
void
|
||||||
__close_all_locales(void)
|
__close_all_locales(void)
|
||||||
{
|
{
|
||||||
@@ -71,8 +90,7 @@ __close_all_locales(void)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
CLIB_DESTRUCTOR(__locale_exit)
|
||||||
__locale_exit(void)
|
|
||||||
{
|
{
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -107,8 +125,7 @@ __locale_exit(void)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
CLIB_CONSTRUCTOR(__locale_init)
|
||||||
__locale_init(void)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -145,5 +162,6 @@ __locale_init(void)
|
|||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
RETURN(OK);
|
RETURN(OK);
|
||||||
return(OK);
|
|
||||||
|
CONSTRUCTOR_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 175
|
#define REVISION 182
|
||||||
#define DATE "10.9.2004"
|
#define DATE "8.11.2004"
|
||||||
#define VERS "m.lib 1.175"
|
#define VERS "m.lib 1.182"
|
||||||
#define VSTRING "m.lib 1.175 (10.9.2004)\r\n"
|
#define VSTRING "m.lib 1.182 (8.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: m.lib 1.175 (10.9.2004)"
|
#define VERSTAG "\0$VER: m.lib 1.182 (8.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
175
|
182
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 175
|
#define REVISION 182
|
||||||
#define DATE "10.9.2004"
|
#define DATE "8.11.2004"
|
||||||
#define VERS "m881.lib 1.175"
|
#define VERS "m881.lib 1.182"
|
||||||
#define VSTRING "m881.lib 1.175 (10.9.2004)\r\n"
|
#define VSTRING "m881.lib 1.182 (8.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: m881.lib 1.175 (10.9.2004)"
|
#define VERSTAG "\0$VER: m881.lib 1.182 (8.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
175
|
182
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: macros.h,v 1.1.1.1 2004-07-26 16:30:36 obarthel Exp $
|
* $Id: macros.h,v 1.2 2004-09-29 19:57:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -148,8 +148,10 @@
|
|||||||
#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
|
#endif
|
||||||
#endif /* UNUSED */
|
#endif /* UNUSED */
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_fabs.c,v 1.1.1.1 2004-07-26 16:30:42 obarthel Exp $
|
* $Id: math_fabs.c,v 1.4 2004-09-29 14:30:03 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -126,8 +126,14 @@ __fabs(double x)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__PPC__)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
INLINE static const double
|
INLINE static const double
|
||||||
__fabs(double x)
|
__fabs(double x)
|
||||||
{
|
{
|
||||||
@@ -141,10 +147,35 @@ __fabs(double x)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
INLINE static const double
|
||||||
|
__fabs(double x)
|
||||||
|
{
|
||||||
|
double res;
|
||||||
|
|
||||||
|
if(x < 0)
|
||||||
|
res = (-x);
|
||||||
|
else
|
||||||
|
res = x;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __PPC__ */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
double
|
double
|
||||||
fabs(double x)
|
fabs(double x)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_init_exit.c,v 1.3 2004-08-21 18:57:40 obarthel Exp $
|
* $Id: math_init_exit.c,v 1.5 2004-09-29 19:57:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -53,9 +53,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
CLIB_DESTRUCTOR(__math_exit)
|
||||||
__math_exit(void)
|
|
||||||
{
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
#if defined(IEEE_FLOATING_POINT_SUPPORT)
|
#if defined(IEEE_FLOATING_POINT_SUPPORT)
|
||||||
{
|
{
|
||||||
if(MathIeeeSingBasBase != NULL)
|
if(MathIeeeSingBasBase != NULL)
|
||||||
@@ -77,6 +78,8 @@ __math_exit(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* IEEE_FLOATING_POINT_SUPPORT */
|
#endif /* IEEE_FLOATING_POINT_SUPPORT */
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_log.c,v 1.1.1.1 2004-07-26 16:30:49 obarthel Exp $
|
* $Id: math_log.c,v 1.2 2004-09-27 15:06:19 tfrieden Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -135,7 +135,7 @@ __log(double x)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
#if defined(__PPC__)
|
||||||
|
|
||||||
static const double
|
static const double
|
||||||
ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
|
ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_modf.c,v 1.1.1.1 2004-07-26 16:30:50 obarthel Exp $
|
* $Id: math_modf.c,v 1.2 2004-09-27 15:06:19 tfrieden Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -109,7 +109,7 @@ __modf(double x,double *nptr)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
#if defined(__PPC__)
|
||||||
|
|
||||||
INLINE static const double
|
INLINE static const double
|
||||||
__modf(double x,double *nptr)
|
__modf(double x,double *nptr)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_pow.c,v 1.2 2004-08-27 11:40:49 obarthel Exp $
|
* $Id: math_pow.c,v 1.3 2004-09-27 15:06:19 tfrieden Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -171,7 +171,7 @@ __pow(double x,double y)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
#if defined(__PPC__)
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: math_sqrt.c,v 1.2 2004-08-21 18:57:40 obarthel Exp $
|
* $Id: math_sqrt.c,v 1.3 2004-09-27 15:06:19 tfrieden Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -135,7 +135,7 @@ __sqrt(double x)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(PPC_FLOATING_POINT_SUPPORT)
|
#ifdef __PPC__
|
||||||
|
|
||||||
static const double one = 1.0, tiny=1.0e-300;
|
static const double one = 1.0, tiny=1.0e-300;
|
||||||
|
|
||||||
@@ -236,7 +236,7 @@ __sqrt(double x)
|
|||||||
return z;
|
return z;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* PPC_FLOATING_POINT_SUPPORT */
|
#endif
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 175
|
#define REVISION 182
|
||||||
#define DATE "10.9.2004"
|
#define DATE "8.11.2004"
|
||||||
#define VERS "net.lib 1.175"
|
#define VERS "net.lib 1.182"
|
||||||
#define VSTRING "net.lib 1.175 (10.9.2004)\r\n"
|
#define VSTRING "net.lib 1.182 (8.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: net.lib 1.175 (10.9.2004)"
|
#define VERSTAG "\0$VER: net.lib 1.182 (8.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
175
|
182
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
c.lib 1.175 (10.9.2004)
|
c.lib 1.180 (23.10.2004)
|
||||||
|
|
||||||
- The timeval definition in <sys/time.h> can now be used without
|
- The printf() family now produces no output at all for floating point
|
||||||
having to include <exec/types.h> and <devices/timer.h>. Just
|
numbers (%e, %f and %g) if the floating point support code is disabled.
|
||||||
define the __USE_CLIB2_TIMEVAL preprocessor symbol. However,
|
In previous versions of the library some output (series of 0 or blank
|
||||||
this is intended only for code which for certain reasons cannot
|
space characters) could still be produced.
|
||||||
include these header files. Don't use this approach if your
|
|
||||||
code may include <devices/timer.h> at some point.
|
|
||||||
|
|
||||||
- The sprintf() function family did not properly terminate the
|
- The scanf() family no longer ignores a conversion request of
|
||||||
output string if the format string itself was empty. Fixed.
|
type '%x' (hexadecimal) and treats the number to be processed
|
||||||
|
as in octal notation if that number begins with the digit 0.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: smakefile,v 1.7 2004-08-25 15:27:27 obarthel Exp $
|
# $Id: smakefile,v 1.10 2004-09-29 14:17:44 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -171,7 +171,6 @@ LIBGEN_OBJ = \
|
|||||||
libgen_dirname.o
|
libgen_dirname.o
|
||||||
|
|
||||||
LOCALE_OBJ = \
|
LOCALE_OBJ = \
|
||||||
locale_data.o \
|
|
||||||
locale_init_exit.o \
|
locale_init_exit.o \
|
||||||
locale_localeconv.o \
|
locale_localeconv.o \
|
||||||
locale_setlocale.o
|
locale_setlocale.o
|
||||||
@@ -415,6 +414,8 @@ STDLIB_OBJ = \
|
|||||||
stdlib_strtod.o \
|
stdlib_strtod.o \
|
||||||
stdlib_strtol.o \
|
stdlib_strtol.o \
|
||||||
stdlib_strtoul.o \
|
stdlib_strtoul.o \
|
||||||
|
stdlib_strtoll.o \
|
||||||
|
stdlib_strtoull.o \
|
||||||
stdlib_swapstack.o \
|
stdlib_swapstack.o \
|
||||||
stdlib_system.o \
|
stdlib_system.o \
|
||||||
stdlib_unsetenv.o \
|
stdlib_unsetenv.o \
|
||||||
@@ -472,9 +473,9 @@ TIME_OBJ = \
|
|||||||
UNISTD_OBJ = \
|
UNISTD_OBJ = \
|
||||||
unistd_access.o \
|
unistd_access.o \
|
||||||
unistd_chdir.o \
|
unistd_chdir.o \
|
||||||
|
unistd_chdir_exit.o \
|
||||||
unistd_chown.o \
|
unistd_chown.o \
|
||||||
unistd_currentpathname.o \
|
unistd_currentpathname.o \
|
||||||
unistd_data.o \
|
|
||||||
unistd_dup.o \
|
unistd_dup.o \
|
||||||
unistd_dup2.o \
|
unistd_dup2.o \
|
||||||
unistd_fchown.o \
|
unistd_fchown.o \
|
||||||
@@ -495,12 +496,15 @@ UNISTD_OBJ = \
|
|||||||
unistd_sleep.o \
|
unistd_sleep.o \
|
||||||
unistd_strip_double_slash.o \
|
unistd_strip_double_slash.o \
|
||||||
unistd_symlink.o \
|
unistd_symlink.o \
|
||||||
|
unistd_time_delay.o \
|
||||||
|
unistd_timer.o \
|
||||||
unistd_translatea2u.o \
|
unistd_translatea2u.o \
|
||||||
unistd_translaterel.o \
|
unistd_translaterel.o \
|
||||||
unistd_translateu2a.o \
|
unistd_translateu2a.o \
|
||||||
unistd_truncate.o \
|
unistd_truncate.o \
|
||||||
unistd_unix_path_semantics.o \
|
unistd_unix_path_semantics.o \
|
||||||
unistd_unlink.o
|
unistd_unlink.o \
|
||||||
|
unistd_usleep.o
|
||||||
# \
|
# \
|
||||||
# unistd_wildcard_expand.o
|
# unistd_wildcard_expand.o
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_init_exit.c,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
* $Id: socket_init_exit.c,v 1.4 2004-09-29 17:03:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,16 +84,11 @@ extern BOOL __is_daemon;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern void __show_error(const char * message);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
extern void __socket_hook_entry(struct Hook * hook,struct fd * fd,struct file_hook_message * message);
|
extern void __socket_hook_entry(struct Hook * hook,struct fd * fd,struct file_hook_message * message);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
CLIB_DESTRUCTOR(__socket_exit)
|
||||||
__socket_exit(void)
|
|
||||||
{
|
{
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -116,16 +111,7 @@ __socket_exit(void)
|
|||||||
* does not happen, the stdio cleanup function will
|
* does not happen, the stdio cleanup function will
|
||||||
* crash (with bells on).
|
* crash (with bells on).
|
||||||
*/
|
*/
|
||||||
if(__fd != NULL)
|
__close_all_files();
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i = 0 ; i < __num_fd ; i++)
|
|
||||||
{
|
|
||||||
if(FLAG_IS_SET(__fd[i]->fd_Flags,FDF_IS_SOCKET) && FLAG_IS_SET(__fd[i]->fd_Flags,FDF_IN_USE))
|
|
||||||
close(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
#if defined(__amigaos4__)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_send.c,v 1.1.1.1 2004-07-26 16:31:19 obarthel Exp $
|
* $Id: socket_send.c,v 1.2 2004-09-29 14:31:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
send(int sockfd,void *buff,size_t nbytes,int flags)
|
send(int sockfd,const void *buff,size_t nbytes,int flags)
|
||||||
{
|
{
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_sendto.c,v 1.1.1.1 2004-07-26 16:31:20 obarthel Exp $
|
* $Id: socket_sendto.c,v 1.2 2004-09-29 14:31:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
sendto(int sockfd,void *buff,int len,int flags,struct sockaddr *to,int tolen)
|
sendto(int sockfd,const void *buff,int len,int flags,struct sockaddr *to,int tolen)
|
||||||
{
|
{
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_setsockopt.c,v 1.1.1.1 2004-07-26 16:31:20 obarthel Exp $
|
* $Id: socket_setsockopt.c,v 1.2 2004-09-29 14:31:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
setsockopt(int sockfd,int level,int optname,void *optval,int optlen)
|
setsockopt(int sockfd,int level,int optname,const void *optval,int optlen)
|
||||||
{
|
{
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 175
|
#define REVISION 182
|
||||||
#define DATE "10.9.2004"
|
#define DATE "8.11.2004"
|
||||||
#define VERS "stack.lib 1.175"
|
#define VERS "stack.lib 1.182"
|
||||||
#define VSTRING "stack.lib 1.175 (10.9.2004)\r\n"
|
#define VSTRING "stack.lib 1.182 (8.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: stack.lib 1.175 (10.9.2004)"
|
#define VERSTAG "\0$VER: stack.lib 1.182 (8.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
175
|
182
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_init_exit.c,v 1.1.1.1 2004-07-26 16:31:36 obarthel Exp $
|
* $Id: stdio_init_exit.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
void
|
||||||
__stdio_exit(void)
|
__close_all_files(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ __stdio_exit(void)
|
|||||||
|
|
||||||
__check_abort_enabled = FALSE;
|
__check_abort_enabled = FALSE;
|
||||||
|
|
||||||
if(__iob != NULL)
|
if(__iob != NULL && __num_iob > 0)
|
||||||
{
|
{
|
||||||
for(i = 0 ; i < __num_iob ; i++)
|
for(i = 0 ; i < __num_iob ; i++)
|
||||||
{
|
{
|
||||||
@@ -72,7 +72,7 @@ __stdio_exit(void)
|
|||||||
__iob = NULL;
|
__iob = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(__fd != NULL)
|
if(__fd != NULL && __num_fd > 0)
|
||||||
{
|
{
|
||||||
for(i = 0 ; i < __num_fd ; i++)
|
for(i = 0 ; i < __num_fd ; i++)
|
||||||
{
|
{
|
||||||
@@ -89,6 +89,17 @@ __stdio_exit(void)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_DESTRUCTOR(__stdio_exit)
|
||||||
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
__close_all_files();
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
__stdio_init(void)
|
__stdio_init(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_openiob.c,v 1.1.1.1 2004-07-26 16:31:37 obarthel Exp $
|
* $Id: stdio_openiob.c,v 1.3 2004-11-03 15:39:04 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -48,9 +48,7 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
|
|||||||
{
|
{
|
||||||
ULONG file_flags;
|
ULONG file_flags;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
char actual_mode[8];
|
|
||||||
int open_mode;
|
int open_mode;
|
||||||
size_t mode_len,len,i;
|
|
||||||
struct fd * fd = NULL;
|
struct fd * fd = NULL;
|
||||||
STRPTR buffer = NULL;
|
STRPTR buffer = NULL;
|
||||||
STRPTR aligned_buffer;
|
STRPTR aligned_buffer;
|
||||||
@@ -86,76 +84,47 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Options can follow the mode string, separated by a comma.
|
/* The first character selects the access mode: read, write or append. */
|
||||||
* We don't support any of those.
|
switch(mode[0])
|
||||||
*/
|
|
||||||
len = mode_len = strlen(mode);
|
|
||||||
for(i = 0 ; i < len ; i++)
|
|
||||||
{
|
{
|
||||||
if(mode[i] == ',')
|
case 'r':
|
||||||
{
|
|
||||||
mode_len = i;
|
SHOWMSG("read mode");
|
||||||
|
|
||||||
|
open_mode = O_RDONLY;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
case 'w':
|
||||||
|
|
||||||
|
SHOWMSG("write mode");
|
||||||
|
|
||||||
|
open_mode = O_WRONLY | O_CREAT | O_TRUNC;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'a':
|
||||||
|
|
||||||
|
SHOWMSG("append mode");
|
||||||
|
|
||||||
|
open_mode = O_WRONLY | O_CREAT | O_APPEND;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
D(("unsupported file open mode '%lc'",mode[0]));
|
||||||
|
|
||||||
|
errno = EINVAL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Keep only the first few letters of the mode string. */
|
/* If the second or third character is a '+', switch to read/write mode. */
|
||||||
if(mode_len > sizeof(actual_mode)-1)
|
if((mode[1] == '+') || (mode[1] != '\0' && mode[2] == '+'))
|
||||||
mode_len = sizeof(actual_mode)-1;
|
|
||||||
|
|
||||||
memmove(actual_mode,mode,mode_len);
|
|
||||||
actual_mode[mode_len] = '\0';
|
|
||||||
|
|
||||||
SHOWSTRING(actual_mode);
|
|
||||||
|
|
||||||
if(strcmp(actual_mode,"r") == SAME || strcmp(actual_mode,"rb") == SAME)
|
|
||||||
{
|
{
|
||||||
SHOWMSG("read-only");
|
SHOWMSG("read/write access");
|
||||||
|
|
||||||
open_mode = O_RDONLY;
|
CLEAR_FLAG(open_mode,O_RDONLY);
|
||||||
file_flags = IOBF_READ;
|
CLEAR_FLAG(open_mode,O_WRONLY);
|
||||||
}
|
|
||||||
else if (strcmp(actual_mode,"w") == SAME || strcmp(actual_mode,"wb") == SAME)
|
|
||||||
{
|
|
||||||
SHOWMSG("write-only");
|
|
||||||
|
|
||||||
open_mode = O_WRONLY | O_CREAT | O_TRUNC;
|
SET_FLAG(open_mode,O_RDWR);
|
||||||
file_flags = IOBF_WRITE;
|
|
||||||
}
|
|
||||||
else if (strcmp(actual_mode,"a") == SAME || strcmp(actual_mode,"ab") == SAME)
|
|
||||||
{
|
|
||||||
SHOWMSG("write-only; append");
|
|
||||||
|
|
||||||
open_mode = O_WRONLY | O_CREAT | O_APPEND;
|
|
||||||
file_flags = IOBF_WRITE;
|
|
||||||
}
|
|
||||||
else if (strcmp(actual_mode,"r+") == SAME || strcmp(actual_mode,"rb+") == SAME || strcmp(actual_mode,"r+b") == SAME)
|
|
||||||
{
|
|
||||||
SHOWMSG("read/write; don't overwrite");
|
|
||||||
|
|
||||||
open_mode = O_RDWR;
|
|
||||||
file_flags = IOBF_READ | IOBF_WRITE;
|
|
||||||
}
|
|
||||||
else if (strcmp(actual_mode,"w+") == SAME || strcmp(actual_mode,"wb+") == SAME || strcmp(actual_mode,"w+b") == SAME)
|
|
||||||
{
|
|
||||||
SHOWMSG("read/write; overwrite");
|
|
||||||
|
|
||||||
open_mode = O_RDWR | O_CREAT | O_TRUNC;
|
|
||||||
file_flags = IOBF_READ | IOBF_WRITE;
|
|
||||||
}
|
|
||||||
else if (strcmp(actual_mode,"a+") == SAME || strcmp(actual_mode,"ab+") == SAME || strcmp(actual_mode,"a+b") == SAME)
|
|
||||||
{
|
|
||||||
SHOWMSG("read/write; append; don't overwrite");
|
|
||||||
|
|
||||||
open_mode = O_RDWR | O_CREAT | O_APPEND;
|
|
||||||
file_flags = IOBF_READ | IOBF_WRITE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SHOWMSG("unsupported file open mode");
|
|
||||||
|
|
||||||
errno = EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SHOWMSG("allocating file buffer");
|
SHOWMSG("allocating file buffer");
|
||||||
@@ -193,12 +162,21 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
|
|||||||
CLEAR_FLAG(fd->fd_Flags,FDF_APPEND);
|
CLEAR_FLAG(fd->fd_Flags,FDF_APPEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Figure out the buffered file access mode by looking at the open mode. */
|
||||||
|
file_flags = IOBF_IN_USE | IOBF_NO_NUL;
|
||||||
|
|
||||||
|
if(FLAG_IS_SET(open_mode,O_RDONLY) || FLAG_IS_SET(open_mode,O_RDWR))
|
||||||
|
SET_FLAG(file_flags,IOBF_READ);
|
||||||
|
|
||||||
|
if(FLAG_IS_SET(open_mode,O_WRONLY) || FLAG_IS_SET(open_mode,O_RDWR))
|
||||||
|
SET_FLAG(file_flags,IOBF_WRITE);
|
||||||
|
|
||||||
__initialize_iob(file,(HOOKFUNC)__iob_hook_entry,
|
__initialize_iob(file,(HOOKFUNC)__iob_hook_entry,
|
||||||
buffer,
|
buffer,
|
||||||
aligned_buffer,BUFSIZ,
|
aligned_buffer,BUFSIZ,
|
||||||
file_descriptor,
|
file_descriptor,
|
||||||
slot_number,
|
slot_number,
|
||||||
IOBF_IN_USE | file_flags | IOBF_NO_NUL);
|
file_flags);
|
||||||
|
|
||||||
buffer = NULL;
|
buffer = NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_protos.h,v 1.2 2004-08-08 10:55:57 obarthel Exp $
|
* $Id: stdio_protos.h,v 1.3 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -65,6 +65,11 @@ struct fd;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* stdio_init_exit.c */
|
||||||
|
void __close_all_files(void);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
/* stdio_translateioerror.c */
|
/* stdio_translateioerror.c */
|
||||||
extern void __translate_io_error_to_errno(LONG io_error,int * errno_ptr);
|
extern void __translate_io_error_to_errno(LONG io_error,int * errno_ptr);
|
||||||
extern void __translate_access_io_error_to_errno(LONG io_error,int * errno_ptr);
|
extern void __translate_access_io_error_to_errno(LONG io_error,int * errno_ptr);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_vfprintf.c,v 1.5 2004-09-10 07:39:19 obarthel Exp $
|
* $Id: stdio_vfprintf.c,v 1.6 2004-10-23 16:38:18 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -979,15 +979,8 @@ vfprintf(FILE * stream,const char * format, va_list arg)
|
|||||||
else
|
else
|
||||||
(void)va_arg(arg, double);
|
(void)va_arg(arg, double);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
minimum_field_width = 0;
|
||||||
{
|
format_flags = 0;
|
||||||
output_buffer = "*FLOATING POINT NUMBER*";
|
|
||||||
output_len = strlen(output_buffer);
|
|
||||||
}
|
|
||||||
#endif /* NDEBUG */
|
|
||||||
|
|
||||||
CLEAR_FLAG(format_flags,FORMATF_ProduceSign);
|
|
||||||
CLEAR_FLAG(format_flags,FORMATF_ProduceSpace);
|
|
||||||
}
|
}
|
||||||
#endif /* FLOATING_POINT_SUPPORT */
|
#endif /* FLOATING_POINT_SUPPORT */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_vfscanf.c,v 1.2 2004-08-08 10:55:57 obarthel Exp $
|
* $Id: stdio_vfscanf.c,v 1.6 2004-11-08 17:57:52 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -105,24 +105,12 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
|
|
||||||
if(isspace(c))
|
if(isspace(c))
|
||||||
{
|
{
|
||||||
BOOL finished = FALSE;
|
|
||||||
|
|
||||||
/* Skip all blank spaces in the stream. */
|
/* Skip all blank spaces in the stream. */
|
||||||
format++;
|
format++;
|
||||||
|
|
||||||
while(TRUE)
|
while((c = __getc(stream)) != EOF)
|
||||||
{
|
{
|
||||||
c = __getc(stream);
|
if(isspace(c))
|
||||||
if(c == EOF)
|
|
||||||
{
|
|
||||||
/* Hit the end of the stream. Due to an error? */
|
|
||||||
if(num_conversions == 0 || ferror(stream))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
finished = TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (isspace(c))
|
|
||||||
{
|
{
|
||||||
total_num_chars_read++;
|
total_num_chars_read++;
|
||||||
}
|
}
|
||||||
@@ -139,8 +127,17 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(finished)
|
if(c == EOF)
|
||||||
|
{
|
||||||
|
SHOWMSG("end of file");
|
||||||
|
|
||||||
|
/* Hit the end of the stream? */
|
||||||
|
if(num_conversions == 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* Finished... */
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Resume scanning. */
|
/* Resume scanning. */
|
||||||
continue;
|
continue;
|
||||||
@@ -159,8 +156,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
{
|
{
|
||||||
SHOWMSG("end of file");
|
SHOWMSG("end of file");
|
||||||
|
|
||||||
/* Hit the end of the stream. Due to an error? */
|
/* Hit the end of the stream. */
|
||||||
if(num_conversions == 0 || ferror(stream))
|
if(num_conversions == 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -305,9 +302,11 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
/* It's a floating point number. */
|
/* It's a floating point number. */
|
||||||
case 'f':
|
|
||||||
case 'e':
|
case 'e':
|
||||||
|
case 'E':
|
||||||
|
case 'f':
|
||||||
case 'g':
|
case 'g':
|
||||||
|
case 'G':
|
||||||
|
|
||||||
conversion_type = 'f';
|
conversion_type = 'f';
|
||||||
format++;
|
format++;
|
||||||
@@ -321,6 +320,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
case 's': /* string */
|
case 's': /* string */
|
||||||
case 'u': /* unsigned integer */
|
case 'u': /* unsigned integer */
|
||||||
case 'x': /* unsigned integer in hexadecimal format */
|
case 'x': /* unsigned integer in hexadecimal format */
|
||||||
|
case 'X': /* unsigned integer in hexadecimal format */
|
||||||
case '%': /* the % character */
|
case '%': /* the % character */
|
||||||
case '[': /* a range of characters */
|
case '[': /* a range of characters */
|
||||||
|
|
||||||
@@ -339,21 +339,9 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
conversion_type != 'n' &&
|
conversion_type != 'n' &&
|
||||||
conversion_type != '[')
|
conversion_type != '[')
|
||||||
{
|
{
|
||||||
BOOL finished = FALSE;
|
while((c = __getc(stream)) != EOF)
|
||||||
|
|
||||||
while(TRUE)
|
|
||||||
{
|
{
|
||||||
c = __getc(stream);
|
if(isspace(c))
|
||||||
if(c == EOF)
|
|
||||||
{
|
|
||||||
/* Hit the end of the stream. Due to an error? */
|
|
||||||
if(num_conversions == 0 || ferror(stream))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
finished = TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (isspace(c))
|
|
||||||
{
|
{
|
||||||
total_num_chars_read++;
|
total_num_chars_read++;
|
||||||
}
|
}
|
||||||
@@ -369,9 +357,6 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(finished)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
num_chars_processed = 0;
|
num_chars_processed = 0;
|
||||||
@@ -428,8 +413,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
c = __getc(stream);
|
c = __getc(stream);
|
||||||
if(c == EOF)
|
if(c == EOF)
|
||||||
{
|
{
|
||||||
/* Bail out if we hit the end of the stream or an error occured. */
|
/* Bail out if we hit the end of the stream. */
|
||||||
if(num_conversions == 0 || ferror(stream))
|
if(num_conversions == 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -609,7 +594,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
maximum_field_width--;
|
maximum_field_width--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(c == EOF && ((num_chars_processed == 0 && num_conversions == 0) || ferror(stream)))
|
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1016,6 +1001,10 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Chose a base according to the conversion to be
|
||||||
|
expected. For the 'x' and 'i' we examine the
|
||||||
|
incoming data rather than commit ourselves to
|
||||||
|
a peculiar data format now. */
|
||||||
if(conversion_type == 'd' || conversion_type == 'u')
|
if(conversion_type == 'd' || conversion_type == 'u')
|
||||||
base = 10;
|
base = 10;
|
||||||
else if (conversion_type == 'o')
|
else if (conversion_type == 'o')
|
||||||
@@ -1060,7 +1049,11 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
* '0x' prefix or just a zero.
|
* '0x' prefix or just a zero.
|
||||||
*/
|
*/
|
||||||
c = __getc(stream);
|
c = __getc(stream);
|
||||||
if (c == 'x' || c == 'X')
|
|
||||||
|
/* This takes care of the '0x' prefix for hexadecimal
|
||||||
|
numbers ('%x') and also picks the right type of
|
||||||
|
data for the '%i' type. */
|
||||||
|
if ((c == 'x' || c == 'X') && (conversion_type == 'x' || conversion_type == 'i'))
|
||||||
{
|
{
|
||||||
/* It's the hex prefix. */
|
/* It's the hex prefix. */
|
||||||
base = 16;
|
base = 16;
|
||||||
@@ -1075,7 +1068,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
if(maximum_field_width > 0)
|
if(maximum_field_width > 0)
|
||||||
maximum_field_width--;
|
maximum_field_width--;
|
||||||
}
|
}
|
||||||
else if (isdigit(c))
|
else if (isdigit(c) && (conversion_type == 'i')) /* This could be the octal prefix for the '%i' format. */
|
||||||
{
|
{
|
||||||
/* The preceding '0' was part of the
|
/* The preceding '0' was part of the
|
||||||
octal prefix. So we don't really know
|
octal prefix. So we don't really know
|
||||||
@@ -1192,7 +1185,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(c == EOF && ((num_chars_processed == 0 && num_conversions == 0) || ferror(stream)))
|
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1298,8 +1291,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
|
|
||||||
/* The conversion is considered to have failed if an EOF was
|
/* The conversion is considered to have failed if an EOF was
|
||||||
encountered before any non-whitespace characters could be
|
encountered before any non-whitespace characters could be
|
||||||
converted. We also bail out if we hit an error. */
|
converted. */
|
||||||
if(c == EOF && (num_chars_processed == 0 || ferror(stream)))
|
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1422,8 +1415,8 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
{
|
{
|
||||||
SHOWMSG("end of file");
|
SHOWMSG("end of file");
|
||||||
|
|
||||||
/* Hit the end of the stream. Due to an error? */
|
/* Hit the end of the stream. */
|
||||||
if(num_conversions == 0 || ferror(stream))
|
if(num_conversions == 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -1555,7 +1548,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
maximum_field_width--;
|
maximum_field_width--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(c == EOF && ((num_chars_processed == 0 && num_conversions == 0) || ferror(stream)))
|
if(c == EOF && num_chars_processed == 0 && num_conversions == 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1569,8 +1562,7 @@ __vfscanf(FILE *stream, const char *format, va_list arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(num_conversions > 0)
|
result = num_assignments;
|
||||||
result = num_assignments;
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_constructor_begin.c,v 1.1.1.1 2004-07-26 16:31:52 obarthel Exp $
|
* $Id: stdlib_constructor_begin.c,v 1.2 2004-09-29 19:57:57 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,80 +42,7 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
#if defined(__SASC)
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Dummy constructor and destructor array. The linker script will put these at the
|
|
||||||
* very beginning of section ".ctors" and ".dtors". crtend.o contains a similar entry
|
|
||||||
* with a NULL pointer entry and is put at the end of the sections. This way, the init
|
|
||||||
* code can find the global constructor/destructor pointers
|
|
||||||
*/
|
|
||||||
static void (*__CTOR_LIST__[1]) (void) __attribute__((section(".ctors"))) = { (void *)-1 };
|
|
||||||
static void (*__DTOR_LIST__[1]) (void) __attribute__((section(".dtors"))) = { (void *)-1 };
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
_do_ctors(void)
|
|
||||||
{
|
|
||||||
void (**pFuncPtr)(void);
|
|
||||||
|
|
||||||
/* Skip the first entry in the list (it's -1 anyway) */
|
|
||||||
pFuncPtr = __CTOR_LIST__ + 1;
|
|
||||||
|
|
||||||
/* Call all constructors in forward order */
|
|
||||||
while (*pFuncPtr != NULL)
|
|
||||||
(**pFuncPtr++)();
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
_do_dtors(void)
|
|
||||||
{
|
|
||||||
static ULONG i = ~0UL;
|
|
||||||
void (**pFuncPtr)(void);
|
|
||||||
|
|
||||||
if(i == ~0UL)
|
|
||||||
{
|
|
||||||
ULONG j = (ULONG)__DTOR_LIST__[0];
|
|
||||||
|
|
||||||
if(j == ~0UL)
|
|
||||||
{
|
|
||||||
/* Find the end of the destructors list. */
|
|
||||||
j = 1;
|
|
||||||
|
|
||||||
while(__DTOR_LIST__[j] != NULL)
|
|
||||||
j++;
|
|
||||||
|
|
||||||
/* We're at the NULL entry now. Go back by one. */
|
|
||||||
j--;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = j;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If one of the destructors drops into
|
|
||||||
* exit(), processing will continue with
|
|
||||||
* the next following destructor.
|
|
||||||
*/
|
|
||||||
(void)setjmp(__exit_jmp_buf);
|
|
||||||
|
|
||||||
/* Call all destructors in reverse order. */
|
|
||||||
pFuncPtr = &__DTOR_LIST__[i];
|
|
||||||
while(i > 0)
|
|
||||||
{
|
|
||||||
i--;
|
|
||||||
|
|
||||||
(**pFuncPtr--)();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#elif defined(__SASC)
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -201,9 +128,21 @@ _do_ctors(void)
|
|||||||
ULONG nptrs = (ULONG)__CTOR_LIST__[0];
|
ULONG nptrs = (ULONG)__CTOR_LIST__[0];
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
D(("there are %ld constructors to be called",nptrs));
|
||||||
|
|
||||||
/* Call all constructors in forward order */
|
/* Call all constructors in forward order */
|
||||||
for(i = 0 ; i < nptrs ; i++)
|
for(i = 0 ; i < nptrs ; i++)
|
||||||
|
{
|
||||||
|
D(("calling constructor #%ld, 0x%08lx",i,__CTOR_LIST__[1+i]));
|
||||||
|
|
||||||
__CTOR_LIST__[1+i]();
|
__CTOR_LIST__[1+i]();
|
||||||
|
}
|
||||||
|
|
||||||
|
SHOWMSG("all done.");
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@@ -216,6 +155,10 @@ _do_dtors(void)
|
|||||||
ULONG nptrs = (ULONG)__DTOR_LIST__[0];
|
ULONG nptrs = (ULONG)__DTOR_LIST__[0];
|
||||||
static ULONG i;
|
static ULONG i;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
D(("there are %ld destructors to be called",nptrs));
|
||||||
|
|
||||||
/* If one of the destructors drops into
|
/* If one of the destructors drops into
|
||||||
* exit(), processing will continue with
|
* exit(), processing will continue with
|
||||||
* the next following destructor.
|
* the next following destructor.
|
||||||
@@ -224,7 +167,15 @@ _do_dtors(void)
|
|||||||
|
|
||||||
/* Call all destructors in reverse order */
|
/* Call all destructors in reverse order */
|
||||||
while(i++ < nptrs)
|
while(i++ < nptrs)
|
||||||
|
{
|
||||||
|
D(("calling destructor #%ld, 0x%08lx",i,__DTOR_LIST__[1+nptrs - i]));
|
||||||
|
|
||||||
__DTOR_LIST__[1+nptrs - i]();
|
__DTOR_LIST__[1+nptrs - i]();
|
||||||
|
}
|
||||||
|
|
||||||
|
SHOWMSG("all done.");
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_data.c,v 1.1.1.1 2004-07-26 16:31:53 obarthel Exp $
|
* $Id: stdlib_data.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -85,15 +85,11 @@ ULONG __stk_extensions;
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
struct Library * __UtilityBase;
|
struct Library * __UtilityBase;
|
||||||
struct Library * __LocaleBase;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
#if defined(__amigaos4__)
|
||||||
|
struct UtilityIFace * __IUtility;
|
||||||
struct UtilityIFace * __IUtility;
|
|
||||||
struct LocaleIFace * __ILocale;
|
|
||||||
|
|
||||||
#endif /* __amigaos4__ */
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_locale_utility.h,v 1.1.1.1 2004-07-26 16:31:57 obarthel Exp $
|
* $Id: stdlib_locale_utility.h,v 1.2 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -49,8 +49,14 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct Library * __UtilityBase;
|
#ifndef _MACROS_H
|
||||||
extern struct Library * __LocaleBase;
|
#include "macros.h"
|
||||||
|
#endif /* _MACROS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern struct Library * NOCOMMON __UtilityBase;
|
||||||
|
extern struct Library * NOCOMMON __LocaleBase;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -58,8 +64,8 @@ extern struct Library * __LocaleBase;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct UtilityIFace * __IUtility;
|
extern struct UtilityIFace NOCOMMON * __IUtility;
|
||||||
extern struct LocaleIFace * __ILocale;
|
extern struct LocaleIFace NOCOMMON * __ILocale;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_main.c,v 1.1.1.1 2004-07-26 16:31:58 obarthel Exp $
|
* $Id: stdlib_main.c,v 1.5 2004-10-02 15:56:13 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -64,7 +64,10 @@ extern int main(int arg_c,char ** arg_v);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if 0
|
/* The SAS/C profiling hooks can be used to track call chains. Neat
|
||||||
|
trick, but not always necessary. Don't enable this unless you know
|
||||||
|
what you're doing... */
|
||||||
|
#if defined(__USE_SAS_PROFILING_FOR_MONITORING)
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -100,7 +103,7 @@ _EPILOG(REG(a0,char * id))
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif
|
#endif /* __USE_SAS_PROFILING_FOR_MONITORING */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -119,10 +122,7 @@ call_main(void)
|
|||||||
__stdio_init,
|
__stdio_init,
|
||||||
__machine_test,
|
__machine_test,
|
||||||
__math_init,
|
__math_init,
|
||||||
__locale_init,
|
|
||||||
__unistd_init,
|
|
||||||
__socket_init,
|
__socket_init,
|
||||||
__usergroup_init,
|
|
||||||
__wildcard_expand_init,
|
__wildcard_expand_init,
|
||||||
|
|
||||||
NULL
|
NULL
|
||||||
@@ -135,15 +135,6 @@ call_main(void)
|
|||||||
*/
|
*/
|
||||||
static exit_func_ptr exit_functions[] =
|
static exit_func_ptr exit_functions[] =
|
||||||
{
|
{
|
||||||
__wildcard_expand_exit,
|
|
||||||
__usergroup_exit,
|
|
||||||
__socket_exit,
|
|
||||||
__unistd_exit,
|
|
||||||
__locale_exit,
|
|
||||||
__math_exit,
|
|
||||||
__stdio_exit,
|
|
||||||
__startup_exit,
|
|
||||||
__stk_exit,
|
|
||||||
__stdlib_exit,
|
__stdlib_exit,
|
||||||
|
|
||||||
NULL
|
NULL
|
||||||
@@ -151,27 +142,51 @@ call_main(void)
|
|||||||
|
|
||||||
static size_t i;
|
static size_t i;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
/* This plants the return buffer for _exit(). */
|
/* This plants the return buffer for _exit(). */
|
||||||
if(setjmp(__exit_jmp_buf) != 0)
|
if(setjmp(__exit_jmp_buf) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
SHOWMSG("calling init functions");
|
||||||
|
|
||||||
for(i = 0 ; init_functions[i] != NULL ; i++)
|
for(i = 0 ; init_functions[i] != NULL ; i++)
|
||||||
{
|
{
|
||||||
|
D(("calling init function #%ld",i));
|
||||||
|
|
||||||
if((*init_functions[i])() != OK)
|
if((*init_functions[i])() != OK)
|
||||||
|
{
|
||||||
|
SHOWMSG("that didn't work");
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHOWMSG("now invoking the constructors");
|
||||||
|
|
||||||
/* Go through the constructor list */
|
/* Go through the constructor list */
|
||||||
_init();
|
_init();
|
||||||
|
|
||||||
//show_profile_names = TRUE;
|
SHOWMSG("done.");
|
||||||
|
|
||||||
|
/* If the SAS/C profiling code is set up for printing function
|
||||||
|
call chains, switch it on now. */
|
||||||
|
#if defined(__USE_SAS_PROFILING_FOR_MONITORING)
|
||||||
|
{
|
||||||
|
show_profile_names = TRUE;
|
||||||
|
}
|
||||||
|
#endif /* __USE_SAS_PROFILING_FOR_MONITORING */
|
||||||
|
|
||||||
/* After all these preparations, get this show on the road... */
|
/* After all these preparations, get this show on the road... */
|
||||||
exit(main((int)__argc,(char **)__argv));
|
exit(main((int)__argc,(char **)__argv));
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
//show_profile_names = FALSE;
|
/* Switch off function name printing, if it was enabled. */
|
||||||
|
#if defined(__USE_SAS_PROFILING_FOR_MONITORING)
|
||||||
|
{
|
||||||
|
show_profile_names = FALSE;
|
||||||
|
}
|
||||||
|
#endif /* __USE_SAS_PROFILING_FOR_MONITORING */
|
||||||
|
|
||||||
/* If we end up here with the __stack_overflow variable
|
/* If we end up here with the __stack_overflow variable
|
||||||
* set then the stack overflow handler dropped into
|
* set then the stack overflow handler dropped into
|
||||||
@@ -181,6 +196,8 @@ call_main(void)
|
|||||||
*/
|
*/
|
||||||
if(__stack_overflow)
|
if(__stack_overflow)
|
||||||
{
|
{
|
||||||
|
SHOWMSG("we have a stack overflow");
|
||||||
|
|
||||||
/* Dump whatever is waiting to be written to the
|
/* Dump whatever is waiting to be written to the
|
||||||
* standard I/O streams, and make sure that no
|
* standard I/O streams, and make sure that no
|
||||||
* break signal is about to make things any more
|
* break signal is about to make things any more
|
||||||
@@ -203,9 +220,15 @@ call_main(void)
|
|||||||
/* If necessary, print stack size usage information. */
|
/* If necessary, print stack size usage information. */
|
||||||
__stack_usage_exit();
|
__stack_usage_exit();
|
||||||
|
|
||||||
|
SHOWMSG("invoking the destructors");
|
||||||
|
|
||||||
/* Go through the destructor list */
|
/* Go through the destructor list */
|
||||||
_fini();
|
_fini();
|
||||||
|
|
||||||
|
SHOWMSG("done.");
|
||||||
|
|
||||||
|
SHOWMSG("calling the exit functions");
|
||||||
|
|
||||||
/* Any of the following cleanup routines may call
|
/* Any of the following cleanup routines may call
|
||||||
* _exit() by way of abort() or through a hook
|
* _exit() by way of abort() or through a hook
|
||||||
* function. Which is why we redirect the exit
|
* function. Which is why we redirect the exit
|
||||||
@@ -213,10 +236,13 @@ call_main(void)
|
|||||||
*/
|
*/
|
||||||
for(i = 0 ; exit_functions[i] != NULL ; i++)
|
for(i = 0 ; exit_functions[i] != NULL ; i++)
|
||||||
{
|
{
|
||||||
|
D(("calling exit function #%ld",i));
|
||||||
|
|
||||||
if(setjmp(__exit_jmp_buf) == 0)
|
if(setjmp(__exit_jmp_buf) == 0)
|
||||||
(*exit_functions[i])();
|
(*exit_functions[i])();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RETURN(__exit_value);
|
||||||
return(__exit_value);
|
return(__exit_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -347,9 +373,6 @@ _main(void)
|
|||||||
}
|
}
|
||||||
#endif /* __amigaos4__ */
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
/* Remember when this program was started. */
|
|
||||||
DateStamp(&__start_time);
|
|
||||||
|
|
||||||
/* If a callback was provided which can fill us in on which
|
/* If a callback was provided which can fill us in on which
|
||||||
* minimum stack size should be used, invoke it now and
|
* minimum stack size should be used, invoke it now and
|
||||||
* store its result in the global __stack_size variable.
|
* store its result in the global __stack_size variable.
|
||||||
@@ -392,33 +415,36 @@ _main(void)
|
|||||||
{
|
{
|
||||||
struct StackSwapStruct * stk;
|
struct StackSwapStruct * stk;
|
||||||
unsigned int stack_size;
|
unsigned int stack_size;
|
||||||
ULONG lower,upper;
|
APTR new_stack;
|
||||||
|
|
||||||
/* Make the stack size a multiple of 16 bytes. */
|
/* Make the stack size a multiple of 32 bytes. */
|
||||||
stack_size = (__stack_size + 15UL) & ~15UL;
|
stack_size = 32 + ((__stack_size + 31UL) & ~31UL);
|
||||||
|
|
||||||
/* We allocate a little more memory so that we can align
|
/* Allocate the stack swapping data structure
|
||||||
the stack to a 128 bit boundary. */
|
and the stack space separately. */
|
||||||
stk = AllocVec(sizeof(*stk) + 15 + stack_size,MEMF_PUBLIC|MEMF_ANY);
|
stk = AllocVec(sizeof(*stk),MEMF_PUBLIC|MEMF_ANY);
|
||||||
if(stk == NULL)
|
if(stk == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Align the lower stack bound to a 128 bit boundary, then
|
new_stack = AllocMem(stack_size,MEMF_PUBLIC|MEMF_ANY);
|
||||||
fix up the upper bound, which is guaranteed to be on
|
if(new_stack == NULL)
|
||||||
a 128 bit boundary, too, on account of the stack size
|
{
|
||||||
having being rounded to that boundary. */
|
FreeVec(stk);
|
||||||
lower = (((ULONG)(stk+1)) + 15UL) & ~15UL;
|
goto out;
|
||||||
upper = lower + stack_size;
|
}
|
||||||
|
|
||||||
stk->stk_Lower = (APTR)lower;
|
/* Fill in the lower and upper bounds, then take care of
|
||||||
stk->stk_Upper = upper;
|
the stack pointer itself. */
|
||||||
stk->stk_Pointer = (APTR)upper;
|
stk->stk_Lower = new_stack;
|
||||||
|
stk->stk_Upper = (ULONG)(new_stack) + stack_size;
|
||||||
|
stk->stk_Pointer = (APTR)(stk->stk_Upper - 32);
|
||||||
|
|
||||||
/* If necessary, set up for stack size usage measurement. */
|
/* If necessary, set up for stack size usage measurement. */
|
||||||
__stack_usage_init(stk);
|
__stack_usage_init(stk);
|
||||||
|
|
||||||
return_code = __swap_stack_and_call(stk,(APTR)call_main);
|
return_code = __swap_stack_and_call(stk,(APTR)call_main);
|
||||||
|
|
||||||
|
FreeMem(new_stack, stack_size);
|
||||||
FreeVec(stk);
|
FreeVec(stk);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_math.c,v 1.1.1.1 2004-07-26 16:31:59 obarthel Exp $
|
* $Id: stdlib_math.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -41,13 +41,6 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
|
||||||
__math_exit(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__math_init(void)
|
__math_init(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_protos.h,v 1.1.1.1 2004-07-26 16:32:02 obarthel Exp $
|
* $Id: stdlib_protos.h,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -60,7 +60,6 @@ struct MemoryTree;
|
|||||||
|
|
||||||
/* math_init_exit.c */
|
/* math_init_exit.c */
|
||||||
extern int __math_init(void);
|
extern int __math_init(void);
|
||||||
extern void __math_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -69,15 +68,8 @@ extern int __machine_test(void);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* locale_init_exit.c */
|
|
||||||
extern int __locale_init(void);
|
|
||||||
extern void __locale_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* stdio_init_exit.c */
|
/* stdio_init_exit.c */
|
||||||
extern int __stdio_init(void);
|
extern int __stdio_init(void);
|
||||||
extern void __stdio_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -87,18 +79,6 @@ extern void __stdlib_exit(void);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* unistd_init_exit.c */
|
|
||||||
extern int __unistd_init(void);
|
|
||||||
extern void __unistd_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* dirent_init_exit.c */
|
|
||||||
extern int __dirent_init(void);
|
|
||||||
extern void __dirent_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* stdlib_atexit.c */
|
/* stdlib_atexit.c */
|
||||||
extern void __exit_trap_trigger(void);
|
extern void __exit_trap_trigger(void);
|
||||||
|
|
||||||
@@ -106,13 +86,6 @@ extern void __exit_trap_trigger(void);
|
|||||||
|
|
||||||
/* socket_init_exit.c */
|
/* socket_init_exit.c */
|
||||||
extern int __socket_init(void);
|
extern int __socket_init(void);
|
||||||
extern void __socket_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* usergroup_init_exit.c */
|
|
||||||
extern int __usergroup_init(void);
|
|
||||||
extern void __usergroup_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -134,13 +107,11 @@ extern unsigned long __get_sp(void);
|
|||||||
/* stdlib_wildcard_expand.c */
|
/* stdlib_wildcard_expand.c */
|
||||||
extern UBYTE * __allocate_quote_vector(int num_parameters);
|
extern UBYTE * __allocate_quote_vector(int num_parameters);
|
||||||
extern int __wildcard_expand_init(void);
|
extern int __wildcard_expand_init(void);
|
||||||
extern void __wildcard_expand_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* stdlib_stackextension.c */
|
/* stdlib_stackextension.c */
|
||||||
extern int __stk_init(void);
|
extern int __stk_init(void);
|
||||||
extern void __stk_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -163,7 +134,6 @@ void _fini(void);
|
|||||||
|
|
||||||
/* stdlib_startup.c */
|
/* stdlib_startup.c */
|
||||||
extern int __startup_init(void);
|
extern int __startup_init(void);
|
||||||
extern void __startup_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_setjmp.c,v 1.1.1.1 2004-07-26 16:32:05 obarthel Exp $
|
* $Id: stdlib_setjmp.c,v 1.2 2004-09-27 15:07:20 tfrieden Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -283,6 +283,8 @@ l1: moveml a0@(4:W),d1-d7 | restore all data registers \n\
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef PPC_FLOATING_POINT_SUPPORT
|
||||||
|
|
||||||
__asm(" \n\
|
__asm(" \n\
|
||||||
\n\
|
\n\
|
||||||
.text \n\
|
.text \n\
|
||||||
@@ -358,6 +360,48 @@ longjmp: \n\
|
|||||||
blr \n\
|
blr \n\
|
||||||
\n\
|
\n\
|
||||||
");
|
");
|
||||||
|
#else
|
||||||
|
__asm(" \n\
|
||||||
|
\n\
|
||||||
|
.text \n\
|
||||||
|
.align 2 \n\
|
||||||
|
\n\
|
||||||
|
.globl setjmp \n\
|
||||||
|
\n\
|
||||||
|
setjmp: \n\
|
||||||
|
\n\
|
||||||
|
mflr r10 \n\
|
||||||
|
mfcr r11 \n\
|
||||||
|
mr r12, r1 \n\
|
||||||
|
stmw r10, 0(r3) \n\
|
||||||
|
li r3, 0 \n\
|
||||||
|
blr \n\
|
||||||
|
\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
__asm(" \n\
|
||||||
|
.text \n\
|
||||||
|
.align 2 \n\
|
||||||
|
\n\
|
||||||
|
.globl longjmp \n\
|
||||||
|
\n\
|
||||||
|
longjmp: \n\
|
||||||
|
\n\
|
||||||
|
lmw r10,0(r3) \n\
|
||||||
|
mtlr r10 \n\
|
||||||
|
mtcr r11 \n\
|
||||||
|
mr r1,r12 \n\
|
||||||
|
cmpwi r4, 0 \n\
|
||||||
|
bne 1f \n\
|
||||||
|
li r3,1 \n\
|
||||||
|
blr \n\
|
||||||
|
1: \n\
|
||||||
|
mr r3, r4 \n\
|
||||||
|
blr \n\
|
||||||
|
\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
#endif /* defined PPC_FLOATING_POINT_SUPPORT */
|
||||||
|
|
||||||
#endif /* defined STACK_EXTENSION */
|
#endif /* defined STACK_EXTENSION */
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_socket.c,v 1.1.1.1 2004-07-26 16:32:06 obarthel Exp $
|
* $Id: stdlib_socket.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -37,13 +37,6 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
|
||||||
__socket_exit(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__socket_init(void)
|
__socket_init(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_stackcheck.c,v 1.1.1.1 2004-07-26 16:32:07 obarthel Exp $
|
* $Id: stdlib_stackcheck.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -123,8 +123,3 @@ __stk_init(void)
|
|||||||
|
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
__stk_exit(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_stackextension.c,v 1.1.1.1 2004-07-26 16:32:08 obarthel Exp $
|
* $Id: stdlib_stackextension.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -294,8 +294,7 @@ __stk_init(void)
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Free all spare stackframes */
|
/* Free all spare stackframes */
|
||||||
void
|
CLIB_DESTRUCTOR(__stk_exit)
|
||||||
__stk_exit(void)
|
|
||||||
{
|
{
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_startup.c,v 1.1.1.1 2004-07-26 16:32:10 obarthel Exp $
|
* $Id: stdlib_startup.c,v 1.3 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -421,9 +421,10 @@ __startup_init(void)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
CLIB_DESTRUCTOR(__startup_exit)
|
||||||
__startup_exit(void)
|
|
||||||
{
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
|
||||||
/* Now clean up after the streams set up for the Workbench
|
/* Now clean up after the streams set up for the Workbench
|
||||||
@@ -461,4 +462,6 @@ __startup_exit(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
}
|
}
|
||||||
|
|||||||
204
library/stdlib_strtoll.c
Normal file
204
library/stdlib_strtoll.c
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdlib_strtoll.c,v 1.1 2004-09-20 17:16:06 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _STDLIB_NULL_POINTER_CHECK_H
|
||||||
|
#include "stdlib_null_pointer_check.h"
|
||||||
|
#endif /* _STDLIB_NULL_POINTER_CHECK_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STDLIB_HEADERS_H
|
||||||
|
#include "stdlib_headers.h"
|
||||||
|
#endif /* _STDLIB_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(USE_64_BIT_INTS)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
long long
|
||||||
|
strtoll(const char *str, char **ptr, int base)
|
||||||
|
{
|
||||||
|
BOOL is_negative;
|
||||||
|
long long result = 0;
|
||||||
|
long long new_sum;
|
||||||
|
long long sum;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
SHOWSTRING(str);
|
||||||
|
SHOWPOINTER(ptr);
|
||||||
|
SHOWVALUE(base);
|
||||||
|
|
||||||
|
assert(str != NULL && base >= 0);
|
||||||
|
|
||||||
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
|
{
|
||||||
|
if(str == NULL)
|
||||||
|
{
|
||||||
|
SHOWMSG("invalid str parameter");
|
||||||
|
|
||||||
|
errno = EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CHECK_FOR_NULL_POINTERS */
|
||||||
|
|
||||||
|
if(base < 0)
|
||||||
|
{
|
||||||
|
SHOWMSG("invalid base parameter");
|
||||||
|
|
||||||
|
errno = ERANGE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip all leading blanks. */
|
||||||
|
while((c = (*str)) != '\0')
|
||||||
|
{
|
||||||
|
if(NOT isspace(c))
|
||||||
|
break;
|
||||||
|
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The first character may be a sign. */
|
||||||
|
if(c == '-')
|
||||||
|
{
|
||||||
|
/* It's a negative number. */
|
||||||
|
is_negative = TRUE;
|
||||||
|
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* It's not going to be negative. */
|
||||||
|
is_negative = FALSE;
|
||||||
|
|
||||||
|
/* But there may be a sign we will choose to
|
||||||
|
* ignore.
|
||||||
|
*/
|
||||||
|
if(c == '+')
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = (*str);
|
||||||
|
|
||||||
|
/* There may be a leading '0x' to indicate that what
|
||||||
|
* follows is a hexadecimal number.
|
||||||
|
*/
|
||||||
|
if(base == 0 || base == 16)
|
||||||
|
{
|
||||||
|
if((c == '0') && (str[1] == 'x' || str[1] == 'X'))
|
||||||
|
{
|
||||||
|
base = 16;
|
||||||
|
|
||||||
|
str += 2;
|
||||||
|
|
||||||
|
c = (*str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we still don't know what base to use and the
|
||||||
|
* next letter to follow is a zero then this is
|
||||||
|
* probably a number in octal notation.
|
||||||
|
*/
|
||||||
|
if(base == 0)
|
||||||
|
{
|
||||||
|
if(c == '0')
|
||||||
|
base = 8;
|
||||||
|
else
|
||||||
|
base = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if(1 <= base && base <= 36)
|
||||||
|
{
|
||||||
|
while(c != '\0')
|
||||||
|
{
|
||||||
|
if('0' <= c && c <= '9')
|
||||||
|
c -= '0';
|
||||||
|
else if ('a' <= c)
|
||||||
|
c -= 'a' - 10;
|
||||||
|
else if ('A' <= c)
|
||||||
|
c -= 'A' - 10;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Ignore invalid numbers. */
|
||||||
|
if(c >= base)
|
||||||
|
break;
|
||||||
|
|
||||||
|
new_sum = base * sum + c;
|
||||||
|
if(new_sum < sum) /* overflow? */
|
||||||
|
{
|
||||||
|
errno = ERANGE;
|
||||||
|
|
||||||
|
if(is_negative)
|
||||||
|
result = LONG_MIN;
|
||||||
|
else
|
||||||
|
result = LONG_MAX;
|
||||||
|
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
sum = new_sum;
|
||||||
|
|
||||||
|
str++;
|
||||||
|
|
||||||
|
c = (*str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_negative)
|
||||||
|
result = (-sum);
|
||||||
|
else
|
||||||
|
result = sum;
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
/* If desired, remember where we stopped reading the
|
||||||
|
* number from the buffer.
|
||||||
|
*/
|
||||||
|
if(ptr != NULL)
|
||||||
|
(*ptr) = (char *)str;
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* USE_64_BIT_INTS */
|
||||||
201
library/stdlib_strtoull.c
Normal file
201
library/stdlib_strtoull.c
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdlib_strtoull.c,v 1.1 2004-09-20 17:16:06 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _STDLIB_NULL_POINTER_CHECK_H
|
||||||
|
#include "stdlib_null_pointer_check.h"
|
||||||
|
#endif /* _STDLIB_NULL_POINTER_CHECK_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STDLIB_HEADERS_H
|
||||||
|
#include "stdlib_headers.h"
|
||||||
|
#endif /* _STDLIB_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(USE_64_BIT_INTS)
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
unsigned long long
|
||||||
|
strtoull(const char *str, char **ptr, int base)
|
||||||
|
{
|
||||||
|
BOOL is_negative;
|
||||||
|
unsigned long long result = 0;
|
||||||
|
unsigned long long new_sum;
|
||||||
|
unsigned long long sum;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
SHOWSTRING(str);
|
||||||
|
SHOWPOINTER(ptr);
|
||||||
|
SHOWVALUE(base);
|
||||||
|
|
||||||
|
assert(str != NULL && base >= 0);
|
||||||
|
|
||||||
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
|
{
|
||||||
|
if(str == NULL)
|
||||||
|
{
|
||||||
|
SHOWMSG("invalid str parameter");
|
||||||
|
|
||||||
|
errno = EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CHECK_FOR_NULL_POINTERS */
|
||||||
|
|
||||||
|
if(base < 0)
|
||||||
|
{
|
||||||
|
SHOWMSG("invalid base parameter");
|
||||||
|
|
||||||
|
errno = ERANGE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip all leading blanks. */
|
||||||
|
while((c = (*str)) != '\0')
|
||||||
|
{
|
||||||
|
if(NOT isspace(c))
|
||||||
|
break;
|
||||||
|
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The first character may be a sign. */
|
||||||
|
if(c == '-')
|
||||||
|
{
|
||||||
|
/* It's a negative number. */
|
||||||
|
is_negative = TRUE;
|
||||||
|
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* It's not going to be negative. */
|
||||||
|
is_negative = FALSE;
|
||||||
|
|
||||||
|
/* But there may be a sign we will choose to
|
||||||
|
* ignore.
|
||||||
|
*/
|
||||||
|
if(c == '+')
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = (*str);
|
||||||
|
|
||||||
|
/* There may be a leading '0x' to indicate that what
|
||||||
|
* follows is a hexadecimal number.
|
||||||
|
*/
|
||||||
|
if(base == 0 || base == 16)
|
||||||
|
{
|
||||||
|
if((c == '0') && (str[1] == 'x' || str[1] == 'X'))
|
||||||
|
{
|
||||||
|
base = 16;
|
||||||
|
|
||||||
|
str += 2;
|
||||||
|
|
||||||
|
c = (*str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we still don't know what base to use and the
|
||||||
|
* next letter to follow is a zero then this is
|
||||||
|
* probably a number in octal notation.
|
||||||
|
*/
|
||||||
|
if(base == 0)
|
||||||
|
{
|
||||||
|
if(c == '0')
|
||||||
|
base = 8;
|
||||||
|
else
|
||||||
|
base = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if(1 <= base && base <= 36)
|
||||||
|
{
|
||||||
|
while(c != '\0')
|
||||||
|
{
|
||||||
|
if('0' <= c && c <= '9')
|
||||||
|
c -= '0';
|
||||||
|
else if ('a' <= c)
|
||||||
|
c -= 'a' - 10;
|
||||||
|
else if ('A' <= c)
|
||||||
|
c -= 'A' - 10;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Ignore invalid numbers. */
|
||||||
|
if(c >= base)
|
||||||
|
break;
|
||||||
|
|
||||||
|
new_sum = base * sum + c;
|
||||||
|
if(new_sum < sum) /* overflow? */
|
||||||
|
{
|
||||||
|
errno = ERANGE;
|
||||||
|
|
||||||
|
result = ULONG_MAX;
|
||||||
|
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
sum = new_sum;
|
||||||
|
|
||||||
|
str++;
|
||||||
|
|
||||||
|
c = (*str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_negative)
|
||||||
|
result = (-sum);
|
||||||
|
else
|
||||||
|
result = sum;
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
/* If desired, remember where we stopped reading the
|
||||||
|
* number from the buffer.
|
||||||
|
*/
|
||||||
|
if(ptr != NULL)
|
||||||
|
(*ptr) = (char *)str;
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* USE_64_BIT_INTS */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_swapstack.c,v 1.1.1.1 2004-07-26 16:32:11 obarthel Exp $
|
* $Id: stdlib_swapstack.c,v 1.2 2004-10-02 15:56:13 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -94,51 +94,19 @@ ___swap_stack_and_call: \n\
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
__asm(" \n\
|
/* Swap the current stack configuration out, call a function provided,
|
||||||
\n\
|
swap the stack configuration back and return. */
|
||||||
.text \n\
|
int
|
||||||
.align 2 \n\
|
__swap_stack_and_call(struct StackSwapStruct * stk,APTR function)
|
||||||
\n\
|
{
|
||||||
.set MainInterface, 632 \n\
|
register int result;
|
||||||
.set IExec_StackSwap, 272 \n\
|
|
||||||
\n\
|
StackSwap(stk);
|
||||||
.globl SysBase \n\
|
result = ((int (*)(void))function)();
|
||||||
.globl __swap_stack_and_call \n\
|
StackSwap(stk);
|
||||||
\n\
|
|
||||||
__swap_stack_and_call: \n\
|
return(result);
|
||||||
stwu r1, -32(r1) # Make a stack frame \n\
|
}
|
||||||
mflr r0 \n\
|
|
||||||
stw r0, 36(r1) \n\
|
|
||||||
stmw r29, 8(r1) # Get us three GPRs \n\
|
|
||||||
# r29 will store IExec \n\
|
|
||||||
mr r4, r31 # Backup ptr to function to call \n\
|
|
||||||
mr r3, r30 # Backup ptr to StackSwapStruct \n\
|
|
||||||
\n\
|
|
||||||
lis r3, SysBase@ha # Retrieve sysbase pointer \n\
|
|
||||||
lwz r3, SysBase@l(r3) \n\
|
|
||||||
lwz r29, MainInterface(r3) # Get IExec \n\
|
|
||||||
\n\
|
|
||||||
addi r3, r29, IExec_StackSwap # StackSwap entry \n\
|
|
||||||
mr r4, r30 # StackSwap struct in r4 \n\
|
|
||||||
mtlr r3 \n\
|
|
||||||
blrl # IExec->StackSwap(r4) \n\
|
|
||||||
\n\
|
|
||||||
mtlr r31 # Call payload \n\
|
|
||||||
blrl \n\
|
|
||||||
\n\
|
|
||||||
addi r3, r29, IExec_StackSwap # Revert to old stack \n\
|
|
||||||
mr r4, r30 \n\
|
|
||||||
mtlr r3 \n\
|
|
||||||
blrl \n\
|
|
||||||
\n\
|
|
||||||
lmw r29, 8(r1) # Restore registers \n\
|
|
||||||
lwz r0, 36(r1) \n\
|
|
||||||
mtlr r0 \n\
|
|
||||||
addi r1, r1, 32 # Clean up stack \n\
|
|
||||||
\n\
|
|
||||||
blr \n\
|
|
||||||
\n\
|
|
||||||
");
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_wildcard_expand.c,v 1.1.1.1 2004-07-26 16:32:13 obarthel Exp $
|
* $Id: stdlib_wildcard_expand.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -39,7 +39,6 @@
|
|||||||
|
|
||||||
UBYTE * WEAK __allocate_quote_vector(int num_parameters UNUSED);
|
UBYTE * WEAK __allocate_quote_vector(int num_parameters UNUSED);
|
||||||
int WEAK __wildcard_expand_init(void);
|
int WEAK __wildcard_expand_init(void);
|
||||||
void WEAK __wildcard_expand_exit(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -56,10 +55,3 @@ __wildcard_expand_init(void)
|
|||||||
{
|
{
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
void
|
|
||||||
__wildcard_expand_exit(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: string_strtok.c,v 1.1.1.1 2004-07-26 16:32:20 obarthel Exp $
|
* $Id: string_strtok.c,v 1.2 2004-10-25 19:53:15 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -89,9 +89,12 @@ strtok(char *str, const char *separator_set)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* This is where the search can resume later. */
|
/* This is where the search can resume later. */
|
||||||
last = &str[size+1];
|
last = &str[size];
|
||||||
if((*last) == '\0')
|
|
||||||
last = NULL;
|
/* If we didn't hit the end of the string already,
|
||||||
|
skip the separator. */
|
||||||
|
if((*last) != '\0')
|
||||||
|
last++;
|
||||||
|
|
||||||
/* This is the token we found; make sure that
|
/* This is the token we found; make sure that
|
||||||
it looks like a valid string. */
|
it looks like a valid string. */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time_clock.c,v 1.1.1.1 2004-07-26 16:32:21 obarthel Exp $
|
* $Id: time_clock.c,v 1.2 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -37,6 +37,22 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
static struct DateStamp start_time;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_CONSTRUCTOR(init_start_time)
|
||||||
|
{
|
||||||
|
/* Remember when this program was started. */
|
||||||
|
DateStamp(&start_time);
|
||||||
|
|
||||||
|
RETURN(OK);
|
||||||
|
|
||||||
|
CONSTRUCTOR_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
clock_t
|
clock_t
|
||||||
clock(void)
|
clock(void)
|
||||||
{
|
{
|
||||||
@@ -57,8 +73,8 @@ clock(void)
|
|||||||
minutes_now = now.ds_Days * 24 * 60 + now.ds_Minute;
|
minutes_now = now.ds_Days * 24 * 60 + now.ds_Minute;
|
||||||
ticks_now = now.ds_Tick;
|
ticks_now = now.ds_Tick;
|
||||||
|
|
||||||
minutes_start = __start_time.ds_Days * 24 * 60 + __start_time.ds_Minute;
|
minutes_start = start_time.ds_Days * 24 * 60 + start_time.ds_Minute;
|
||||||
ticks_start = __start_time.ds_Tick;
|
ticks_start = start_time.ds_Tick;
|
||||||
|
|
||||||
/* Subtract the start time from the current time. We start
|
/* Subtract the start time from the current time. We start
|
||||||
* with the ticks.
|
* with the ticks.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time_data.c,v 1.1.1.1 2004-07-26 16:32:22 obarthel Exp $
|
* $Id: time_data.c,v 1.2 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -37,10 +37,6 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
struct DateStamp __start_time;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
const char * const __abbreviated_week_day_names[7] =
|
const char * const __abbreviated_week_day_names[7] =
|
||||||
{
|
{
|
||||||
"Sun",
|
"Sun",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time_headers.h,v 1.1.1.1 2004-07-26 16:32:23 obarthel Exp $
|
* $Id: time_headers.h,v 1.2 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,10 +84,6 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct DateStamp __start_time;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
extern const char * const __abbreviated_week_day_names[7];
|
extern const char * const __abbreviated_week_day_names[7];
|
||||||
extern const char * const __week_day_names[7];
|
extern const char * const __week_day_names[7];
|
||||||
extern const char * const __abbreviated_month_names[12];
|
extern const char * const __abbreviated_month_names[12];
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd_data.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
* $Id: unistd_chdir_exit.c,v 1.2 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -41,20 +41,34 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Names of files and directories to delete when shutting down. */
|
|
||||||
struct MinList __unlink_list;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* Local timer I/O. */
|
|
||||||
struct MsgPort * __timer_port;
|
|
||||||
struct timerequest * __timer_request;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* If the program's current directory was changed, here is where
|
/* If the program's current directory was changed, here is where
|
||||||
* we find out about it.
|
we find out about it. */
|
||||||
*/
|
BPTR NOCOMMON __original_current_directory;
|
||||||
BPTR __original_current_directory;
|
BOOL NOCOMMON __current_directory_changed;
|
||||||
BOOL __current_directory_changed;
|
BOOL NOCOMMON __unlock_current_directory;
|
||||||
BOOL __unlock_current_directory;
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_DESTRUCTOR(__chdir_exit)
|
||||||
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if(__current_directory_changed)
|
||||||
|
{
|
||||||
|
BPTR old_dir;
|
||||||
|
|
||||||
|
old_dir = CurrentDir(__original_current_directory);
|
||||||
|
__original_current_directory = ZERO;
|
||||||
|
|
||||||
|
if(__unlock_current_directory)
|
||||||
|
{
|
||||||
|
UnLock(old_dir);
|
||||||
|
|
||||||
|
__unlock_current_directory = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
__current_directory_changed = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd_headers.h,v 1.1.1.1 2004-07-26 16:32:28 obarthel Exp $
|
* $Id: unistd_headers.h,v 1.3 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,22 +47,29 @@ extern char __current_path_name[MAXPATHLEN];
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Names of files and directories to delete when shutting down. */
|
/* Names of files and directories to delete when shutting down. */
|
||||||
extern struct MinList __unlink_list;
|
extern struct MinList NOCOMMON __unlink_list;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Local timer I/O. */
|
/* Local timer I/O. */
|
||||||
extern struct MsgPort * __timer_port;
|
extern struct MsgPort * NOCOMMON __timer_port;
|
||||||
extern struct timerequest * __timer_request;
|
extern struct timerequest * NOCOMMON __timer_request;
|
||||||
|
extern BOOL NOCOMMON __timer_busy;
|
||||||
|
extern struct Library * NOCOMMON __TimerBase;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
extern struct TimerIFace * NOCOMMON __ITimer;
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* If the program's current directory was changed, here is where
|
/* If the program's current directory was changed, here is where
|
||||||
* we find out about it.
|
we find out about it. */
|
||||||
*/
|
extern BPTR NOCOMMON __original_current_directory;
|
||||||
extern BPTR __original_current_directory;
|
extern BOOL NOCOMMON __current_directory_changed;
|
||||||
extern BOOL __current_directory_changed;
|
extern BOOL NOCOMMON __unlock_current_directory;
|
||||||
extern BOOL __unlock_current_directory;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -75,4 +82,8 @@ extern void __strip_double_slash(char * file_name,int len);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern unsigned int __time_delay(unsigned long seconds,unsigned long microseconds);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /* _UNISTD_HEADERS_H */
|
#endif /* _UNISTD_HEADERS_H */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd_init_exit.c,v 1.3 2004-08-07 10:24:04 obarthel Exp $
|
* $Id: unistd_init_exit.c,v 1.6 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -41,21 +41,25 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
/* Names of files and directories to delete when shutting down. */
|
||||||
__unistd_init(void)
|
struct MinList NOCOMMON __unlink_list;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_CONSTRUCTOR(__unistd_init)
|
||||||
{
|
{
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
NewList((struct List *)&__unlink_list);
|
NewList((struct List *)&__unlink_list);
|
||||||
|
|
||||||
RETURN(OK);
|
RETURN(OK);
|
||||||
return(OK);
|
|
||||||
|
CONSTRUCTOR_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
CLIB_DESTRUCTOR(__unistd_exit)
|
||||||
__unistd_exit(void)
|
|
||||||
{
|
{
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -66,6 +70,9 @@ __unistd_exit(void)
|
|||||||
struct UnlinkNode * uln;
|
struct UnlinkNode * uln;
|
||||||
BPTR old_dir;
|
BPTR old_dir;
|
||||||
|
|
||||||
|
/* Close all the files that still might be open. */
|
||||||
|
__close_all_files();
|
||||||
|
|
||||||
while((uln = (struct UnlinkNode *)RemHead((struct List *)&__unlink_list)))
|
while((uln = (struct UnlinkNode *)RemHead((struct List *)&__unlink_list)))
|
||||||
{
|
{
|
||||||
old_dir = CurrentDir(uln->uln_Lock);
|
old_dir = CurrentDir(uln->uln_Lock);
|
||||||
@@ -80,38 +87,6 @@ __unistd_exit(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(__timer_request != NULL)
|
|
||||||
{
|
|
||||||
if(__timer_request->tr_node.io_Device != NULL)
|
|
||||||
CloseDevice((struct IORequest *)__timer_request);
|
|
||||||
|
|
||||||
DeleteIORequest((struct IORequest *)__timer_request);
|
|
||||||
__timer_request = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(__timer_port != NULL)
|
|
||||||
{
|
|
||||||
DeleteMsgPort(__timer_port);
|
|
||||||
__timer_port = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(__current_directory_changed)
|
|
||||||
{
|
|
||||||
BPTR old_dir;
|
|
||||||
|
|
||||||
old_dir = CurrentDir(__original_current_directory);
|
|
||||||
__original_current_directory = ZERO;
|
|
||||||
|
|
||||||
if(__unlock_current_directory)
|
|
||||||
{
|
|
||||||
UnLock(old_dir);
|
|
||||||
|
|
||||||
__unlock_current_directory = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
__current_directory_changed = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
LEAVE();
|
LEAVE();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd_sleep.c,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
* $Id: unistd_sleep.c,v 1.3 2004-09-29 12:10:29 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -44,132 +44,11 @@
|
|||||||
unsigned int
|
unsigned int
|
||||||
sleep(unsigned int seconds)
|
sleep(unsigned int seconds)
|
||||||
{
|
{
|
||||||
static BOOL sleeping;
|
unsigned int result;
|
||||||
unsigned int result = 0;
|
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
SHOWVALUE(seconds);
|
result = __time_delay(seconds,0);
|
||||||
|
|
||||||
if(__check_abort_enabled)
|
|
||||||
__check_abort();
|
|
||||||
|
|
||||||
if(seconds > 0)
|
|
||||||
{
|
|
||||||
if(NOT sleeping)
|
|
||||||
{
|
|
||||||
BOOL timer_open;
|
|
||||||
|
|
||||||
sleeping = TRUE;
|
|
||||||
|
|
||||||
if(__timer_request == NULL)
|
|
||||||
{
|
|
||||||
timer_open = FALSE;
|
|
||||||
|
|
||||||
SHOWMSG("trying to open the timer");
|
|
||||||
|
|
||||||
PROFILE_OFF();
|
|
||||||
|
|
||||||
__timer_port = CreateMsgPort();
|
|
||||||
if(__timer_port != NULL)
|
|
||||||
{
|
|
||||||
__timer_request = (struct timerequest *)CreateIORequest(__timer_port,sizeof(*__timer_request));
|
|
||||||
if(__timer_request != NULL)
|
|
||||||
{
|
|
||||||
if(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)__timer_request,0) == 0)
|
|
||||||
timer_open = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(NOT timer_open)
|
|
||||||
{
|
|
||||||
SHOWMSG("that didn't work");
|
|
||||||
|
|
||||||
DeleteIORequest((struct IORequest *)__timer_request);
|
|
||||||
__timer_request = NULL;
|
|
||||||
|
|
||||||
DeleteMsgPort(__timer_port);
|
|
||||||
__timer_port = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
PROFILE_ON();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
timer_open = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(timer_open)
|
|
||||||
{
|
|
||||||
ULONG signals_to_wait_for;
|
|
||||||
ULONG seconds_then;
|
|
||||||
ULONG timer_signal;
|
|
||||||
struct DateStamp ds;
|
|
||||||
ULONG signals;
|
|
||||||
|
|
||||||
__timer_request->tr_node.io_Command = TR_ADDREQUEST;
|
|
||||||
__timer_request->tr_time.tv_secs = seconds;
|
|
||||||
__timer_request->tr_time.tv_micro = 0;
|
|
||||||
|
|
||||||
timer_signal = (1UL << __timer_port->mp_SigBit);
|
|
||||||
|
|
||||||
signals_to_wait_for = timer_signal;
|
|
||||||
|
|
||||||
SetSignal(0,signals_to_wait_for);
|
|
||||||
|
|
||||||
if(__check_abort_enabled)
|
|
||||||
SET_FLAG(signals_to_wait_for,SIGBREAKF_CTRL_C);
|
|
||||||
|
|
||||||
PROFILE_OFF();
|
|
||||||
DateStamp(&ds);
|
|
||||||
PROFILE_ON();
|
|
||||||
|
|
||||||
seconds_then = (ds.ds_Days * 24 * 60 + ds.ds_Minute) * 60 + ds.ds_Tick / TICKS_PER_SECOND;
|
|
||||||
|
|
||||||
SendIO((struct IORequest *)__timer_request);
|
|
||||||
|
|
||||||
while(TRUE)
|
|
||||||
{
|
|
||||||
PROFILE_OFF();
|
|
||||||
signals = Wait(signals_to_wait_for);
|
|
||||||
PROFILE_ON();
|
|
||||||
|
|
||||||
if(FLAG_IS_SET(signals,SIGBREAKF_CTRL_C))
|
|
||||||
{
|
|
||||||
ULONG seconds_now;
|
|
||||||
|
|
||||||
if(CheckIO((struct IORequest *)__timer_request))
|
|
||||||
AbortIO((struct IORequest *)__timer_request);
|
|
||||||
|
|
||||||
WaitIO((struct IORequest *)__timer_request);
|
|
||||||
|
|
||||||
SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C);
|
|
||||||
__check_abort();
|
|
||||||
|
|
||||||
PROFILE_OFF();
|
|
||||||
DateStamp(&ds);
|
|
||||||
PROFILE_ON();
|
|
||||||
|
|
||||||
seconds_now = (ds.ds_Days * 24 * 60 + ds.ds_Minute) * 60 + ds.ds_Tick / TICKS_PER_SECOND;
|
|
||||||
|
|
||||||
seconds_now -= seconds_then;
|
|
||||||
if(seconds_now < seconds)
|
|
||||||
result = (seconds - seconds_now);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(FLAG_IS_SET(signals,timer_signal))
|
|
||||||
{
|
|
||||||
WaitIO((struct IORequest *)__timer_request);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sleeping = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
|
|||||||
139
library/unistd_time_delay.c
Normal file
139
library/unistd_time_delay.c
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* $Id: unistd_time_delay.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UNISTD_HEADERS_H
|
||||||
|
#include "unistd_headers.h"
|
||||||
|
#endif /* _UNISTD_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#include <proto/timer.h>
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
__time_delay(unsigned long seconds,unsigned long microseconds)
|
||||||
|
{
|
||||||
|
unsigned int result = 0;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
SHOWVALUE(seconds);
|
||||||
|
|
||||||
|
if(__check_abort_enabled)
|
||||||
|
__check_abort();
|
||||||
|
|
||||||
|
if((seconds > 0 || microseconds > 0) && NOT __timer_busy)
|
||||||
|
{
|
||||||
|
struct Library * TimerBase = __TimerBase;
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
struct TimerIFace * ITimer = __ITimer;
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
ULONG signals_to_wait_for;
|
||||||
|
ULONG seconds_then;
|
||||||
|
ULONG timer_signal;
|
||||||
|
struct timeval tv;
|
||||||
|
ULONG signals;
|
||||||
|
|
||||||
|
__timer_busy = TRUE;
|
||||||
|
|
||||||
|
__timer_request->tr_node.io_Command = TR_ADDREQUEST;
|
||||||
|
__timer_request->tr_time.tv_secs = seconds;
|
||||||
|
__timer_request->tr_time.tv_micro = microseconds;
|
||||||
|
|
||||||
|
timer_signal = (1UL << __timer_port->mp_SigBit);
|
||||||
|
|
||||||
|
signals_to_wait_for = timer_signal;
|
||||||
|
|
||||||
|
SetSignal(0,signals_to_wait_for);
|
||||||
|
|
||||||
|
if(__check_abort_enabled)
|
||||||
|
SET_FLAG(signals_to_wait_for,SIGBREAKF_CTRL_C);
|
||||||
|
|
||||||
|
PROFILE_OFF();
|
||||||
|
GetSysTime(&tv);
|
||||||
|
PROFILE_ON();
|
||||||
|
|
||||||
|
seconds_then = tv.tv_secs + seconds;
|
||||||
|
|
||||||
|
SendIO((struct IORequest *)__timer_request);
|
||||||
|
|
||||||
|
while(TRUE)
|
||||||
|
{
|
||||||
|
PROFILE_OFF();
|
||||||
|
signals = Wait(signals_to_wait_for);
|
||||||
|
PROFILE_ON();
|
||||||
|
|
||||||
|
if(FLAG_IS_SET(signals,SIGBREAKF_CTRL_C))
|
||||||
|
{
|
||||||
|
ULONG seconds_now;
|
||||||
|
|
||||||
|
if(CheckIO((struct IORequest *)__timer_request))
|
||||||
|
AbortIO((struct IORequest *)__timer_request);
|
||||||
|
|
||||||
|
WaitIO((struct IORequest *)__timer_request);
|
||||||
|
|
||||||
|
SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C);
|
||||||
|
__check_abort();
|
||||||
|
|
||||||
|
/* Now figure out how many seconds have elapsed and
|
||||||
|
how many would still remain. */
|
||||||
|
PROFILE_OFF();
|
||||||
|
GetSysTime(&tv);
|
||||||
|
PROFILE_ON();
|
||||||
|
|
||||||
|
seconds_now = tv.tv_secs;
|
||||||
|
if(seconds_now < seconds_then)
|
||||||
|
result = seconds_then - seconds_now;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(FLAG_IS_SET(signals,timer_signal))
|
||||||
|
{
|
||||||
|
WaitIO((struct IORequest *)__timer_request);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__timer_busy = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
146
library/unistd_timer.c
Normal file
146
library/unistd_timer.c
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
/*
|
||||||
|
* $Id: unistd_timer.c,v 1.2 2004-09-29 19:57:58 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UNISTD_HEADERS_H
|
||||||
|
#include "unistd_headers.h"
|
||||||
|
#endif /* _UNISTD_HEADERS_H */
|
||||||
|
|
||||||
|
#ifndef _STDLIB_HEADERS_H
|
||||||
|
#include "stdlib_headers.h"
|
||||||
|
#endif /* _STDLIB_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* Local timer I/O. */
|
||||||
|
struct MsgPort * NOCOMMON __timer_port;
|
||||||
|
struct timerequest * NOCOMMON __timer_request;
|
||||||
|
BOOL NOCOMMON __timer_busy;
|
||||||
|
struct Library * NOCOMMON __TimerBase;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
struct TimerIFace * NOCOMMON __ITimer;
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_CONSTRUCTOR(__timer_init)
|
||||||
|
{
|
||||||
|
BOOL success = FALSE;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
__timer_port = CreateMsgPort();
|
||||||
|
if(__timer_port == NULL)
|
||||||
|
{
|
||||||
|
__show_error("The timer message port could not be created.");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
__timer_request = (struct timerequest *)CreateIORequest(__timer_port,sizeof(*__timer_request));
|
||||||
|
if(__timer_request == NULL)
|
||||||
|
{
|
||||||
|
__show_error("The timer I/O request could not be created.");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)__timer_request,0) != OK)
|
||||||
|
{
|
||||||
|
__show_error("The timer could not be opened.");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
__TimerBase = (struct Library *)__timer_request->tr_node.io_Device;
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
{
|
||||||
|
__ITimer = (struct TimerIFace *)GetInterface(__TimerBase, "main", 1, 0);
|
||||||
|
if(__ITimer == NULL)
|
||||||
|
{
|
||||||
|
__show_error("The timer interface could not be obtained.");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
success = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(success);
|
||||||
|
|
||||||
|
if(success)
|
||||||
|
CONSTRUCTOR_SUCCEED();
|
||||||
|
else
|
||||||
|
CONSTRUCTOR_FAIL();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_DESTRUCTOR(__timer_exit)
|
||||||
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
{
|
||||||
|
if(__ITimer != NULL)
|
||||||
|
DropInterface((struct Interface *)__ITimer);
|
||||||
|
|
||||||
|
__ITimer = NULL;
|
||||||
|
}
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
__TimerBase = NULL;
|
||||||
|
|
||||||
|
if(__timer_request != NULL)
|
||||||
|
{
|
||||||
|
if(__timer_request->tr_node.io_Device != NULL)
|
||||||
|
CloseDevice((struct IORequest *)__timer_request);
|
||||||
|
|
||||||
|
DeleteIORequest((struct IORequest *)__timer_request);
|
||||||
|
__timer_request = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(__timer_port != NULL)
|
||||||
|
{
|
||||||
|
DeleteMsgPort(__timer_port);
|
||||||
|
__timer_port = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_usergroup.c,v 1.1.1.1 2004-07-26 16:32:13 obarthel Exp $
|
* $Id: unistd_usleep.c,v 1.1 2004-09-29 12:10:29 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -31,21 +31,24 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _STDLIB_HEADERS_H
|
#ifndef _UNISTD_HEADERS_H
|
||||||
#include "stdlib_headers.h"
|
#include "unistd_headers.h"
|
||||||
#endif /* _STDLIB_HEADERS_H */
|
#endif /* _UNISTD_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
void
|
||||||
__usergroup_exit(void)
|
usleep(unsigned long microseconds)
|
||||||
{
|
{
|
||||||
}
|
ENTER();
|
||||||
|
|
||||||
/****************************************************************************/
|
SHOWVALUE(microseconds);
|
||||||
|
|
||||||
int
|
__time_delay(0,microseconds);
|
||||||
__usergroup_init(void)
|
|
||||||
{
|
LEAVE();
|
||||||
return(OK);
|
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd_wildcard_expand.c,v 1.1.1.1 2004-07-26 16:32:33 obarthel Exp $
|
* $Id: unistd_wildcard_expand.c,v 1.3 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -74,16 +74,17 @@ static struct AnchorPath * anchor;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
CLIB_DESTRUCTOR(__wildcard_expand_exit)
|
||||||
__wildcard_expand_exit(void)
|
|
||||||
{
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
if(anchor != NULL)
|
if(anchor != NULL)
|
||||||
{
|
{
|
||||||
MatchEnd(anchor);
|
MatchEnd(anchor);
|
||||||
|
|
||||||
free(anchor);
|
|
||||||
anchor = NULL;
|
anchor = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 175
|
#define REVISION 182
|
||||||
#define DATE "10.9.2004"
|
#define DATE "8.11.2004"
|
||||||
#define VERS "unix.lib 1.175"
|
#define VERS "unix.lib 1.182"
|
||||||
#define VSTRING "unix.lib 1.175 (10.9.2004)\r\n"
|
#define VSTRING "unix.lib 1.182 (8.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: unix.lib 1.175 (10.9.2004)"
|
#define VERSTAG "\0$VER: unix.lib 1.182 (8.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
175
|
182
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: usergroup_data.c,v 1.1.1.1 2004-07-26 16:32:34 obarthel Exp $
|
* $Id: usergroup_data.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -41,18 +41,6 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
struct Library * __UserGroupBase;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
|
||||||
|
|
||||||
struct UserGroupIFace *__IUserGroup;
|
|
||||||
|
|
||||||
#endif /* __amigaos4__ */
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
int __root_uid;
|
int __root_uid;
|
||||||
int __root_gid;
|
int __root_gid;
|
||||||
int __root_euid;
|
int __root_euid;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: usergroup_headers.h,v 1.1.1.1 2004-07-26 16:32:38 obarthel Exp $
|
* $Id: usergroup_headers.h,v 1.3 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,13 +42,13 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct Library * __UserGroupBase;
|
extern struct Library * NOCOMMON __UserGroupBase;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
#if defined(__amigaos4__)
|
||||||
|
|
||||||
extern struct UserGroupIFace *__IUserGroup;
|
extern struct UserGroupIFace * NOCOMMON __IUserGroup;
|
||||||
|
|
||||||
#endif /* __amigaos4__ */
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
@@ -519,14 +519,18 @@ extern int __root_egid;
|
|||||||
|
|
||||||
#define __umask(mask) ({ \
|
#define __umask(mask) ({ \
|
||||||
ULONG _umask_mask = (mask); \
|
ULONG _umask_mask = (mask); \
|
||||||
{ \
|
ULONG _umask__re = \
|
||||||
|
({ \
|
||||||
register struct Library * const __umask__bn __asm("a6") = (struct Library *) (__UserGroupBase);\
|
register struct Library * const __umask__bn __asm("a6") = (struct Library *) (__UserGroupBase);\
|
||||||
|
register ULONG __umask__re __asm("d0"); \
|
||||||
register ULONG __umask_mask __asm("d0") = (_umask_mask); \
|
register ULONG __umask_mask __asm("d0") = (_umask_mask); \
|
||||||
__asm volatile ("jsr a6@(-192:W)" \
|
__asm volatile ("jsr a6@(-192:W)" \
|
||||||
: \
|
: "=r"(__umask__re) \
|
||||||
: "r"(__umask__bn), "r"(__umask_mask) \
|
: "r"(__umask__bn), "r"(__umask_mask) \
|
||||||
: "d0", "d1", "a0", "a1", "fp0", "fp1", "cc", "memory"); \
|
: "d1", "a0", "a1", "fp0", "fp1", "cc", "memory"); \
|
||||||
} \
|
__umask__re; \
|
||||||
|
}); \
|
||||||
|
_umask__re; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define __getumask() ({ \
|
#define __getumask() ({ \
|
||||||
@@ -718,7 +722,7 @@ VOID __endgrent(VOID);
|
|||||||
UBYTE *__crypt(UBYTE *key,UBYTE *set);
|
UBYTE *__crypt(UBYTE *key,UBYTE *set);
|
||||||
UBYTE *__ug_GetSalt(struct passwd *user,UBYTE *buf,ULONG size);
|
UBYTE *__ug_GetSalt(struct passwd *user,UBYTE *buf,ULONG size);
|
||||||
UBYTE *__getpass(UBYTE *prompt);
|
UBYTE *__getpass(UBYTE *prompt);
|
||||||
VOID __umask(ULONG mask);
|
UWORD __umask(ULONG mask);
|
||||||
UWORD __getumask(VOID);
|
UWORD __getumask(VOID);
|
||||||
LONG __setsid(VOID);
|
LONG __setsid(VOID);
|
||||||
LONG __getpgrp(VOID);
|
LONG __getpgrp(VOID);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: usergroup_init_exit.c,v 1.1.1.1 2004-07-26 16:32:38 obarthel Exp $
|
* $Id: usergroup_init_exit.c,v 1.3 2004-09-29 19:57:58 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -54,12 +54,17 @@ extern char * __program_name;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern void __show_error(const char * message);
|
struct Library * NOCOMMON __UserGroupBase;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
#if defined(__amigaos4__)
|
||||||
__usergroup_exit(void)
|
struct UserGroupIFace * NOCOMMON __IUserGroup;
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_DESTRUCTOR(__usergroup_exit)
|
||||||
{
|
{
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -84,8 +89,7 @@ __usergroup_exit(void)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
CLIB_CONSTRUCTOR(__usergroup_init)
|
||||||
__usergroup_init(void)
|
|
||||||
{
|
{
|
||||||
struct TagItem tags[2];
|
struct TagItem tags[2];
|
||||||
int result = ERROR;
|
int result = ERROR;
|
||||||
@@ -139,7 +143,11 @@ __usergroup_init(void)
|
|||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
|
||||||
|
if(result == OK)
|
||||||
|
CONSTRUCTOR_SUCCEED();
|
||||||
|
else
|
||||||
|
CONSTRUCTOR_FAIL();
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,90 +0,0 @@
|
|||||||
#
|
|
||||||
# $Id: GNUmakefile.68k,v 1.1 2004-08-14 15:01:22 obarthel Exp $
|
|
||||||
#
|
|
||||||
# :ts=8
|
|
||||||
#
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
CC = gcc
|
|
||||||
DELETE = delete all quiet
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@echo "Compiling $<"
|
|
||||||
@$(CC) -c $(CFLAGS) $<
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
#CODE_TYPE := -fbaserel -DSMALL_DATA -m68020-60 -DM68020
|
|
||||||
#CODE_TYPE := -fbaserel -DSMALL_DATA -m68000
|
|
||||||
#CODE_TYPE := -fbaserel32 -DSMALL_DATA32 -m68020-60 -DM68020
|
|
||||||
CODE_TYPE := -m68020-60 -DM68020
|
|
||||||
#CODE_TYPE := -m68000
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
WARNINGS = \
|
|
||||||
-Wall -W -Wshadow -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
|
|
||||||
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
|
|
||||||
|
|
||||||
INCLUDE = -I../library/include
|
|
||||||
LIB = -L../library/lib
|
|
||||||
OPTIONS = -DNDEBUG -fno-builtin -DNO_INLINE_STDARG -DIEEE_FLOATING_POINT_SUPPORT
|
|
||||||
#OPTIONS = -D__MEM_DEBUG -fno-builtin
|
|
||||||
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
|
|
||||||
OPTIMIZE = -O
|
|
||||||
#OPTIMIZE = -O2 -fomit-frame-pointer
|
|
||||||
#DEBUG = -g2
|
|
||||||
|
|
||||||
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDE) $(LIB)
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
LIBS = -lm -lc -lgcc
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
all: test fgets_test iotest sscanf_test printf_test stack_size_test translate_test
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(DELETE) #?.o #?.map test fgets_test iotest sscanf_test printf_test stack_size_test translate_test
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
test : test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
$(CC) $(CFLAGS) -o $@ test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
|
|
||||||
|
|
||||||
fgets_test : fgets_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
$(CC) $(CFLAGS) -o $@ fgets_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
|
|
||||||
|
|
||||||
iotest : iotest.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
$(CC) $(CFLAGS) -o $@ iotest.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
|
|
||||||
|
|
||||||
sscanf_test : sscanf_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
$(CC) $(CFLAGS) -o $@ sscanf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
|
|
||||||
|
|
||||||
printf_test : printf_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
$(CC) $(CFLAGS) -o $@ printf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
|
|
||||||
|
|
||||||
stack_size_test : stack_size_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
$(CC) $(CFLAGS) -o $@ stack_size_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
|
|
||||||
|
|
||||||
translate_test : translate_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
$(CC) $(CFLAGS) -o $@ translate_test.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
mkid:
|
|
||||||
mkid -v #?.(c|h|asm|i)
|
|
||||||
|
|
||||||
update:
|
|
||||||
mkid -v -u
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
This is a collection of programs I'm using to test the library. These
|
|
||||||
are functional tests: the library is supposed to do something, and produce
|
|
||||||
a particular result. For example, "printf_test" exercises a bunch of
|
|
||||||
output formatting rules. Currently, there is only an smakefile for SAS/C
|
|
||||||
to build these programs with.
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define LINEBUFLENGTH 180
|
|
||||||
|
|
||||||
#define STRIP_LF(str) (str[strlen(str)-1]=0)
|
|
||||||
void invert_str(char * in)
|
|
||||||
{
|
|
||||||
char t;
|
|
||||||
while(t=*in)
|
|
||||||
{
|
|
||||||
*in++=~t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int i, char *c[])
|
|
||||||
{
|
|
||||||
char dest_fname[80], in_linebuffer[LINEBUFLENGTH];
|
|
||||||
FILE * fileout, * filein;
|
|
||||||
|
|
||||||
if(i>1)
|
|
||||||
{
|
|
||||||
sprintf(dest_fname, "%s.c", c[1]);
|
|
||||||
|
|
||||||
fileout=fopen(dest_fname, "w");
|
|
||||||
filein =fopen(c[1], "r");
|
|
||||||
|
|
||||||
if(fileout && filein)
|
|
||||||
{
|
|
||||||
fgets(in_linebuffer, LINEBUFLENGTH, filein);
|
|
||||||
STRIP_LF(in_linebuffer);
|
|
||||||
invert_str(in_linebuffer);
|
|
||||||
fputs("char *s_leading=\"", fileout);
|
|
||||||
fputs(in_linebuffer, fileout);
|
|
||||||
fputs("\";\n", fileout);
|
|
||||||
|
|
||||||
fputs("char *s_messages[]={\n", fileout);
|
|
||||||
|
|
||||||
while(fgets(in_linebuffer, LINEBUFLENGTH, filein))
|
|
||||||
{
|
|
||||||
STRIP_LF(in_linebuffer);
|
|
||||||
invert_str(in_linebuffer);
|
|
||||||
|
|
||||||
fputs("\"", fileout);
|
|
||||||
fputs(in_linebuffer, fileout);
|
|
||||||
fputs("\",\n", fileout);
|
|
||||||
}
|
|
||||||
fputs("};\n", fileout);
|
|
||||||
fputs("unsigned s_mess_num = sizeof(s_messages)/sizeof(char *);\n", fileout);
|
|
||||||
fclose(filein);
|
|
||||||
fclose(fileout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
What's this stuff for ? I use it in SP_Engine to hide the usual bunch of "secret
|
|
||||||
messages". As you can see, the strings are simply not'ed .
|
|
||||||
This source shows both flaws: fgets() and the missing buffer flush. You can
|
|
||||||
change the while() statement with
|
|
||||||
|
|
||||||
while(!feof(filein))
|
|
||||||
{
|
|
||||||
fgets(in_linebuffer, LINEBUFLENGTH, filein);
|
|
||||||
....
|
|
||||||
|
|
||||||
This way you'll workaround the first problem.
|
|
||||||
The second issue manifests itself this way: the last two fputs() followed by the
|
|
||||||
fclose() don't do anything: no "};\n" and no "unsigned....." lines are output to
|
|
||||||
'fileout'. With SAS, it works perfectly. Converting the source to dos.library
|
|
||||||
calls also works perfectly. I wonder if there's some kind of strange interaction
|
|
||||||
with the dos/shell updates.
|
|
||||||
*/
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* $Id: fgets_test.c,v 1.1.1.1 2004-07-26 16:36:07 obarthel Exp $
|
|
||||||
*
|
|
||||||
* :ts=4
|
|
||||||
*/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc,char ** argv)
|
|
||||||
{
|
|
||||||
char line[256];
|
|
||||||
size_t len;
|
|
||||||
FILE * in;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i = 1 ; i < argc ; i++)
|
|
||||||
{
|
|
||||||
in = fopen(argv[i],"rb");
|
|
||||||
if(in != NULL)
|
|
||||||
{
|
|
||||||
while(fgets(line,sizeof(line),in) != NULL)
|
|
||||||
{
|
|
||||||
len = strlen(line);
|
|
||||||
while(len > 0 && (line[len-1] == '\n' || line[len-1] == '\r'))
|
|
||||||
line[--len] = '\0';
|
|
||||||
|
|
||||||
printf("%s\n",line);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(in);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define FILE_SIZE 2048
|
|
||||||
#define WRITE_SIZE 32
|
|
||||||
|
|
||||||
char FileData[FILE_SIZE];
|
|
||||||
|
|
||||||
void CreateFile(char *filename)
|
|
||||||
{
|
|
||||||
FILE *file;
|
|
||||||
|
|
||||||
if (file = fopen(filename,"w")) {
|
|
||||||
memset(FileData,'0',FILE_SIZE);
|
|
||||||
memset(FileData,'-',WRITE_SIZE);
|
|
||||||
fwrite(FileData,1,FILE_SIZE,file);
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReadWriteFile(char *filename)
|
|
||||||
{
|
|
||||||
FILE *file;
|
|
||||||
|
|
||||||
if (file = fopen(filename,"r+")) {
|
|
||||||
fseek(file,0,SEEK_SET);
|
|
||||||
fread(FileData,1,FILE_SIZE,file);
|
|
||||||
fseek(file,0,SEEK_SET);
|
|
||||||
memset(FileData,'1',WRITE_SIZE);
|
|
||||||
fwrite(FileData,1,WRITE_SIZE,file);
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
if (argc > 1) {
|
|
||||||
CreateFile(argv[1]);
|
|
||||||
ReadWriteFile(argv[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int __debug_level = 2;
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
double val = 0.0001;
|
|
||||||
|
|
||||||
printf("%g\n", val);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
double x;
|
|
||||||
|
|
||||||
void
|
|
||||||
print_format_int(const char * format_string,int parameter1,int parameter2)
|
|
||||||
{
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter1);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = % d, Format = \"%s\"\n",parameter1,format_string);
|
|
||||||
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter2);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = % d, Format = \"%s\"\n",parameter2,format_string);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
print_format_char(const char * format_string,char parameter)
|
|
||||||
{
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = '%c', Format = \"%s\"\n",parameter,format_string);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
print_format_string(const char * format_string,const char *parameter1,const char *parameter2)
|
|
||||||
{
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter1);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = \"%s\", Format = \"%s\"\n",parameter1,format_string);
|
|
||||||
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter2);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = \"%s\", Format = \"%s\"\n",parameter2,format_string);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
print_format_float(const char * format_string,double parameter1,double parameter2)
|
|
||||||
{
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter1);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = % f, Format = \"%s\"\n",parameter1,format_string);
|
|
||||||
|
|
||||||
printf("\"");
|
|
||||||
printf(format_string,parameter2);
|
|
||||||
printf("\"\t");
|
|
||||||
|
|
||||||
printf("Value = % f, Format = \"%s\"\n",parameter2,format_string);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
unsigned long foo[2] = { 0x41f00000, 0 };
|
|
||||||
|
|
||||||
memcpy(&x,foo,sizeof(x));
|
|
||||||
|
|
||||||
printf("%.20g\n",x);
|
|
||||||
*/
|
|
||||||
|
|
||||||
print_format_int("%12d",45,-45);
|
|
||||||
print_format_int("%012d",45,-45);
|
|
||||||
print_format_int("% 012d",45,-45);
|
|
||||||
print_format_int("%+12d",45,-45);
|
|
||||||
print_format_int("%+012d",45,-45);
|
|
||||||
print_format_int("%-12d",45,-45);
|
|
||||||
print_format_int("%- 12d",45,-45);
|
|
||||||
print_format_int("%-+12d",45,-45);
|
|
||||||
print_format_int("%12.4d",45,-45);
|
|
||||||
print_format_int("%-12.4d",45,-45);
|
|
||||||
print_format_int("%12.0d",45,-45);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_int("%14u",45,-45);
|
|
||||||
print_format_int("%014u",45,-45);
|
|
||||||
print_format_int("%#14u",45,-45);
|
|
||||||
print_format_int("%#014u",45,-45);
|
|
||||||
print_format_int("%-14u",45,-45);
|
|
||||||
print_format_int("%-#14u",45,-45);
|
|
||||||
print_format_int("%14.4u",45,-45);
|
|
||||||
print_format_int("%-14.4u",45,-45);
|
|
||||||
print_format_int("%14.0u",45,-45);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_int("%14o",45,-45);
|
|
||||||
print_format_int("%014o",45,-45);
|
|
||||||
print_format_int("%#14o",45,-45);
|
|
||||||
print_format_int("%#014o",45,-45);
|
|
||||||
print_format_int("%-14o",45,-45);
|
|
||||||
print_format_int("%-#14o",45,-45);
|
|
||||||
print_format_int("%14.4o",45,-45);
|
|
||||||
print_format_int("%-14.4o",45,-45);
|
|
||||||
print_format_int("%14.0o",45,-45);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_int("%12x",45,-45);
|
|
||||||
print_format_int("%012x",45,-45);
|
|
||||||
print_format_int("%#12X",45,-45);
|
|
||||||
print_format_int("%#012X",45,-45);
|
|
||||||
print_format_int("%-12x",45,-45);
|
|
||||||
print_format_int("%-#12x",45,-45);
|
|
||||||
print_format_int("%12.4x",45,-45);
|
|
||||||
print_format_int("%-12.4x",45,-45);
|
|
||||||
print_format_int("%12.0x",45,-45);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_char("%12c",'*');
|
|
||||||
print_format_char("%012c",'*');
|
|
||||||
print_format_char("%-12c",'*');
|
|
||||||
print_format_char("%12.0c",'*');
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_string("%12s","zap","longish");
|
|
||||||
print_format_string("%12.5s","zap","longish");
|
|
||||||
print_format_string("%012s","zap","longish");
|
|
||||||
print_format_string("%-12s","zap","longish");
|
|
||||||
print_format_string("%12.0s","zap","longish");
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_float("%10.2f",12.678,-12.678);
|
|
||||||
print_format_float("%010.2f",12.678,-12.678);
|
|
||||||
print_format_float("% 010.2f",12.678,-12.678);
|
|
||||||
print_format_float("%+10.2f",12.678,-12.678);
|
|
||||||
print_format_float("%+010.2f",12.678,-12.678);
|
|
||||||
print_format_float("%-10.2f",12.678,-12.678);
|
|
||||||
print_format_float("%- 10.2f",12.678,-12.678);
|
|
||||||
print_format_float("%-+10.4f",12.678,-12.678);
|
|
||||||
print_format_float("%f",12.678,-12.678);
|
|
||||||
print_format_float("%10f",12.678,-12.678);
|
|
||||||
print_format_float("%10.0f",12.678,-12.678);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_float("%10.2e",12.678,-12.678);
|
|
||||||
print_format_float("%010.2e",12.678,-12.678);
|
|
||||||
print_format_float("% 010.2e",12.678,-12.678);
|
|
||||||
print_format_float("%+10.2E",12.678,-12.678);
|
|
||||||
print_format_float("%+010.2E",12.678,-12.678);
|
|
||||||
print_format_float("%-10.2e",12.678,-12.678);
|
|
||||||
print_format_float("%- 10.2e",12.678,-12.678);
|
|
||||||
print_format_float("%-+10.2e",12.678,-12.678);
|
|
||||||
print_format_float("%e",12.678,-12.678);
|
|
||||||
print_format_float("%10e",12.678,-12.678);
|
|
||||||
print_format_float("%10.0e",12.678,-12.678);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_float("%10.2g",12.678,-12.678);
|
|
||||||
print_format_float("%010.2g",12.678,-12.678);
|
|
||||||
print_format_float("% 010.2g",12.678,-12.678);
|
|
||||||
print_format_float("%+10.2G",12.678,-12.678);
|
|
||||||
print_format_float("%+010.2G",12.678,-12.678);
|
|
||||||
print_format_float("%-10.2g",12.678,-12.678);
|
|
||||||
print_format_float("%- 10.2g",12.678,-12.678);
|
|
||||||
print_format_float("%-+10.2g",12.678,-12.678);
|
|
||||||
print_format_float("%g",12.678,-12.678);
|
|
||||||
print_format_float("%10g",12.678,-12.678);
|
|
||||||
print_format_float("%10.0g",12.678,-12.678);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
print_format_float("%10.2g",0.678,-0.678);
|
|
||||||
print_format_float("%010.2g",0.678,-0.678);
|
|
||||||
print_format_float("% 010.2g",0.678,-0.678);
|
|
||||||
print_format_float("%+10.2G",0.678,-0.678);
|
|
||||||
print_format_float("%+010.2G",0.678,-0.678);
|
|
||||||
print_format_float("%-10.2g",0.678,-0.678);
|
|
||||||
print_format_float("%- 10.2g",0.678,-0.678);
|
|
||||||
print_format_float("%-+10.2g",0.678,-0.678);
|
|
||||||
print_format_float("%g",0.678,-0.678);
|
|
||||||
print_format_float("%10g",0.678,-0.678);
|
|
||||||
print_format_float("%10.0g",0.678,-0.678);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
#
|
|
||||||
# $Id: smakefile,v 1.1 2004-08-06 11:51:50 obarthel Exp $
|
|
||||||
#
|
|
||||||
# :ts=8
|
|
||||||
#
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@echo "Compiling $<"
|
|
||||||
@sc nover $(CFLAGS) $<
|
|
||||||
|
|
||||||
.asm.o:
|
|
||||||
@echo "Assembling $<"
|
|
||||||
@asm $(AFLAGS) $<
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
# You might want to change this to the directory where your operating system
|
|
||||||
# header files are stored. On my system, that's "V:include", but you might
|
|
||||||
# get lucky with "sc:include" instead, which is the default for SAS/C.
|
|
||||||
INCLUDE_DIR = V:include
|
|
||||||
#INCLUDE_DIR = sc:include
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
# This is where the header files, the startup code and the c.lib files are
|
|
||||||
# stored; see below how this prefix is used.
|
|
||||||
LIB = /library/
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
OPTIMIZE = optimize opttime optschedule optinline
|
|
||||||
#DEBUG = debug=line noopt define=CHECK_FOR_NULL_POINTERS
|
|
||||||
#DEBUG = debug=line
|
|
||||||
#DEBUG = debug=line define=NDEBUG
|
|
||||||
DEBUG = debug=sf noopt
|
|
||||||
#DEBUG = debug=sf noopt define=CHECK_FOR_NULL_POINTERS
|
|
||||||
#PROFILE = profile
|
|
||||||
DATA = data=faronly
|
|
||||||
#CODE = code=far
|
|
||||||
CPU = cpu=060
|
|
||||||
MATH = define=IEEE_FLOATING_POINT_SUPPORT math=IEEE
|
|
||||||
SUPPORT = define=UNIX_PATH_SEMANTICS define=SOCKET_SUPPORT define=USERGROUP_SUPPORT \
|
|
||||||
define=__C_MACROS__
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
CFLAGS = \
|
|
||||||
resopt \
|
|
||||||
nover \
|
|
||||||
memorysize=huge \
|
|
||||||
idlen=64 \
|
|
||||||
commentnest \
|
|
||||||
nostackcheck \
|
|
||||||
stringmerge \
|
|
||||||
errorrexx \
|
|
||||||
$(PROFILE) $(OPTIMIZE) $(CODE) $(DATA) $(CPU) $(MATH) \
|
|
||||||
$(SUPPORT) $(DEBUG)
|
|
||||||
|
|
||||||
AFLAGS = \
|
|
||||||
-d -m2
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
all: setup test fgets_test iotest sscanf_test printf_test stack_size_test translate_test cleanup
|
|
||||||
|
|
||||||
clean:
|
|
||||||
-delete \#?.o \#?.map test fgets_test iotest sscanf_test printf_test stack_size_test translate_test
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
setup:
|
|
||||||
@echo "Setting up include: assignment"
|
|
||||||
@assign include: $(LIB)include V:include
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
@echo "Cleaning up include: assignment"
|
|
||||||
@assign include: sc:include
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
test: test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
fgets_test: fgets_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o fgets_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
iotest: iotest.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o iotest.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
sscanf_test: sscanf_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o sscanf_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
printf_test: printf_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o printf_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
stack_size_test: stack_size_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o stack_size_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
translate_test: translate_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
@slink $(LIB)startup.o translate_test.o to $@ lib $(LIB)c.lib addsym \
|
|
||||||
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
mkid:
|
|
||||||
mkid \#?.(c|h|asm|i) include/\#?.(c|h|asm|i) include/sys/\#?.(c|h|asm|i)
|
|
||||||
|
|
||||||
update:
|
|
||||||
mkid -v -u
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
int first, second, num;
|
|
||||||
int n,a,b,c;
|
|
||||||
char str[4];
|
|
||||||
|
|
||||||
num = sscanf("6", "%d %d", &first, &second);
|
|
||||||
|
|
||||||
printf("%d %d\n", num, first);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("","%*d,%d,%d",&a,&b,&c);
|
|
||||||
printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("1,2,3","%*d,%d,%d",&a,&b,&c);
|
|
||||||
printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("1,2","%*d,%d,%d",&a,&b,&c);
|
|
||||||
printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("asdf","*d,d,d",&a,&b,&c);
|
|
||||||
printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("asdf","%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("asdbbfc","%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("","%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("abcdef","%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("-","%d",&a);
|
|
||||||
printf("n = %d, a = %d\n",n,a);
|
|
||||||
|
|
||||||
a = b = c = 0;
|
|
||||||
n = sscanf("-4,-","%d,%d",&a,&b);
|
|
||||||
printf("n = %d, a = %d, b = %d\n",n,a,b);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("1 abc","%d %4c",&a,str);
|
|
||||||
printf("n = %d, a = %d, str = '%s'\n",n,a,str);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("abc","%4c",&a,str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
a = 0;
|
|
||||||
n = sscanf("17","%i",&a);
|
|
||||||
printf("n = %d, a = %d\n",n,a);
|
|
||||||
|
|
||||||
a = 0;
|
|
||||||
n = sscanf("017","%i",&a);
|
|
||||||
printf("n = %d, a = %d\n",n,a);
|
|
||||||
|
|
||||||
a = 0;
|
|
||||||
n = sscanf("0x17","%i",&a);
|
|
||||||
printf("n = %d, a = %d\n",n,a);
|
|
||||||
|
|
||||||
a = 0;
|
|
||||||
n = sscanf("0x80000000","%i",&a);
|
|
||||||
printf("n = %d, a = %u\n",n,a);
|
|
||||||
|
|
||||||
memset(str,0,sizeof(str));
|
|
||||||
n = sscanf("1,e","%*d,%[abc]",str);
|
|
||||||
printf("n = %d, str = '%s'\n",n,str);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/* gcc -mstackextend -o stack_extension_test stack_extension_test.c */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
void
|
|
||||||
recursive_function(char *data,int data_size,int level)
|
|
||||||
{
|
|
||||||
char local_data[10000];
|
|
||||||
char line[10];
|
|
||||||
int c;
|
|
||||||
|
|
||||||
data_size += sizeof(local_data);
|
|
||||||
level++;
|
|
||||||
|
|
||||||
printf("recursion level=%d, size=%d; continue? ",level,data_size);
|
|
||||||
|
|
||||||
fgets(line,sizeof(line),stdin);
|
|
||||||
c = toupper(line[0]);
|
|
||||||
|
|
||||||
if(c == 'Y')
|
|
||||||
recursive_function(local_data,data_size,level);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc,char ** argv)
|
|
||||||
{
|
|
||||||
recursive_function(NULL,0,0);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user