1
0
mirror of https://github.com/adtools/clib2.git synced 2025-12-08 14:59:05 +00:00

11 Commits

Author SHA1 Message Date
Olaf Barthel
59c0bb7f0b This commit was manufactured by cvs2svn to create tag 'V1_184'.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/tags/V1_184@14778 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-28 10:01:27 +00:00
Olaf Barthel
7492d108a3 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.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14777 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-28 10:01:26 +00:00
Olaf Barthel
9bf1e01518 - 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.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14776 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-28 09:33:19 +00:00
Olaf Barthel
be2d80a86a - For sockets, ioctl() and fcntl() now interact on the FIONBIO/FIOASYNC
requests (ioctl) and the O_NOBLOCK/O_ASYNC flags (fcntl).


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14775 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-27 12:43:12 +00:00
Olaf Barthel
24ea9161a7 - Split the reentrant functions from the non-reentrant ones.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14774 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-18 09:40:37 +00:00
Olaf Barthel
2d5193371a - Added asctime_r(), ctime_r(), gmtime_r(), localtime_r() and strtok_r().
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14773 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-17 19:07:26 +00:00
Olaf Barthel
186887bba5 - The program's task priority is now always restored before it exits.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14772 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-14 11:43:30 +00:00
Olaf Barthel
83f0977c0c - 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.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14771 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-14 11:06:29 +00:00
Olaf Barthel
e22a226640 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?


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14769 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-13 12:55:39 +00:00
Olaf Barthel
3c1df9b1db - 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?


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14768 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-10 17:45:40 +00:00
Olaf Barthel
655ea577d2 - Modified the amiga.lib Ext/StdIO functions to work well with
the updated system header files.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14767 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2004-11-10 14:55:30 +00:00
103 changed files with 2130 additions and 2430 deletions

View File

@@ -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 '#'

View File

@@ -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".

View File

@@ -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

View File

@@ -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'

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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".

View File

@@ -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".

View File

@@ -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.

View File

@@ -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.

View File

@@ -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

View File

@@ -1,5 +1,5 @@
#
# $Id: GNUmakefile.68k,v 1.13 2004-10-26 16:25:03 obarthel Exp $
# $Id: GNUmakefile.68k,v 1.17 2004-11-18 09:40:37 obarthel Exp $
#
# :ts=8
#
@@ -106,7 +106,7 @@ INCLUDES = -Iinclude -I. -Inetinclude
OPTIONS = -DNDEBUG -fno-builtin -DNO_INLINE_STDARG
#OPTIONS = -D__MEM_DEBUG -fno-builtin
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
OPTIMIZE = -O
OPTIMIZE = -O -fomit-frame-pointer -fstrength-reduce -finline-functions
#OPTIMIZE = -O2 -fomit-frame-pointer
#DEBUG = -g2
@@ -286,6 +286,10 @@ C_LIB = \
stdlib_modsi3.o \
stdlib_mulsi3.o \
stdlib_never_free.o \
stdlib_osliberror.o \
stdlib_oslibversion.o \
stdlib_priority.o \
stdlib_process_name.o \
stdlib_putenv.o \
stdlib_qsort.o \
stdlib_rand.o \
@@ -318,6 +322,7 @@ C_LIB = \
stdlib_umodsi3.o \
stdlib_unsetenv.o \
stdlib_wildcard_expand.o \
stdlib_stdio_window_spec.o \
strings_strcasecmp.o \
strings_strncasecmp.o \
string_bcmp.o \
@@ -338,6 +343,8 @@ C_LIB = \
string_strcspn.o \
string_strdup.o \
string_strerror.o \
string_strlcat.o \
string_strlcpy.o \
string_strlen.o \
string_strncat.o \
string_strncmp.o \
@@ -347,15 +354,20 @@ C_LIB = \
string_strspn.o \
string_strstr.o \
string_strtok.o \
string_strtok_r.o \
string_strxfrm.o \
time_asctime.o \
time_asctime_r.o \
time_clock.o \
time_converttime.o \
time_ctime.o \
time_ctime_r.o \
time_data.o \
time_gettimeofday.o \
time_gmtime.o \
time_gmtime_r.o \
time_localtime.o \
time_localtime_r.o \
time_mktime.o \
time_numbertostring.o \
time_strftime.o \
@@ -487,7 +499,6 @@ MATH_LIB = \
stdio_vasprintf.o \
stdio_vfprintf.o \
stdio_vfscanf.o \
stdio_vfscanf.o \
stdio_vprintf.o \
stdio_vsnprintf.o \
stdio_vsprintf.o \
@@ -678,6 +689,7 @@ AMIGA_LIB = \
amiga_newlist.o \
amiga_rangerand.o \
amiga_remtof.o \
amiga_rexxvars.o \
amiga_setsuperattrs.o \
amiga_timedelay.o \
amiga_waitbeam.o
@@ -687,7 +699,7 @@ AMIGA_LIB = \
LIBS_68K := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libunix.a \
$(LIBNET_OBJS)/libnet.a $(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
$(LIBM_OBJS)/libm.a
LIBS_020 := $(LIBM881_OBJS)/libm881.a $(LIBS_68K)
LIBS_020 := $(LIBM881_OBJS)/libm881.a $(LIBS_68K)
##############################################################################
@@ -986,28 +998,3 @@ mainb.o : stdlib_main.c
mainnb.o : stdlib_main.c
$(CC) -o mainnb.o -c $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDES) -m68000 stdlib_main.c
##############################################################################
#test: test.o ncrt0.o libc.a libunix.a libm.a libdebug.a libamiga.a
# $(CC) -Wl,--verbose $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT \
# -o $@ -nostdlib ncrt0.o test.o -L. -lm -lunix -ldebug -lc -lamiga
#test: test.o ncrt0.o nbcrt0.o nrcrt0.o libc.a libunix.a libm.a libdebug.a libamiga.a
# $(CC) -resident -Wl,--verbose $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT -fbaserel32 -DSMALL_DATA \
# -o $@ -nostdlib nbcrt0.o test.o -L. -lm -lunix -ldebug -lc -lamiga
test : test.c
gcc -o test test.c -D__MEM_DEBUG -DFLOATING_POINT_SUPPORT -Llib -lunix -lm
#test: test.o ncrt0.o nbcrt0.o nrcrt0.o libc.a libunix.a libm.a libdebug.a libamiga.a
# $(CC) -resident -Wl,--verbose $(CFLAGS) -DIEEE_FLOATING_POINT_SUPPORT -fbaserel -DSMALL_DATA \
# -o $@ -nostdlib nrcrt0.o test.o -L. -lm -lunix -ldebug -lc -lamiga
##############################################################################
mkid:
mkid -v #?.(c|h|asm|i) include/#?.(c|h|asm|i) include/sys/#?.(c|h|asm|i)
update:
mkid -v -u

View File

