mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
59c0bb7f0b | ||
|
|
7492d108a3 | ||
|
|
9bf1e01518 | ||
|
|
be2d80a86a | ||
|
|
24ea9161a7 | ||
|
|
2d5193371a | ||
|
|
186887bba5 | ||
|
|
83f0977c0c | ||
|
|
e22a226640 | ||
|
|
3c1df9b1db | ||
|
|
655ea577d2 | ||
|
|
99e6856c11 | ||
|
|
b252f90d66 | ||
|
|
1ed26d0a60 | ||
|
|
4dd74de299 | ||
|
|
3b5a4a32a4 | ||
|
|
7f7ca50d06 | ||
|
|
0ed8ef67ed | ||
|
|
267bdc4be6 | ||
|
|
a7bac89279 | ||
|
|
95f0617964 | ||
|
|
4b3dbd3546 | ||
|
|
b8663a4240 |
@@ -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.11 2004-10-07 09:20:44 obarthel Exp $
|
# $Id: GNUmakefile.68k,v 1.17 2004-11-18 09:40:37 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
|
||||||
@@ -106,7 +106,7 @@ INCLUDES = -Iinclude -I. -Inetinclude
|
|||||||
OPTIONS = -DNDEBUG -fno-builtin -DNO_INLINE_STDARG
|
OPTIONS = -DNDEBUG -fno-builtin -DNO_INLINE_STDARG
|
||||||
#OPTIONS = -D__MEM_DEBUG -fno-builtin
|
#OPTIONS = -D__MEM_DEBUG -fno-builtin
|
||||||
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
|
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
|
||||||
OPTIMIZE = -O
|
OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
|
||||||
#OPTIMIZE = -O2 -fomit-frame-pointer
|
#OPTIMIZE = -O2 -fomit-frame-pointer
|
||||||
#DEBUG = -g2
|
#DEBUG = -g2
|
||||||
|
|
||||||
@@ -286,6 +286,10 @@ C_LIB = \
|
|||||||
stdlib_modsi3.o \
|
stdlib_modsi3.o \
|
||||||
stdlib_mulsi3.o \
|
stdlib_mulsi3.o \
|
||||||
stdlib_never_free.o \
|
stdlib_never_free.o \
|
||||||
|
stdlib_osliberror.o \
|
||||||
|
stdlib_oslibversion.o \
|
||||||
|
stdlib_priority.o \
|
||||||
|
stdlib_process_name.o \
|
||||||
stdlib_putenv.o \
|
stdlib_putenv.o \
|
||||||
stdlib_qsort.o \
|
stdlib_qsort.o \
|
||||||
stdlib_rand.o \
|
stdlib_rand.o \
|
||||||
@@ -318,6 +322,7 @@ C_LIB = \
|
|||||||
stdlib_umodsi3.o \
|
stdlib_umodsi3.o \
|
||||||
stdlib_unsetenv.o \
|
stdlib_unsetenv.o \
|
||||||
stdlib_wildcard_expand.o \
|
stdlib_wildcard_expand.o \
|
||||||
|
stdlib_stdio_window_spec.o \
|
||||||
strings_strcasecmp.o \
|
strings_strcasecmp.o \
|
||||||
strings_strncasecmp.o \
|
strings_strncasecmp.o \
|
||||||
string_bcmp.o \
|
string_bcmp.o \
|
||||||
@@ -338,6 +343,8 @@ C_LIB = \
|
|||||||
string_strcspn.o \
|
string_strcspn.o \
|
||||||
string_strdup.o \
|
string_strdup.o \
|
||||||
string_strerror.o \
|
string_strerror.o \
|
||||||
|
string_strlcat.o \
|
||||||
|
string_strlcpy.o \
|
||||||
string_strlen.o \
|
string_strlen.o \
|
||||||
string_strncat.o \
|
string_strncat.o \
|
||||||
string_strncmp.o \
|
string_strncmp.o \
|
||||||
@@ -347,15 +354,20 @@ C_LIB = \
|
|||||||
string_strspn.o \
|
string_strspn.o \
|
||||||
string_strstr.o \
|
string_strstr.o \
|
||||||
string_strtok.o \
|
string_strtok.o \
|
||||||
|
string_strtok_r.o \
|
||||||
string_strxfrm.o \
|
string_strxfrm.o \
|
||||||
time_asctime.o \
|
time_asctime.o \
|
||||||
|
time_asctime_r.o \
|
||||||
time_clock.o \
|
time_clock.o \
|
||||||
time_converttime.o \
|
time_converttime.o \
|
||||||
time_ctime.o \
|
time_ctime.o \
|
||||||
|
time_ctime_r.o \
|
||||||
time_data.o \
|
time_data.o \
|
||||||
time_gettimeofday.o \
|
time_gettimeofday.o \
|
||||||
time_gmtime.o \
|
time_gmtime.o \
|
||||||
|
time_gmtime_r.o \
|
||||||
time_localtime.o \
|
time_localtime.o \
|
||||||
|
time_localtime_r.o \
|
||||||
time_mktime.o \
|
time_mktime.o \
|
||||||
time_numbertostring.o \
|
time_numbertostring.o \
|
||||||
time_strftime.o \
|
time_strftime.o \
|
||||||
@@ -487,7 +499,6 @@ MATH_LIB = \
|
|||||||
stdio_vasprintf.o \
|
stdio_vasprintf.o \
|
||||||
stdio_vfprintf.o \
|
stdio_vfprintf.o \
|
||||||
stdio_vfscanf.o \
|
stdio_vfscanf.o \
|
||||||
stdio_vfscanf.o \
|
|
||||||
stdio_vprintf.o \
|
stdio_vprintf.o \
|
||||||
stdio_vsnprintf.o \
|
stdio_vsnprintf.o \
|
||||||
stdio_vsprintf.o \
|
stdio_vsprintf.o \
|
||||||
@@ -678,6 +689,7 @@ AMIGA_LIB = \
|
|||||||
amiga_newlist.o \
|
amiga_newlist.o \
|
||||||
amiga_rangerand.o \
|
amiga_rangerand.o \
|
||||||
amiga_remtof.o \
|
amiga_remtof.o \
|
||||||
|
amiga_rexxvars.o \
|
||||||
amiga_setsuperattrs.o \
|
amiga_setsuperattrs.o \
|
||||||
amiga_timedelay.o \
|
amiga_timedelay.o \
|
||||||
amiga_waitbeam.o
|
amiga_waitbeam.o
|
||||||
@@ -687,8 +699,7 @@ AMIGA_LIB = \
|
|||||||
LIBS_68K := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libunix.a \
|
LIBS_68K := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libunix.a \
|
||||||
$(LIBNET_OBJS)/libnet.a $(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
|
$(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)
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
@@ -714,8 +725,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
|
||||||
@@ -987,28 +998,3 @@ mainb.o : stdlib_main.c
|
|||||||
|
|
||||||
mainnb.o : stdlib_main.c
|
mainnb.o : stdlib_main.c
|
||||||
$(CC) -o mainnb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -m68000 stdlib_main.c
|
$(CC) -o mainnb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -m68000 stdlib_main.c
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
#test: test.o ncrt0.o libc.a libunix.a libm.a libdebug.a libamiga.a
|
|
||||||
# $(CC) -Wl,--verbose $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT \
|
|
||||||
# -o $@ -nostdlib ncrt0.o test.o -L. -lm -lunix -ldebug -lc -lamiga
|
|
||||||
|
|
||||||
#test: test.o ncrt0.o nbcrt0.o nrcrt0.o libc.a libunix.a libm.a libdebug.a libamiga.a
|
|
||||||
# $(CC) -resident -Wl,--verbose $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT -fbaserel32 -DSMALL_DATA \
|
|
||||||
# -o $@ -nostdlib nbcrt0.o test.o -L. -lm -lunix -ldebug -lc -lamiga
|
|
||||||
|
|
||||||
test : test.c
|
|
||||||
gcc -o test test.c -D__MEM_DEBUG -DFLOATING_POINT_SUPPORT -Llib -lunix -lm
|
|
||||||
|
|
||||||
#test: test.o ncrt0.o nbcrt0.o nrcrt0.o libc.a libunix.a libm.a libdebug.a libamiga.a
|
|
||||||
# $(CC) -resident -Wl,--verbose $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT -fbaserel -DSMALL_DATA \
|
|
||||||
# -o $@ -nostdlib nrcrt0.o test.o -L. -lm -lunix -ldebug -lc -lamiga
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
mkid:
|
|
||||||
mkid -v #?.(c|h|asm|i) include/#?.(c|h|asm|i) include/sys/#?.(c|h|asm|i)
|
|
||||||
|
|
||||||
update:
|
|
||||||
mkid -v -u
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: GNUmakefile.os4,v 1.12 2004-10-07 11:03:46 tfrieden Exp $
|
# $Id: GNUmakefile.os4,v 1.15 2004-11-18 09:40:37 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -35,7 +35,6 @@ ifeq (,$(TYPE))
|
|||||||
LIBC_OBJS = libc_objs
|
LIBC_OBJS = libc_objs
|
||||||
LIBUNIX_OBJS = libunix_objs
|
LIBUNIX_OBJS = libunix_objs
|
||||||
LIBM_OBJS = libm_objs
|
LIBM_OBJS = libm_objs
|
||||||
LIBSTACK_OBJS = libstack_objs
|
|
||||||
LIBNET_OBJS = libnet_objs
|
LIBNET_OBJS = libnet_objs
|
||||||
LIBDEBUG_OBJS = libdebug_objs
|
LIBDEBUG_OBJS = libdebug_objs
|
||||||
LIBAMIGA_OBJS = libamiga_objs
|
LIBAMIGA_OBJS = libamiga_objs
|
||||||
@@ -43,7 +42,6 @@ else
|
|||||||
LIBC_OBJS = $(TYPE)/libc_objs
|
LIBC_OBJS = $(TYPE)/libc_objs
|
||||||
LIBUNIX_OBJS = $(TYPE)/libunix_objs
|
LIBUNIX_OBJS = $(TYPE)/libunix_objs
|
||||||
LIBM_OBJS = $(TYPE)/libm_objs
|
LIBM_OBJS = $(TYPE)/libm_objs
|
||||||
LIBSTACK_OBJS = $(TYPE)/libstack_objs
|
|
||||||
LIBNET_OBJS = $(TYPE)/libnet_objs
|
LIBNET_OBJS = $(TYPE)/libnet_objs
|
||||||
LIBDEBUG_OBJS = $(TYPE)/libdebug_objs
|
LIBDEBUG_OBJS = $(TYPE)/libdebug_objs
|
||||||
LIBAMIGA_OBJS = $(TYPE)/libamiga_objs
|
LIBAMIGA_OBJS = $(TYPE)/libamiga_objs
|
||||||
@@ -51,6 +49,7 @@ endif
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# General build rules for all object files and the individual libraries
|
||||||
%.o : %.c
|
%.o : %.c
|
||||||
@echo "Compiling $<"
|
@echo "Compiling $<"
|
||||||
@$(CC) -c $(CFLAGS) $<
|
@$(CC) -c $(CFLAGS) $<
|
||||||
@@ -67,10 +66,6 @@ $(LIBM_OBJS)/%.o : %.c
|
|||||||
@echo "Compiling $< [$(TYPE):m]"
|
@echo "Compiling $< [$(TYPE):m]"
|
||||||
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) $(FLOAT_TYPE) $<
|
@$(CC) -o $(LIBM_OBJS)/$*.o -c $(CFLAGS) $(FLOAT_TYPE) $<
|
||||||
|
|
||||||
$(LIBSTACK_OBJS)/%.o : %.c
|
|
||||||
@echo "Compiling $< [$(TYPE):stack]"
|
|
||||||
@$(CC) -o $(LIBSTACK_OBJS)/$*.o -c $(CFLAGS) $<
|
|
||||||
|
|
||||||
$(LIBNET_OBJS)/%.o : %.c
|
$(LIBNET_OBJS)/%.o : %.c
|
||||||
@echo "Compiling $< [$(TYPE):net]"
|
@echo "Compiling $< [$(TYPE):net]"
|
||||||
@$(CC) -o $(LIBNET_OBJS)/$*.o -c $(CFLAGS) -I$(NET_INCLUDE) -DSOCKET_SUPPORT -DUSERGROUP_SUPPORT $<
|
@$(CC) -o $(LIBNET_OBJS)/$*.o -c $(CFLAGS) -I$(NET_INCLUDE) -DSOCKET_SUPPORT -DUSERGROUP_SUPPORT $<
|
||||||
@@ -85,6 +80,7 @@ $(LIBAMIGA_OBJS)/%.o : %.c
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Build options for the individual libraries
|
||||||
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
|
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
|
||||||
@@ -95,7 +91,7 @@ CODE_TYPE := -msdata=data
|
|||||||
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
|
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (large_data_softfloat, $(TYPE))
|
ifeq (large_data_softfloat,$(TYPE))
|
||||||
CODE_TYPE := -msdata=data -msoft-float
|
CODE_TYPE := -msdata=data -msoft-float
|
||||||
FLOAT_TYPE :=
|
FLOAT_TYPE :=
|
||||||
endif
|
endif
|
||||||
@@ -107,7 +103,7 @@ WARNINGS = \
|
|||||||
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
|
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
|
||||||
|
|
||||||
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 -D__USE_INLINE__ -Wa,-mregnames
|
||||||
OPTIMIZE = -O -fomit-frame-pointer -funroll-loops
|
OPTIMIZE = -O -fomit-frame-pointer -funroll-loops
|
||||||
#DEBUG = -g
|
#DEBUG = -g
|
||||||
|
|
||||||
@@ -115,6 +111,7 @@ CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDES)
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# All objects files which make up libc.a
|
||||||
C_LIB = \
|
C_LIB = \
|
||||||
c.lib_rev.o \
|
c.lib_rev.o \
|
||||||
ctype_isalnum.o \
|
ctype_isalnum.o \
|
||||||
@@ -134,9 +131,9 @@ C_LIB = \
|
|||||||
ctype_table.o \
|
ctype_table.o \
|
||||||
dirent_closedir.o \
|
dirent_closedir.o \
|
||||||
dirent_data.o \
|
dirent_data.o \
|
||||||
|
dirent_rewinddir.o \
|
||||||
dirent_opendir.o \
|
dirent_opendir.o \
|
||||||
dirent_readdir.o \
|
dirent_readdir.o \
|
||||||
dirent_rewinddir.o \
|
|
||||||
errno_data.o \
|
errno_data.o \
|
||||||
fcntl_close.o \
|
fcntl_close.o \
|
||||||
fcntl_creat.o \
|
fcntl_creat.o \
|
||||||
@@ -255,41 +252,42 @@ C_LIB = \
|
|||||||
stdlib_atol.o \
|
stdlib_atol.o \
|
||||||
stdlib_bsearch.o \
|
stdlib_bsearch.o \
|
||||||
stdlib_calloc.o \
|
stdlib_calloc.o \
|
||||||
|
stdlib_checkdetach.o \
|
||||||
|
stdlib_constructor.o \
|
||||||
|
stdlib_constructor_begin.o \
|
||||||
|
stdlib_constructor_end.o \
|
||||||
stdlib_data.o \
|
stdlib_data.o \
|
||||||
stdlib_default_pool_size.o \
|
stdlib_default_pool_size.o \
|
||||||
stdlib_default_puddle_size.o \
|
stdlib_default_puddle_size.o \
|
||||||
stdlib_destructor.o \
|
stdlib_destructor.o \
|
||||||
|
stdlib_detach.o \
|
||||||
stdlib_disablerequesters.o \
|
stdlib_disablerequesters.o \
|
||||||
stdlib_div.o \
|
stdlib_div.o \
|
||||||
stdlib_modsi3.o \
|
|
||||||
stdlib_divsi3.o \
|
stdlib_divsi3.o \
|
||||||
stdlib_divsi4.o \
|
stdlib_divsi4.o \
|
||||||
stdlib_umodsi3.o \
|
stdlib_dosbase.o \
|
||||||
stdlib_udivsi3.o \
|
|
||||||
stdlib_udivsi4.o \
|
|
||||||
stdlib_exit.o \
|
stdlib_exit.o \
|
||||||
stdlib_free.o \
|
stdlib_free.o \
|
||||||
|
stdlib_getdefstacksize.o \
|
||||||
stdlib_getenv.o \
|
stdlib_getenv.o \
|
||||||
stdlib_getsp.o \
|
stdlib_getsp.o \
|
||||||
stdlib_init_exit.o \
|
stdlib_init_exit.o \
|
||||||
|
stdlib_isresident.o \
|
||||||
stdlib_labs.o \
|
stdlib_labs.o \
|
||||||
stdlib_ldiv.o \
|
stdlib_ldiv.o \
|
||||||
stdlib_getdefstacksize.o \
|
|
||||||
stdlib_stackargbytes.o \
|
|
||||||
stdlib_stack_usage.o \
|
|
||||||
stdlib_checkdetach.o \
|
|
||||||
stdlib_detach.o \
|
|
||||||
stdlib_isresident.o \
|
|
||||||
stdlib_sysbase.o \
|
|
||||||
stdlib_dosbase.o \
|
|
||||||
stdlib_machine_test.o \
|
stdlib_machine_test.o \
|
||||||
stdlib_malloc.o \
|
stdlib_malloc.o \
|
||||||
stdlib_math.o \
|
stdlib_math.o \
|
||||||
stdlib_mkdtemp.o \
|
stdlib_mkdtemp.o \
|
||||||
stdlib_mkstemp.o \
|
stdlib_mkstemp.o \
|
||||||
stdlib_mktemp.o \
|
stdlib_mktemp.o \
|
||||||
|
stdlib_modsi3.o \
|
||||||
stdlib_mulsi3.o \
|
stdlib_mulsi3.o \
|
||||||
stdlib_never_free.o \
|
stdlib_never_free.o \
|
||||||
|
stdlib_osliberror.o \
|
||||||
|
stdlib_oslibversion.o \
|
||||||
|
stdlib_priority.o \
|
||||||
|
stdlib_process_name.o \
|
||||||
stdlib_putenv.o \
|
stdlib_putenv.o \
|
||||||
stdlib_qsort.o \
|
stdlib_qsort.o \
|
||||||
stdlib_rand.o \
|
stdlib_rand.o \
|
||||||
@@ -301,21 +299,28 @@ C_LIB = \
|
|||||||
stdlib_showerror.o \
|
stdlib_showerror.o \
|
||||||
stdlib_socket.o \
|
stdlib_socket.o \
|
||||||
stdlib_srand.o \
|
stdlib_srand.o \
|
||||||
|
stdlib_stackargbytes.o \
|
||||||
stdlib_stackcheck.o \
|
stdlib_stackcheck.o \
|
||||||
stdlib_stackoverflow.o \
|
stdlib_stackoverflow.o \
|
||||||
stdlib_stacksafezone.o \
|
stdlib_stacksafezone.o \
|
||||||
stdlib_stacksize.o \
|
stdlib_stacksize.o \
|
||||||
|
stdlib_stack_usage.o \
|
||||||
stdlib_startup.o \
|
stdlib_startup.o \
|
||||||
stdlib_strtol.o \
|
stdlib_strtol.o \
|
||||||
stdlib_strtoul.o \
|
stdlib_strtoul.o \
|
||||||
stdlib_strtoll.o \
|
stdlib_strtoll.o \
|
||||||
stdlib_strtoull.o \
|
stdlib_strtoull.o \
|
||||||
stdlib_swapstack.o \
|
stdlib_swapstack.o \
|
||||||
|
stdlib_sysbase.o \
|
||||||
stdlib_system.o \
|
stdlib_system.o \
|
||||||
stdlib_termination_message.o \
|
stdlib_termination_message.o \
|
||||||
stdlib_threshold.o \
|
stdlib_threshold.o \
|
||||||
|
stdlib_udivsi3.o \
|
||||||
|
stdlib_udivsi4.o \
|
||||||
|
stdlib_umodsi3.o \
|
||||||
stdlib_unsetenv.o \
|
stdlib_unsetenv.o \
|
||||||
stdlib_wildcard_expand.o \
|
stdlib_wildcard_expand.o \
|
||||||
|
stdlib_stdio_window_spec.o \
|
||||||
strings_strcasecmp.o \
|
strings_strcasecmp.o \
|
||||||
strings_strncasecmp.o \
|
strings_strncasecmp.o \
|
||||||
string_bcmp.o \
|
string_bcmp.o \
|
||||||
@@ -336,6 +341,8 @@ C_LIB = \
|
|||||||
string_strcspn.o \
|
string_strcspn.o \
|
||||||
string_strdup.o \
|
string_strdup.o \
|
||||||
string_strerror.o \
|
string_strerror.o \
|
||||||
|
string_strlcat.o \
|
||||||
|
string_strlcpy.o \
|
||||||
string_strlen.o \
|
string_strlen.o \
|
||||||
string_strncat.o \
|
string_strncat.o \
|
||||||
string_strncmp.o \
|
string_strncmp.o \
|
||||||
@@ -345,15 +352,20 @@ C_LIB = \
|
|||||||
string_strspn.o \
|
string_strspn.o \
|
||||||
string_strstr.o \
|
string_strstr.o \
|
||||||
string_strtok.o \
|
string_strtok.o \
|
||||||
|
string_strtok_r.o \
|
||||||
string_strxfrm.o \
|
string_strxfrm.o \
|
||||||
time_asctime.o \
|
time_asctime.o \
|
||||||
|
time_asctime_r.o \
|
||||||
time_clock.o \
|
time_clock.o \
|
||||||
time_converttime.o \
|
time_converttime.o \
|
||||||
time_ctime.o \
|
time_ctime.o \
|
||||||
|
time_ctime_r.o \
|
||||||
time_data.o \
|
time_data.o \
|
||||||
time_gettimeofday.o \
|
time_gettimeofday.o \
|
||||||
time_gmtime.o \
|
time_gmtime.o \
|
||||||
|
time_gmtime_r.o \
|
||||||
time_localtime.o \
|
time_localtime.o \
|
||||||
|
time_localtime_r.o \
|
||||||
time_mktime.o \
|
time_mktime.o \
|
||||||
time_numbertostring.o \
|
time_numbertostring.o \
|
||||||
time_strftime.o \
|
time_strftime.o \
|
||||||
@@ -380,21 +392,21 @@ 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_timer.o \
|
||||||
|
unistd_time_delay.o \
|
||||||
unistd_truncate.o \
|
unistd_truncate.o \
|
||||||
unistd_unlink.o \
|
unistd_unlink.o \
|
||||||
unistd_usleep.o \
|
unistd_usleep.o \
|
||||||
utime_utime.o
|
utime_utime.o
|
||||||
|
|
||||||
|
# All objects files which make up libunix.a
|
||||||
UNIX_LIB = \
|
UNIX_LIB = \
|
||||||
unix.lib_rev.o \
|
unix.lib_rev.o \
|
||||||
dirent_closedir.o \
|
dirent_closedir.o \
|
||||||
dirent_data.o \
|
dirent_data.o \
|
||||||
|
dirent_rewinddir.o \
|
||||||
dirent_opendir.o \
|
dirent_opendir.o \
|
||||||
dirent_readdir.o \
|
dirent_readdir.o \
|
||||||
dirent_rewinddir.o \
|
|
||||||
fcntl_creat.o \
|
fcntl_creat.o \
|
||||||
fcntl_fcntl.o \
|
fcntl_fcntl.o \
|
||||||
fcntl_open.o \
|
fcntl_open.o \
|
||||||
@@ -408,12 +420,12 @@ UNIX_LIB = \
|
|||||||
stat_rmdir.o \
|
stat_rmdir.o \
|
||||||
stat_stat.o \
|
stat_stat.o \
|
||||||
stdio_fdhookentry.o \
|
stdio_fdhookentry.o \
|
||||||
stdio_init_exit.o \
|
|
||||||
stdio_locksemaphorename.o \
|
|
||||||
stdio_openiob.o \
|
|
||||||
stdio_fflush.o \
|
stdio_fflush.o \
|
||||||
stdio_fopen.o \
|
stdio_fopen.o \
|
||||||
stdio_fopen.o \
|
stdio_fopen.o \
|
||||||
|
stdio_init_exit.o \
|
||||||
|
stdio_locksemaphorename.o \
|
||||||
|
stdio_openiob.o \
|
||||||
stdio_popen.o \
|
stdio_popen.o \
|
||||||
stdio_remove.o \
|
stdio_remove.o \
|
||||||
stdio_rename.o \
|
stdio_rename.o \
|
||||||
@@ -443,6 +455,7 @@ UNIX_LIB = \
|
|||||||
unistd_wildcard_expand.o \
|
unistd_wildcard_expand.o \
|
||||||
utime_utime.o
|
utime_utime.o
|
||||||
|
|
||||||
|
# All objects files which make up libm.a
|
||||||
MATH_LIB = \
|
MATH_LIB = \
|
||||||
math_acos.o \
|
math_acos.o \
|
||||||
math_asin.o \
|
math_asin.o \
|
||||||
@@ -492,7 +505,6 @@ MATH_LIB = \
|
|||||||
stdio_vasprintf.o \
|
stdio_vasprintf.o \
|
||||||
stdio_vfprintf.o \
|
stdio_vfprintf.o \
|
||||||
stdio_vfscanf.o \
|
stdio_vfscanf.o \
|
||||||
stdio_vfscanf.o \
|
|
||||||
stdio_vprintf.o \
|
stdio_vprintf.o \
|
||||||
stdio_vsnprintf.o \
|
stdio_vsnprintf.o \
|
||||||
stdio_vsprintf.o \
|
stdio_vsprintf.o \
|
||||||
@@ -501,48 +513,7 @@ MATH_LIB = \
|
|||||||
stdlib_strtod.o \
|
stdlib_strtod.o \
|
||||||
time_difftime.o
|
time_difftime.o
|
||||||
|
|
||||||
MATH_LIB_IEEE = \
|
# All objects files which make up libnet.a
|
||||||
m.lib_rev.o \
|
|
||||||
$(MATH_LIB) \
|
|
||||||
math_adddf3.o \
|
|
||||||
math_addsf3.o \
|
|
||||||
math_divdf3.o \
|
|
||||||
math_divsf3.o \
|
|
||||||
math_eqdf2.o \
|
|
||||||
math_eqsf2.o \
|
|
||||||
math_extendsfdf2.o \
|
|
||||||
math_fixdfsi.o \
|
|
||||||
math_fixsfsi.o \
|
|
||||||
math_fixunsdfsi.o \
|
|
||||||
math_fixunssfsi.o \
|
|
||||||
math_floatsidf.o \
|
|
||||||
math_floatsisf.o \
|
|
||||||
math_gedf2.o \
|
|
||||||
math_gesf2.o \
|
|
||||||
math_gtdf2.o \
|
|
||||||
math_gtsf2.o \
|
|
||||||
math_ledf2.o \
|
|
||||||
math_lesf2.o \
|
|
||||||
math_ltdf2.o \
|
|
||||||
math_ltsf2.o \
|
|
||||||
math_muldf3.o \
|
|
||||||
math_mulsf3.o \
|
|
||||||
math_nedf2.o \
|
|
||||||
math_negdf2.o \
|
|
||||||
math_negsf2.o \
|
|
||||||
math_nesf2.o \
|
|
||||||
math_subdf3.o \
|
|
||||||
math_subsf3.o \
|
|
||||||
math_truncdfsf2.o
|
|
||||||
|
|
||||||
STACK_LIB = \
|
|
||||||
stack.lib_rev.o \
|
|
||||||
stdlib_setjmp.o \
|
|
||||||
stdlib_stackextension.o \
|
|
||||||
stdlib_stackminframe.o \
|
|
||||||
stdlib_stackoverflow.o \
|
|
||||||
stdlib_stacksafezone.o
|
|
||||||
|
|
||||||
NET_LIB = \
|
NET_LIB = \
|
||||||
net.lib_rev.o \
|
net.lib_rev.o \
|
||||||
socket_accept.o \
|
socket_accept.o \
|
||||||
@@ -586,6 +557,7 @@ NET_LIB = \
|
|||||||
socket_socket.o \
|
socket_socket.o \
|
||||||
socket_hook_entry.o \
|
socket_hook_entry.o \
|
||||||
socket_hstrerror.o \
|
socket_hstrerror.o \
|
||||||
|
stat_umask.o \
|
||||||
usergroup_crypt.o \
|
usergroup_crypt.o \
|
||||||
usergroup_data.o \
|
usergroup_data.o \
|
||||||
usergroup_endgrent.o \
|
usergroup_endgrent.o \
|
||||||
@@ -614,13 +586,12 @@ NET_LIB = \
|
|||||||
usergroup_setregid.o \
|
usergroup_setregid.o \
|
||||||
usergroup_setreuid.o \
|
usergroup_setreuid.o \
|
||||||
usergroup_setsid.o \
|
usergroup_setsid.o \
|
||||||
usergroup_setuid.o \
|
usergroup_setuid.o
|
||||||
stat_umask.o
|
|
||||||
|
|
||||||
|
# All objects files which make up libdebug.a
|
||||||
DEBUG_LIB = \
|
DEBUG_LIB = \
|
||||||
debug.lib_rev.o \
|
debug.lib_rev.o \
|
||||||
debug.o \
|
debug.o \
|
||||||
debug_level.o \
|
|
||||||
debug_cmpstrexec.o \
|
debug_cmpstrexec.o \
|
||||||
debug_kcmpstr.o \
|
debug_kcmpstr.o \
|
||||||
debug_kdofmt.o \
|
debug_kdofmt.o \
|
||||||
@@ -646,8 +617,10 @@ DEBUG_LIB = \
|
|||||||
debug_kputstr1.o \
|
debug_kputstr1.o \
|
||||||
debug_kputstr2.o \
|
debug_kputstr2.o \
|
||||||
debug_kvprintf1.o \
|
debug_kvprintf1.o \
|
||||||
debug_kvprintf2.o
|
debug_kvprintf2.o \
|
||||||
|
debug_level.o
|
||||||
|
|
||||||
|
# All objects files which make up libamiga.a
|
||||||
AMIGA_LIB = \
|
AMIGA_LIB = \
|
||||||
amiga.lib_rev.o \
|
amiga.lib_rev.o \
|
||||||
amiga_acrypt.o \
|
amiga_acrypt.o \
|
||||||
@@ -656,10 +629,17 @@ AMIGA_LIB = \
|
|||||||
amiga_argarrayinit.o \
|
amiga_argarrayinit.o \
|
||||||
amiga_argint.o \
|
amiga_argint.o \
|
||||||
amiga_argstring.o \
|
amiga_argstring.o \
|
||||||
|
amiga_beginio.o \
|
||||||
amiga_callhooka.o \
|
amiga_callhooka.o \
|
||||||
amiga_coercemethod.o \
|
amiga_coercemethod.o \
|
||||||
|
amiga_createextio.o \
|
||||||
|
amiga_createport.o \
|
||||||
amiga_createstdio.o \
|
amiga_createstdio.o \
|
||||||
|
amiga_createtask.o \
|
||||||
|
amiga_deleteextio.o \
|
||||||
|
amiga_deleteport.o \
|
||||||
amiga_deletestdio.o \
|
amiga_deletestdio.o \
|
||||||
|
amiga_deletetask.o \
|
||||||
amiga_domethod.o \
|
amiga_domethod.o \
|
||||||
amiga_dosupermethod.o \
|
amiga_dosupermethod.o \
|
||||||
amiga_dotimer.o \
|
amiga_dotimer.o \
|
||||||
@@ -667,54 +647,62 @@ AMIGA_LIB = \
|
|||||||
amiga_freeievents.o \
|
amiga_freeievents.o \
|
||||||
amiga_hotkey.o \
|
amiga_hotkey.o \
|
||||||
amiga_invertstring.o \
|
amiga_invertstring.o \
|
||||||
|
amiga_newlist.o \
|
||||||
amiga_rangerand.o \
|
amiga_rangerand.o \
|
||||||
amiga_remtof.o \
|
amiga_remtof.o \
|
||||||
|
amiga_rexxvars.o \
|
||||||
amiga_setsuperattrs.o \
|
amiga_setsuperattrs.o \
|
||||||
amiga_timedelay.o \
|
amiga_timedelay.o \
|
||||||
amiga_waitbeam.o
|
amiga_waitbeam.o
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
LIBS := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libunix.a \
|
# The libraries to be built, prefixed by the respective path names
|
||||||
$(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
|
LIBS := \
|
||||||
$(LIBM_OBJS)/libm.a $(LIBNET_OBJS)/libnet.a
|
$(LIBC_OBJS)/libc.a \
|
||||||
|
$(LIBUNIX_OBJS)/libunix.a \
|
||||||
|
$(LIBDEBUG_OBJS)/libdebug.a \
|
||||||
|
$(LIBAMIGA_OBJS)/libamiga.a \
|
||||||
|
$(LIBM_OBJS)/libm.a \
|
||||||
|
$(LIBNET_OBJS)/libnet.a
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# The startup object files to be built
|
||||||
|
STARTUPS := bcrt0.o bcrtbegin.o bcrtend.o crt0.o crtbegin.o crtend.o mainb.o mainnb.o
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
STARTUPS := crt0.o crtbegin.o crtend.o mainnb.o
|
# This is the first target: it creates the necessary directories, then proceeds
|
||||||
|
# to build the startup object files and finally the libraries
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
all: \
|
all: \
|
||||||
lib/crt0.o \
|
lib \
|
||||||
lib/crtbegin.o \
|
lib/soft-float \
|
||||||
lib/crtend.o \
|
lib/small-data \
|
||||||
lib/mainnb.o \
|
small_data \
|
||||||
lib/libm.a \
|
large_data \
|
||||||
lib/small-data/libm.a \
|
large_data_softfloat \
|
||||||
lib/bcrt0.o \
|
lib/bcrt0.o \
|
||||||
lib/bcrtbegin.o \
|
lib/bcrtbegin.o \
|
||||||
lib/bcrtend.o \
|
lib/bcrtend.o \
|
||||||
lib/soft-float/libc.a
|
lib/crt0.o \
|
||||||
|
lib/crtbegin.o \
|
||||||
copy:
|
lib/crtend.o \
|
||||||
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
|
lib/mainb.o \
|
||||||
|
lib/mainnb.o \
|
||||||
|
lib/libm.a \
|
||||||
|
lib/small-data/libm.a \
|
||||||
|
lib/soft-float/libm.a
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Delete all object files and libraries
|
||||||
clean:
|
clean:
|
||||||
-$(DELETE) $(TYPE) $(STARTUPS) \
|
-$(DELETE) $(STARTUPS) lib small_data large_data large_data_softfloat
|
||||||
$(LIBC_OBJS) $(LIBUNIX_OBJS) $(LIBM_OBJS) $(LIBSTACK_OBJS) $(LIBNET_OBJS) $(LIBDEBUG_OBJS) $(LIBAMIGA_OBJS)
|
|
||||||
|
|
||||||
realclean:
|
|
||||||
$(MAKE) clean
|
|
||||||
-$(DELETE) lib small_data large_data large_data_softfloat
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Update the version numbers bound to the individual libraries
|
||||||
version:
|
version:
|
||||||
cp c.lib_rev.rev amiga.lib_rev.rev
|
cp c.lib_rev.rev amiga.lib_rev.rev
|
||||||
cp c.lib_rev.rev debug.lib_rev.rev
|
cp c.lib_rev.rev debug.lib_rev.rev
|
||||||
@@ -734,43 +722,74 @@ version:
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Tag all files with a certain version number
|
||||||
cvs-tag:
|
cvs-tag:
|
||||||
cvs -q tag V1_`cat c.lib_rev.rev`
|
cvs -q tag V1_`cat c.lib_rev.rev`
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
kitchen_sink: $(TYPE) $(LIBS) $(STARTUPS)
|
# This target first creates a directory to store the object files in, then
|
||||||
|
# proceeds to build the libraries from the code. It is invoked by the
|
||||||
##############################################################################
|
# individual library build targets below.
|
||||||
|
all_libraries: $(TYPE) $(LIBS)
|
||||||
ifneq (,$(TYPE))
|
|
||||||
$(TYPE):
|
|
||||||
$(MAKEDIR) $@
|
|
||||||
endif
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# These create the required subdirectories to store object files and
|
||||||
|
# libraries in
|
||||||
lib:
|
lib:
|
||||||
-$(MAKEDIR) $@
|
-$(MAKEDIR) $@
|
||||||
|
|
||||||
lib/small-data:
|
lib/small-data: lib
|
||||||
-$(MAKEDIR) $@
|
-$(MAKEDIR) $@
|
||||||
|
|
||||||
lib/soft-float:
|
lib/soft-float: lib
|
||||||
-$(MAKEDIR) $@
|
-$(MAKEDIR) $@
|
||||||
|
|
||||||
lib/libm.a: lib
|
small_data:
|
||||||
$(MAKE) TYPE=large_data kitchen_sink
|
-$(MAKEDIR) $@
|
||||||
|
|
||||||
|
large_data:
|
||||||
|
-$(MAKEDIR) $@
|
||||||
|
|
||||||
|
large_data_softfloat:
|
||||||
|
-$(MAKEDIR) $@
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Dependencies for libm.a (large data variant with hardware floating point code
|
||||||
|
# support): this actually ends up building all the libraries rather than just
|
||||||
|
# libm.a
|
||||||
|
lib/libm.a: large_data large_data/libm.a
|
||||||
|
|
||||||
|
large_data/libm.a:
|
||||||
|
$(MAKE) TYPE=large_data all_libraries
|
||||||
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
|
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
|
||||||
|
|
||||||
lib/small-data/libm.a: lib lib/small-data
|
##############################################################################
|
||||||
$(MAKE) TYPE=small_data kitchen_sink
|
|
||||||
$(COPY) $(foreach file,$(LIBS),small_data/$(file)) lib/small-data
|
|
||||||
|
|
||||||
lib/soft-float/libc.a: lib lib/soft-float
|
# Dependencies for libm.a (large data variant with software floating point code
|
||||||
$(MAKE) TYPE=large_data_softfloat kitchen_sink
|
# support): this actually ends up building all the libraries rather than just
|
||||||
|
# libm.a
|
||||||
|
lib/soft-float/libm.a: large_data_softfloat large_data_softfloat/libm.a
|
||||||
|
|
||||||
|
large_data_softfloat/libm.a:
|
||||||
|
$(MAKE) TYPE=large_data_softfloat all_libraries
|
||||||
$(COPY) $(foreach file,$(LIBS),large_data_softfloat/$(file)) lib/soft-float
|
$(COPY) $(foreach file,$(LIBS),large_data_softfloat/$(file)) lib/soft-float
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Dependencies for libm.a (small data variant): this actually ends up building all
|
||||||
|
# the libraries rather than just libm.a
|
||||||
|
lib/small-data/libm.a: small_data small_data/libm.a
|
||||||
|
|
||||||
|
small_data/libm.a:
|
||||||
|
$(MAKE) TYPE=small_data all_libraries
|
||||||
|
$(COPY) $(foreach file,$(LIBS),small_data/$(file)) lib/small-data
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Rules to build and move the startup code
|
||||||
lib/crt0.o : lib crt0.o
|
lib/crt0.o : lib crt0.o
|
||||||
$(COPY) crt0.o lib
|
$(COPY) crt0.o lib
|
||||||
|
|
||||||
@@ -797,22 +816,35 @@ lib/bcrtend.o : lib bcrtend.o
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
$(LIBAMIGA_OBJS)/amiga_hookentry.o : amiga_hookentry.c
|
# Individual dependencies which tell make to build the object files from
|
||||||
|
# 'C' source files rather than the assembly language source files of the
|
||||||
|
# same name (e.g. stdlib_getsp.c instead of stdlib_getsp.asm).
|
||||||
$(LIBC_OBJS)/stdlib_getsp.o : stdlib_getsp.c
|
$(LIBC_OBJS)/stdlib_getsp.o : stdlib_getsp.c
|
||||||
|
|
||||||
$(LIBC_OBJS)/stdlib_swapstack.o : stdlib_swapstack.c
|
$(LIBC_OBJS)/stdlib_swapstack.o : stdlib_swapstack.c
|
||||||
|
|
||||||
$(LIBC_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
|
$(LIBC_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
|
||||||
|
|
||||||
$(LIBSTACK_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
|
##############################################################################
|
||||||
|
|
||||||
|
# Build rules for version information that goes into each library
|
||||||
|
$(LIBC_OBJS)/c.lib_rev.o : c.lib_rev.c c.lib_rev.h
|
||||||
|
|
||||||
|
$(LIBUNIX_OBJS)/unix.lib_rev.o : unix.lib_rev.c unix.lib_rev.h
|
||||||
|
|
||||||
|
$(LIBM_OBJS)/m.lib_rev.o : m.lib_rev.c m.lib_rev.h
|
||||||
|
|
||||||
|
$(LIBNET_OBJS)/net.lib_rev.o : net.lib_rev.c net.lib_rev.h
|
||||||
|
|
||||||
|
$(LIBDEBUG_OBJS)/debug.lib_rev.o : debug.lib_rev.c debug.lib_rev.h
|
||||||
|
|
||||||
|
$(LIBAMIGA_OBJS)/amiga.lib_rev.o : amiga.lib_rev.c amiga.lib_rev.h
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
$(LIBC_OBJS)/stdlib_stacksize.o : stdlib_stacksize.c stdlib_gcc_help.h
|
# Build rules for the debug version of the library which has special
|
||||||
|
# memory allocation debugging code, controlled by the contents of
|
||||||
$(LIBC_OBJS)/stdlib_shell_escape.o : stdlib_shell_escape.c stdlib_gcc_help.h
|
# the stdlib_mem_debug.h file.
|
||||||
|
|
||||||
$(LIBC_OBJS)/stdlib_alloca.o : stdlib_alloca.c stdlib_mem_debug.h
|
$(LIBC_OBJS)/stdlib_alloca.o : stdlib_alloca.c stdlib_mem_debug.h
|
||||||
|
|
||||||
$(LIBC_OBJS)/stdlib_calloc.o : stdlib_calloc.c stdlib_mem_debug.h
|
$(LIBC_OBJS)/stdlib_calloc.o : stdlib_calloc.c stdlib_mem_debug.h
|
||||||
@@ -829,6 +861,7 @@ $(LIBC_OBJS)/stdlib_red_black.o : stdlib_red_black.c stdlib_mem_debug.h
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Individual build rules for libc.a
|
||||||
$(LIBC_OBJS) :
|
$(LIBC_OBJS) :
|
||||||
$(MAKEDIR) $@
|
$(MAKEDIR) $@
|
||||||
|
|
||||||
@@ -839,6 +872,7 @@ $(LIBC_OBJS)/libc.a : $(LIBC_OBJS) $(foreach file,$(C_LIB),$(LIBC_OBJS)/$(file))
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Individual build rules for libunix.a
|
||||||
$(LIBUNIX_OBJS) :
|
$(LIBUNIX_OBJS) :
|
||||||
$(MAKEDIR) $@
|
$(MAKEDIR) $@
|
||||||
|
|
||||||
@@ -849,26 +883,18 @@ $(LIBUNIX_OBJS)/libunix.a : $(LIBUNIX_OBJS) $(foreach file,$(UNIX_LIB),$(LIBUNIX
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Individual build rules for libm.a
|
||||||
$(LIBM_OBJS) :
|
$(LIBM_OBJS) :
|
||||||
$(MAKEDIR) $@
|
$(MAKEDIR) $@
|
||||||
|
|
||||||
$(LIBM_OBJS)/libm.a : $(LIBM_OBJS) $(foreach file,$(MATH_LIB_IEEE),$(LIBM_OBJS)/$(file))
|
$(LIBM_OBJS)/libm.a : $(LIBM_OBJS) $(foreach file,$(MATH_LIB),$(LIBM_OBJS)/$(file))
|
||||||
-$(DELETE) $@
|
-$(DELETE) $@
|
||||||
@$(AR) $@ $(foreach file,$(MATH_LIB_IEEE),$(LIBM_OBJS)/$(file))
|
@$(AR) $@ $(foreach file,$(MATH_LIB),$(LIBM_OBJS)/$(file))
|
||||||
$(RANLIB) $@
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
$(LIBSTACK_OBJS) :
|
|
||||||
$(MAKEDIR) $@
|
|
||||||
|
|
||||||
$(LIBSTACK_OBJS)/libstack.a : $(LIBSTACK_OBJS) $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
|
|
||||||
-$(DELETE) $@
|
|
||||||
@$(AR) $@ $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
|
|
||||||
$(RANLIB) $@
|
$(RANLIB) $@
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Individual build rules for libnet.a
|
||||||
$(LIBNET_OBJS) :
|
$(LIBNET_OBJS) :
|
||||||
$(MAKEDIR) $@
|
$(MAKEDIR) $@
|
||||||
|
|
||||||
@@ -879,6 +905,7 @@ $(LIBNET_OBJS)/libnet.a : $(LIBNET_OBJS) $(foreach file,$(NET_LIB),$(LIBNET_OBJS
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Individual build rules for libdebug.a
|
||||||
$(LIBDEBUG_OBJS) :
|
$(LIBDEBUG_OBJS) :
|
||||||
$(MAKEDIR) $@
|
$(MAKEDIR) $@
|
||||||
|
|
||||||
@@ -889,6 +916,7 @@ $(LIBDEBUG_OBJS)/libdebug.a : $(LIBDEBUG_OBJS) $(foreach file,$(DEBUG_LIB),$(LIB
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Individual build rules for libamiga.a
|
||||||
$(LIBAMIGA_OBJS) :
|
$(LIBAMIGA_OBJS) :
|
||||||
$(MAKEDIR) $@
|
$(MAKEDIR) $@
|
||||||
|
|
||||||
@@ -899,6 +927,7 @@ $(LIBAMIGA_OBJS)/libamiga.a : $(LIBAMIGA_OBJS) $(foreach file,$(AMIGA_LIB),$(LIB
|
|||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
# Individual build rules for the startup code.
|
||||||
crt0.o : crt0.S
|
crt0.o : crt0.S
|
||||||
@echo "Assembling $<"
|
@echo "Assembling $<"
|
||||||
@$(CC) -Wa,-mregnames -o crt0.o -c crt0.S
|
@$(CC) -Wa,-mregnames -o crt0.o -c crt0.S
|
||||||
@@ -920,13 +949,3 @@ bcrtbegin.o : crtbegin.c
|
|||||||
|
|
||||||
bcrtend.o : crtend.c
|
bcrtend.o : crtend.c
|
||||||
$(CC) -o bcrtend.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA crtend.c
|
$(CC) -o bcrtend.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -msdata=sysv -DSMALL_DATA crtend.c
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
mkid:
|
|
||||||
# mkid -v #?.(c|h|asm|i) include/#?.(c|h|asm|i) include/sys/#?.(c|h|asm|i)
|
|
||||||
mkid *.[ch] include/*.h include/sys/*.h
|
|
||||||
|
|
||||||
update:
|
|
||||||
mkid -v -u
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 178
|
#define REVISION 184
|
||||||
#define DATE "7.10.2004"
|
#define DATE "28.11.2004"
|
||||||
#define VERS "amiga.lib 1.178"
|
#define VERS "amiga.lib 1.184"
|
||||||
#define VSTRING "amiga.lib 1.178 (7.10.2004)\r\n"
|
#define VSTRING "amiga.lib 1.184 (28.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: amiga.lib 1.178 (7.10.2004)"
|
#define VERSTAG "\0$VER: amiga.lib 1.184 (28.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
178
|
184
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_beginio.c,v 1.1.1.1 2004-07-26 16:30:17 obarthel Exp $
|
* $Id: amiga_beginio.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -37,6 +37,14 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __PPC__
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__SASC)
|
#if defined(__SASC)
|
||||||
|
|
||||||
VOID __begin_io(struct IORequest * ior);
|
VOID __begin_io(struct IORequest * ior);
|
||||||
@@ -64,10 +72,6 @@ VOID __begin_io(struct IORequest * ior);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
BeginIO(struct IORequest *ior)
|
BeginIO(struct IORequest *ior)
|
||||||
{
|
{
|
||||||
@@ -82,3 +86,35 @@ BeginIO(struct IORequest *ior)
|
|||||||
|
|
||||||
LEAVE();
|
LEAVE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#include <proto/exec.h>
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(BeginIO)
|
||||||
|
#undef BeginIO
|
||||||
|
#endif /* BeginIO */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
BeginIO(struct IORequest *ior)
|
||||||
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
assert( ior != NULL && ior->io_Device != NULL );
|
||||||
|
|
||||||
|
IExec->BeginIO(ior);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __PPC__ */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_createextio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
* $Id: amiga_createextio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -44,6 +44,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CreateExtIO)
|
||||||
|
#undef CreateExtIO
|
||||||
|
#endif /* CreateExtIO */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
struct IORequest *
|
struct IORequest *
|
||||||
CreateExtIO(CONST struct MsgPort * port, LONG io_size)
|
CreateExtIO(CONST struct MsgPort * port, LONG io_size)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_createport.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
* $Id: amiga_createport.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -44,6 +44,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CreatePort)
|
||||||
|
#undef CreatePort
|
||||||
|
#endif /* CreatePort */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
struct MsgPort *
|
struct MsgPort *
|
||||||
CreatePort(CONST_STRPTR name, LONG pri)
|
CreatePort(CONST_STRPTR name, LONG pri)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_createstdio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
* $Id: amiga_createstdio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -44,6 +44,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CreateStdIO)
|
||||||
|
#undef CreateStdIO
|
||||||
|
#endif /* CreateStdIO */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
struct IOStdReq *
|
struct IOStdReq *
|
||||||
CreateStdIO(CONST struct MsgPort * port)
|
CreateStdIO(CONST struct MsgPort * port)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_createtask.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
* $Id: amiga_createtask.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -31,8 +31,6 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __PPC__
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#include <exec/libraries.h>
|
#include <exec/libraries.h>
|
||||||
@@ -53,6 +51,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __PPC__
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a task with given name, priority, and stack size.
|
* Create a task with given name, priority, and stack size.
|
||||||
* It will use the default exception and trap handlers for now.
|
* It will use the default exception and trap handlers for now.
|
||||||
@@ -191,4 +193,44 @@ CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CreateTask)
|
||||||
|
#undef CreateTask
|
||||||
|
#endif /* CreateTask */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct Task *
|
||||||
|
CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
|
||||||
|
{
|
||||||
|
struct Task * result = NULL;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
SHOWSTRING(name);
|
||||||
|
SHOWVALUE(pri);
|
||||||
|
SHOWPOINTER(init_pc);
|
||||||
|
SHOWVALUE(stack_size);
|
||||||
|
|
||||||
|
assert( name != NULL && (-128 <= pri && pri <= 127) && init_pc != NULL && stack_size > 0 );
|
||||||
|
|
||||||
|
if(name == NULL || pri < -128 || pri > 127 || init_pc == NULL || stack_size == 0)
|
||||||
|
{
|
||||||
|
SHOWMSG("invalid parameters");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = IExec->CreateTask(name,pri,init_pc,stack_size,NULL);
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#endif /* __PPC__ */
|
#endif /* __PPC__ */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_deleteextio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
|
* $Id: amiga_deleteextio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -44,6 +44,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(DeleteExtIO)
|
||||||
|
#undef DeleteExtIO
|
||||||
|
#endif /* DeleteExtIO */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DeleteExtIO(struct IORequest * io)
|
DeleteExtIO(struct IORequest * io)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_deleteport.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
|
* $Id: amiga_deleteport.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -44,6 +44,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(DeletePort)
|
||||||
|
#undef DeletePort
|
||||||
|
#endif /* DeletePort */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DeletePort(struct MsgPort * port)
|
DeletePort(struct MsgPort * port)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_deletestdio.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
|
* $Id: amiga_deletestdio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -44,6 +44,12 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(DeleteStdIO)
|
||||||
|
#undef DeleteStdIO
|
||||||
|
#endif /* DeleteStdIO */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DeleteStdIO(struct IOStdReq * io)
|
DeleteStdIO(struct IOStdReq * io)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: amiga_deletetask.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
|
* $Id: amiga_deletetask.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -41,8 +41,34 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __PPC__
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DeleteTask(struct Task *tc)
|
DeleteTask(struct Task *tc)
|
||||||
{
|
{
|
||||||
RemTask(tc);
|
RemTask(tc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(DeleteTask)
|
||||||
|
#undef DeleteTask
|
||||||
|
#endif /* DeleteTask */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
DeleteTask(struct Task *tc)
|
||||||
|
{
|
||||||
|
IExec->DeleteTask(tc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* __PPC__ */
|
||||||
|
|||||||
193
library/amiga_rexxvars.c
Normal file
193
library/amiga_rexxvars.c
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
/*
|
||||||
|
* $Id: amiga_rexxvars.c,v 1.1 2004-11-14 11:06:27 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* We don't want to pull in <clib/alib_protos.h> */
|
||||||
|
#define CLIB_ALIB_PROTOS_H
|
||||||
|
|
||||||
|
#ifndef _STDLIB_HEADERS_H
|
||||||
|
#include "stdlib_headers.h"
|
||||||
|
#endif /* _STDLIB_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#include <rexx/rxslib.h>
|
||||||
|
#include <rexx/errors.h>
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define __NOLIBBASE__
|
||||||
|
#include <proto/rexxsyslib.h>
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
STATIC struct Library * RexxSysBase;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
STATIC struct RexxSysIFace * IRexxSys;
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_CONSTRUCTOR(__rexxvars_init)
|
||||||
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
RexxSysBase = OpenLibrary(RXSNAME,0);
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
{
|
||||||
|
if(RexxSysBase != NULL)
|
||||||
|
{
|
||||||
|
IRexxSys = (struct RexxSysIFace *)GetInterface(RexxSysBase, "main", 1, 0);
|
||||||
|
if(IRexxSys == NULL)
|
||||||
|
{
|
||||||
|
CloseLibrary(RexxSysBase);
|
||||||
|
RexxSysBase = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
CONSTRUCTOR_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
CLIB_DESTRUCTOR(__rexxvars_exit)
|
||||||
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
#if defined(__amigaos4__)
|
||||||
|
{
|
||||||
|
if(IRexxSys != NULL)
|
||||||
|
DropInterface((struct Interface *)IRexxSys);
|
||||||
|
|
||||||
|
IRexxSys = NULL;
|
||||||
|
}
|
||||||
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
|
if(RexxSysBase != NULL)
|
||||||
|
{
|
||||||
|
CloseLibrary(RexxSysBase);
|
||||||
|
RexxSysBase = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* This is modeled after the original assembly language code. Except for the
|
||||||
|
fact that we compare the library base against a local, static variable
|
||||||
|
rather then opening the library for each check. */
|
||||||
|
BOOL
|
||||||
|
CheckRexxMsg(struct RexxMsg *message)
|
||||||
|
{
|
||||||
|
BOOL result = FALSE;
|
||||||
|
|
||||||
|
if(RexxSysBase == NULL)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if(message->rm_LibBase != RexxSysBase)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if(message->rm_TaskBlock == NULL)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if(NOT IsRexxMsg(message))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
result = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following function works in about like the original, except that it's
|
||||||
|
not reentrant, does not fill in a pointer to the variable itself and
|
||||||
|
requires rexxsyslib.library V45. */
|
||||||
|
LONG
|
||||||
|
GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer)
|
||||||
|
{
|
||||||
|
STATIC TEXT buffer[256];
|
||||||
|
LONG result;
|
||||||
|
|
||||||
|
/* The following uses a function which was added to rexxsyslib.library V45.
|
||||||
|
We therefore have a minimum library version requirement. */
|
||||||
|
if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg(message))
|
||||||
|
{
|
||||||
|
result = ERR10_010; /* invalid message packet */
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The 256 character limit isn't good. This should be done differently. */
|
||||||
|
result = GetRexxVarFromMsg(variable_name,buffer,message);
|
||||||
|
if(result != 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
(*buffer_pointer) = buffer;
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following function works in about like the original, except that it
|
||||||
|
ignores the length parameter (the value needs to be a NUL-terminated string)
|
||||||
|
and requires rexxsyslib.library V45. */
|
||||||
|
LONG
|
||||||
|
SetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR value,ULONG length)
|
||||||
|
{
|
||||||
|
LONG result;
|
||||||
|
|
||||||
|
/* The following uses a function which was added to rexxsyslib.library V45.
|
||||||
|
We therefore have a minimum library version requirement. */
|
||||||
|
if(RexxSysBase == NULL || RexxSysBase->lib_Version < 45 || NOT IsRexxMsg(message))
|
||||||
|
{
|
||||||
|
result = ERR10_010; /* invalid message packet */
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = SetRexxVarFromMsg(variable_name,value,message);
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 178
|
#define REVISION 184
|
||||||
#define DATE "7.10.2004"
|
#define DATE "28.11.2004"
|
||||||
#define VERS "c.lib 1.178"
|
#define VERS "c.lib 1.184"
|
||||||
#define VSTRING "c.lib 1.178 (7.10.2004)\r\n"
|
#define VSTRING "c.lib 1.184 (28.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: c.lib 1.178 (7.10.2004)"
|
#define VERSTAG "\0$VER: c.lib 1.184 (28.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
178
|
184
|
||||||
|
|||||||
114
library/changes
114
library/changes
@@ -1,3 +1,117 @@
|
|||||||
|
c.lib 1.184 (28.11.2004)
|
||||||
|
|
||||||
|
- Added asctime_r(), ctime_r(), gmtime_r(), localtime_r() and strtok_r().
|
||||||
|
|
||||||
|
- Added stubs for the Rexx Variables Interface code that used to
|
||||||
|
be part of amiga.lib. While comparable functionality is available
|
||||||
|
in rexxsyslib.library V45, the new stubs might be helpful during
|
||||||
|
porting. Care must be taken since these functions don't work
|
||||||
|
exactly like the originals.
|
||||||
|
|
||||||
|
- Integrated strlcpy() and strlcat() which are intended to be safer
|
||||||
|
replacements for strncpy() and strncat().
|
||||||
|
|
||||||
|
- The program's task priority is now configurable through an external
|
||||||
|
variable '__priority'.
|
||||||
|
|
||||||
|
- The process name to be used when detaching can be configured through
|
||||||
|
the new '__process_name' variable.
|
||||||
|
|
||||||
|
- The minimum required operating system version can be configured
|
||||||
|
through the new '__minimum_os_lib_version' variable; a matching
|
||||||
|
error message can be provided through the new '__minimum_os_lib_error'
|
||||||
|
variable.
|
||||||
|
|
||||||
|
- The default console window specification can be overriden through
|
||||||
|
the new '__stdio_window_specification' variable.
|
||||||
|
|
||||||
|
- The socket initialization code did not set up a reference to the
|
||||||
|
'h_errno' variable correctly. This had the effect of making name
|
||||||
|
and address resolution errors trash the 'errno' variable instead
|
||||||
|
and leaving 'h_errno' always set to 0. Fixed.
|
||||||
|
|
||||||
|
- For sockets, ioctl() and fcntl() now interact on the FIONBIO/FIOASYNC
|
||||||
|
requests (ioctl) and the O_NOBLOCK/O_ASYNC flags (fcntl).
|
||||||
|
|
||||||
|
- popen() now accepts "rb" and "wb" as mode parameters. However, "r+",
|
||||||
|
"w+" and variants thereof are still unsupported due to the
|
||||||
|
unidirectional pipe support in the standard "PIPE:" device.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.183 (13.11.2004)
|
||||||
|
|
||||||
|
- Cleaned up the OS4 build makefile, losing redundant libraries,
|
||||||
|
adding more startup object code and ultimatively making the whole
|
||||||
|
rebuild logic work again: if code changes and dependencies are
|
||||||
|
set up correctly, it will now get rebuilt. Previously, such
|
||||||
|
changes went unnoticed and you had to rebuild the entire library
|
||||||
|
from scratch.
|
||||||
|
|
||||||
|
- Added stubs for CreatePort(), DeletePort(), CreateTask(), DeleteTask()
|
||||||
|
and NewList() which have equivalents in exec.library V50 but for which
|
||||||
|
it might be useful if ported code didn't have to reference these
|
||||||
|
explicitly.
|
||||||
|
|
||||||
|
- mktemp() was broken in libunix.a with Unix path semantics enabled.
|
||||||
|
This was because the name template was translated and translated
|
||||||
|
back again, overwriting the translation buffer. This, funny enough,
|
||||||
|
broke Samba's printing feature. Fixed by translating the name only
|
||||||
|
before each test for "uniqueness" is made. The new code also handles
|
||||||
|
empty "" templates gracefully, which was a problem with both the
|
||||||
|
"standard" and the Unix path semantics flavour.
|
||||||
|
|
||||||
|
Why is it that I find bugs like this always after having just
|
||||||
|
released another library update?
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.182 (8.11.2004)
|
||||||
|
|
||||||
|
- Changed the error abort condition for the %s conversion of the
|
||||||
|
scanf() family. It now matches the abort conditions for all other
|
||||||
|
conversions and no longer ignores whether any other parameters were
|
||||||
|
converted before. This was a quirk in the older implementation.
|
||||||
|
|
||||||
|
- The scanf() family now accepts %E and %G in place of %f and %X in
|
||||||
|
place of %x.
|
||||||
|
|
||||||
|
- Simplified the common code that fopen(), freopen() and fdopen()
|
||||||
|
share and which has to figure out by looking at a file access
|
||||||
|
mode specification which parameters should be used.
|
||||||
|
|
||||||
|
- Dropped error detection in the scanf() family. The EOF has to be
|
||||||
|
good enough. Also, ungetc() failure still leads to error handling.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.181 (26.10.2004)
|
||||||
|
|
||||||
|
- The scanf() family now always returns the number of assignments made
|
||||||
|
unless an error occured or an EOF was hit during conversion before the
|
||||||
|
first assignment could be made.
|
||||||
|
|
||||||
|
- strtok() did not terminate properly if the last token in the string
|
||||||
|
did not end with a separator character but with a '\0' byte. Fixed.
|
||||||
|
|
||||||
|
- The directory scanning functions opendir/closedir did not get the global
|
||||||
|
directory data tracking data structure initialized which later led to
|
||||||
|
Enforcer hits and maybe trashed memory. Fixed.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.180 (23.10.2004)
|
||||||
|
|
||||||
|
- The printf() family now produces no output at all for %e, %f and %g if the
|
||||||
|
floating point support code is disabled. Previously, a minimum field width
|
||||||
|
specification could take effect, printing a series of 0 or blank space
|
||||||
|
characters where no output should have been produced.
|
||||||
|
|
||||||
|
|
||||||
|
c.lib 1.179 (22.10.2004)
|
||||||
|
|
||||||
|
- The scanf() family no longer assumes that a leading '0' indicates that the
|
||||||
|
following digits form an octal number if the conversion type has been
|
||||||
|
specified as already '%x' already.
|
||||||
|
|
||||||
|
|
||||||
c.lib 1.178 (7.10.2004)
|
c.lib 1.178 (7.10.2004)
|
||||||
|
|
||||||
- The OS4 version had floating point math support code enabled in all
|
- The OS4 version had floating point math support code enabled in all
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: debug.h,v 1.1.1.1 2004-07-26 16:30:26 obarthel Exp $
|
* $Id: debug.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=8
|
* :ts=8
|
||||||
*
|
*
|
||||||
@@ -57,9 +57,17 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STDLIB_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif /* _STDLIB_H */
|
||||||
|
|
||||||
|
#ifndef _DOS_H
|
||||||
|
#include <dos.h>
|
||||||
|
#endif /* _DOS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
extern void kprintf(const char *format,...);
|
extern void kprintf(const char *format,...);
|
||||||
extern void abort(void);
|
|
||||||
extern char * __program_name;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 178
|
#define REVISION 184
|
||||||
#define DATE "7.10.2004"
|
#define DATE "28.11.2004"
|
||||||
#define VERS "debug.lib 1.178"
|
#define VERS "debug.lib 1.184"
|
||||||
#define VSTRING "debug.lib 1.178 (7.10.2004)\r\n"
|
#define VSTRING "debug.lib 1.184 (28.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: debug.lib 1.178 (7.10.2004)"
|
#define VERSTAG "\0$VER: debug.lib 1.184 (28.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
178
|
184
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dirent_data.c,v 1.3 2004-08-07 10:24:04 obarthel Exp $
|
* $Id: dirent_data.c,v 1.4 2004-10-24 20:03:42 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :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: fcntl_close.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
* $Id: fcntl_close.c,v 1.3 2004-11-28 10:01:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -135,7 +135,7 @@ __close(int file_descriptor,int * error_ptr)
|
|||||||
SHOWMSG("resetting non-blocking access mode");
|
SHOWMSG("resetting non-blocking access mode");
|
||||||
|
|
||||||
message.action = file_hook_action_set_blocking;
|
message.action = file_hook_action_set_blocking;
|
||||||
message.block = 1;
|
message.arg = 1;
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
assert( fd->fd_Hook != NULL );
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_fcntl.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
* $Id: fcntl_fcntl.c,v 1.4 2004-11-28 10:01:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -126,10 +126,13 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
|
|
||||||
SHOWMSG("cmd=F_GETFL");
|
SHOWMSG("cmd=F_GETFL");
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
|
||||||
result = O_NONBLOCK;
|
SET_FLAG(result,O_NONBLOCK);
|
||||||
else
|
|
||||||
result = 0;
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO))
|
||||||
|
SET_FLAG(result,O_ASYNC);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -147,7 +150,7 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
(FLAG_IS_CLEAR(flags,O_NONBLOCK) && FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING)))
|
(FLAG_IS_CLEAR(flags,O_NONBLOCK) && FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING)))
|
||||||
{
|
{
|
||||||
message.action = file_hook_action_set_blocking;
|
message.action = file_hook_action_set_blocking;
|
||||||
message.block = FLAG_IS_CLEAR(flags,O_NONBLOCK);
|
message.arg = FLAG_IS_CLEAR(flags,O_NONBLOCK);
|
||||||
|
|
||||||
assert( fd->fd_Hook != NULL );
|
assert( fd->fd_Hook != NULL );
|
||||||
|
|
||||||
@@ -168,6 +171,31 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
CLEAR_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
|
CLEAR_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if((FLAG_IS_SET(flags,O_ASYNC) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_ASYNC_IO)) ||
|
||||||
|
(FLAG_IS_CLEAR(flags,O_ASYNC) && FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO)))
|
||||||
|
{
|
||||||
|
message.action = file_hook_action_set_async;
|
||||||
|
message.arg = FLAG_IS_SET(flags,O_ASYNC);
|
||||||
|
|
||||||
|
assert( fd->fd_Hook != NULL );
|
||||||
|
|
||||||
|
CallHookPkt(fd->fd_Hook,fd,&message);
|
||||||
|
|
||||||
|
result = message.result;
|
||||||
|
if(result < 0)
|
||||||
|
{
|
||||||
|
errno = message.error;
|
||||||
|
|
||||||
|
va_end(arg);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(FLAG_IS_SET(flags,O_ASYNC))
|
||||||
|
SET_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||||
|
else
|
||||||
|
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||||
|
}
|
||||||
|
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: dos.h,v 1.3 2004-08-25 15:27:28 obarthel Exp $
|
* $Id: dos.h,v 1.4 2004-11-14 11:06:28 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -164,6 +164,28 @@ extern ULONG __free_memory_threshold;
|
|||||||
* them initialized to certain well-defined values to get the desired effect.
|
* them initialized to certain well-defined values to get the desired effect.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The minimum required operating system version number is 37, which
|
||||||
|
* corresponds to Workbench/Kickstart 2.04. You may request a higher
|
||||||
|
* version number by defining the following variable; if you do so,
|
||||||
|
* please provide a fitting error message, too. Note that you cannot
|
||||||
|
* request a minimum version number lower than 37.
|
||||||
|
*/
|
||||||
|
extern int __minimum_os_lib_version;
|
||||||
|
extern char * __minimum_os_lib_error;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If your program is launched from Workbench it will not necessarily
|
||||||
|
* have a window to send console output to and from which console
|
||||||
|
* input can be read. The startup code attempts to set up such a console
|
||||||
|
* window for you, but it uses defaults for the window specification.
|
||||||
|
* These defaults can be overridden by your program if you define a
|
||||||
|
* variable to point to the specification string. Note that if you
|
||||||
|
* request a specific window specification, this will also override
|
||||||
|
* any tool window definition stored in the program's icon.
|
||||||
|
*/
|
||||||
|
extern char * __stdio_window_specification;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If set to TRUE, your program's process->pr_WindowPtr will be set to -1
|
* If set to TRUE, your program's process->pr_WindowPtr will be set to -1
|
||||||
* when it starts. The process->pr_WindowPtr will be automatically restored
|
* when it starts. The process->pr_WindowPtr will be automatically restored
|
||||||
@@ -192,6 +214,20 @@ extern BOOL __detach;
|
|||||||
*/
|
*/
|
||||||
extern BOOL (* __check_detach)(void);
|
extern BOOL (* __check_detach)(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If this pointer is not NULL, it refers the name that will be given to
|
||||||
|
* the process which is created when the program detaches. The default
|
||||||
|
* is to reuse the program name instead.
|
||||||
|
*/
|
||||||
|
extern char * __process_name;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This variable controls the task priority of the program, when running.
|
||||||
|
* It must be in the range -128..127 to be useful. By default, the task
|
||||||
|
* priority will not be changed.
|
||||||
|
*/
|
||||||
|
extern int __priority;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This variable can be set up to contain the minimum stack size the program
|
* This variable can be set up to contain the minimum stack size the program
|
||||||
* should be launched with. If the startup code finds that there is not enough
|
* should be launched with. If the startup code finds that there is not enough
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
|
* $Id: fcntl.h,v 1.3 2004-11-27 12:43:12 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -67,6 +67,7 @@ extern "C" {
|
|||||||
#define O_NONBLOCK (1<<6)
|
#define O_NONBLOCK (1<<6)
|
||||||
#define O_SYNC (0)
|
#define O_SYNC (0)
|
||||||
#define O_NOCTTY (0)
|
#define O_NOCTTY (0)
|
||||||
|
#define O_ASYNC (1<<7)
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: string.h,v 1.3 2004-08-07 09:15:33 obarthel Exp $
|
* $Id: string.h,v 1.5 2004-11-17 19:07:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -122,6 +122,15 @@ extern int bcmp(const void *a,const void *b,size_t len);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern size_t strlcpy(char *dst, const char *src, size_t siz);
|
||||||
|
extern size_t strlcat(char *dst, const char *src, size_t siz);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern char * strtok_r(char *str, const char *separator_set,char ** state_ptr);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time.h,v 1.1.1.1 2004-07-26 16:32:56 obarthel Exp $
|
* $Id: time.h,v 1.2 2004-11-17 19:07:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -95,6 +95,17 @@ extern size_t strftime(char *s, size_t maxsize, const char *format,
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern char * asctime_r(const struct tm *tm,char * buffer);
|
||||||
|
extern char * ctime_r(const time_t *tptr,char * buffer);
|
||||||
|
extern struct tm * gmtime_r(const time_t *t,struct tm * tm_ptr);
|
||||||
|
extern struct tm * localtime_r(const time_t *t,struct tm * tm_ptr);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 178
|
#define REVISION 184
|
||||||
#define DATE "7.10.2004"
|
#define DATE "28.11.2004"
|
||||||
#define VERS "m.lib 1.178"
|
#define VERS "m.lib 1.184"
|
||||||
#define VSTRING "m.lib 1.178 (7.10.2004)\r\n"
|
#define VSTRING "m.lib 1.184 (28.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: m.lib 1.178 (7.10.2004)"
|
#define VERSTAG "\0$VER: m.lib 1.184 (28.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
178
|
184
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 178
|
#define REVISION 184
|
||||||
#define DATE "7.10.2004"
|
#define DATE "28.11.2004"
|
||||||
#define VERS "m881.lib 1.178"
|
#define VERS "m881.lib 1.184"
|
||||||
#define VSTRING "m881.lib 1.178 (7.10.2004)\r\n"
|
#define VSTRING "m881.lib 1.184 (28.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: m881.lib 1.178 (7.10.2004)"
|
#define VERSTAG "\0$VER: m881.lib 1.184 (28.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
178
|
184
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 178
|
#define REVISION 184
|
||||||
#define DATE "7.10.2004"
|
#define DATE "28.11.2004"
|
||||||
#define VERS "net.lib 1.178"
|
#define VERS "net.lib 1.184"
|
||||||
#define VSTRING "net.lib 1.178 (7.10.2004)\r\n"
|
#define VSTRING "net.lib 1.184 (28.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: net.lib 1.178 (7.10.2004)"
|
#define VERSTAG "\0$VER: net.lib 1.184 (28.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
178
|
184
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
c.lib 1.178 (7.10.2004)
|
c.lib 1.180 (23.10.2004)
|
||||||
|
|
||||||
- The OS4 version had floating point math support code enabled in all
|
- The printf() family now produces no output at all for floating point
|
||||||
libraries and not just "libm.a". Trying to link with, for example,
|
numbers (%e, %f and %g) if the floating point support code is disabled.
|
||||||
"libc.a" would bring up a number of unsatisfied symbol references
|
In previous versions of the library some output (series of 0 or blank
|
||||||
which could be fixed only by linking against "libm.a", too.
|
space characters) could still be produced.
|
||||||
|
|
||||||
|
- The scanf() family no longer ignores a conversion request of
|
||||||
|
type '%x' (hexadecimal) and treats the number to be processed
|
||||||
|
as in octal notation if that number begins with the digit 0.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: signal_headers.h,v 1.1.1.1 2004-07-26 16:31:05 obarthel Exp $
|
* $Id: signal_headers.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -68,20 +68,20 @@ typedef void (*signal_handler_t)(int sig);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern signal_handler_t __signal_handler_table[NUM_SIGNALS];
|
extern signal_handler_t NOCOMMON __signal_handler_table[NUM_SIGNALS];
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern int __signals_blocked;
|
extern int NOCOMMON __signals_blocked;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern BOOL __termination_message_printed;
|
extern BOOL NOCOMMON __termination_message_printed;
|
||||||
extern BOOL __termination_message_disabled;
|
extern BOOL NOCOMMON __termination_message_disabled;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern const char __abnormal_program_termination[];
|
extern const char NOCOMMON __abnormal_program_termination[];
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# $Id: smakefile,v 1.10 2004-09-29 14:17:44 obarthel Exp $
|
# $Id: smakefile,v 1.12 2004-11-18 09:40:37 obarthel Exp $
|
||||||
#
|
#
|
||||||
# :ts=8
|
# :ts=8
|
||||||
#
|
#
|
||||||
@@ -88,6 +88,7 @@ AMIGA_OBJ = \
|
|||||||
amiga_newlist.o \
|
amiga_newlist.o \
|
||||||
amiga_rangerand.o \
|
amiga_rangerand.o \
|
||||||
amiga_remtof.o \
|
amiga_remtof.o \
|
||||||
|
amiga_rexxvars.o \
|
||||||
amiga_setsuperattrs.o \
|
amiga_setsuperattrs.o \
|
||||||
amiga_timedelay.o \
|
amiga_timedelay.o \
|
||||||
amiga_waitbeam.o \
|
amiga_waitbeam.o \
|
||||||
@@ -394,6 +395,10 @@ STDLIB_OBJ = \
|
|||||||
stdlib_mkstemp.o \
|
stdlib_mkstemp.o \
|
||||||
stdlib_mktemp.o \
|
stdlib_mktemp.o \
|
||||||
stdlib_never_free.o \
|
stdlib_never_free.o \
|
||||||
|
stdlib_osliberror.o \
|
||||||
|
stdlib_oslibversion.o \
|
||||||
|
stdlib_priority.o \
|
||||||
|
stdlib_process_name.o \
|
||||||
stdlib_putenv.o \
|
stdlib_putenv.o \
|
||||||
stdlib_qsort.o \
|
stdlib_qsort.o \
|
||||||
stdlib_rand.o \
|
stdlib_rand.o \
|
||||||
@@ -419,7 +424,8 @@ STDLIB_OBJ = \
|
|||||||
stdlib_swapstack.o \
|
stdlib_swapstack.o \
|
||||||
stdlib_system.o \
|
stdlib_system.o \
|
||||||
stdlib_unsetenv.o \
|
stdlib_unsetenv.o \
|
||||||
stdlib_wildcard_expand.o
|
stdlib_wildcard_expand.o \
|
||||||
|
stdlib_stdio_window_spec.o
|
||||||
|
|
||||||
STRING_OBJ = \
|
STRING_OBJ = \
|
||||||
string_bcmp.o \
|
string_bcmp.o \
|
||||||
@@ -440,6 +446,8 @@ STRING_OBJ = \
|
|||||||
string_strcspn.o \
|
string_strcspn.o \
|
||||||
string_strdup.o \
|
string_strdup.o \
|
||||||
string_strerror.o \
|
string_strerror.o \
|
||||||
|
string_strlcat.o \
|
||||||
|
string_strlcpy.o \
|
||||||
string_strlen.o \
|
string_strlen.o \
|
||||||
string_strncat.o \
|
string_strncat.o \
|
||||||
string_strncmp.o \
|
string_strncmp.o \
|
||||||
@@ -449,6 +457,7 @@ STRING_OBJ = \
|
|||||||
string_strspn.o \
|
string_strspn.o \
|
||||||
string_strstr.o \
|
string_strstr.o \
|
||||||
string_strtok.o \
|
string_strtok.o \
|
||||||
|
string_strtok_r.o \
|
||||||
string_strxfrm.o
|
string_strxfrm.o
|
||||||
|
|
||||||
STRINGS_OBJ = \
|
STRINGS_OBJ = \
|
||||||
@@ -457,14 +466,18 @@ STRINGS_OBJ = \
|
|||||||
|
|
||||||
TIME_OBJ = \
|
TIME_OBJ = \
|
||||||
time_asctime.o \
|
time_asctime.o \
|
||||||
|
time_asctime_r.o \
|
||||||
time_clock.o \
|
time_clock.o \
|
||||||
time_converttime.o \
|
time_converttime.o \
|
||||||
time_ctime.o \
|
time_ctime.o \
|
||||||
|
time_ctime_r.o \
|
||||||
time_data.o \
|
time_data.o \
|
||||||
time_difftime.o \
|
time_difftime.o \
|
||||||
time_gettimeofday.o \
|
time_gettimeofday.o \
|
||||||
time_gmtime.o \
|
time_gmtime.o \
|
||||||
|
time_gmtime_r.o \
|
||||||
time_localtime.o \
|
time_localtime.o \
|
||||||
|
time_localtime_r.o \
|
||||||
time_mktime.o \
|
time_mktime.o \
|
||||||
time_numbertostring.o \
|
time_numbertostring.o \
|
||||||
time_strftime.o \
|
time_strftime.o \
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_data.c,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
* $Id: socket_data.c,v 1.3 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -46,9 +46,7 @@ struct Library * __SocketBase;
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
#if defined(__amigaos4__)
|
||||||
|
|
||||||
struct SocketIFace *__ISocket;
|
struct SocketIFace *__ISocket;
|
||||||
|
|
||||||
#endif /* __amigaos4__ */
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_headers.h,v 1.2 2004-07-28 15:50:45 obarthel Exp $
|
* $Id: socket_headers.h,v 1.3 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -48,19 +48,19 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct Library * __SocketBase;
|
extern struct Library * NOCOMMON __SocketBase;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(__amigaos4__)
|
#if defined(__amigaos4__)
|
||||||
|
|
||||||
extern struct SocketIFace *__ISocket;
|
extern struct SocketIFace * NOCOMMON __ISocket;
|
||||||
|
|
||||||
#endif /* __amigaos4__ */
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern int h_errno;
|
extern int NOCOMMON h_errno;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_hook_entry.c,v 1.1.1.1 2004-07-26 16:31:14 obarthel Exp $
|
* $Id: socket_hook_entry.c,v 1.3 2004-11-28 10:01:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -41,6 +41,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
void
|
void
|
||||||
__socket_hook_entry(
|
__socket_hook_entry(
|
||||||
struct Hook * UNUSED unused_hook,
|
struct Hook * UNUSED unused_hook,
|
||||||
@@ -49,6 +53,7 @@ __socket_hook_entry(
|
|||||||
{
|
{
|
||||||
struct FileInfoBlock * fib;
|
struct FileInfoBlock * fib;
|
||||||
int error = OK;
|
int error = OK;
|
||||||
|
int param;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
assert( message != NULL && fd != NULL );
|
assert( message != NULL && fd != NULL );
|
||||||
@@ -129,6 +134,28 @@ __socket_hook_entry(
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case file_hook_action_set_blocking:
|
||||||
|
|
||||||
|
SHOWMSG("file_hook_action_set_blocking");
|
||||||
|
|
||||||
|
param = (int)(message->arg == 0);
|
||||||
|
|
||||||
|
result = __IoctlSocket(fd->fd_DefaultFile,FIONBIO,¶m);
|
||||||
|
error = errno;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case file_hook_action_set_async:
|
||||||
|
|
||||||
|
SHOWMSG("file_hook_action_set_async");
|
||||||
|
|
||||||
|
param = (int)(message->arg != 0);
|
||||||
|
|
||||||
|
result = __IoctlSocket(fd->fd_DefaultFile,FIOASYNC,¶m);
|
||||||
|
error = errno;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case file_hook_action_examine:
|
case file_hook_action_examine:
|
||||||
|
|
||||||
SHOWMSG("file_hook_action_examine");
|
SHOWMSG("file_hook_action_examine");
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_init_exit.c,v 1.4 2004-09-29 17:03:57 obarthel Exp $
|
* $Id: socket_init_exit.c,v 1.5 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -39,16 +39,16 @@
|
|||||||
#include "socket_headers.h"
|
#include "socket_headers.h"
|
||||||
#endif /* _SOCKET_HEADERS_H */
|
#endif /* _SOCKET_HEADERS_H */
|
||||||
|
|
||||||
|
#ifndef _SIGNAL_HEADERS_H
|
||||||
|
#include "signal_headers.h"
|
||||||
|
#endif /* _SIGNAL_HEADERS_H */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#include "stdlib_protos.h"
|
#include "stdlib_protos.h"
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern BOOL __detach;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/* Code value. */
|
/* Code value. */
|
||||||
#define SBTB_CODE 1
|
#define SBTB_CODE 1
|
||||||
#define SBTS_CODE 0x3FFF
|
#define SBTS_CODE 0x3FFF
|
||||||
@@ -78,16 +78,6 @@ struct DaemonMessage
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern BOOL __termination_message_disabled;
|
|
||||||
extern char * __program_name;
|
|
||||||
extern BOOL __is_daemon;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
extern void __socket_hook_entry(struct Hook * hook,struct fd * fd,struct file_hook_message * message);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
CLIB_DESTRUCTOR(__socket_exit)
|
CLIB_DESTRUCTOR(__socket_exit)
|
||||||
{
|
{
|
||||||
ENTER();
|
ENTER();
|
||||||
@@ -192,7 +182,7 @@ __socket_init(void)
|
|||||||
|
|
||||||
/* Wire the library's h_errno variable to our local h_errno. */
|
/* Wire the library's h_errno variable to our local h_errno. */
|
||||||
tags[3].ti_Tag = SBTM_SETVAL(SBTC_HERRNOLONGPTR);
|
tags[3].ti_Tag = SBTM_SETVAL(SBTC_HERRNOLONGPTR);
|
||||||
tags[3].ti_Data = (ULONG)&errno;
|
tags[3].ti_Data = (ULONG)&h_errno;
|
||||||
|
|
||||||
tags[4].ti_Tag = TAG_END;
|
tags[4].ti_Tag = TAG_END;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: socket_ioctl.c,v 1.1.1.1 2004-07-26 16:31:16 obarthel Exp $
|
* $Id: socket_ioctl.c,v 1.3 2004-11-28 10:01:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,6 +47,10 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
ioctl(int sockfd,unsigned long request, ... /* char *arg */)
|
ioctl(int sockfd,unsigned long request, ... /* char *arg */)
|
||||||
{
|
{
|
||||||
@@ -81,6 +85,26 @@ ioctl(int sockfd,unsigned long request, ... /* char *arg */)
|
|||||||
result = __IoctlSocket((LONG)fd->fd_DefaultFile,request,param);
|
result = __IoctlSocket((LONG)fd->fd_DefaultFile,request,param);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
|
if(result == OK)
|
||||||
|
{
|
||||||
|
int * option = (int *)param;
|
||||||
|
|
||||||
|
if(request == FIONBIO)
|
||||||
|
{
|
||||||
|
if((*option) != 0)
|
||||||
|
SET_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
|
||||||
|
else
|
||||||
|
CLEAR_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
|
||||||
|
}
|
||||||
|
else if (request == FIOASYNC)
|
||||||
|
{
|
||||||
|
if((*option) != 0)
|
||||||
|
SET_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||||
|
else
|
||||||
|
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 178
|
#define REVISION 184
|
||||||
#define DATE "7.10.2004"
|
#define DATE "28.11.2004"
|
||||||
#define VERS "stack.lib 1.178"
|
#define VERS "stack.lib 1.184"
|
||||||
#define VSTRING "stack.lib 1.178 (7.10.2004)\r\n"
|
#define VSTRING "stack.lib 1.184 (28.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: stack.lib 1.178 (7.10.2004)"
|
#define VERSTAG "\0$VER: stack.lib 1.184 (28.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
178
|
184
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stat_headers.h,v 1.1.1.1 2004-07-26 16:31:22 obarthel Exp $
|
* $Id: stat_headers.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern mode_t __current_umask;
|
extern mode_t NOCOMMON __current_umask;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_fdhookentry.c,v 1.1.1.1 2004-07-26 16:31:28 obarthel Exp $
|
* $Id: stdio_fdhookentry.c,v 1.2 2004-11-28 10:01:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -1829,7 +1829,7 @@ __fd_hook_entry(
|
|||||||
|
|
||||||
SHOWMSG("changing the mode");
|
SHOWMSG("changing the mode");
|
||||||
|
|
||||||
if(message->block)
|
if(message->arg != 0)
|
||||||
mode = 0; /* buffered mode */
|
mode = 0; /* buffered mode */
|
||||||
else
|
else
|
||||||
mode = 1; /* single character mode */
|
mode = 1; /* single character mode */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_headers.h,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
* $Id: stdio_headers.h,v 1.5 2004-11-28 10:01:26 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -252,6 +252,8 @@ struct iob
|
|||||||
to have its protection bits updated after
|
to have its protection bits updated after
|
||||||
it has been closed */
|
it has been closed */
|
||||||
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
|
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
|
||||||
|
#define FDF_ASYNC_IO (1UL<<10) /* File was switched into asynchronous I/O
|
||||||
|
mode (sockets only). */
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -306,7 +308,8 @@ enum file_hook_action_t
|
|||||||
file_hook_action_info,
|
file_hook_action_info,
|
||||||
file_hook_action_duplicate_fd,
|
file_hook_action_duplicate_fd,
|
||||||
file_hook_action_seek_and_extend,
|
file_hook_action_seek_and_extend,
|
||||||
file_hook_action_is_interactive
|
file_hook_action_is_interactive,
|
||||||
|
file_hook_action_set_async
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@@ -324,7 +327,7 @@ struct file_hook_message
|
|||||||
struct flock * lock; /* Record locking request */
|
struct flock * lock; /* Record locking request */
|
||||||
int command; /* What kind of locking command was sent */
|
int command; /* What kind of locking command was sent */
|
||||||
|
|
||||||
int block; /* Whether or not this file should
|
int arg; /* Whether or not this file should
|
||||||
be set non-blocking */
|
be set non-blocking */
|
||||||
|
|
||||||
uid_t owner;
|
uid_t owner;
|
||||||
@@ -347,22 +350,22 @@ struct file_hook_message
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* The file handle table. */
|
/* The file handle table. */
|
||||||
extern struct iob ** __iob;
|
extern struct iob ** NOCOMMON __iob;
|
||||||
extern int __num_iob;
|
extern int NOCOMMON __num_iob;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* The file descriptor table. */
|
/* The file descriptor table. */
|
||||||
extern struct fd ** __fd;
|
extern struct fd ** NOCOMMON __fd;
|
||||||
extern int __num_fd;
|
extern int NOCOMMON __num_fd;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern char * __file_lock_semaphore_name;
|
extern char * NOCOMMON __file_lock_semaphore_name;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern BOOL __no_standard_io;
|
extern BOOL NOCOMMON __no_standard_io;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdio_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_popen.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
* $Id: stdio_popen.c,v 1.3 2004-11-28 09:33:19 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -94,20 +94,6 @@ pclose(FILE *stream)
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#define SET_TAG(t,v,d) \
|
|
||||||
do \
|
|
||||||
{ \
|
|
||||||
(t)->ti_Tag = (Tag)(v); \
|
|
||||||
(t)->ti_Data = (ULONG)(d); \
|
|
||||||
(t)++; \
|
|
||||||
} \
|
|
||||||
while(0)
|
|
||||||
|
|
||||||
#define END_TAG(t) \
|
|
||||||
(void)((t)->ti_Tag = TAG_END)
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
FILE *
|
FILE *
|
||||||
popen(const char *command, const char *type)
|
popen(const char *command, const char *type)
|
||||||
{
|
{
|
||||||
@@ -118,14 +104,10 @@ popen(const char *command, const char *type)
|
|||||||
BPTR input = ZERO;
|
BPTR input = ZERO;
|
||||||
BPTR output = ZERO;
|
BPTR output = ZERO;
|
||||||
char pipe_file_name[40];
|
char pipe_file_name[40];
|
||||||
struct TagItem tags[5];
|
|
||||||
struct TagItem * tag;
|
|
||||||
FILE * result = NULL;
|
FILE * result = NULL;
|
||||||
LONG status;
|
LONG status;
|
||||||
unsigned long task_address;
|
unsigned long task_address;
|
||||||
time_t now;
|
time_t now;
|
||||||
size_t type_len;
|
|
||||||
char actual_type[8];
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
@@ -150,6 +132,36 @@ popen(const char *command, const char *type)
|
|||||||
if(__check_abort_enabled)
|
if(__check_abort_enabled)
|
||||||
__check_abort();
|
__check_abort();
|
||||||
|
|
||||||
|
/* The first character selects the access mode: read or write. We don't
|
||||||
|
support anything else. */
|
||||||
|
switch(type[0])
|
||||||
|
{
|
||||||
|
case 'r':
|
||||||
|
|
||||||
|
SHOWMSG("read mode");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'w':
|
||||||
|
|
||||||
|
SHOWMSG("write mode");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
D(("unsupported access mode '%lc'",type[0]));
|
||||||
|
errno = EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The current PIPE: device only supports unidirectional connections. */
|
||||||
|
if((type[1] == '+') || (type[1] != '\0' && type[2] == '+'))
|
||||||
|
{
|
||||||
|
D(("unsupported access mode '%s'",type));
|
||||||
|
|
||||||
|
errno = EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(UNIX_PATH_SEMANTICS)
|
#if defined(UNIX_PATH_SEMANTICS)
|
||||||
{
|
{
|
||||||
if(__unix_path_semantics)
|
if(__unix_path_semantics)
|
||||||
@@ -237,33 +249,10 @@ popen(const char *command, const char *type)
|
|||||||
}
|
}
|
||||||
#endif /* UNIX_PATH_SEMANTICS */
|
#endif /* UNIX_PATH_SEMANTICS */
|
||||||
|
|
||||||
/* Skip any options following the comma. */
|
/* Build a (hopefully) unique name for the pipe stream to open. We
|
||||||
type_len = strlen(type);
|
construct it from the current process address, converted into
|
||||||
for(i = 0 ; i < (int)type_len ; i++)
|
an octal number, followed by the current time (in seconds),
|
||||||
{
|
converted into another octal number. */
|
||||||
if(type[i] == ',')
|
|
||||||
{
|
|
||||||
type_len = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Keep only the first few letters of the type string. */
|
|
||||||
if(type_len > sizeof(actual_type)-1)
|
|
||||||
type_len = sizeof(actual_type)-1;
|
|
||||||
|
|
||||||
memmove(actual_type,type,type_len);
|
|
||||||
actual_type[type_len] = '\0';
|
|
||||||
|
|
||||||
/* The current PIPE: device only supports unidirectional connections. */
|
|
||||||
if(strcmp(actual_type,"r+") == SAME)
|
|
||||||
{
|
|
||||||
SHOWMSG("unsupported access mode");
|
|
||||||
|
|
||||||
errno = EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(pipe_file_name,"PIPE:");
|
strcpy(pipe_file_name,"PIPE:");
|
||||||
|
|
||||||
task_address = (unsigned long)FindTask(NULL);
|
task_address = (unsigned long)FindTask(NULL);
|
||||||
@@ -290,26 +279,27 @@ popen(const char *command, const char *type)
|
|||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
|
|
||||||
if(strcmp(actual_type,"r") == SAME)
|
/* Now open the input and output streams for the program to launch. */
|
||||||
|
if(type[0] == 'r')
|
||||||
{
|
{
|
||||||
|
/* Read mode: we want to read the output of the program; the program
|
||||||
|
should read from "NIL:". */
|
||||||
input = Open("NIL:",MODE_NEWFILE);
|
input = Open("NIL:",MODE_NEWFILE);
|
||||||
if(input != ZERO)
|
if(input != ZERO)
|
||||||
output = Open(pipe_file_name,MODE_NEWFILE);
|
output = Open(pipe_file_name,MODE_NEWFILE);
|
||||||
}
|
}
|
||||||
else if (strcmp(actual_type,"w") == SAME)
|
else
|
||||||
{
|
{
|
||||||
|
/* Write mode: we want to send data to the program; the program
|
||||||
|
should write to "NIL:". */
|
||||||
input = Open(pipe_file_name,MODE_NEWFILE);
|
input = Open(pipe_file_name,MODE_NEWFILE);
|
||||||
if(input != ZERO)
|
if(input != ZERO)
|
||||||
output = Open("NIL:",MODE_NEWFILE);
|
output = Open("NIL:",MODE_NEWFILE);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
|
/* Check if both I/O streams could be opened. */
|
||||||
if(input == ZERO || output == ZERO)
|
if(input == ZERO || output == ZERO)
|
||||||
{
|
{
|
||||||
SHOWMSG("couldn't open the streams");
|
SHOWMSG("couldn't open the streams");
|
||||||
@@ -318,18 +308,20 @@ popen(const char *command, const char *type)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
tag = tags;
|
|
||||||
|
|
||||||
SET_TAG(tag,SYS_Input, input);
|
|
||||||
SET_TAG(tag,SYS_Output, output);
|
|
||||||
SET_TAG(tag,SYS_Asynch, TRUE);
|
|
||||||
SET_TAG(tag,SYS_UserShell, TRUE);
|
|
||||||
END_TAG(tag);
|
|
||||||
|
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
status = SystemTagList((STRPTR)command,tags);
|
|
||||||
|
/* Now try to launch the program. */
|
||||||
|
status = SystemTags((STRPTR)command,
|
||||||
|
SYS_Input, input,
|
||||||
|
SYS_Output, output,
|
||||||
|
SYS_Asynch, TRUE,
|
||||||
|
SYS_UserShell, TRUE,
|
||||||
|
TAG_END);
|
||||||
|
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
|
/* If launching the program returned -1 then it could not be started.
|
||||||
|
We'll need to close the I/O streams we opened above. */
|
||||||
if(status == -1)
|
if(status == -1)
|
||||||
{
|
{
|
||||||
SHOWMSG("SystemTagList() failed");
|
SHOWMSG("SystemTagList() failed");
|
||||||
@@ -338,8 +330,11 @@ popen(const char *command, const char *type)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* OK, the program is running. Once it terminates, it will automatically
|
||||||
|
shut down the streams we opened for it. */
|
||||||
input = output = ZERO;
|
input = output = ZERO;
|
||||||
|
|
||||||
|
/* Now try to open the pipe we will use to exchange data with the program. */
|
||||||
result = fopen(pipe_file_name,type);
|
result = fopen(pipe_file_name,type);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -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_data.c,v 1.2 2004-09-29 14:17:44 obarthel Exp $
|
* $Id: stdlib_data.c,v 1.3 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,6 +84,14 @@ ULONG __stk_extensions;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__SASC)
|
||||||
|
|
||||||
|
UBYTE * __base;
|
||||||
|
|
||||||
|
#endif /* __SASC */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
struct Library * __UtilityBase;
|
struct Library * __UtilityBase;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@@ -91,11 +99,3 @@ struct Library * __UtilityBase;
|
|||||||
#if defined(__amigaos4__)
|
#if defined(__amigaos4__)
|
||||||
struct UtilityIFace * __IUtility;
|
struct UtilityIFace * __IUtility;
|
||||||
#endif /* __amigaos4__ */
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#if defined(__SASC)
|
|
||||||
|
|
||||||
UBYTE * __base;
|
|
||||||
|
|
||||||
#endif /* __SASC */
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_exit.c,v 1.1.1.1 2004-07-26 16:31:54 obarthel Exp $
|
* $Id: stdlib_exit.c,v 1.2 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,10 +42,6 @@ int __exit_value = RETURN_FAIL;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern void __exit_trap_trigger(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
void
|
void
|
||||||
_exit(int return_code)
|
_exit(int return_code)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_headers.h,v 1.1.1.1 2004-07-26 16:31:56 obarthel Exp $
|
* $Id: stdlib_headers.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -157,81 +157,79 @@ struct LocalVariable
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct LocalVariable * __lv_root;
|
extern struct LocalVariable * NOCOMMON __lv_root;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern unsigned __random_seed;
|
extern unsigned NOCOMMON __random_seed;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct MemoryTree __memory_tree;
|
extern struct MemoryTree NOCOMMON __memory_tree;
|
||||||
extern struct MinList __memory_list;
|
extern struct MinList NOCOMMON __memory_list;
|
||||||
extern APTR __memory_pool;
|
extern APTR NOCOMMON __memory_pool;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern struct MinList __alloca_memory_list;
|
extern struct MinList NOCOMMON __alloca_memory_list;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern unsigned long __maximum_memory_allocated;
|
extern unsigned long NOCOMMON __maximum_memory_allocated;
|
||||||
extern unsigned long __current_memory_allocated;
|
extern unsigned long NOCOMMON __current_memory_allocated;
|
||||||
extern unsigned long __maximum_num_memory_chunks_allocated;
|
extern unsigned long NOCOMMON __maximum_num_memory_chunks_allocated;
|
||||||
extern unsigned long __current_num_memory_chunks_allocated;
|
extern unsigned long NOCOMMON __current_num_memory_chunks_allocated;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern jmp_buf __exit_jmp_buf;
|
extern jmp_buf NOCOMMON __exit_jmp_buf;
|
||||||
extern int __exit_value;
|
extern int NOCOMMON __exit_value;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern unsigned int (* __get_default_stack_size)(void);
|
extern unsigned int NOCOMMON (* __get_default_stack_size)(void);
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern unsigned int __stack_size;
|
extern unsigned int NOCOMMON __stack_size;
|
||||||
extern BOOL __stack_overflow;
|
extern BOOL NOCOMMON __stack_overflow;
|
||||||
extern UBYTE * __stk_limit;
|
extern UBYTE * NOCOMMON __stk_limit;
|
||||||
/*extern UBYTE ** __stackborders;*/
|
extern UBYTE * NOCOMMON __base;
|
||||||
/*extern UBYTE * __SaveSP;*/
|
|
||||||
extern UBYTE * __base;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern ULONG __stk_argbytes;
|
extern ULONG NOCOMMON __stk_argbytes;
|
||||||
extern ULONG __stk_safezone;
|
extern ULONG NOCOMMON __stk_safezone;
|
||||||
extern ULONG __stk_maxsize;
|
extern ULONG NOCOMMON __stk_maxsize;
|
||||||
extern ULONG __stk_size;
|
extern ULONG NOCOMMON __stk_size;
|
||||||
extern ULONG __stk_extensions;
|
extern ULONG NOCOMMON __stk_extensions;
|
||||||
extern ULONG __stk_minframe;
|
extern ULONG NOCOMMON __stk_minframe;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern BOOL __is_resident;
|
extern BOOL NOCOMMON __is_resident;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern BOOL __free_program_name;
|
extern BOOL NOCOMMON __free_program_name;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern UBYTE __shell_escape_character;
|
extern UBYTE NOCOMMON __shell_escape_character;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern char ** __argv;
|
extern char ** NOCOMMON __argv;
|
||||||
extern int __argc;
|
extern int NOCOMMON __argc;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern UBYTE * __quote_vector;
|
extern UBYTE * NOCOMMON __quote_vector;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern int __default_pool_size;
|
extern int NOCOMMON __default_pool_size;
|
||||||
extern int __default_puddle_size;
|
extern int NOCOMMON __default_puddle_size;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_main.c,v 1.5 2004-10-02 15:56:13 obarthel Exp $
|
* $Id: stdlib_main.c,v 1.7 2004-11-14 11:43:30 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -111,9 +111,8 @@ static int
|
|||||||
call_main(void)
|
call_main(void)
|
||||||
{
|
{
|
||||||
/* Initialization functions; must be called exactly in this
|
/* Initialization functions; must be called exactly in this
|
||||||
* order because there are dependencies between the
|
order because there are dependencies between the
|
||||||
* individual functions.
|
individual functions. */
|
||||||
*/
|
|
||||||
static init_func_ptr init_functions[] =
|
static init_func_ptr init_functions[] =
|
||||||
{
|
{
|
||||||
__stdlib_init,
|
__stdlib_init,
|
||||||
@@ -129,10 +128,9 @@ call_main(void)
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Finalization functions; these may be called
|
/* Finalization functions; these may be called
|
||||||
* essentially in any order. But this one makes the
|
essentially in any order. But this one makes the
|
||||||
* most sense (roll-back of the corresponding
|
most sense (roll-back of the corresponding
|
||||||
* initialization functions).
|
initialization functions). */
|
||||||
*/
|
|
||||||
static exit_func_ptr exit_functions[] =
|
static exit_func_ptr exit_functions[] =
|
||||||
{
|
{
|
||||||
__stdlib_exit,
|
__stdlib_exit,
|
||||||
@@ -189,20 +187,18 @@ call_main(void)
|
|||||||
#endif /* __USE_SAS_PROFILING_FOR_MONITORING */
|
#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
|
||||||
* longjmp() and _exit() did not get called. This
|
longjmp() and _exit() did not get called. This
|
||||||
* means that we will have to show the error message
|
means that we will have to show the error message
|
||||||
* and invoke _exit() all on our own.
|
and invoke _exit() all on our own. */
|
||||||
*/
|
|
||||||
if(__stack_overflow)
|
if(__stack_overflow)
|
||||||
{
|
{
|
||||||
SHOWMSG("we have a 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
|
||||||
* complicated than they already are.
|
complicated than they already are. */
|
||||||
*/
|
|
||||||
__check_abort_enabled = FALSE;
|
__check_abort_enabled = FALSE;
|
||||||
|
|
||||||
if(stdout != NULL)
|
if(stdout != NULL)
|
||||||
@@ -230,10 +226,9 @@ call_main(void)
|
|||||||
SHOWMSG("calling the exit functions");
|
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
|
||||||
* return procedure.
|
return procedure. */
|
||||||
*/
|
|
||||||
for(i = 0 ; exit_functions[i] != NULL ; i++)
|
for(i = 0 ; exit_functions[i] != NULL ; i++)
|
||||||
{
|
{
|
||||||
D(("calling exit function #%ld",i));
|
D(("calling exit function #%ld",i));
|
||||||
@@ -265,13 +260,12 @@ detach_cleanup(REG(d0, LONG UNUSED unused_return_code),REG(d1, BPTR segment_list
|
|||||||
if(((struct Library *)DOSBase)->lib_Version < 50)
|
if(((struct Library *)DOSBase)->lib_Version < 50)
|
||||||
{
|
{
|
||||||
/* Now for the slightly shady part. We need to unload the segment
|
/* Now for the slightly shady part. We need to unload the segment
|
||||||
* list this program was originally loaded with. We have to close
|
list this program was originally loaded with. We have to close
|
||||||
* dos.library, though, which means that either we can close the
|
dos.library, though, which means that either we can close the
|
||||||
* library or unload the code, but not both. But there's a loophole
|
library or unload the code, but not both. But there's a loophole
|
||||||
* in that we can enter Forbid(), unload the code, close the library
|
in that we can enter Forbid(), unload the code, close the library
|
||||||
* and exit and nobody will be able to allocate this program's
|
and exit and nobody will be able to allocate this program's
|
||||||
* memory until after the process has been terminated.
|
memory until after the process has been terminated. */
|
||||||
*/
|
|
||||||
Forbid();
|
Forbid();
|
||||||
|
|
||||||
UnLoadSeg(segment_list);
|
UnLoadSeg(segment_list);
|
||||||
@@ -316,6 +310,7 @@ _main(void)
|
|||||||
int return_code = RETURN_FAIL;
|
int return_code = RETURN_FAIL;
|
||||||
ULONG current_stack_size;
|
ULONG current_stack_size;
|
||||||
APTR old_window_pointer;
|
APTR old_window_pointer;
|
||||||
|
int os_version;
|
||||||
|
|
||||||
SysBase = *(struct Library **)4;
|
SysBase = *(struct Library **)4;
|
||||||
|
|
||||||
@@ -349,13 +344,26 @@ _main(void)
|
|||||||
|
|
||||||
__WBenchMsg = startup_message;
|
__WBenchMsg = startup_message;
|
||||||
|
|
||||||
|
/* Check which minimum operating system version we actually require. */
|
||||||
|
os_version = 37;
|
||||||
|
if(__minimum_os_lib_version > 37)
|
||||||
|
os_version = __minimum_os_lib_version;
|
||||||
|
|
||||||
/* We will need dos.library V37 and utility.library V37. */
|
/* We will need dos.library V37 and utility.library V37. */
|
||||||
DOSBase = (struct Library *)OpenLibrary("dos.library",37);
|
DOSBase = (struct Library *)OpenLibrary("dos.library",os_version);
|
||||||
__UtilityBase = OpenLibrary("utility.library",37);
|
__UtilityBase = OpenLibrary("utility.library",os_version);
|
||||||
|
|
||||||
if(DOSBase == NULL || __UtilityBase == NULL)
|
if(DOSBase == NULL || __UtilityBase == NULL)
|
||||||
{
|
{
|
||||||
__show_error("This program requires AmigaOS 2.04 or higher.");
|
char * error_message;
|
||||||
|
|
||||||
|
/* If available, use the error message provided by the client. */
|
||||||
|
if(__minimum_os_lib_error != NULL)
|
||||||
|
error_message = __minimum_os_lib_error;
|
||||||
|
else
|
||||||
|
error_message = "This program requires AmigaOS 2.04 or higher.";
|
||||||
|
|
||||||
|
__show_error(error_message);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -374,9 +382,8 @@ _main(void)
|
|||||||
#endif /* __amigaos4__ */
|
#endif /* __amigaos4__ */
|
||||||
|
|
||||||
/* 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. */
|
||||||
*/
|
|
||||||
if(__get_default_stack_size != NULL)
|
if(__get_default_stack_size != NULL)
|
||||||
{
|
{
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
@@ -390,9 +397,8 @@ _main(void)
|
|||||||
current_stack_size = get_stack_size(&this_process->pr_Task);
|
current_stack_size = get_stack_size(&this_process->pr_Task);
|
||||||
|
|
||||||
/* If this is a resident program, don't allow for the detach
|
/* If this is a resident program, don't allow for the detach
|
||||||
* code to run. Same goes for launching the program from
|
code to run. Same goes for launching the program from
|
||||||
* Workbench.
|
Workbench. */
|
||||||
*/
|
|
||||||
if(__is_resident || startup_message != NULL)
|
if(__is_resident || startup_message != NULL)
|
||||||
{
|
{
|
||||||
__detach = FALSE;
|
__detach = FALSE;
|
||||||
@@ -404,13 +410,17 @@ _main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* The following code will be executed if the program is to keep
|
/* The following code will be executed if the program is to keep
|
||||||
* running in the shell or was launched from Workbench.
|
running in the shell or was launched from Workbench. */
|
||||||
*/
|
|
||||||
if(DO_NOT __detach)
|
if(DO_NOT __detach)
|
||||||
{
|
{
|
||||||
|
int old_priority = this_process->pr_Task.tc_Node.ln_Pri;
|
||||||
|
|
||||||
|
/* Change the task priority, if requested. */
|
||||||
|
if(-128 <= __priority && __priority <= 127)
|
||||||
|
SetTaskPri((struct Task *)this_process,__priority);
|
||||||
|
|
||||||
/* Was a minimum stack size requested and do we
|
/* Was a minimum stack size requested and do we
|
||||||
* need more stack space than was provided for?
|
need more stack space than was provided for? */
|
||||||
*/
|
|
||||||
if(__stack_size > 0 && current_stack_size < (ULONG)__stack_size)
|
if(__stack_size > 0 && current_stack_size < (ULONG)__stack_size)
|
||||||
{
|
{
|
||||||
struct StackSwapStruct * stk;
|
struct StackSwapStruct * stk;
|
||||||
@@ -452,19 +462,21 @@ _main(void)
|
|||||||
/* We have enough room to make the call or just don't care. */
|
/* We have enough room to make the call or just don't care. */
|
||||||
return_code = call_main();
|
return_code = call_main();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Restore the task priority. */
|
||||||
|
SetTaskPri((struct Task *)this_process,old_priority);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct CommandLineInterface * cli = Cli();
|
struct CommandLineInterface * cli = Cli();
|
||||||
struct TagItem tags[11];
|
struct TagItem tags[12];
|
||||||
UBYTE program_name[256];
|
UBYTE program_name[256];
|
||||||
unsigned int stack_size;
|
unsigned int stack_size;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Now for the interesting part: detach from the shell we're
|
/* Now for the interesting part: detach from the shell we're
|
||||||
* currently executing in. This works only if the program is
|
currently executing in. This works only if the program is
|
||||||
* not reentrant and has not been launched from Workbench.
|
not reentrant and has not been launched from Workbench. */
|
||||||
*/
|
|
||||||
|
|
||||||
stack_size = __stack_size;
|
stack_size = __stack_size;
|
||||||
|
|
||||||
@@ -483,9 +495,9 @@ _main(void)
|
|||||||
tags[i]. ti_Tag = NP_StackSize;
|
tags[i]. ti_Tag = NP_StackSize;
|
||||||
tags[i++]. ti_Data = stack_size;
|
tags[i++]. ti_Data = stack_size;
|
||||||
tags[i]. ti_Tag = NP_Name;
|
tags[i]. ti_Tag = NP_Name;
|
||||||
tags[i++]. ti_Data = (ULONG)program_name;
|
tags[i++]. ti_Data = (ULONG)(__process_name != NULL ? (UBYTE *)__process_name : FilePart(program_name));
|
||||||
tags[i]. ti_Tag = NP_CommandName;
|
tags[i]. ti_Tag = NP_CommandName;
|
||||||
tags[i++]. ti_Data = (ULONG)program_name;
|
tags[i++]. ti_Data = (ULONG)FilePart(program_name);
|
||||||
tags[i]. ti_Tag = NP_Cli;
|
tags[i]. ti_Tag = NP_Cli;
|
||||||
tags[i++]. ti_Data = TRUE;
|
tags[i++]. ti_Data = TRUE;
|
||||||
tags[i]. ti_Tag = NP_Arguments;
|
tags[i]. ti_Tag = NP_Arguments;
|
||||||
@@ -495,6 +507,13 @@ _main(void)
|
|||||||
tags[i]. ti_Tag = NP_ExitData;
|
tags[i]. ti_Tag = NP_ExitData;
|
||||||
tags[i++]. ti_Data = (ULONG)cli->cli_Module;
|
tags[i++]. ti_Data = (ULONG)cli->cli_Module;
|
||||||
|
|
||||||
|
/* Use a predefined task priority, if requested. */
|
||||||
|
if(-128 <= __priority && __priority <= 127)
|
||||||
|
{
|
||||||
|
tags[i]. ti_Tag = NP_Priority;
|
||||||
|
tags[i++]. ti_Data = (ULONG)__priority;
|
||||||
|
}
|
||||||
|
|
||||||
/* dos.library V50 will free the segment list upon exit. */
|
/* dos.library V50 will free the segment list upon exit. */
|
||||||
if(((struct Library *)DOSBase)->lib_Version >= 50)
|
if(((struct Library *)DOSBase)->lib_Version >= 50)
|
||||||
{
|
{
|
||||||
@@ -581,11 +600,10 @@ _main(void)
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* The following is automatically called by the main() function through code
|
/* The following is automatically called by the main() function through code
|
||||||
* inserted by GCC. In theory, this could be removed by updating the machine
|
inserted by GCC. In theory, this could be removed by updating the machine
|
||||||
* definition, but for now we'll just keep this stub around. It is intended
|
definition, but for now we'll just keep this stub around. It is intended
|
||||||
* to call the constructor functions, but we do this in our own _main()
|
to call the constructor functions, but we do this in our own _main()
|
||||||
* anyway.
|
anyway. */
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_mktemp.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
|
* $Id: stdlib_mktemp.c,v 1.3 2004-11-10 17:45:40 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -57,16 +57,19 @@ mktemp(char * name_template)
|
|||||||
{
|
{
|
||||||
#if defined(UNIX_PATH_SEMANTICS)
|
#if defined(UNIX_PATH_SEMANTICS)
|
||||||
struct name_translation_info name_template_nti;
|
struct name_translation_info name_template_nti;
|
||||||
char * original_name_template = NULL;
|
|
||||||
#endif /* UNIX_PATH_SEMANTICS */
|
#endif /* UNIX_PATH_SEMANTICS */
|
||||||
|
char * test_name;
|
||||||
struct Process * this_process;
|
struct Process * this_process;
|
||||||
APTR old_window_pointer;
|
APTR old_window_pointer;
|
||||||
char * result = NULL;
|
char * result = NULL;
|
||||||
int template_offset;
|
size_t template_offset;
|
||||||
int template_len;
|
size_t template_len;
|
||||||
|
size_t name_len;
|
||||||
|
size_t offset;
|
||||||
time_t now;
|
time_t now;
|
||||||
|
ULONG pseudo_random_number;
|
||||||
BPTR lock;
|
BPTR lock;
|
||||||
int i;
|
size_t i;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
@@ -74,6 +77,8 @@ mktemp(char * name_template)
|
|||||||
|
|
||||||
assert(name_template != NULL);
|
assert(name_template != NULL);
|
||||||
|
|
||||||
|
this_process = (struct Process *)FindTask(NULL);
|
||||||
|
|
||||||
#if defined(CHECK_FOR_NULL_POINTERS)
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
{
|
{
|
||||||
if(name_template == NULL)
|
if(name_template == NULL)
|
||||||
@@ -89,43 +94,11 @@ mktemp(char * name_template)
|
|||||||
if(__check_abort_enabled)
|
if(__check_abort_enabled)
|
||||||
__check_abort();
|
__check_abort();
|
||||||
|
|
||||||
#if defined(UNIX_PATH_SEMANTICS)
|
|
||||||
{
|
|
||||||
if(__unix_path_semantics)
|
|
||||||
{
|
|
||||||
original_name_template = name_template;
|
|
||||||
|
|
||||||
if(__translate_unix_to_amiga_path_name((char const **)&name_template,&name_template_nti) != 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if(name_template_nti.is_root)
|
|
||||||
{
|
|
||||||
errno = EACCES;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* UNIX_PATH_SEMANTICS */
|
|
||||||
|
|
||||||
SHOWSTRING(name_template);
|
SHOWSTRING(name_template);
|
||||||
|
|
||||||
template_offset = -1;
|
/* So, how long is that name template? */
|
||||||
template_len = 0;
|
name_len = strlen(name_template);
|
||||||
|
if(name_len == 0)
|
||||||
for(i = strlen(name_template)-1 ; i >= 0 ; i--)
|
|
||||||
{
|
|
||||||
if(name_template[i] == 'X')
|
|
||||||
{
|
|
||||||
template_offset = i;
|
|
||||||
template_len++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(template_offset == -1)
|
|
||||||
{
|
{
|
||||||
SHOWMSG("invalid name template");
|
SHOWMSG("invalid name template");
|
||||||
|
|
||||||
@@ -133,23 +106,65 @@ mktemp(char * name_template)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
this_process = (struct Process *)FindTask(NULL);
|
/* Find out how many trailing 'X' characters there are in
|
||||||
|
the template. There should be at least 6. We also want
|
||||||
|
to know where to find the first 'X' and how many of the
|
||||||
|
'X' characters there are. */
|
||||||
|
template_offset = 0;
|
||||||
|
template_len = 0;
|
||||||
|
|
||||||
|
for(i = 0 ; i < name_len ; i++)
|
||||||
|
{
|
||||||
|
assert( name_len >= (i + 1) );
|
||||||
|
|
||||||
|
offset = name_len - (i + 1);
|
||||||
|
|
||||||
|
if(name_template[offset] != 'X')
|
||||||
|
break;
|
||||||
|
|
||||||
|
template_offset = offset;
|
||||||
|
template_len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHOWVALUE(template_offset);
|
||||||
|
SHOWVALUE(template_len);
|
||||||
|
|
||||||
|
if(template_len == 0)
|
||||||
|
{
|
||||||
|
SHOWMSG("invalid name template");
|
||||||
|
|
||||||
|
errno = EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Generate a pseudo-random number from the current time and
|
||||||
|
the address of the current process. */
|
||||||
time(&now);
|
time(&now);
|
||||||
|
|
||||||
now += (time_t)this_process;
|
pseudo_random_number = (ULONG)now + (ULONG)this_process;
|
||||||
|
|
||||||
|
/* Fill the template 'X' characters with letters made up by
|
||||||
|
converting the pseudo-random number. */
|
||||||
for(i = 0 ; i < template_len ; i++)
|
for(i = 0 ; i < template_len ; i++)
|
||||||
{
|
{
|
||||||
name_template[template_offset + i] = 'A' + (now % 26);
|
name_template[template_offset + i] = 'A' + (pseudo_random_number % 26);
|
||||||
|
|
||||||
now = (now / 26);
|
/* One more letter taken; if we run out of letters,
|
||||||
if(now == 0)
|
cook up another pseudo-random number. */
|
||||||
|
pseudo_random_number = (pseudo_random_number / 26);
|
||||||
|
if(pseudo_random_number == 0)
|
||||||
|
{
|
||||||
time(&now);
|
time(&now);
|
||||||
|
|
||||||
|
pseudo_random_number = (ULONG)now;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHOWSTRING(name_template);
|
||||||
|
|
||||||
old_window_pointer = this_process->pr_WindowPtr;
|
old_window_pointer = this_process->pr_WindowPtr;
|
||||||
|
|
||||||
|
/* Now check if the name we picked is unique. If not, make another name. */
|
||||||
while(TRUE)
|
while(TRUE)
|
||||||
{
|
{
|
||||||
if(__check_abort_enabled)
|
if(__check_abort_enabled)
|
||||||
@@ -157,12 +172,32 @@ mktemp(char * name_template)
|
|||||||
|
|
||||||
D(("checking '%s'",name_template));
|
D(("checking '%s'",name_template));
|
||||||
|
|
||||||
|
test_name = name_template;
|
||||||
|
|
||||||
|
/* If necessary, quickly translate the semantics of the file name
|
||||||
|
we cooked up above. */
|
||||||
|
#if defined(UNIX_PATH_SEMANTICS)
|
||||||
|
{
|
||||||
|
if(__unix_path_semantics)
|
||||||
|
{
|
||||||
|
if(__translate_unix_to_amiga_path_name((char const **)&test_name,&name_template_nti) != 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if(name_template_nti.is_root)
|
||||||
|
{
|
||||||
|
errno = EACCES;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* UNIX_PATH_SEMANTICS */
|
||||||
|
|
||||||
/* Turn off DOS error requesters. */
|
/* Turn off DOS error requesters. */
|
||||||
this_process->pr_WindowPtr = (APTR)-1;
|
this_process->pr_WindowPtr = (APTR)-1;
|
||||||
|
|
||||||
/* Does this object exist already? */
|
/* Does this object exist already? */
|
||||||
PROFILE_OFF();
|
PROFILE_OFF();
|
||||||
lock = Lock(name_template,SHARED_LOCK);
|
lock = Lock(test_name,SHARED_LOCK);
|
||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
/* Restore DOS requesters. */
|
/* Restore DOS requesters. */
|
||||||
@@ -191,8 +226,7 @@ mktemp(char * name_template)
|
|||||||
PROFILE_ON();
|
PROFILE_ON();
|
||||||
|
|
||||||
/* Change one letter; if that 'overflows', start
|
/* Change one letter; if that 'overflows', start
|
||||||
* over with 'A' and move on to the next position.
|
over with 'A' and move on to the next position. */
|
||||||
*/
|
|
||||||
for(i = 0 ; i < template_len ; i++)
|
for(i = 0 ; i < template_len ; i++)
|
||||||
{
|
{
|
||||||
name_template[template_offset + i]++;
|
name_template[template_offset + i]++;
|
||||||
@@ -205,20 +239,6 @@ mktemp(char * name_template)
|
|||||||
|
|
||||||
SHOWSTRING(name_template);
|
SHOWSTRING(name_template);
|
||||||
|
|
||||||
#if defined(UNIX_PATH_SEMANTICS)
|
|
||||||
{
|
|
||||||
if(__unix_path_semantics)
|
|
||||||
{
|
|
||||||
if(__translate_amiga_to_unix_path_name((char const **)&name_template,&name_template_nti) != 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
strcpy(original_name_template,name_template);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* UNIX_PATH_SEMANTICS */
|
|
||||||
|
|
||||||
SHOWSTRING(name_template);
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
|
|||||||
34
library/stdlib_osliberror.c
Normal file
34
library/stdlib_osliberror.c
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdlib_osliberror.c,v 1.1 2004-11-14 11:06:27 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
char * __minimum_os_lib_error;
|
||||||
34
library/stdlib_oslibversion.c
Normal file
34
library/stdlib_oslibversion.c
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdlib_oslibversion.c,v 1.1 2004-11-14 11:06:27 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int __minimum_os_lib_version;
|
||||||
36
library/stdlib_priority.c
Normal file
36
library/stdlib_priority.c
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdlib_priority.c,v 1.1 2004-11-14 11:06:27 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* We use an invalid priority value to indicate "do not change the program's
|
||||||
|
task priority". */
|
||||||
|
int __priority = 256;
|
||||||
34
library/stdlib_process_name.c
Normal file
34
library/stdlib_process_name.c
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdlib_process_name.c,v 1.1 2004-11-14 11:06:27 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
char * __process_name;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: stdlib_startup.c,v 1.3 2004-09-29 19:57:58 obarthel Exp $
|
* $Id: stdlib_startup.c,v 1.4 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -347,7 +347,11 @@ __startup_init(void)
|
|||||||
__original_current_directory = CurrentDir(__WBenchMsg->sm_ArgList[0].wa_Lock);
|
__original_current_directory = CurrentDir(__WBenchMsg->sm_ArgList[0].wa_Lock);
|
||||||
__current_directory_changed = TRUE;
|
__current_directory_changed = TRUE;
|
||||||
|
|
||||||
if(__WBenchMsg->sm_ToolWindow != NULL)
|
if (__stdio_window_specification != NULL)
|
||||||
|
{
|
||||||
|
input = Open(__stdio_window_specification,MODE_NEWFILE);
|
||||||
|
}
|
||||||
|
else if (__WBenchMsg->sm_ToolWindow != NULL)
|
||||||
{
|
{
|
||||||
input = Open(__WBenchMsg->sm_ToolWindow,MODE_NEWFILE);
|
input = Open(__WBenchMsg->sm_ToolWindow,MODE_NEWFILE);
|
||||||
}
|
}
|
||||||
|
|||||||
34
library/stdlib_stdio_window_spec.c
Normal file
34
library/stdlib_stdio_window_spec.c
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* $Id: stdlib_stdio_window_spec.c,v 1.1 2004-11-14 11:06:27 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
char * __stdio_window_specification;
|
||||||
140
library/string_strlcat.c
Normal file
140
library/string_strlcat.c
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
* $Id: string_strlcat.c,v 1.1 2004-11-14 11:06:27 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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 _STRING_HEADERS_H
|
||||||
|
#include "string_headers.h"
|
||||||
|
#endif /* _STRING_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Appends src to string dst of size siz (unlike strncat, siz is the
|
||||||
|
* full size of dst, not space left). At most siz-1 characters
|
||||||
|
* will be copied. Always NUL terminates (unless siz <= strlen(dst)).
|
||||||
|
* Returns strlen(src) + MIN(siz, strlen(initial dst)).
|
||||||
|
* If retval >= siz, truncation occurred.
|
||||||
|
*/
|
||||||
|
size_t
|
||||||
|
strlcat(char *dst, const char *src, size_t siz)
|
||||||
|
{
|
||||||
|
register char *d = dst;
|
||||||
|
register const char *s = src;
|
||||||
|
register size_t n = siz;
|
||||||
|
size_t result;
|
||||||
|
size_t dlen;
|
||||||
|
|
||||||
|
assert( src != NULL && (siz == 0 || dst != NULL) );
|
||||||
|
|
||||||
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
|
{
|
||||||
|
if(src == NULL || (siz != 0 && dst == NULL))
|
||||||
|
{
|
||||||
|
errno = EFAULT;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CHECK_FOR_NULL_POINTERS */
|
||||||
|
|
||||||
|
/* Find the end of dst and adjust bytes left but don't go past end */
|
||||||
|
while(n-- != 0 && (*d) != '\0')
|
||||||
|
d++;
|
||||||
|
|
||||||
|
dlen = d - dst;
|
||||||
|
n = siz - dlen;
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
{
|
||||||
|
result = dlen + strlen(s);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while((*s) != '\0')
|
||||||
|
{
|
||||||
|
if(n != 1)
|
||||||
|
{
|
||||||
|
(*d++) = (*s);
|
||||||
|
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*d) = '\0';
|
||||||
|
|
||||||
|
result = dlen + (s - src); /* count does not include NUL */
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
130
library/string_strlcpy.c
Normal file
130
library/string_strlcpy.c
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
* $Id: string_strlcpy.c,v 1.1 2004-11-14 11:06:27 obarthel Exp $
|
||||||
|
*
|
||||||
|
* :ts=4
|
||||||
|
*
|
||||||
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
||||||
|
* Copyright (c) 2002-2004 by Olaf Barthel <olsen@sourcery.han.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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 _STRING_HEADERS_H
|
||||||
|
#include "string_headers.h"
|
||||||
|
#endif /* _STRING_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy src to string dst of size siz. At most siz-1 characters
|
||||||
|
* will be copied. Always NUL terminates (unless siz == 0).
|
||||||
|
* Returns strlen(src); if retval >= siz, truncation occurred.
|
||||||
|
*/
|
||||||
|
size_t
|
||||||
|
strlcpy(char *dst, const char *src, size_t siz)
|
||||||
|
{
|
||||||
|
register char *d = dst;
|
||||||
|
register const char *s = src;
|
||||||
|
register size_t n = siz;
|
||||||
|
size_t result;
|
||||||
|
|
||||||
|
assert( siz == 0 || (dst != NULL && src != NULL) );
|
||||||
|
|
||||||
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
|
{
|
||||||
|
if(siz != 0 && (dst == NULL || src == NULL))
|
||||||
|
{
|
||||||
|
errno = EFAULT;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CHECK_FOR_NULL_POINTERS */
|
||||||
|
|
||||||
|
/* Copy as many bytes as will fit */
|
||||||
|
if(n != 0 && --n != 0)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(((*d++) = (*s++)) == '\0')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while(--n != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Not enough room in dst, add NUL and traverse rest of src */
|
||||||
|
if(n == 0)
|
||||||
|
{
|
||||||
|
if(siz != 0)
|
||||||
|
(*d) = '\0'; /* NUL-terminate dst */
|
||||||
|
|
||||||
|
while (*s++)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = (s - src - 1); /* count does not include NUL */
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -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.4 2004-11-18 09:40:37 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -48,58 +48,12 @@ strtok(char *str, const char *separator_set)
|
|||||||
{
|
{
|
||||||
static char * last;
|
static char * last;
|
||||||
|
|
||||||
char * result = NULL;
|
char * result;
|
||||||
size_t size;
|
|
||||||
|
|
||||||
assert( separator_set != NULL );
|
ENTER();
|
||||||
|
|
||||||
#if defined(CHECK_FOR_NULL_POINTERS)
|
result = strtok_r(str,separator_set,&last);
|
||||||
{
|
|
||||||
if(separator_set == NULL)
|
|
||||||
{
|
|
||||||
errno = EFAULT;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* CHECK_FOR_NULL_POINTERS */
|
|
||||||
|
|
||||||
/* Did we get called before? Restart at the last valid position. */
|
|
||||||
if(str == NULL)
|
|
||||||
{
|
|
||||||
str = last;
|
|
||||||
|
|
||||||
/* However, we may have hit the end of the
|
|
||||||
string already. */
|
|
||||||
if(str == NULL)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
last = NULL;
|
|
||||||
|
|
||||||
/* Skip the characters which count as
|
|
||||||
separators. */
|
|
||||||
str += strspn(str, separator_set);
|
|
||||||
if((*str) == '\0')
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* Count the number of characters which aren't
|
|
||||||
separators. */
|
|
||||||
size = strcspn(str, separator_set);
|
|
||||||
if(size == 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* This is where the search can resume later. */
|
|
||||||
last = &str[size+1];
|
|
||||||
if((*last) == '\0')
|
|
||||||
last = NULL;
|
|
||||||
|
|
||||||
/* This is the token we found; make sure that
|
|
||||||
it looks like a valid string. */
|
|
||||||
str[size] = '\0';
|
|
||||||
|
|
||||||
result = str;
|
|
||||||
|
|
||||||
out:
|
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
112
library/string_strtok_r.c
Normal file
112
library/string_strtok_r.c
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* $Id: string_strtok_r.c,v 1.1 2004-11-18 09:40:37 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 _STRING_HEADERS_H
|
||||||
|
#include "string_headers.h"
|
||||||
|
#endif /* _STRING_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
char *
|
||||||
|
strtok_r(char *str, const char *separator_set,char ** state_ptr)
|
||||||
|
{
|
||||||
|
char * result = NULL;
|
||||||
|
char * last;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
assert( separator_set != NULL && state_ptr != NULL );
|
||||||
|
|
||||||
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
|
{
|
||||||
|
if(separator_set == NULL || state_ptr == NULL)
|
||||||
|
{
|
||||||
|
errno = EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CHECK_FOR_NULL_POINTERS */
|
||||||
|
|
||||||
|
last = (*state_ptr);
|
||||||
|
|
||||||
|
/* Did we get called before? Restart at the last valid position. */
|
||||||
|
if(str == NULL)
|
||||||
|
{
|
||||||
|
str = last;
|
||||||
|
|
||||||
|
/* However, we may have hit the end of the
|
||||||
|
string already. */
|
||||||
|
if(str == NULL)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
last = NULL;
|
||||||
|
|
||||||
|
/* Skip the characters which count as
|
||||||
|
separators. */
|
||||||
|
str += strspn(str, separator_set);
|
||||||
|
if((*str) == '\0')
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* Count the number of characters which aren't
|
||||||
|
separators. */
|
||||||
|
size = strcspn(str, separator_set);
|
||||||
|
if(size == 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* This is where the search can resume later. */
|
||||||
|
last = &str[size];
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
it looks like a valid string. */
|
||||||
|
str[size] = '\0';
|
||||||
|
|
||||||
|
result = str;
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
if(state_ptr != NULL)
|
||||||
|
(*state_ptr) = last;
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time_asctime.c,v 1.1.1.1 2004-07-26 16:32:21 obarthel Exp $
|
* $Id: time_asctime.c,v 1.3 2004-11-18 09:40:37 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -43,149 +43,16 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
static void
|
|
||||||
add_to_string(char * to,int to_size,const char * string,int * offset_ptr)
|
|
||||||
{
|
|
||||||
int offset;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
assert( to != NULL && to_size > 0 && string != NULL && offset_ptr != NULL );
|
|
||||||
|
|
||||||
offset = (*offset_ptr);
|
|
||||||
|
|
||||||
assert( offset < to_size );
|
|
||||||
|
|
||||||
len = strlen(string);
|
|
||||||
if(offset + len > (to_size-1))
|
|
||||||
len = (to_size-1) - offset;
|
|
||||||
|
|
||||||
if(len > 0)
|
|
||||||
{
|
|
||||||
memmove(&to[offset],string,(size_t)len);
|
|
||||||
offset += len;
|
|
||||||
|
|
||||||
assert( offset < to_size );
|
|
||||||
|
|
||||||
to[offset] = '\0';
|
|
||||||
|
|
||||||
(*offset_ptr) = offset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
asctime(const struct tm *tm)
|
asctime(const struct tm *tm)
|
||||||
{
|
{
|
||||||
static char buffer[40];
|
static char buffer[40];
|
||||||
|
|
||||||
struct tm copy_tm;
|
char * result;
|
||||||
char number[16];
|
|
||||||
char * result = NULL;
|
|
||||||
const char * b;
|
|
||||||
int offset = 0;
|
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
SHOWPOINTER(tm);
|
result = __asctime_r(tm,buffer,sizeof(buffer));
|
||||||
|
|
||||||
assert( tm != NULL );
|
|
||||||
|
|
||||||
#if defined(CHECK_FOR_NULL_POINTERS)
|
|
||||||
{
|
|
||||||
if(tm == NULL)
|
|
||||||
{
|
|
||||||
errno = EFAULT;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* CHECK_FOR_NULL_POINTERS */
|
|
||||||
|
|
||||||
/* Fill in the week day if it's not in proper range. */
|
|
||||||
if(tm->tm_wday < 0 || tm->tm_wday > 6)
|
|
||||||
{
|
|
||||||
struct tm other_tm;
|
|
||||||
time_t seconds;
|
|
||||||
|
|
||||||
other_tm = (*tm);
|
|
||||||
|
|
||||||
seconds = mktime(&other_tm);
|
|
||||||
if(seconds != (time_t)-1)
|
|
||||||
{
|
|
||||||
__convert_time(seconds,0,&other_tm);
|
|
||||||
|
|
||||||
copy_tm = (*tm);
|
|
||||||
copy_tm.tm_wday = other_tm.tm_wday;
|
|
||||||
|
|
||||||
tm = ©_tm;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(0 <= tm->tm_wday && tm->tm_wday <= 6)
|
|
||||||
b = __abbreviated_week_day_names[tm->tm_wday];
|
|
||||||
else
|
|
||||||
b = "---";
|
|
||||||
|
|
||||||
add_to_string(buffer,sizeof(buffer),b, &offset);
|
|
||||||
add_to_string(buffer,sizeof(buffer)," ", &offset);
|
|
||||||
|
|
||||||
if(0 <= tm->tm_mon && tm->tm_mon <= 11)
|
|
||||||
b = __abbreviated_month_names[tm->tm_mon];
|
|
||||||
else
|
|
||||||
b = "---";
|
|
||||||
|
|
||||||
add_to_string(buffer,sizeof(buffer),b, &offset);
|
|
||||||
add_to_string(buffer,sizeof(buffer)," ", &offset);
|
|
||||||
|
|
||||||
if(1 <= tm->tm_mday && tm->tm_mday <= 31)
|
|
||||||
b = __number_to_string((unsigned int)tm->tm_mday,number,sizeof(number),2);
|
|
||||||
else
|
|
||||||
b = "--";
|
|
||||||
|
|
||||||
add_to_string(buffer,sizeof(buffer),b, &offset);
|
|
||||||
add_to_string(buffer,sizeof(buffer)," ", &offset);
|
|
||||||
|
|
||||||
if(0 <= tm->tm_hour && tm->tm_hour <= 23)
|
|
||||||
b = __number_to_string((unsigned int)tm->tm_hour,number,sizeof(number),2);
|
|
||||||
else
|
|
||||||
b = "--";
|
|
||||||
|
|
||||||
add_to_string(buffer,sizeof(buffer),b, &offset);
|
|
||||||
add_to_string(buffer,sizeof(buffer),":", &offset);
|
|
||||||
|
|
||||||
if(0 <= tm->tm_min && tm->tm_min <= 59)
|
|
||||||
b = __number_to_string((unsigned int)tm->tm_min,number,sizeof(number),2);
|
|
||||||
else
|
|
||||||
b = "--";
|
|
||||||
|
|
||||||
add_to_string(buffer,sizeof(buffer),b, &offset);
|
|
||||||
add_to_string(buffer,sizeof(buffer),":", &offset);
|
|
||||||
|
|
||||||
if(0 <= tm->tm_sec && tm->tm_sec <= 59)
|
|
||||||
b = __number_to_string((unsigned int)tm->tm_sec,number,sizeof(number),2);
|
|
||||||
else
|
|
||||||
b = "--";
|
|
||||||
|
|
||||||
add_to_string(buffer,sizeof(buffer),b, &offset);
|
|
||||||
add_to_string(buffer,sizeof(buffer)," ", &offset);
|
|
||||||
|
|
||||||
if(0 <= tm->tm_year)
|
|
||||||
b = __number_to_string((unsigned int)1900 + tm->tm_year,number,sizeof(number),0);
|
|
||||||
else
|
|
||||||
b = "----";
|
|
||||||
|
|
||||||
add_to_string(buffer,sizeof(buffer),b,&offset);
|
|
||||||
|
|
||||||
SHOWSTRING(buffer);
|
|
||||||
|
|
||||||
add_to_string(buffer,sizeof(buffer),"\n",&offset);
|
|
||||||
|
|
||||||
assert( offset < sizeof(buffer) );
|
|
||||||
assert( strlen(buffer) < sizeof(buffer) );
|
|
||||||
|
|
||||||
result = buffer;
|
|
||||||
|
|
||||||
out:
|
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
|
|||||||
205
library/time_asctime_r.c
Normal file
205
library/time_asctime_r.c
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
/*
|
||||||
|
* $Id: time_asctime_r.c,v 1.1 2004-11-18 09:40:37 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 _TIME_HEADERS_H
|
||||||
|
#include "time_headers.h"
|
||||||
|
#endif /* _TIME_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_to_string(char * to,int to_size,const char * string,int * offset_ptr)
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
assert( to != NULL && to_size > 0 && string != NULL && offset_ptr != NULL );
|
||||||
|
|
||||||
|
offset = (*offset_ptr);
|
||||||
|
|
||||||
|
assert( offset < to_size );
|
||||||
|
|
||||||
|
len = strlen(string);
|
||||||
|
if(offset + len > (to_size-1))
|
||||||
|
len = (to_size-1) - offset;
|
||||||
|
|
||||||
|
if(len > 0)
|
||||||
|
{
|
||||||
|
memmove(&to[offset],string,(size_t)len);
|
||||||
|
offset += len;
|
||||||
|
|
||||||
|
assert( offset < to_size );
|
||||||
|
|
||||||
|
to[offset] = '\0';
|
||||||
|
|
||||||
|
(*offset_ptr) = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
char *
|
||||||
|
__asctime_r(const struct tm *tm,char * buffer,size_t buffer_size)
|
||||||
|
{
|
||||||
|
struct tm copy_tm;
|
||||||
|
char number[16];
|
||||||
|
char * result = NULL;
|
||||||
|
const char * b;
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
SHOWPOINTER(tm);
|
||||||
|
|
||||||
|
assert( tm != NULL || buffer == NULL );
|
||||||
|
|
||||||
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
|
{
|
||||||
|
if(tm == NULL || buffer == NULL )
|
||||||
|
{
|
||||||
|
errno = EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CHECK_FOR_NULL_POINTERS */
|
||||||
|
|
||||||
|
/* Fill in the week day if it's not in proper range. */
|
||||||
|
if(tm->tm_wday < 0 || tm->tm_wday > 6)
|
||||||
|
{
|
||||||
|
struct tm other_tm;
|
||||||
|
time_t seconds;
|
||||||
|
|
||||||
|
other_tm = (*tm);
|
||||||
|
|
||||||
|
seconds = mktime(&other_tm);
|
||||||
|
if(seconds != (time_t)-1)
|
||||||
|
{
|
||||||
|
__convert_time(seconds,0,&other_tm);
|
||||||
|
|
||||||
|
copy_tm = (*tm);
|
||||||
|
copy_tm.tm_wday = other_tm.tm_wday;
|
||||||
|
|
||||||
|
tm = ©_tm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(0 <= tm->tm_wday && tm->tm_wday <= 6)
|
||||||
|
b = __abbreviated_week_day_names[tm->tm_wday];
|
||||||
|
else
|
||||||
|
b = "---";
|
||||||
|
|
||||||
|
add_to_string(buffer,buffer_size,b, &offset);
|
||||||
|
add_to_string(buffer,buffer_size," ", &offset);
|
||||||
|
|
||||||
|
if(0 <= tm->tm_mon && tm->tm_mon <= 11)
|
||||||
|
b = __abbreviated_month_names[tm->tm_mon];
|
||||||
|
else
|
||||||
|
b = "---";
|
||||||
|
|
||||||
|
add_to_string(buffer,buffer_size,b, &offset);
|
||||||
|
add_to_string(buffer,buffer_size," ", &offset);
|
||||||
|
|
||||||
|
if(1 <= tm->tm_mday && tm->tm_mday <= 31)
|
||||||
|
b = __number_to_string((unsigned int)tm->tm_mday,number,sizeof(number),2);
|
||||||
|
else
|
||||||
|
b = "--";
|
||||||
|
|
||||||
|
add_to_string(buffer,buffer_size,b, &offset);
|
||||||
|
add_to_string(buffer,buffer_size," ", &offset);
|
||||||
|
|
||||||
|
if(0 <= tm->tm_hour && tm->tm_hour <= 23)
|
||||||
|
b = __number_to_string((unsigned int)tm->tm_hour,number,sizeof(number),2);
|
||||||
|
else
|
||||||
|
b = "--";
|
||||||
|
|
||||||
|
add_to_string(buffer,buffer_size,b, &offset);
|
||||||
|
add_to_string(buffer,buffer_size,":", &offset);
|
||||||
|
|
||||||
|
if(0 <= tm->tm_min && tm->tm_min <= 59)
|
||||||
|
b = __number_to_string((unsigned int)tm->tm_min,number,sizeof(number),2);
|
||||||
|
else
|
||||||
|
b = "--";
|
||||||
|
|
||||||
|
add_to_string(buffer,buffer_size,b, &offset);
|
||||||
|
add_to_string(buffer,buffer_size,":", &offset);
|
||||||
|
|
||||||
|
if(0 <= tm->tm_sec && tm->tm_sec <= 59)
|
||||||
|
b = __number_to_string((unsigned int)tm->tm_sec,number,sizeof(number),2);
|
||||||
|
else
|
||||||
|
b = "--";
|
||||||
|
|
||||||
|
add_to_string(buffer,buffer_size,b, &offset);
|
||||||
|
add_to_string(buffer,buffer_size," ", &offset);
|
||||||
|
|
||||||
|
if(0 <= tm->tm_year)
|
||||||
|
b = __number_to_string((unsigned int)1900 + tm->tm_year,number,sizeof(number),0);
|
||||||
|
else
|
||||||
|
b = "----";
|
||||||
|
|
||||||
|
add_to_string(buffer,buffer_size,b,&offset);
|
||||||
|
|
||||||
|
SHOWSTRING(buffer);
|
||||||
|
|
||||||
|
add_to_string(buffer,buffer_size,"\n",&offset);
|
||||||
|
|
||||||
|
assert( offset < buffer_size );
|
||||||
|
assert( strlen(buffer) < buffer_size );
|
||||||
|
|
||||||
|
result = buffer;
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
char *
|
||||||
|
asctime_r(const struct tm *tm,char * buffer)
|
||||||
|
{
|
||||||
|
char * result;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
result = __asctime_r(tm,buffer,40);
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time_ctime.c,v 1.1.1.1 2004-07-26 16:32:22 obarthel Exp $
|
* $Id: time_ctime.c,v 1.3 2004-11-18 09:40:37 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
|
|||||||
72
library/time_ctime_r.c
Normal file
72
library/time_ctime_r.c
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* $Id: time_ctime_r.c,v 1.1 2004-11-18 09:40:37 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 _TIME_HEADERS_H
|
||||||
|
#include "time_headers.h"
|
||||||
|
#endif /* _TIME_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
char *
|
||||||
|
ctime_r(const time_t *tptr,char * buffer)
|
||||||
|
{
|
||||||
|
char * result = NULL;
|
||||||
|
struct tm tm;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
assert( tptr != NULL && buffer != NULL );
|
||||||
|
|
||||||
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
|
{
|
||||||
|
if(tptr == NULL || buffer == NULL)
|
||||||
|
{
|
||||||
|
errno = EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CHECK_FOR_NULL_POINTERS */
|
||||||
|
|
||||||
|
result = asctime_r(localtime_r(tptr,&tm),buffer);
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time_gmtime.c,v 1.1.1.1 2004-07-26 16:32:22 obarthel Exp $
|
* $Id: time_gmtime.c,v 1.3 2004-11-18 09:40:37 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -47,27 +47,11 @@ struct tm *
|
|||||||
gmtime(const time_t *t)
|
gmtime(const time_t *t)
|
||||||
{
|
{
|
||||||
static struct tm tm;
|
static struct tm tm;
|
||||||
struct tm * result = NULL;
|
struct tm * result;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
assert( t != NULL );
|
result = gmtime_r(t,&tm);
|
||||||
|
|
||||||
#if defined(CHECK_FOR_NULL_POINTERS)
|
|
||||||
{
|
|
||||||
if(t == NULL)
|
|
||||||
{
|
|
||||||
SHOWMSG("invalid t parameter");
|
|
||||||
|
|
||||||
errno = EFAULT;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* CHECK_FOR_NULL_POINTERS */
|
|
||||||
|
|
||||||
result = __convert_time((*t), 0, &tm);
|
|
||||||
|
|
||||||
out:
|
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
|
|||||||
71
library/time_gmtime_r.c
Normal file
71
library/time_gmtime_r.c
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* $Id: time_gmtime_r.c,v 1.1 2004-11-18 09:40:37 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 _TIME_HEADERS_H
|
||||||
|
#include "time_headers.h"
|
||||||
|
#endif /* _TIME_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct tm *
|
||||||
|
gmtime_r(const time_t *t,struct tm * tm_ptr)
|
||||||
|
{
|
||||||
|
struct tm * result = NULL;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
assert( t != NULL && tm_ptr != NULL );
|
||||||
|
|
||||||
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
|
{
|
||||||
|
if(t == NULL || tm_ptr == NULL)
|
||||||
|
{
|
||||||
|
errno = EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CHECK_FOR_NULL_POINTERS */
|
||||||
|
|
||||||
|
result = __convert_time((*t), 0, tm_ptr);
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time_headers.h,v 1.2 2004-09-29 19:57:58 obarthel Exp $
|
* $Id: time_headers.h,v 1.4 2004-11-18 09:40:37 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -84,13 +84,14 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern const char * const __abbreviated_week_day_names[7];
|
extern const char * const NOCOMMON __abbreviated_week_day_names[7];
|
||||||
extern const char * const __week_day_names[7];
|
extern const char * const NOCOMMON __week_day_names[7];
|
||||||
extern const char * const __abbreviated_month_names[12];
|
extern const char * const NOCOMMON __abbreviated_month_names[12];
|
||||||
extern const char * const __month_names[12];
|
extern const char * const NOCOMMON __month_names[12];
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
extern char * __asctime_r(const struct tm *tm,char * buffer,size_t buffer_size);
|
||||||
extern char * __number_to_string(unsigned int number,char * string,size_t max_len,size_t min_len);
|
extern char * __number_to_string(unsigned int number,char * string,size_t max_len,size_t min_len);
|
||||||
extern struct tm * __convert_time(ULONG seconds, LONG gmt_offset, struct tm * tm);
|
extern struct tm * __convert_time(ULONG seconds, LONG gmt_offset, struct tm * tm);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: time_localtime.c,v 1.1.1.1 2004-07-26 16:32:23 obarthel Exp $
|
* $Id: time_localtime.c,v 1.3 2004-11-18 09:40:37 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -51,38 +51,12 @@ struct tm *
|
|||||||
localtime(const time_t *t)
|
localtime(const time_t *t)
|
||||||
{
|
{
|
||||||
static struct tm tm;
|
static struct tm tm;
|
||||||
struct tm * result = NULL;
|
|
||||||
LONG gmt_offset;
|
struct tm * result;
|
||||||
|
|
||||||
ENTER();
|
ENTER();
|
||||||
|
|
||||||
assert( t != NULL );
|
result = localtime_r(t,&tm);
|
||||||
|
|
||||||
#if defined(CHECK_FOR_NULL_POINTERS)
|
|
||||||
{
|
|
||||||
if(t == NULL)
|
|
||||||
{
|
|
||||||
SHOWMSG("invalid t parameter");
|
|
||||||
|
|
||||||
errno = EFAULT;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* CHECK_FOR_NULL_POINTERS */
|
|
||||||
|
|
||||||
/* The time parameter given represents local time and
|
|
||||||
* must be converted to UTC before we proceed.
|
|
||||||
*/
|
|
||||||
if(__default_locale != NULL)
|
|
||||||
gmt_offset = 60 * __default_locale->loc_GMTOffset;
|
|
||||||
else
|
|
||||||
gmt_offset = 0;
|
|
||||||
|
|
||||||
SHOWVALUE(gmt_offset);
|
|
||||||
|
|
||||||
result = __convert_time((*t), gmt_offset, &tm);
|
|
||||||
|
|
||||||
out:
|
|
||||||
|
|
||||||
RETURN(result);
|
RETURN(result);
|
||||||
return(result);
|
return(result);
|
||||||
|
|||||||
86
library/time_localtime_r.c
Normal file
86
library/time_localtime_r.c
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* $Id: time_localtime_r.c,v 1.1 2004-11-18 09:40:37 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 _TIME_HEADERS_H
|
||||||
|
#include "time_headers.h"
|
||||||
|
#endif /* _TIME_HEADERS_H */
|
||||||
|
|
||||||
|
#ifndef _LOCALE_HEADERS_H
|
||||||
|
#include "locale_headers.h"
|
||||||
|
#endif /* _LOCALE_HEADERS_H */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
struct tm *
|
||||||
|
localtime_r(const time_t *t,struct tm * tm_ptr)
|
||||||
|
{
|
||||||
|
struct tm * result = NULL;
|
||||||
|
LONG gmt_offset;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
assert( t != NULL && tm_ptr != NULL );
|
||||||
|
|
||||||
|
#if defined(CHECK_FOR_NULL_POINTERS)
|
||||||
|
{
|
||||||
|
if(t == NULL || tm_ptr == NULL)
|
||||||
|
{
|
||||||
|
errno = EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CHECK_FOR_NULL_POINTERS */
|
||||||
|
|
||||||
|
/* The time parameter given represents local time and
|
||||||
|
* must be converted to UTC before we proceed.
|
||||||
|
*/
|
||||||
|
if(__default_locale != NULL)
|
||||||
|
gmt_offset = 60 * __default_locale->loc_GMTOffset;
|
||||||
|
else
|
||||||
|
gmt_offset = 0;
|
||||||
|
|
||||||
|
SHOWVALUE(gmt_offset);
|
||||||
|
|
||||||
|
result = __convert_time((*t), gmt_offset, tm_ptr);
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
RETURN(result);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: unistd_headers.h,v 1.3 2004-09-29 19:57:58 obarthel Exp $
|
* $Id: unistd_headers.h,v 1.4 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern char __current_path_name[MAXPATHLEN];
|
extern char NOCOMMON __current_path_name[MAXPATHLEN];
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ extern BOOL NOCOMMON __unlock_current_directory;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern BOOL __unix_path_semantics;
|
extern BOOL NOCOMMON __unix_path_semantics;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#define VERSION 1
|
#define VERSION 1
|
||||||
#define REVISION 178
|
#define REVISION 184
|
||||||
#define DATE "7.10.2004"
|
#define DATE "28.11.2004"
|
||||||
#define VERS "unix.lib 1.178"
|
#define VERS "unix.lib 1.184"
|
||||||
#define VSTRING "unix.lib 1.178 (7.10.2004)\r\n"
|
#define VSTRING "unix.lib 1.184 (28.11.2004)\r\n"
|
||||||
#define VERSTAG "\0$VER: unix.lib 1.178 (7.10.2004)"
|
#define VERSTAG "\0$VER: unix.lib 1.184 (28.11.2004)"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
178
|
184
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: usergroup_headers.h,v 1.3 2004-09-29 19:57:58 obarthel Exp $
|
* $Id: usergroup_headers.h,v 1.4 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -54,14 +54,14 @@ extern struct UserGroupIFace * NOCOMMON __IUserGroup;
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern BOOL __root_mode;
|
extern BOOL NOCOMMON __root_mode;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern int __root_uid;
|
extern int NOCOMMON __root_uid;
|
||||||
extern int __root_gid;
|
extern int NOCOMMON __root_gid;
|
||||||
extern int __root_euid;
|
extern int NOCOMMON __root_euid;
|
||||||
extern int __root_egid;
|
extern int NOCOMMON __root_egid;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: usergroup_init_exit.c,v 1.3 2004-09-29 19:57:58 obarthel Exp $
|
* $Id: usergroup_init_exit.c,v 1.4 2004-11-14 11:06:27 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@@ -45,15 +45,11 @@
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Pointer to errno, length == sizeof(errno) */
|
/* Pointer to errno, length == sizeof(long) */
|
||||||
#define UGT_ERRNOLPTR 0x80000004
|
#define UGT_ERRNOLPTR 0x80000004
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
extern char * __program_name;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
struct Library * NOCOMMON __UserGroupBase;
|
struct Library * NOCOMMON __UserGroupBase;
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -1,94 +0,0 @@
|
|||||||
#
|
|
||||||
# $Id: GNUmakefile.68k,v 1.2 2004-09-10 07:41:13 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 sprintf_test stack_size_test translate_test
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(DELETE) #?.o #?.map test fgets_test iotest sscanf_test printf_test sprintf_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
|
|
||||||
|
|
||||||
sprintf_test : sprintf_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
$(CC) $(CFLAGS) -o $@ sprintf_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,78 +0,0 @@
|
|||||||
#
|
|
||||||
# $Id: GNUmakefile.os4,v 1.1 2004-09-29 14:37:10 obarthel Exp $
|
|
||||||
#
|
|
||||||
# :ts=8
|
|
||||||
#
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
CC = ppc-amigaos-gcc
|
|
||||||
DELETE = rm -r
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@echo "Compiling $<"
|
|
||||||
@$(CC) -c $(CFLAGS) $<
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
all: test fgets_test iotest sscanf_test printf_test sprintf_test stack_size_test translate_test
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(DELETE) *.o *.map test fgets_test iotest sscanf_test printf_test sprintf_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
|
|
||||||
|
|
||||||
sprintf_test : sprintf_test.o
|
|
||||||
@echo "Linking $@"
|
|
||||||
$(CC) $(CFLAGS) -o $@ sprintf_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
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user