@@ -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
#
@@ -35,7 +35,6 @@ ifeq (,$(TYPE))
LIBC_OBJS = libc_objs
LIBUNIX_OBJS = libunix_objs
LIBM_OBJS = libm_objs
LIBSTACK_OBJS = libstack_objs
LIBNET_OBJS = libnet_objs
LIBDEBUG_OBJS = libdebug_objs
LIBAMIGA_OBJS = libamiga_objs
@@ -43,7 +42,6 @@ else
LIBC_OBJS = $(TYPE)/libc_objs
LIBUNIX_OBJS = $(TYPE)/libunix_objs
LIBM_OBJS = $(TYPE)/libm_objs
LIBSTACK_OBJS = $(TYPE)/libstack_objs
LIBNET_OBJS = $(TYPE)/libnet_objs
LIBDEBUG_OBJS = $(TYPE)/libdebug_objs
LIBAMIGA_OBJS = $(TYPE)/libamiga_objs
@@ -51,6 +49,7 @@ endif
##############################################################################
# General build rules for all object files and the individual libraries
%.o : %.c
@echo "Compiling $<"
@$(CC) -c $(CFLAGS) $<
@@ -67,10 +66,6 @@ $(LIBM_OBJS)/%.o : %.c
@echo "Compiling $< [$(TYPE):m]"
@$(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
@echo "Compiling $< [$(TYPE):net]"
@$(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))
CODE_TYPE := -msdata=sysv -DSMALL_DATA
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
@@ -95,7 +91,7 @@ CODE_TYPE := -msdata=data
FLOAT_TYPE := -DPPC_FLOATING_POINT_SUPPORT
endif
ifeq (large_data_softfloat, $(TYPE))
ifeq (large_data_softfloat,$(TYPE))
CODE_TYPE := -msdata=data -msoft-float
FLOAT_TYPE :=
endif
@@ -107,7 +103,7 @@ WARNINGS = \
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
INCLUDES = -Iinclude -I. -I$(SDK_INCLUDE)
OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -fno-builtin -D__USE_INLINE__ -Wa,-mregnames
OPTIONS = -DNDEBUG -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames
OPTIMIZE = -O -fomit-frame-pointer -funroll-loops
#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_rev.o \
ctype_isalnum.o \
@@ -134,9 +131,9 @@ C_LIB = \
ctype_table.o \
dirent_closedir.o \
dirent_data.o \
dirent_rewinddir.o \
dirent_opendir.o \
dirent_readdir.o \
dirent_rewinddir.o \
errno_data.o \
fcntl_close.o \
fcntl_creat.o \
@@ -255,41 +252,42 @@ C_LIB = \
stdlib_atol.o \
stdlib_bsearch.o \
stdlib_calloc.o \
stdlib_checkdetach.o \
stdlib_constructor.o \
stdlib_constructor_begin.o \
stdlib_constructor_end.o \
stdlib_data.o \
stdlib_default_pool_size.o \
stdlib_default_puddle_size.o \
stdlib_destructor.o \
stdlib_detach.o \
stdlib_disablerequesters.o \
stdlib_div.o \
stdlib_modsi3.o \
stdlib_divsi3.o \
stdlib_divsi4.o \
stdlib_umodsi3.o \
stdlib_udivsi3.o \
stdlib_udivsi4.o \
stdlib_dosbase.o \
stdlib_exit.o \
stdlib_free.o \
stdlib_getdefstacksize.o \
stdlib_getenv.o \
stdlib_getsp.o \
stdlib_init_exit.o \
stdlib_isresident.o \
stdlib_labs.o \
stdlib_ldiv.o \
stdlib_getdefstacksize.o \
stdlib_stackargbytes.o \
stdlib_stack_usage.o \
stdlib_checkdetach.o \
stdlib_detach.o \
stdlib_isresident.o \
stdlib_sysbase.o \
stdlib_dosbase.o \
stdlib_machine_test.o \
stdlib_malloc.o \
stdlib_math.o \
stdlib_mkdtemp.o \
stdlib_mkstemp.o \
stdlib_mktemp.o \
stdlib_modsi3.o \
stdlib_mulsi3.o \
stdlib_never_free.o \
stdlib_osliberror.o \
stdlib_oslibversion.o \
stdlib_priority.o \
stdlib_process_name.o \
stdlib_putenv.o \
stdlib_qsort.o \
stdlib_rand.o \
@@ -301,21 +299,28 @@ C_LIB = \
stdlib_showerror.o \
stdlib_socket.o \
stdlib_srand.o \
stdlib_stackargbytes.o \
stdlib_stackcheck.o \
stdlib_stackoverflow.o \
stdlib_stacksafezone.o \
stdlib_stacksize.o \
stdlib_stack_usage.o \
stdlib_startup.o \
stdlib_strtol.o \
stdlib_strtoul.o \
stdlib_strtoll.o \
stdlib_strtoull.o \
stdlib_swapstack.o \
stdlib_sysbase.o \
stdlib_system.o \
stdlib_termination_message.o \
stdlib_threshold.o \
stdlib_udivsi3.o \
stdlib_udivsi4.o \
stdlib_umodsi3.o \
stdlib_unsetenv.o \
stdlib_wildcard_expand.o \
stdlib_stdio_window_spec.o \
strings_strcasecmp.o \
strings_strncasecmp.o \
string_bcmp.o \
@@ -336,6 +341,8 @@ C_LIB = \
string_strcspn.o \
string_strdup.o \
string_strerror.o \
string_strlcat.o \
string_strlcpy.o \
string_strlen.o \
string_strncat.o \
string_strncmp.o \
@@ -345,15 +352,20 @@ C_LIB = \
string_strspn.o \
string_strstr.o \
string_strtok.o \
string_strtok_r.o \
string_strxfrm.o \
time_asctime.o \
time_asctime_r.o \
time_clock.o \
time_converttime.o \
time_ctime.o \
time_ctime_r.o \
time_data.o \
time_gettimeofday.o \
time_gmtime.o \
time_gmtime_r.o \
time_localtime.o \
time_localtime_r.o \
time_mktime.o \
time_numbertostring.o \
time_strftime.o \
@@ -380,21 +392,21 @@ C_LIB = \
unistd_realpath.o \
unistd_sleep.o \
unistd_symlink.o \
unistd_time_delay.o \
unistd_timer.o \
unistd_time_delay.o \
unistd_truncate.o \
unistd_unlink.o \
unistd_usleep.o \
utime_utime.o
utime_utime.o
# All objects files which make up libunix.a
UNIX_LIB = \
unix.lib_rev.o \
dirent_closedir.o \
dirent_data.o \
dirent_rewinddir.o \
dirent_opendir.o \
dirent_readdir.o \
dirent_rewinddir.o \
fcntl_creat.o \
fcntl_fcntl.o \
fcntl_open.o \
@@ -408,12 +420,12 @@ UNIX_LIB = \
stat_rmdir.o \
stat_stat.o \
stdio_fdhookentry.o \
stdio_init_exit.o \
stdio_locksemaphorename.o \
stdio_openiob.o \
stdio_fflush.o \
stdio_fopen.o \
stdio_fopen.o \
stdio_init_exit.o \
stdio_locksemaphorename.o \
stdio_openiob.o \
stdio_popen.o \
stdio_remove.o \
stdio_rename.o \
@@ -443,6 +455,7 @@ UNIX_LIB = \
unistd_wildcard_expand.o \
utime_utime.o
# All objects files which make up libm.a
MATH_LIB = \
math_acos.o \
math_asin.o \
@@ -492,7 +505,6 @@ MATH_LIB = \
stdio_vasprintf.o \
stdio_vfprintf.o \
stdio_vfscanf.o \
stdio_vfscanf.o \
stdio_vprintf.o \
stdio_vsnprintf.o \
stdio_vsprintf.o \
@@ -501,48 +513,7 @@ MATH_LIB = \
stdlib_strtod.o \
time_difftime.o
MATH_LIB_IEEE = \
m.lib_rev.o \
$(MATH_LIB) \
math_adddf3.o \
math_addsf3.o \
math_divdf3.o \
math_divsf3.o \
math_eqdf2.o \
math_eqsf2.o \
math_extendsfdf2.o \
math_fixdfsi.o \
math_fixsfsi.o \
math_fixunsdfsi.o \
math_fixunssfsi.o \
math_floatsidf.o \
math_floatsisf.o \
math_gedf2.o \
math_gesf2.o \
math_gtdf2.o \
math_gtsf2.o \
math_ledf2.o \
math_lesf2.o \
math_ltdf2.o \
math_ltsf2.o \
math_muldf3.o \
math_mulsf3.o \
math_nedf2.o \
math_negdf2.o \
math_negsf2.o \
math_nesf2.o \
math_subdf3.o \
math_subsf3.o \
math_truncdfsf2.o
STACK_LIB = \
stack.lib_rev.o \
stdlib_setjmp.o \
stdlib_stackextension.o \
stdlib_stackminframe.o \
stdlib_stackoverflow.o \
stdlib_stacksafezone.o
# All objects files which make up libnet.a
NET_LIB = \
net.lib_rev.o \
socket_accept.o \
@@ -586,6 +557,7 @@ NET_LIB = \
socket_socket.o \
socket_hook_entry.o \
socket_hstrerror.o \
stat_umask.o \
usergroup_crypt.o \
usergroup_data.o \
usergroup_endgrent.o \
@@ -614,13 +586,12 @@ NET_LIB = \
usergroup_setregid.o \
usergroup_setreuid.o \
usergroup_setsid.o \
usergroup_setuid.o \
stat_umask.o
usergroup_setuid.o
# All objects files which make up libdebug.a
DEBUG_LIB = \
debug.lib_rev.o \
debug.o \
debug_level.o \
debug_cmpstrexec.o \
debug_kcmpstr.o \
debug_kdofmt.o \
@@ -646,8 +617,10 @@ DEBUG_LIB = \
debug_kputstr1.o \
debug_kputstr2.o \
debug_kvprintf1.o \
debug_kvprintf2.o
debug_kvprintf2.o \
debug_level.o
# All objects files which make up libamiga.a
AMIGA_LIB = \
amiga.lib_rev.o \
amiga_acrypt.o \
@@ -656,10 +629,17 @@ AMIGA_LIB = \
amiga_argarrayinit.o \
amiga_argint.o \
amiga_argstring.o \
amiga_beginio.o \
amiga_callhooka.o \
amiga_coercemethod.o \
amiga_createextio.o \
amiga_createport.o \
amiga_createstdio.o \
amiga_createtask.o \
amiga_deleteextio.o \
amiga_deleteport.o \
amiga_deletestdio.o \
amiga_deletetask.o \
amiga_domethod.o \
amiga_dosupermethod.o \
amiga_dotimer.o \
@@ -667,54 +647,62 @@ AMIGA_LIB = \
amiga_freeievents.o \
amiga_hotkey.o \
amiga_invertstring.o \
amiga_newlist.o \
amiga_rangerand.o \
amiga_remtof.o \
amiga_rexxvars.o \
amiga_setsuperattrs.o \
amiga_timedelay.o \
amiga_waitbeam.o
##############################################################################
LIBS := $(LIBC_OBJS)/libc.a $(LIBSTACK_OBJS)/libstack.a $(LIBUNIX_OBJS)/libunix.a \
$(LIBDEBUG_OBJS)/libdebug.a $(LIBAMIGA_OBJS)/libamiga.a \
$(LIBM_OBJS)/libm.a $(LIBNET_OBJS)/libnet.a
# The libraries to be built, prefixed by the respective path names
LIBS := \
$(LIBC_OBJS)/libc.a \
$(LIBUNIX_OBJS)/libunix.a \
$(LIBDEBUG_OBJS)/libdebug.a \
$(LIBAMIGA_OBJS)/libamiga.a \
$(LIBM_OBJS)/libm.a \
$(LIBNET_OBJS)/libnet.a
##############################################################################
# The startup object files to be built
STARTUPS := bcrt0.o bcrtbegin.o bcrtend.o crt0.o crtbegin.o crtend.o mainb.o mainnb.o
##############################################################################
STARTUPS := crt0.o crtbegin.o crtend.o mainnb.o
##############################################################################
# This is the first target: it creates the necessary directories, then proceeds
# to build the startup object files and finally the libraries
all: \
lib/crt0.o \
lib/crtbegin.o \
lib/crtend.o \
lib/mainnb.o \
lib/libm.a \
lib/small-data/libm.a \
lib \
lib/soft-float \
lib/small-data \
small_data \
large_data \
large_data_softfloat \
lib/bcrt0.o \
lib/bcrtbegin.o \
lib/bcrtend.o \
lib/soft-float/libc.a
copy:
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
lib/crt0.o \
lib/crtbegin.o \
lib/crtend.o \
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:
-$(DELETE) $(TYPE) $(STARTUPS) \
$(LIBC_OBJS) $(LIBUNIX_OBJS) $(LIBM_OBJS) $(LIBSTACK_OBJS) $(LIBNET_OBJS) $(LIBDEBUG_OBJS) $(LIBAMIGA_OBJS)
realclean:
$(MAKE) clean
-$(DELETE) lib small_data large_data large_data_softfloat
-$(DELETE) $(STARTUPS) lib small_data large_data large_data_softfloat
##############################################################################
# Update the version numbers bound to the individual libraries
version:
cp c.lib_rev.rev amiga.lib_rev.rev
cp c.lib_rev.rev debug.lib_rev.rev
@@ -734,43 +722,74 @@ version:
##############################################################################
# Tag all files with a certain version number
cvs-tag:
cvs -q tag V1_`cat c.lib_rev.rev`
##############################################################################
kitchen_sink: $(TYPE) $(LIBS) $(STARTUPS)
##############################################################################
ifneq (,$(TYPE))
$(TYPE):
$(MAKEDIR) $@
endif
# This target first creates a directory to store the object files in, then
# proceeds to build the libraries from the code. It is invoked by the
# individual library build targets below.
all_libraries: $(TYPE) $(LIBS)
##############################################################################
# These create the required subdirectories to store object files and
# libraries in
lib:
-$(MAKEDIR) $@
lib/small-data:
lib/small-data: lib
-$(MAKEDIR) $@
lib/soft-float:
lib/soft-float: lib
-$(MAKEDIR) $@
lib/libm.a: lib
$(MAKE) TYPE=large_data kitchen_sink
small_data:
-$(MAKEDIR) $@
large_data:
-$(MAKEDIR) $@
large_data_softfloat:
-$(MAKEDIR) $@
##############################################################################
# Dependencies for libm.a (large data variant with hardware floating point code
# support): this actually ends up building all the libraries rather than just
# libm.a
lib/libm.a: large_data large_data/libm.a
large_data/libm.a:
$(MAKE) TYPE=large_data all_libraries
$(COPY) $(foreach file,$(LIBS),large_data/$(file)) lib
lib/small-data/libm.a: lib lib/small-data
$(MAKE) TYPE=small_data kitchen_sink
$(COPY) $(foreach file,$(LIBS),small_data/$(file)) lib/small-data
##############################################################################
lib/soft-float/libc.a: lib lib/soft-float
$(MAKE) TYPE=large_data_softfloat kitchen_sink
# Dependencies for libm.a (large data variant with software floating point code
# support): this actually ends up building all the libraries rather than just
# libm.a
lib/soft-float/libm.a: large_data_softfloat large_data_softfloat/libm.a
large_data_softfloat/libm.a:
$(MAKE) TYPE=large_data_softfloat all_libraries
$(COPY) $(foreach file,$(LIBS),large_data_softfloat/$(file)) lib/soft-float
##############################################################################
# Dependencies for libm.a (small data variant): this actually ends up building all
# the libraries rather than just libm.a
lib/small-data/libm.a: small_data small_data/libm.a
small_data/libm.a:
$(MAKE) TYPE=small_data all_libraries
$(COPY) $(foreach file,$(LIBS),small_data/$(file)) lib/small-data
##############################################################################
# Rules to build and move the startup code
lib/crt0.o : lib crt0.o
$(COPY) crt0.o lib
@@ -794,25 +813,38 @@ lib/bcrtbegin.o : lib bcrtbegin.o
lib/bcrtend.o : lib bcrtend.o
$(COPY) bcrtend.o lib
##############################################################################
$(LIBAMIGA_OBJS)/amiga_hookentry.o : amiga_hookentry.c
# Individual dependencies which tell make to build the object files from
# 'C' source files rather than the assembly language source files of the
# same name (e.g. stdlib_getsp.c instead of stdlib_getsp.asm).
$(LIBC_OBJS)/stdlib_getsp.o : stdlib_getsp.c
$(LIBC_OBJS)/stdlib_swapstack.o : stdlib_swapstack.c
$(LIBC_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
$(LIBSTACK_OBJS)/stdlib_setjmp.o : stdlib_setjmp.c
##############################################################################
# Build rules for version information that goes into each library
$(LIBC_OBJS)/c.lib_rev.o : c.lib_rev.c c.lib_rev.h
$(LIBUNIX_OBJS)/unix.lib_rev.o : unix.lib_rev.c unix.lib_rev.h
$(LIBM_OBJS)/m.lib_rev.o : m.lib_rev.c m.lib_rev.h
$(LIBNET_OBJS)/net.lib_rev.o : net.lib_rev.c net.lib_rev.h
$(LIBDEBUG_OBJS)/debug.lib_rev.o : debug.lib_rev.c debug.lib_rev.h
$(LIBAMIGA_OBJS)/amiga.lib_rev.o : amiga.lib_rev.c amiga.lib_rev.h
##############################################################################
$(LIBC_OBJS)/stdlib_stacksize.o : stdlib_stacksize.c stdlib_gcc_help.h
$(LIBC_OBJS)/stdlib_shell_escape.o : stdlib_shell_escape.c stdlib_gcc_help.h
# Build rules for the debug version of the library which has special
# memory allocation debugging code, controlled by the contents of
# the stdlib_mem_debug.h file.
$(LIBC_OBJS)/stdlib_alloca.o : stdlib_alloca.c stdlib_mem_debug.h
$(LIBC_OBJS)/stdlib_calloc.o : stdlib_calloc.c stdlib_mem_debug.h
@@ -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) :
$(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) :
$(MAKEDIR) $@
@@ -849,26 +883,18 @@ $(LIBUNIX_OBJS)/libunix.a : $(LIBUNIX_OBJS) $(foreach file,$(UNIX_LIB),$(LIBUNIX
##############################################################################
# Individual build rules for libm.a
$(LIBM_OBJS) :
$(MAKEDIR) $@
$(LIBM_OBJS)/libm.a : $(LIBM_OBJS) $(foreach file,$(MATH_LIB_IEEE),$(LIBM_OBJS)/$(file))
$(LIBM_OBJS)/libm.a : $(LIBM_OBJS) $(foreach file,$(MATH_LIB),$(LIBM_OBJS)/$(file))
-$(DELETE) $@
@$(AR) $@ $(foreach file,$(MATH_LIB_IEEE),$(LIBM_OBJS)/$(file))
$(RANLIB) $@
##############################################################################
$(LIBSTACK_OBJS) :
$(MAKEDIR) $@
$(LIBSTACK_OBJS)/libstack.a : $(LIBSTACK_OBJS) $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
-$(DELETE) $@
@$(AR) $@ $(foreach file,$(STACK_LIB),$(LIBSTACK_OBJS)/$(file))
@$(AR) $@ $(foreach file,$(MATH_LIB),$(LIBM_OBJS)/$(file))
$(RANLIB) $@
##############################################################################
# Individual build rules for libnet.a
$(LIBNET_OBJS) :
$(MAKEDIR) $@
@@ -879,6 +905,7 @@ $(LIBNET_OBJS)/libnet.a : $(LIBNET_OBJS) $(foreach file,$(NET_LIB),$(LIBNET_OBJS
##############################################################################
# Individual build rules for libdebug.a
$(LIBDEBUG_OBJS) :
$(MAKEDIR) $@
@@ -889,6 +916,7 @@ $(LIBDEBUG_OBJS)/libdebug.a : $(LIBDEBUG_OBJS) $(foreach file,$(DEBUG_LIB),$(LIB
##############################################################################
# Individual build rules for libamiga.a
$(LIBAMIGA_OBJS) :
$(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
@echo "Assembling $<"
@$(CC) -Wa,-mregnames -o crt0.o -c crt0.S
@@ -920,13 +949,3 @@ bcrtbegin.o : crtbegin.c
bcrtend.o : 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

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 182
#define DATE "8.11.2004"
#define VERS "amiga.lib 1.182"
#define VSTRING "amiga.lib 1.182 (8.11.2004)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.182 (8.11.2004)"
#define REVISION 184
#define DATE "28.11.2004"
#define VERS "amiga.lib 1.184"
#define VSTRING "amiga.lib 1.184 (28.11.2004)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.184 (28.11.2004)"

View File

@@ -1 +1 @@
182
184

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_beginio.c,v 1.1.1.1 2004-07-26 16:30:17 obarthel Exp $
* $Id: amiga_beginio.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -37,6 +37,14 @@
/****************************************************************************/
#include "debug.h"
/****************************************************************************/
#ifndef __PPC__
/****************************************************************************/
#if defined(__SASC)
VOID __begin_io(struct IORequest * ior);
@@ -64,10 +72,6 @@ VOID __begin_io(struct IORequest * ior);
/****************************************************************************/
#include "debug.h"
/****************************************************************************/
VOID
BeginIO(struct IORequest *ior)
{
@@ -82,3 +86,35 @@ BeginIO(struct IORequest *ior)
LEAVE();
}
/****************************************************************************/
#else
/****************************************************************************/
#include <proto/exec.h>
/****************************************************************************/
#if defined(BeginIO)
#undef BeginIO
#endif /* BeginIO */
/****************************************************************************/
VOID
BeginIO(struct IORequest *ior)
{
ENTER();
assert( ior != NULL && ior->io_Device != NULL );
IExec->BeginIO(ior);
LEAVE();
}
/****************************************************************************/
#endif /* __PPC__ */

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createextio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_createextio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(CreateExtIO)
#undef CreateExtIO
#endif /* CreateExtIO */
/****************************************************************************/
struct IORequest *
CreateExtIO(CONST struct MsgPort * port, LONG io_size)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createport.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_createport.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(CreatePort)
#undef CreatePort
#endif /* CreatePort */
/****************************************************************************/
struct MsgPort *
CreatePort(CONST_STRPTR name, LONG pri)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createstdio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_createstdio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(CreateStdIO)
#undef CreateStdIO
#endif /* CreateStdIO */
/****************************************************************************/
struct IOStdReq *
CreateStdIO(CONST struct MsgPort * port)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_createtask.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_createtask.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -31,8 +31,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __PPC__
/****************************************************************************/
#include <exec/libraries.h>
@@ -53,6 +51,10 @@
/****************************************************************************/
#ifndef __PPC__
/****************************************************************************/
/*
* Create a task with given name, priority, and stack size.
* It will use the default exception and trap handlers for now.
@@ -191,4 +193,44 @@ CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
/****************************************************************************/
#else
/****************************************************************************/
#if defined(CreateTask)
#undef CreateTask
#endif /* CreateTask */
/****************************************************************************/
struct Task *
CreateTask(CONST_STRPTR name,LONG pri,CONST APTR init_pc,ULONG stack_size)
{
struct Task * result = NULL;
ENTER();
SHOWSTRING(name);
SHOWVALUE(pri);
SHOWPOINTER(init_pc);
SHOWVALUE(stack_size);
assert( name != NULL && (-128 <= pri && pri <= 127) && init_pc != NULL && stack_size > 0 );
if(name == NULL || pri < -128 || pri > 127 || init_pc == NULL || stack_size == 0)
{
SHOWMSG("invalid parameters");
goto out;
}
result = IExec->CreateTask(name,pri,init_pc,stack_size,NULL);
out:
RETURN(result);
return(result);
}
/****************************************************************************/
#endif /* __PPC__ */

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deleteextio.c,v 1.1.1.1 2004-07-26 16:30:18 obarthel Exp $
* $Id: amiga_deleteextio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(DeleteExtIO)
#undef DeleteExtIO
#endif /* DeleteExtIO */
/****************************************************************************/
VOID
DeleteExtIO(struct IORequest * io)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deleteport.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
* $Id: amiga_deleteport.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(DeletePort)
#undef DeletePort
#endif /* DeletePort */
/****************************************************************************/
VOID
DeletePort(struct MsgPort * port)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deletestdio.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
* $Id: amiga_deletestdio.c,v 1.2 2004-11-10 14:55:30 obarthel Exp $
*
* :ts=4
*
@@ -44,6 +44,12 @@
/****************************************************************************/
#if defined(DeleteStdIO)
#undef DeleteStdIO
#endif /* DeleteStdIO */
/****************************************************************************/
VOID
DeleteStdIO(struct IOStdReq * io)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_deletetask.c,v 1.1.1.1 2004-07-26 16:30:19 obarthel Exp $
* $Id: amiga_deletetask.c,v 1.2 2004-11-13 12:55:39 obarthel Exp $
*
* :ts=4
*
@@ -41,8 +41,34 @@
/****************************************************************************/
#ifndef __PPC__
/****************************************************************************/
VOID
DeleteTask(struct Task *tc)
{
RemTask(tc);
}
/****************************************************************************/
#else
/****************************************************************************/
#if defined(DeleteTask)
#undef DeleteTask
#endif /* DeleteTask */
/****************************************************************************/
VOID
DeleteTask(struct Task *tc)
{
IExec->DeleteTask(tc);
}
/****************************************************************************/
#endif /* __PPC__ */

193
library/amiga_rexxvars.c Normal file
View 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);
}

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 182
#define DATE "8.11.2004"
#define VERS "c.lib 1.182"
#define VSTRING "c.lib 1.182 (8.11.2004)\r\n"
#define VERSTAG "\0$VER: c.lib 1.182 (8.11.2004)"
#define REVISION 184
#define DATE "28.11.2004"
#define VERS "c.lib 1.184"
#define VSTRING "c.lib 1.184 (28.11.2004)\r\n"
#define VERSTAG "\0$VER: c.lib 1.184 (28.11.2004)"

View File

@@ -1 +1 @@
182
184

View File

@@ -1,3 +1,69 @@
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

View File

@@ -1,5 +1,5 @@
/*
* $Id: debug.h,v 1.1.1.1 2004-07-26 16:30:26 obarthel Exp $
* $Id: debug.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
*
* :ts=8
*
@@ -57,9 +57,17 @@
/****************************************************************************/
#ifndef _STDLIB_H
#include <stdlib.h>
#endif /* _STDLIB_H */
#ifndef _DOS_H
#include <dos.h>
#endif /* _DOS_H */
/****************************************************************************/
extern void kprintf(const char *format,...);
extern void abort(void);
extern char * __program_name;
/****************************************************************************/

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 182
#define DATE "8.11.2004"
#define VERS "debug.lib 1.182"
#define VSTRING "debug.lib 1.182 (8.11.2004)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.182 (8.11.2004)"
#define REVISION 184
#define DATE "28.11.2004"
#define VERS "debug.lib 1.184"
#define VSTRING "debug.lib 1.184 (28.11.2004)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.184 (28.11.2004)"

View File

@@ -1 +1 @@
182
184

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_close.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
* $Id: fcntl_close.c,v 1.3 2004-11-28 10:01:26 obarthel Exp $
*
* :ts=4
*
@@ -135,7 +135,7 @@ __close(int file_descriptor,int * error_ptr)
SHOWMSG("resetting non-blocking access mode");
message.action = file_hook_action_set_blocking;
message.block = 1;
message.arg = 1;
assert( fd->fd_Hook != NULL );

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_fcntl.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
* $Id: fcntl_fcntl.c,v 1.4 2004-11-28 10:01:26 obarthel Exp $
*
* :ts=4
*
@@ -126,10 +126,13 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
SHOWMSG("cmd=F_GETFL");
result = 0;
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
result = O_NONBLOCK;
else
result = 0;
SET_FLAG(result,O_NONBLOCK);
if(FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO))
SET_FLAG(result,O_ASYNC);
break;
@@ -147,7 +150,7 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
(FLAG_IS_CLEAR(flags,O_NONBLOCK) && FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING)))
{
message.action = file_hook_action_set_blocking;
message.block = FLAG_IS_CLEAR(flags,O_NONBLOCK);
message.arg = FLAG_IS_CLEAR(flags,O_NONBLOCK);
assert( fd->fd_Hook != NULL );
@@ -168,6 +171,31 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
CLEAR_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
}
if((FLAG_IS_SET(flags,O_ASYNC) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_ASYNC_IO)) ||
(FLAG_IS_CLEAR(flags,O_ASYNC) && FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO)))
{
message.action = file_hook_action_set_async;
message.arg = FLAG_IS_SET(flags,O_ASYNC);
assert( fd->fd_Hook != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
result = message.result;
if(result < 0)
{
errno = message.error;
va_end(arg);
goto out;
}
if(FLAG_IS_SET(flags,O_ASYNC))
SET_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
else
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
}
va_end(arg);
break;

View File

@@ -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
*
@@ -164,6 +164,28 @@ extern ULONG __free_memory_threshold;
* them initialized to certain well-defined values to get the desired effect.
*/
/*
* The minimum required operating system version number is 37, which
* corresponds to Workbench/Kickstart 2.04. You may request a higher
* version number by defining the following variable; if you do so,
* please provide a fitting error message, too. Note that you cannot
* request a minimum version number lower than 37.
*/
extern int __minimum_os_lib_version;
extern char * __minimum_os_lib_error;
/*
* If your program is launched from Workbench it will not necessarily
* have a window to send console output to and from which console
* input can be read. The startup code attempts to set up such a console
* window for you, but it uses defaults for the window specification.
* These defaults can be overridden by your program if you define a
* variable to point to the specification string. Note that if you
* request a specific window specification, this will also override
* any tool window definition stored in the program's icon.
*/
extern char * __stdio_window_specification;
/*
* If set to TRUE, your program's process->pr_WindowPtr will be set to -1
* when it starts. The process->pr_WindowPtr will be automatically restored
@@ -192,6 +214,20 @@ extern BOOL __detach;
*/
extern BOOL (* __check_detach)(void);
/*
* If this pointer is not NULL, it refers the name that will be given to
* the process which is created when the program detaches. The default
* is to reuse the program name instead.
*/
extern char * __process_name;
/*
* This variable controls the task priority of the program, when running.
* It must be in the range -128..127 to be useful. By default, the task
* priority will not be changed.
*/
extern int __priority;
/*
* This variable can be set up to contain the minimum stack size the program
* should be launched with. If the startup code finds that there is not enough

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl.h,v 1.2 2004-08-07 09:15:33 obarthel Exp $
* $Id: fcntl.h,v 1.3 2004-11-27 12:43:12 obarthel Exp $
*
* :ts=4
*
@@ -67,6 +67,7 @@ extern "C" {
#define O_NONBLOCK (1<<6)
#define O_SYNC (0)
#define O_NOCTTY (0)
#define O_ASYNC (1<<7)
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: string.h,v 1.3 2004-08-07 09:15:33 obarthel Exp $
* $Id: string.h,v 1.5 2004-11-17 19:07:26 obarthel Exp $
*
* :ts=4
*
@@ -122,6 +122,15 @@ extern int bcmp(const void *a,const void *b,size_t len);
/****************************************************************************/
extern size_t strlcpy(char *dst, const char *src, size_t siz);
extern size_t strlcat(char *dst, const char *src, size_t siz);
/****************************************************************************/
extern char * strtok_r(char *str, const char *separator_set,char ** state_ptr);
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@@ -1,5 +1,5 @@
/*
* $Id: time.h,v 1.1.1.1 2004-07-26 16:32:56 obarthel Exp $
* $Id: time.h,v 1.2 2004-11-17 19:07:26 obarthel Exp $
*
* :ts=4
*
@@ -95,6 +95,17 @@ extern size_t strftime(char *s, size_t maxsize, const char *format,
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
extern char * asctime_r(const struct tm *tm,char * buffer);
extern char * ctime_r(const time_t *tptr,char * buffer);
extern struct tm * gmtime_r(const time_t *t,struct tm * tm_ptr);
extern struct tm * localtime_r(const time_t *t,struct tm * tm_ptr);
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 182
#define DATE "8.11.2004"
#define VERS "m.lib 1.182"
#define VSTRING "m.lib 1.182 (8.11.2004)\r\n"
#define VERSTAG "\0$VER: m.lib 1.182 (8.11.2004)"
#define REVISION 184
#define DATE "28.11.2004"
#define VERS "m.lib 1.184"
#define VSTRING "m.lib 1.184 (28.11.2004)\r\n"
#define VERSTAG "\0$VER: m.lib 1.184 (28.11.2004)"

View File

@@ -1 +1 @@
182
184

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 182
#define DATE "8.11.2004"
#define VERS "m881.lib 1.182"
#define VSTRING "m881.lib 1.182 (8.11.2004)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.182 (8.11.2004)"
#define REVISION 184
#define DATE "28.11.2004"
#define VERS "m881.lib 1.184"
#define VSTRING "m881.lib 1.184 (28.11.2004)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.184 (28.11.2004)"

View File

@@ -1 +1 @@
182
184

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 182
#define DATE "8.11.2004"
#define VERS "net.lib 1.182"
#define VSTRING "net.lib 1.182 (8.11.2004)\r\n"
#define VERSTAG "\0$VER: net.lib 1.182 (8.11.2004)"
#define REVISION 184
#define DATE "28.11.2004"
#define VERS "net.lib 1.184"
#define VSTRING "net.lib 1.184 (28.11.2004)\r\n"
#define VERSTAG "\0$VER: net.lib 1.184 (28.11.2004)"

View File

@@ -1 +1 @@
182
184

View File

@@ -1,5 +1,5 @@
/*
* $Id: signal_headers.h,v 1.1.1.1 2004-07-26 16:31:05 obarthel Exp $
* $Id: signal_headers.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
*
* :ts=4
*
@@ -68,20 +68,20 @@ typedef void (*signal_handler_t)(int sig);
/****************************************************************************/
extern signal_handler_t __signal_handler_table[NUM_SIGNALS];
extern signal_handler_t NOCOMMON __signal_handler_table[NUM_SIGNALS];
/****************************************************************************/
extern int __signals_blocked;
extern int NOCOMMON __signals_blocked;
/****************************************************************************/
extern BOOL __termination_message_printed;
extern BOOL __termination_message_disabled;
extern BOOL NOCOMMON __termination_message_printed;
extern BOOL NOCOMMON __termination_message_disabled;
/****************************************************************************/
extern const char __abnormal_program_termination[];
extern const char NOCOMMON __abnormal_program_termination[];
/****************************************************************************/

View File

@@ -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
#
@@ -88,6 +88,7 @@ AMIGA_OBJ = \
amiga_newlist.o \
amiga_rangerand.o \
amiga_remtof.o \
amiga_rexxvars.o \
amiga_setsuperattrs.o \
amiga_timedelay.o \
amiga_waitbeam.o \
@@ -394,6 +395,10 @@ STDLIB_OBJ = \
stdlib_mkstemp.o \
stdlib_mktemp.o \
stdlib_never_free.o \
stdlib_osliberror.o \
stdlib_oslibversion.o \
stdlib_priority.o \
stdlib_process_name.o \
stdlib_putenv.o \
stdlib_qsort.o \
stdlib_rand.o \
@@ -419,7 +424,8 @@ STDLIB_OBJ = \
stdlib_swapstack.o \
stdlib_system.o \
stdlib_unsetenv.o \
stdlib_wildcard_expand.o
stdlib_wildcard_expand.o \
stdlib_stdio_window_spec.o
STRING_OBJ = \
string_bcmp.o \
@@ -440,6 +446,8 @@ STRING_OBJ = \
string_strcspn.o \
string_strdup.o \
string_strerror.o \
string_strlcat.o \
string_strlcpy.o \
string_strlen.o \
string_strncat.o \
string_strncmp.o \
@@ -449,6 +457,7 @@ STRING_OBJ = \
string_strspn.o \
string_strstr.o \
string_strtok.o \
string_strtok_r.o \
string_strxfrm.o
STRINGS_OBJ = \
@@ -457,14 +466,18 @@ STRINGS_OBJ = \
TIME_OBJ = \
time_asctime.o \
time_asctime_r.o \
time_clock.o \
time_converttime.o \
time_ctime.o \
time_ctime_r.o \
time_data.o \
time_difftime.o \
time_gettimeofday.o \
time_gmtime.o \
time_gmtime_r.o \
time_localtime.o \
time_localtime_r.o \
time_mktime.o \
time_numbertostring.o \
time_strftime.o \

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_data.c,v 1.2 2004-07-28 15:50:45 obarthel Exp $
* $Id: socket_data.c,v 1.3 2004-11-14 11:06:27 obarthel Exp $
*
* :ts=4
*
@@ -46,9 +46,7 @@ struct Library * __SocketBase;
/****************************************************************************/
#if defined(__amigaos4__)
struct SocketIFace *__ISocket;
#endif /* __amigaos4__ */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_headers.h,v 1.2 2004-07-28 15:50:45 obarthel Exp $
* $Id: socket_headers.h,v 1.3 2004-11-14 11:06:27 obarthel Exp $
*
* :ts=4
*
@@ -48,19 +48,19 @@
/****************************************************************************/
extern struct Library * __SocketBase;
extern struct Library * NOCOMMON __SocketBase;
/****************************************************************************/
#if defined(__amigaos4__)
extern struct SocketIFace *__ISocket;
extern struct SocketIFace * NOCOMMON __ISocket;
#endif /* __amigaos4__ */
/****************************************************************************/
extern int h_errno;
extern int NOCOMMON h_errno;
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_hook_entry.c,v 1.1.1.1 2004-07-26 16:31:14 obarthel Exp $
* $Id: socket_hook_entry.c,v 1.3 2004-11-28 10:01:26 obarthel Exp $
*
* :ts=4
*
@@ -41,6 +41,10 @@
/****************************************************************************/
#include <sys/ioctl.h>
/****************************************************************************/
void
__socket_hook_entry(
struct Hook * UNUSED unused_hook,
@@ -49,6 +53,7 @@ __socket_hook_entry(
{
struct FileInfoBlock * fib;
int error = OK;
int param;
int result;
assert( message != NULL && fd != NULL );
@@ -129,6 +134,28 @@ __socket_hook_entry(
break;
case file_hook_action_set_blocking:
SHOWMSG("file_hook_action_set_blocking");
param = (int)(message->arg == 0);
result = __IoctlSocket(fd->fd_DefaultFile,FIONBIO,&param);
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,&param);
error = errno;
break;
case file_hook_action_examine:
SHOWMSG("file_hook_action_examine");

View File

@@ -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
*
@@ -39,16 +39,16 @@
#include "socket_headers.h"
#endif /* _SOCKET_HEADERS_H */
#ifndef _SIGNAL_HEADERS_H
#include "signal_headers.h"
#endif /* _SIGNAL_HEADERS_H */
/****************************************************************************/
#include "stdlib_protos.h"
/****************************************************************************/
extern BOOL __detach;
/****************************************************************************/
/* Code value. */
#define SBTB_CODE 1
#define SBTS_CODE 0x3FFF
@@ -78,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)
{
ENTER();
@@ -192,7 +182,7 @@ __socket_init(void)
/* Wire the library's h_errno variable to our local h_errno. */
tags[3].ti_Tag = SBTM_SETVAL(SBTC_HERRNOLONGPTR);
tags[3].ti_Data = (ULONG)&errno;
tags[3].ti_Data = (ULONG)&h_errno;
tags[4].ti_Tag = TAG_END;

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_ioctl.c,v 1.1.1.1 2004-07-26 16:31:16 obarthel Exp $
* $Id: socket_ioctl.c,v 1.3 2004-11-28 10:01:26 obarthel Exp $
*
* :ts=4
*
@@ -47,6 +47,10 @@
/****************************************************************************/
#include <sys/ioctl.h>
/****************************************************************************/
int
ioctl(int sockfd,unsigned long request, ... /* char *arg */)
{
@@ -81,6 +85,26 @@ ioctl(int sockfd,unsigned long request, ... /* char *arg */)
result = __IoctlSocket((LONG)fd->fd_DefaultFile,request,param);
PROFILE_ON();
if(result == OK)
{
int * option = (int *)param;
if(request == FIONBIO)
{
if((*option) != 0)
SET_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
else
CLEAR_FLAG(fd->fd_Flags,FDF_NON_BLOCKING);
}
else if (request == FIOASYNC)
{
if((*option) != 0)
SET_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
else
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
}
}
va_end(arg);
out:

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 182
#define DATE "8.11.2004"
#define VERS "stack.lib 1.182"
#define VSTRING "stack.lib 1.182 (8.11.2004)\r\n"
#define VERSTAG "\0$VER: stack.lib 1.182 (8.11.2004)"
#define REVISION 184
#define DATE "28.11.2004"
#define VERS "stack.lib 1.184"
#define VSTRING "stack.lib 1.184 (28.11.2004)\r\n"
#define VERSTAG "\0$VER: stack.lib 1.184 (28.11.2004)"

View File

@@ -1 +1 @@
182
184

View File

@@ -1,5 +1,5 @@
/*
* $Id: stat_headers.h,v 1.1.1.1 2004-07-26 16:31:22 obarthel Exp $
* $Id: stat_headers.h,v 1.2 2004-11-14 11:06:27 obarthel Exp $
*
* :ts=4
*
@@ -42,7 +42,7 @@
/****************************************************************************/
extern mode_t __current_umask;
extern mode_t NOCOMMON __current_umask;
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_fdhookentry.c,v 1.1.1.1 2004-07-26 16:31:28 obarthel Exp $
* $Id: stdio_fdhookentry.c,v 1.2 2004-11-28 10:01:26 obarthel Exp $
*
* :ts=4
*
@@ -1829,7 +1829,7 @@ __fd_hook_entry(
SHOWMSG("changing the mode");
if(message->block)
if(message->arg != 0)
mode = 0; /* buffered mode */
else
mode = 1; /* single character mode */

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_headers.h,v 1.2 2004-08-07 09:15:32 obarthel Exp $
* $Id: stdio_headers.h,v 1.5 2004-11-28 10:01:26 obarthel Exp $
*
* :ts=4
*
@@ -252,6 +252,8 @@ struct iob
to have its protection bits updated after
it has been closed */
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
#define FDF_ASYNC_IO (1UL<<10) /* File was switched into asynchronous I/O
mode (sockets only). */
/****************************************************************************/
@@ -306,7 +308,8 @@ enum file_hook_action_t
file_hook_action_info,
file_hook_action_duplicate_fd,
file_hook_action_seek_and_extend,
file_hook_action_is_interactive
file_hook_action_is_interactive,
file_hook_action_set_async
};
/****************************************************************************/
@@ -324,7 +327,7 @@ struct file_hook_message
struct flock * lock; /* Record locking request */
int command; /* What kind of locking command was sent */
int block; /* Whether or not this file should
int arg; /* Whether or not this file should
be set non-blocking */
uid_t owner;
@@ -347,22 +350,22 @@ struct file_hook_message
/****************************************************************************/
/* The file handle table. */
extern struct iob ** __iob;
extern int __num_iob;
extern struct iob ** NOCOMMON __iob;
extern int NOCOMMON __num_iob;
/****************************************************************************/
/* The file descriptor table. */
extern struct fd ** __fd;
extern int __num_fd;
extern struct fd ** NOCOMMON __fd;
extern int NOCOMMON __num_fd;
/****************************************************************************/
extern char * __file_lock_semaphore_name;
extern char * NOCOMMON __file_lock_semaphore_name;
/****************************************************************************/
extern BOOL __no_standard_io;
extern BOOL NOCOMMON __no_standard_io;
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_popen.c,v 1.2 2004-08-07 09:15:32 obarthel Exp $
* $Id: stdio_popen.c,v 1.3 2004-11-28 09:33:19 obarthel Exp $
*
* :ts=4
*
@@ -94,20 +94,6 @@ pclose(FILE *stream)
/****************************************************************************/
#define SET_TAG(t,v,d) \
do \
{ \
(t)->ti_Tag = (Tag)(v); \
(t)->ti_Data = (ULONG)(d); \
(t)++; \
} \
while(0)
#define END_TAG(t) \
(void)((t)->ti_Tag = TAG_END)
/****************************************************************************/
FILE *
popen(const char *command, const char *type)
{
@@ -118,14 +104,10 @@ popen(const char *command, const char *type)
BPTR input = ZERO;
BPTR output = ZERO;
char pipe_file_name[40];
struct TagItem tags[5];
struct TagItem * tag;
FILE * result = NULL;
LONG status;
unsigned long task_address;
time_t now;
size_t type_len;
char actual_type[8];
int i;
ENTER();
@@ -150,6 +132,36 @@ popen(const char *command, const char *type)
if(__check_abort_enabled)
__check_abort();
/* The first character selects the access mode: read or write. We don't
support anything else. */
switch(type[0])
{
case 'r':
SHOWMSG("read mode");
break;
case 'w':
SHOWMSG("write mode");
break;
default:
D(("unsupported access mode '%lc'",type[0]));
errno = EINVAL;
goto out;
}
/* The current PIPE: device only supports unidirectional connections. */
if((type[1] == '+') || (type[1] != '\0' && type[2] == '+'))
{
D(("unsupported access mode '%s'",type));
errno = EINVAL;
goto out;
}
#if defined(UNIX_PATH_SEMANTICS)
{
if(__unix_path_semantics)
@@ -237,33 +249,10 @@ popen(const char *command, const char *type)
}
#endif /* UNIX_PATH_SEMANTICS */
/* Skip any options following the comma. */
type_len = strlen(type);
for(i = 0 ; i < (int)type_len ; i++)
{
if(type[i] == ',')
{
type_len = i;
break;
}
}
/* Keep only the first few letters of the type string. */
if(type_len > sizeof(actual_type)-1)
type_len = sizeof(actual_type)-1;
memmove(actual_type,type,type_len);
actual_type[type_len] = '\0';
/* The current PIPE: device only supports unidirectional connections. */
if(strcmp(actual_type,"r+") == SAME)
{
SHOWMSG("unsupported access mode");
errno = EINVAL;
goto out;
}
/* Build a (hopefully) unique name for the pipe stream to open. We
construct it from the current process address, converted into
an octal number, followed by the current time (in seconds),
converted into another octal number. */
strcpy(pipe_file_name,"PIPE:");
task_address = (unsigned long)FindTask(NULL);
@@ -290,26 +279,27 @@ popen(const char *command, const char *type)
PROFILE_OFF();
if(strcmp(actual_type,"r") == SAME)
/* Now open the input and output streams for the program to launch. */
if(type[0] == 'r')
{
/* Read mode: we want to read the output of the program; the program
should read from "NIL:". */
input = Open("NIL:",MODE_NEWFILE);
if(input != ZERO)
output = Open(pipe_file_name,MODE_NEWFILE);
}
else if (strcmp(actual_type,"w") == SAME)
else
{
/* Write mode: we want to send data to the program; the program
should write to "NIL:". */
input = Open(pipe_file_name,MODE_NEWFILE);
if(input != ZERO)
output = Open("NIL:",MODE_NEWFILE);
}
else
{
errno = EINVAL;
goto out;
}
PROFILE_ON();
/* Check if both I/O streams could be opened. */
if(input == ZERO || output == ZERO)
{
SHOWMSG("couldn't open the streams");
@@ -318,18 +308,20 @@ popen(const char *command, const char *type)
goto out;
}
tag = tags;
SET_TAG(tag,SYS_Input, input);
SET_TAG(tag,SYS_Output, output);
SET_TAG(tag,SYS_Asynch, TRUE);
SET_TAG(tag,SYS_UserShell, TRUE);
END_TAG(tag);
PROFILE_OFF();
status = SystemTagList((STRPTR)command,tags);
/* Now try to launch the program. */
status = SystemTags((STRPTR)command,
SYS_Input, input,
SYS_Output, output,
SYS_Asynch, TRUE,
SYS_UserShell, TRUE,
TAG_END);
PROFILE_ON();
/* If launching the program returned -1 then it could not be started.
We'll need to close the I/O streams we opened above. */
if(status == -1)
{
SHOWMSG("SystemTagList() failed");
@@ -338,8 +330,11 @@ popen(const char *command, const char *type)
goto out;
}
/* OK, the program is running. Once it terminates, it will automatically
shut down the streams we opened for it. */
input = output = ZERO;
/* Now try to open the pipe we will use to exchange data with the program. */
result = fopen(pipe_file_name,type);
out:

View File

@@ -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
*
@@ -84,6 +84,14 @@ ULONG __stk_extensions;
/****************************************************************************/
#if defined(__SASC)
UBYTE * __base;
#endif /* __SASC */
/****************************************************************************/
struct Library * __UtilityBase;
/****************************************************************************/
@@ -91,11 +99,3 @@ struct Library * __UtilityBase;
#if defined(__amigaos4__)
struct UtilityIFace * __IUtility;
#endif /* __amigaos4__ */
/****************************************************************************/
#if defined(__SASC)
UBYTE * __base;
#endif /* __SASC */

View File

@@ -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
*
@@ -42,10 +42,6 @@ int __exit_value = RETURN_FAIL;
/****************************************************************************/
extern void __exit_trap_trigger(void);
/****************************************************************************/
void
_exit(int return_code)
{

View File

@@ -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
*
@@ -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 MinList __memory_list;
extern APTR __memory_pool;
extern struct MemoryTree NOCOMMON __memory_tree;
extern struct MinList NOCOMMON __memory_list;
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 __current_memory_allocated;
extern unsigned long __maximum_num_memory_chunks_allocated;
extern unsigned long __current_num_memory_chunks_allocated;
extern unsigned long NOCOMMON __maximum_memory_allocated;
extern unsigned long NOCOMMON __current_memory_allocated;
extern unsigned long NOCOMMON __maximum_num_memory_chunks_allocated;
extern unsigned long NOCOMMON __current_num_memory_chunks_allocated;
/****************************************************************************/
extern jmp_buf __exit_jmp_buf;
extern int __exit_value;
extern jmp_buf NOCOMMON __exit_jmp_buf;
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 BOOL __stack_overflow;
extern UBYTE * __stk_limit;
/*extern UBYTE ** __stackborders;*/
/*extern UBYTE * __SaveSP;*/
extern UBYTE * __base;
extern unsigned int NOCOMMON __stack_size;
extern BOOL NOCOMMON __stack_overflow;
extern UBYTE * NOCOMMON __stk_limit;
extern UBYTE * NOCOMMON __base;
/****************************************************************************/
extern ULONG __stk_argbytes;
extern ULONG __stk_safezone;
extern ULONG __stk_maxsize;
extern ULONG __stk_size;
extern ULONG __stk_extensions;
extern ULONG __stk_minframe;
extern ULONG NOCOMMON __stk_argbytes;
extern ULONG NOCOMMON __stk_safezone;
extern ULONG NOCOMMON __stk_maxsize;
extern ULONG NOCOMMON __stk_size;
extern ULONG NOCOMMON __stk_extensions;
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 int __argc;
extern char ** NOCOMMON __argv;
extern int NOCOMMON __argc;
/****************************************************************************/
extern UBYTE * __quote_vector;
extern UBYTE * NOCOMMON __quote_vector;
/****************************************************************************/
extern int __default_pool_size;
extern int __default_puddle_size;
extern int NOCOMMON __default_pool_size;
extern int NOCOMMON __default_puddle_size;
/****************************************************************************/

View File

@@ -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
*
@@ -111,9 +111,8 @@ static int
call_main(void)
{
/* Initialization functions; must be called exactly in this
* order because there are dependencies between the
* individual functions.
*/
order because there are dependencies between the
individual functions. */
static init_func_ptr init_functions[] =
{
__stdlib_init,
@@ -129,10 +128,9 @@ call_main(void)
};
/* Finalization functions; these may be called
* essentially in any order. But this one makes the
* most sense (roll-back of the corresponding
* initialization functions).
*/
essentially in any order. But this one makes the
most sense (roll-back of the corresponding
initialization functions). */
static exit_func_ptr exit_functions[] =
{
__stdlib_exit,
@@ -189,20 +187,18 @@ call_main(void)
#endif /* __USE_SAS_PROFILING_FOR_MONITORING */
/* If we end up here with the __stack_overflow variable
* set then the stack overflow handler dropped into
* longjmp() and _exit() did not get called. This
* means that we will have to show the error message
* and invoke _exit() all on our own.
*/
set then the stack overflow handler dropped into
longjmp() and _exit() did not get called. This
means that we will have to show the error message
and invoke _exit() all on our own. */
if(__stack_overflow)
{
SHOWMSG("we have a stack overflow");
/* Dump whatever is waiting to be written to the
* standard I/O streams, and make sure that no
* break signal is about to make things any more
* complicated than they already are.
*/
standard I/O streams, and make sure that no
break signal is about to make things any more
complicated than they already are. */
__check_abort_enabled = FALSE;
if(stdout != NULL)
@@ -230,10 +226,9 @@ call_main(void)
SHOWMSG("calling the exit functions");
/* Any of the following cleanup routines may call
* _exit() by way of abort() or through a hook
* function. Which is why we redirect the exit
* return procedure.
*/
_exit() by way of abort() or through a hook
function. Which is why we redirect the exit
return procedure. */
for(i = 0 ; exit_functions[i] != NULL ; 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)
{
/* Now for the slightly shady part. We need to unload the segment
* list this program was originally loaded with. We have to close
* dos.library, though, which means that either we can close the
* 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
* and exit and nobody will be able to allocate this program's
* memory until after the process has been terminated.
*/
list this program was originally loaded with. We have to close
dos.library, though, which means that either we can close the
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
and exit and nobody will be able to allocate this program's
memory until after the process has been terminated. */
Forbid();
UnLoadSeg(segment_list);
@@ -316,6 +310,7 @@ _main(void)
int return_code = RETURN_FAIL;
ULONG current_stack_size;
APTR old_window_pointer;
int os_version;
SysBase = *(struct Library **)4;
@@ -349,13 +344,26 @@ _main(void)
__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. */
DOSBase = (struct Library *)OpenLibrary("dos.library",37);
__UtilityBase = OpenLibrary("utility.library",37);
DOSBase = (struct Library *)OpenLibrary("dos.library",os_version);
__UtilityBase = OpenLibrary("utility.library",os_version);
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;
}
@@ -374,9 +382,8 @@ _main(void)
#endif /* __amigaos4__ */
/* If a callback was provided which can fill us in on which
* minimum stack size should be used, invoke it now and
* store its result in the global __stack_size variable.
*/
minimum stack size should be used, invoke it now and
store its result in the global __stack_size variable. */
if(__get_default_stack_size != NULL)
{
unsigned int size;
@@ -390,9 +397,8 @@ _main(void)
current_stack_size = get_stack_size(&this_process->pr_Task);
/* If this is a resident program, don't allow for the detach
* code to run. Same goes for launching the program from
* Workbench.
*/
code to run. Same goes for launching the program from
Workbench. */
if(__is_resident || startup_message != NULL)
{
__detach = FALSE;
@@ -404,13 +410,17 @@ _main(void)
}
/* 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)
{
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
* 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)
{
struct StackSwapStruct * stk;
@@ -452,19 +462,21 @@ _main(void)
/* We have enough room to make the call or just don't care. */
return_code = call_main();
}
/* Restore the task priority. */
SetTaskPri((struct Task *)this_process,old_priority);
}
else
{
struct CommandLineInterface * cli = Cli();
struct TagItem tags[11];
struct TagItem tags[12];
UBYTE program_name[256];
unsigned int stack_size;
int i;
/* Now for the interesting part: detach from the shell we're
* currently executing in. This works only if the program is
* not reentrant and has not been launched from Workbench.
*/
currently executing in. This works only if the program is
not reentrant and has not been launched from Workbench. */
stack_size = __stack_size;
@@ -483,9 +495,9 @@ _main(void)
tags[i]. ti_Tag = NP_StackSize;
tags[i++]. ti_Data = stack_size;
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_Data = (ULONG)program_name;
tags[i++]. ti_Data = (ULONG)FilePart(program_name);
tags[i]. ti_Tag = NP_Cli;
tags[i++]. ti_Data = TRUE;
tags[i]. ti_Tag = NP_Arguments;
@@ -495,6 +507,13 @@ _main(void)
tags[i]. ti_Tag = NP_ExitData;
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. */
if(((struct Library *)DOSBase)->lib_Version >= 50)
{
@@ -581,11 +600,10 @@ _main(void)
/****************************************************************************/
/* The following is automatically called by the main() function through code
* 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
* to call the constructor functions, but we do this in our own _main()
* anyway.
*/
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
to call the constructor functions, but we do this in our own _main()
anyway. */
#if defined(__GNUC__)

View File

@@ -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
*
@@ -57,16 +57,19 @@ mktemp(char * name_template)
{
#if defined(UNIX_PATH_SEMANTICS)
struct name_translation_info name_template_nti;
char * original_name_template = NULL;
#endif /* UNIX_PATH_SEMANTICS */
char * test_name;
struct Process * this_process;
APTR old_window_pointer;
char * result = NULL;
int template_offset;
int template_len;
size_t template_offset;
size_t template_len;
size_t name_len;
size_t offset;
time_t now;
ULONG pseudo_random_number;
BPTR lock;
int i;
size_t i;
ENTER();
@@ -74,6 +77,8 @@ mktemp(char * name_template)
assert(name_template != NULL);
this_process = (struct Process *)FindTask(NULL);
#if defined(CHECK_FOR_NULL_POINTERS)
{
if(name_template == NULL)
@@ -89,43 +94,11 @@ mktemp(char * name_template)
if(__check_abort_enabled)
__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);
template_offset = -1;
template_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)
/* So, how long is that name template? */
name_len = strlen(name_template);
if(name_len == 0)
{
SHOWMSG("invalid name template");
@@ -133,23 +106,65 @@ mktemp(char * name_template)
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);
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++)
{
name_template[template_offset + i] = 'A' + (now % 26);
name_template[template_offset + i] = 'A' + (pseudo_random_number % 26);
now = (now / 26);
if(now == 0)
/* One more letter taken; if we run out of letters,
cook up another pseudo-random number. */
pseudo_random_number = (pseudo_random_number / 26);
if(pseudo_random_number == 0)
{
time(&now);
pseudo_random_number = (ULONG)now;
}
}
SHOWSTRING(name_template);
old_window_pointer = this_process->pr_WindowPtr;
/* Now check if the name we picked is unique. If not, make another name. */
while(TRUE)
{
if(__check_abort_enabled)
@@ -157,12 +172,32 @@ mktemp(char * 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. */
this_process->pr_WindowPtr = (APTR)-1;
/* Does this object exist already? */
PROFILE_OFF();
lock = Lock(name_template,SHARED_LOCK);
lock = Lock(test_name,SHARED_LOCK);
PROFILE_ON();
/* Restore DOS requesters. */
@@ -191,8 +226,7 @@ mktemp(char * name_template)
PROFILE_ON();
/* 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++)
{
name_template[template_offset + i]++;
@@ -205,20 +239,6 @@ mktemp(char * 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:
RETURN(result);

View 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;

View 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
View 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;

View 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;

View File

@@ -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
*
@@ -347,7 +347,11 @@ __startup_init(void)
__original_current_directory = CurrentDir(__WBenchMsg->sm_ArgList[0].wa_Lock);
__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);
}

View 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
View 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
View 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);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: string_strtok.c,v 1.2 2004-10-25 19:53:15 obarthel Exp $
* $Id: string_strtok.c,v 1.4 2004-11-18 09:40:37 obarthel Exp $
*
* :ts=4
*
@@ -48,61 +48,12 @@ strtok(char *str, const char *separator_set)
{
static char * last;
char * result = NULL;
size_t size;
char * result;
assert( separator_set != NULL );
#if defined(CHECK_FOR_NULL_POINTERS)
{
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];
/* 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:
ENTER();
result = strtok_r(str,separator_set,&last);
RETURN(result);
return(result);
}

112
library/string_strtok_r.c Normal file
View 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);
}

View File

@@ -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
*
@@ -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 *
asctime(const struct tm *tm)
{
static char buffer[40];
struct tm copy_tm;
char number[16];
char * result = NULL;
const char * b;
int offset = 0;
char * result;
ENTER();
SHOWPOINTER(tm);
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 = &copy_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:
result = __asctime_r(tm,buffer,sizeof(buffer));
RETURN(result);
return(result);

205
library/time_asctime_r.c Normal file
View 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 = &copy_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);
}

View File

@@ -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
*

72
library/time_ctime_r.c Normal file
View 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);
}

View File

@@ -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
*
@@ -47,27 +47,11 @@ struct tm *
gmtime(const time_t *t)
{
static struct tm tm;
struct tm * result = NULL;
struct tm * result;
ENTER();
assert( t != NULL );
#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:
result = gmtime_r(t,&tm);
RETURN(result);
return(result);

71
library/time_gmtime_r.c Normal file
View 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);
}

View File

@@ -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
*
@@ -84,13 +84,14 @@
/****************************************************************************/
extern const char * const __abbreviated_week_day_names[7];
extern const char * const __week_day_names[7];
extern const char * const __abbreviated_month_names[12];
extern const char * const __month_names[12];
extern const char * const NOCOMMON __abbreviated_week_day_names[7];
extern const char * const NOCOMMON __week_day_names[7];
extern const char * const NOCOMMON __abbreviated_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 struct tm * __convert_time(ULONG seconds, LONG gmt_offset, struct tm * tm);

View File

@@ -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
*
@@ -51,38 +51,12 @@ struct tm *
localtime(const time_t *t)
{
static struct tm tm;
struct tm * result = NULL;
LONG gmt_offset;
struct tm * result;
ENTER();
assert( t != NULL );
#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:
result = localtime_r(t,&tm);
RETURN(result);
return(result);

View 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);
}

View File

@@ -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
*
@@ -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;
/****************************************************************************/

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 182
#define DATE "8.11.2004"
#define VERS "unix.lib 1.182"
#define VSTRING "unix.lib 1.182 (8.11.2004)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.182 (8.11.2004)"
#define REVISION 184
#define DATE "28.11.2004"
#define VERS "unix.lib 1.184"
#define VSTRING "unix.lib 1.184 (28.11.2004)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.184 (28.11.2004)"

View File

@@ -1 +1 @@
182
184

View File

@@ -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
*
@@ -54,14 +54,14 @@ extern struct UserGroupIFace * NOCOMMON __IUserGroup;
/****************************************************************************/
extern BOOL __root_mode;
extern BOOL NOCOMMON __root_mode;
/****************************************************************************/
extern int __root_uid;
extern int __root_gid;
extern int __root_euid;
extern int __root_egid;
extern int NOCOMMON __root_uid;
extern int NOCOMMON __root_gid;
extern int NOCOMMON __root_euid;
extern int NOCOMMON __root_egid;
/****************************************************************************/

View File

@@ -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
*
@@ -45,15 +45,11 @@
/****************************************************************************/
/* Pointer to errno, length == sizeof(errno) */
/* Pointer to errno, length == sizeof(long) */
#define UGT_ERRNOLPTR 0x80000004
/****************************************************************************/
extern char * __program_name;
/****************************************************************************/
struct Library * NOCOMMON __UserGroupBase;
/****************************************************************************/

View File

@@ -1,100 +0,0 @@
#
# $Id: GNUmakefile.68k,v 1.3 2004-10-25 19:50:33 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 strtok_test
clean:
$(DELETE) #?.o #?.map test fgets_test iotest sscanf_test printf_test sprintf_test \
stack_size_test translate_test strtok_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
strtok_test : strtok_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ strtok_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

View File

@@ -1,84 +0,0 @@
#
# $Id: GNUmakefile.os4,v 1.2 2004-10-25 19:50:33 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 strtok_test
clean:
$(DELETE) *.o *.map test fgets_test iotest sscanf_test printf_test sprintf_test \
stack_size_test translate_test strtok_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
strtok_test : strtok_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ strtok_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

View File

@@ -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.

View File

@@ -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.
*/

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -1,12 +0,0 @@
#include <stdio.h>
int __debug_level = 2;
int main(void)
{
double val = 0.0001;
printf("%g\n", val);
return(0);
}

View File

@@ -1,195 +0,0 @@
#include <string.h>
#include <stdio.h>
double x;
void
print_format_int(const char * format_string,int parameter1,int parameter2)
{
printf("\"");
printf(format_string,parameter1);
printf("\"\t");
printf("Value = % d, Format = \"%s\"\n",parameter1,format_string);
printf("\"");
printf(format_string,parameter2);
printf("\"\t");
printf("Value = % d, Format = \"%s\"\n",parameter2,format_string);
}
void
print_format_char(const char * format_string,char parameter)
{
printf("\"");
printf(format_string,parameter);
printf("\"\t");
printf("Value = '%c', Format = \"%s\"\n",parameter,format_string);
}
void
print_format_string(const char * format_string,const char *parameter1,const char *parameter2)
{
printf("\"");
printf(format_string,parameter1);
printf("\"\t");
printf("Value = \"%s\", Format = \"%s\"\n",parameter1,format_string);
printf("\"");
printf(format_string,parameter2);
printf("\"\t");
printf("Value = \"%s\", Format = \"%s\"\n",parameter2,format_string);
}
void
print_format_float(const char * format_string,double parameter1,double parameter2)
{
printf("\"");
printf(format_string,parameter1);
printf("\"\t");
printf("Value = % f, Format = \"%s\"\n",parameter1,format_string);
printf("\"");
printf(format_string,parameter2);
printf("\"\t");
printf("Value = % f, Format = \"%s\"\n",parameter2,format_string);
}
int
main(void)
{
/*
unsigned long foo[2] = { 0x41f00000, 0 };
memcpy(&x,foo,sizeof(x));
printf("%.20g\n",x);
*/
print_format_int("%12d",45,-45);
print_format_int("%012d",45,-45);
print_format_int("% 012d",45,-45);
print_format_int("%+12d",45,-45);
print_format_int("%+012d",45,-45);
print_format_int("%-12d",45,-45);
print_format_int("%- 12d",45,-45);
print_format_int("%-+12d",45,-45);
print_format_int("%12.4d",45,-45);
print_format_int("%-12.4d",45,-45);
print_format_int("%12.0d",45,-45);
printf("\n");
print_format_int("%14u",45,-45);
print_format_int("%014u",45,-45);
print_format_int("%#14u",45,-45);
print_format_int("%#014u",45,-45);
print_format_int("%-14u",45,-45);
print_format_int("%-#14u",45,-45);
print_format_int("%14.4u",45,-45);
print_format_int("%-14.4u",45,-45);
print_format_int("%14.0u",45,-45);
printf("\n");
print_format_int("%14o",45,-45);
print_format_int("%014o",45,-45);
print_format_int("%#14o",45,-45);
print_format_int("%#014o",45,-45);
print_format_int("%-14o",45,-45);
print_format_int("%-#14o",45,-45);
print_format_int("%14.4o",45,-45);
print_format_int("%-14.4o",45,-45);
print_format_int("%14.0o",45,-45);
printf("\n");
print_format_int("%12x",45,-45);
print_format_int("%012x",45,-45);
print_format_int("%#12X",45,-45);
print_format_int("%#012X",45,-45);
print_format_int("%-12x",45,-45);
print_format_int("%-#12x",45,-45);
print_format_int("%12.4x",45,-45);
print_format_int("%-12.4x",45,-45);
print_format_int("%12.0x",45,-45);
printf("\n");
print_format_char("%12c",'*');
print_format_char("%012c",'*');
print_format_char("%-12c",'*');
print_format_char("%12.0c",'*');
printf("\n");
print_format_string("%12s","zap","longish");
print_format_string("%12.5s","zap","longish");
print_format_string("%012s","zap","longish");
print_format_string("%-12s","zap","longish");
print_format_string("%12.0s","zap","longish");
printf("\n");
print_format_float("%10.2f",12.678,-12.678);
print_format_float("%010.2f",12.678,-12.678);
print_format_float("% 010.2f",12.678,-12.678);
print_format_float("%+10.2f",12.678,-12.678);
print_format_float("%+010.2f",12.678,-12.678);
print_format_float("%-10.2f",12.678,-12.678);
print_format_float("%- 10.2f",12.678,-12.678);
print_format_float("%-+10.4f",12.678,-12.678);
print_format_float("%f",12.678,-12.678);
print_format_float("%10f",12.678,-12.678);
print_format_float("%10.0f",12.678,-12.678);
printf("\n");
print_format_float("%10.2e",12.678,-12.678);
print_format_float("%010.2e",12.678,-12.678);
print_format_float("% 010.2e",12.678,-12.678);
print_format_float("%+10.2E",12.678,-12.678);
print_format_float("%+010.2E",12.678,-12.678);
print_format_float("%-10.2e",12.678,-12.678);
print_format_float("%- 10.2e",12.678,-12.678);
print_format_float("%-+10.2e",12.678,-12.678);
print_format_float("%e",12.678,-12.678);
print_format_float("%10e",12.678,-12.678);
print_format_float("%10.0e",12.678,-12.678);
printf("\n");
print_format_float("%10.2g",12.678,-12.678);
print_format_float("%010.2g",12.678,-12.678);
print_format_float("% 010.2g",12.678,-12.678);
print_format_float("%+10.2G",12.678,-12.678);
print_format_float("%+010.2G",12.678,-12.678);
print_format_float("%-10.2g",12.678,-12.678);
print_format_float("%- 10.2g",12.678,-12.678);
print_format_float("%-+10.2g",12.678,-12.678);
print_format_float("%g",12.678,-12.678);
print_format_float("%10g",12.678,-12.678);
print_format_float("%10.0g",12.678,-12.678);
printf("\n");
print_format_float("%10.2g",0.678,-0.678);
print_format_float("%010.2g",0.678,-0.678);
print_format_float("% 010.2g",0.678,-0.678);
print_format_float("%+10.2G",0.678,-0.678);
print_format_float("%+010.2G",0.678,-0.678);
print_format_float("%-10.2g",0.678,-0.678);
print_format_float("%- 10.2g",0.678,-0.678);
print_format_float("%-+10.2g",0.678,-0.678);
print_format_float("%g",0.678,-0.678);
print_format_float("%10g",0.678,-0.678);
print_format_float("%10.0g",0.678,-0.678);
return(0);
}

View File

@@ -1,134 +0,0 @@
#
# $Id: smakefile,v 1.3 2004-10-25 19:50:33 obarthel Exp $
#
# :ts=8
#
##############################################################################
.c.o:
@echo "Compiling $<"
@sc nover $(CFLAGS) $<
.asm.o:
@echo "Assembling $<"
@asm $(AFLAGS) $<
##############################################################################
# You might want to change this to the directory where your operating system
# header files are stored. On my system, that's "V:include", but you might
# get lucky with "sc:include" instead, which is the default for SAS/C.
INCLUDE_DIR = V:include
#INCLUDE_DIR = sc:include
##############################################################################
# This is where the header files, the startup code and the c.lib files are
# stored; see below how this prefix is used.
LIB = /library/
##############################################################################
OPTIMIZE = optimize opttime optschedule optinline
#DEBUG = debug=line noopt define=CHECK_FOR_NULL_POINTERS
#DEBUG = debug=line
#DEBUG = debug=line define=NDEBUG
DEBUG = debug=sf noopt
#DEBUG = debug=sf noopt define=CHECK_FOR_NULL_POINTERS
#PROFILE = profile
DATA = data=faronly
#CODE = code=far
CPU = cpu=060
MATH = define=IEEE_FLOATING_POINT_SUPPORT math=IEEE
SUPPORT = define=UNIX_PATH_SEMANTICS define=SOCKET_SUPPORT define=USERGROUP_SUPPORT \
define=__C_MACROS__
##############################################################################
CFLAGS = \
resopt \
nover \
memorysize=huge \
idlen=64 \
commentnest \
nostackcheck \
stringmerge \
errorrexx \
$(PROFILE) $(OPTIMIZE) $(CODE) $(DATA) $(CPU) $(MATH) \
$(SUPPORT) $(DEBUG)
AFLAGS = \
-d -m2
##############################################################################
all: setup test fgets_test iotest sscanf_test printf_test sprintf_test stack_size_test translate_test strtok_test cleanup
clean:
-delete \#?.o \#?.map test fgets_test iotest sscanf_test printf_test sprintf_test stack_size_test translate_test strtok_test
##############################################################################
setup:
@echo "Setting up include: assignment"
@assign include: $(LIB)include V:include
cleanup:
@echo "Cleaning up include: assignment"
@assign include: sc:include
##############################################################################
test: test.o
@echo "Linking $@"
@slink $(LIB)startup.o test.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
fgets_test: fgets_test.o
@echo "Linking $@"
@slink $(LIB)startup.o fgets_test.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
strtok_test: strtok_test.o
@echo "Linking $@"
@slink $(LIB)startup.o strtok_test.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
iotest: iotest.o
@echo "Linking $@"
@slink $(LIB)startup.o iotest.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
sscanf_test: sscanf_test.o
@echo "Linking $@"
@slink $(LIB)startup.o sscanf_test.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
printf_test: printf_test.o
@echo "Linking $@"
@slink $(LIB)startup.o printf_test.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
sprintf_test: sprintf_test.o
@echo "Linking $@"
@slink $(LIB)startup.o sprintf_test.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
stack_size_test: stack_size_test.o
@echo "Linking $@"
@slink $(LIB)startup.o stack_size_test.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
translate_test: translate_test.o
@echo "Linking $@"
@slink $(LIB)startup.o translate_test.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
##############################################################################
mkid:
mkid \#?.(c|h|asm|i) include/\#?.(c|h|asm|i) include/sys/\#?.(c|h|asm|i)
update:
mkid -v -u

View File

@@ -1,25 +0,0 @@
#include <string.h>
#include <stdio.h>
static char buf[256];
void addsomething(void)
{
char *p = &buf[strlen(buf)];
sprintf(p, "yeah");
}
int main(void)
{
buf[0] = '\0';
addsomething();
printf("1: [%s]\n", buf);
sprintf(buf, "");
addsomething();
printf("2: [%s]\n", buf);
return (0);
}

View File

@@ -1,108 +0,0 @@
#include <string.h>
#include <stdio.h>
int
main(void)
{
int first, second, third, num;
int n,a,b,c;
char str[4];
num = sscanf("day-month-year", "%d-%d-%d", &first, &second, &third);
printf("%s:%d:",__FILE__,__LINE__);printf("%d %d %d %d\n", num, first, second, third);
num = sscanf("8-11-2004", "%d-%d-%d", &first, &second, &third);
printf("%s:%d:",__FILE__,__LINE__);printf("%d %d %d %d\n", num, first, second, third);
num = sscanf("", "%d-%d-%d", &first, &second, &third);
printf("%s:%d:",__FILE__,__LINE__);printf("%d %d %d %d\n", num, first, second, third);
num = sscanf("6", "%d %d", &first, &second);
printf("%s:%d:",__FILE__,__LINE__);printf("%d %d\n", num, first);
a = b = c = 0;
n = sscanf("","%*d,%d,%d",&a,&b,&c);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
a = b = c = 0;
n = sscanf("1,2,3","%*d,%d,%d",&a,&b,&c);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
a = b = c = 0;
n = sscanf("1,2","%*d,%d,%d",&a,&b,&c);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
a = b = c = 0;
n = sscanf("asdf","*d,d,d",&a,&b,&c);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d, b = %d, c = %d\n",n,a,b,c);
memset(str,0,sizeof(str));
n = sscanf("asdf","%[abc]",str);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, str = '%s'\n",n,str);
memset(str,0,sizeof(str));
n = sscanf("asdbbfc","%[abc]",str);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, str = '%s'\n",n,str);
memset(str,0,sizeof(str));
n = sscanf("","%[abc]",str);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, str = '%s'\n",n,str);
memset(str,0,sizeof(str));
n = sscanf("abcdef","%[abc]",str);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, str = '%s'\n",n,str);
a = b = c = 0;
n = sscanf("-","%d",&a);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d\n",n,a);
a = b = c = 0;
n = sscanf("-4,-","%d,%d",&a,&b);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d, b = %d\n",n,a,b);
memset(str,0,sizeof(str));
n = sscanf("1 abc","%d %4c",&a,str);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d, str = '%s'\n",n,a,str);
memset(str,0,sizeof(str));
n = sscanf("abc","%4c",&a,str);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, str = '%s'\n",n,str);
a = 0;
n = sscanf("17","%i",&a);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d\n",n,a);
a = 0;
n = sscanf("017","%i",&a);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d\n",n,a);
a = 0;
n = sscanf("0x17","%i",&a);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d\n",n,a);
a = 0;
n = sscanf("0x017","%i",&a);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d\n",n,a);
a = 0;
n = sscanf("0x017","%x",&a);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d\n",n,a);
a = 0;
n = sscanf("0017","%x",&a);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d\n",n,a);
a = 0;
n = sscanf("0x80000000","%i",&a);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %u\n",n,a);
memset(str,0,sizeof(str));
n = sscanf("1,e","%*d,%[abc]",str);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, str = '%s'\n",n,str);
return(0);
}

View File

@@ -1,31 +0,0 @@
/* gcc -mstackextend -o stack_extension_test stack_extension_test.c */
#include <stdio.h>
#include <ctype.h>
void
recursive_function(char *data,int data_size,int level)
{
char local_data[10000];
char line[10];
int c;
data_size += sizeof(local_data);
level++;
printf("recursion level=%d, size=%d; continue? ",level,data_size);
fgets(line,sizeof(line),stdin);
c = toupper(line[0]);
if(c == 'Y')
recursive_function(local_data,data_size,level);
}
int
main(int argc,char ** argv)
{
recursive_function(NULL,0,0);
return(0);
}

View File

@@ -1,15 +0,0 @@
#include <stdio.h>
int __stack_size = 60000;
int
main(void)
{
int first, second, num;
num = sscanf("6", "%d %d", &first, &second);
printf("%d %d\n", num, first);
return(0);
}

Some files were not shown because too many files have changed in this diff Show More