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

15 Commits

Author SHA1 Message Date
Olaf Barthel
0cecdc99fb This commit was manufactured by cvs2svn to create tag 'V1_205'.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/tags/V1_205@15209 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2010-08-21 11:39:11 +00:00
Olaf Barthel
6bc8108a39 - Version bump to 1.205
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15208 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2010-08-21 11:39:10 +00:00
Olaf Barthel
f600c5e37a - Added dlclose(), dlerror(), dlopen() and dlsym() functions, which are
available only under OS4. There is a variant of dlopen() in libunix.a
  which will perform a path name conversion. Note that these functions
  will not work in the thread-safe variant of the library because it
  would be unwise to tinker with the currently running program's binary.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15207 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2010-08-21 11:37:03 +00:00
Olaf Barthel
1bdfc0d143 - Added dlclose(), dlerror(), dlopen() and dlsym() functions, which are
available only under OS4. There is a variant of dlopen() in libunix.a
  which will perform a path name conversion.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15206 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2010-08-21 10:59:34 +00:00
Olaf Barthel
37a1fdee4f - The shared object initialization has to be performed before any local
constructors are invoked, and after all local destructors have been
  invoked.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15205 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2010-08-21 09:57:50 +00:00
Olaf Barthel
d10027ece7 - Preparations for clib2 1.205
- Added support for ELF shared objects and libraries. This is implemented through
  constructor/destructor functions, which means that you can use this
  functionality even in Amiga Exec style shared libraries, with the proper
  library initialization code to invoke the constructor/destructor functions
  for you.

- Updated uname() to recognize AmigaOS 4.1.

- The translation from Unix to Amiga path names did not properly process
  multiple occurences of "/./" in the path name. Thanks go to Steven Solie
  for finding the issue.

- The detection of "/./" and "/../" patterns in Unix path names to be
  translated into Amiga path names did not test if it was overrunning
  the end of the string.

- If strcmp(), strncmp() and memcmp() detect a pair of different
  characters, then the function result must be calculated as if the
  characters were of type "unsigned char". This is a requirement
  according to the ISO 'C' (1994) standard. Thanks go to Georg Steger
  for finding the issue.

- The definitions for INT_MIN, INT_MAX and UINT_MAX in <limits.h> no
  longer use long integer types, as prompted by Steven Solie.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15204 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2010-08-20 15:33:36 +00:00
Olaf Barthel
60fbee698e - Preparations for c.lib 1.204 release.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15203 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-11-11 12:58:39 +00:00
Olaf Barthel
933483d365 - Updated the build rules for use with GCC 4.2.x
- Added a workaround for the baserel build flavour, which requires a specific
  GCC version, e.g. 4.0.4 or earlier.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15202 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-11-06 14:44:07 +00:00
Olaf Barthel
4291a0564f - The memory allocated by malloc() and friends is now of type MEMF_PRIVATE
under OS4 and beyond. The AmigaOS 2.x/3.x compatible code will still
  use MEMF_ANY in the same situation, though. Other uses of MEMF_ANY have
  been replaced as well where MEMF_PRIVATE would have made better sense.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15201 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-09-30 14:09:00 +00:00
Olaf Barthel
8a1347e61d - I/O buffers allocated are now aligned according to the CPU cache line size,
if the operating system can supply that detailed information.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15200 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-09-04 12:07:58 +00:00
Olaf Barthel
b9ad1fda3f - Elaborated on the unidirectional/bidirectional PIPE: issues.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15199 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-05-07 09:33:55 +00:00
Olaf Barthel
f28dcf8ed1 - stdlib_unsetenv.c needs stdio_headers.h to compile properly.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15198 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-30 16:32:49 +00:00
Olaf Barthel
8eac1027a5 - It's iswpunct() and not iswpunc().
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15197 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-30 14:41:28 +00:00
Olaf Barthel
0b19424148 - unsetenv() now returns a status value.
- Corrected the function prototype for wcspbrk().

- Added function prototypes for mbrtowc_l(), wcscoll_l(), wcscspn() and wcsrchr().


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15196 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-30 14:34:03 +00:00
Olaf Barthel
f100199861 - Switched to BSD style options for the "cp" command, as used in the build
makefiles and the archive build script (that is: 'cp -a' becomes 'cp -p'
  and 'cp -pR', depending upon the specific context).


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15195 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2008-04-28 16:12:22 +00:00
90 changed files with 1002 additions and 2830 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,30 +0,0 @@
<!DOCTYPE html public "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Notes on building the library</title>
<body>
<h1>Notes on building the library</h1>
<p>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 <tt>netinclude</tt> which has to sit in the same directory as
the source code and the <tt>include</tt> 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.</p>
<p>The SAS/C flavour (<tt>smakefile</tt>) 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 (<tt>startup.o</tt>) and doesn't tinker with A4 relative data
addressing (and how this may be set up).</p>
<p>There are two makefiles for GCC, each a different flavour. There is <tt>GNUmakefile.68k</tt>,
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 (<tt>GNUmakefile.os4</tt>). 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.</p>
</body>
</html>

View File

@@ -1,67 +0,0 @@
<!DOCTYPE html public "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Notes on using the library with Amiga GCC (68k)</title>
<body>
<h1>Notes on using the library with Amiga GCC (68k)</h1>
<p>You can use the 68k build of clib2 with the existing Amiga 68k ports of the
GNU 'C' compiler. In order to do so, you need to modify the <tt>specs</tt> file which
controls how the compiler(s) and the linker interact, and where the linker
will look for the program startup code and library files. Also, you will need
to copy the header files, startup code and library files to the locations
where the 'C' compiler and linker expects them.</p>
<p>Please read the following description before you follow the instructions. The
changes suggested may have unexpected side-effects!</p>
<p>I have provided a working <tt>specs</tt> file with this documentation file. To switch
over an existing Amiga 68k port of GCC to use clib2, you would proceed as
follows:</p>
<ul>
<li> Locate the directory within which GCC is installed. For example, this
could be within a directory to which the name <tt>ADE:</tt>, <tt>GG:</tt> or <tt>GCC:</tt>
is assigned. For the sake of simplicity, the following notes assume
that the assignment name is <tt>GCC:</tt>
<li> Make backup copies of the following directories and files:
<ol>
<li> <tt>GCC:lib/gcc-lib/amigaos/2.95.3/specs</tt><br>
<p>(NOTE: Check the directory called <tt>GCC:lib/gcc-lib/amigaos</tt>
first; the "2.95.3" quoted above refers to the version,
revision and patch number of the GCC installed and your
version number may differ!)</p>
<li> <tt>GCC:include</tt>
<li> <tt>GCC:lib</tt>
</ol>
<li> Now you can proceed to install clib2; just copy the <tt>include</tt> and <tt>lib</tt>
directories over, like this:
<ol>
<li><kbd>Copy include GCC:include all quiet</kbd>
<li><kbd>Copy lib GCC:lib all quiet</kbd>
</ol>
<li> Finally, replace the <tt>specs</tt> file with the one provided:
<ol>
<li> <kbd>Copy specs GCC:lib/gcc-lib/amigaos/2.95.3/specs</kbd><br>
<p>(NOTE: Check the directory called <tt>GCC:lib/gcc-lib/amigaos</tt>
first; the "2.95.3" quoted above refers to the version,
revision and patch number of the GCC installed and your
version number may differ!)</p>
</ol>
</ul>
<p>Once you have completed these steps you should be able to build programs using
the 68k build of clib2 and you currently installed GCC. Note that these
changes may have the effect of rendering your C++ compiler unusable, so make
sure that you've made backup copies of all files and directories first!</p>
</body>
</html>

View File

@@ -1,517 +0,0 @@
<!DOCTYPE html public "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>An ISO 'C' (1994) compliant runtime library for the Amiga</title>
<body>
<h1>An ISO 'C' (1994) compliant runtime library for the Amiga</h1>
<h2>1. What is this?</h2>
<p>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.</p>
<p>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.</p>
<h2>2. What does it do?</h2>
<p>Using <i>'C' - A reference manual</i> (4th edition) 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. The library was subsequently updated to offer functionality defined in
<i>ISO/IEC 9899:1999</i>, also known as <i>C99</i>.</p>
<p>Because Samba needs a few POSIX-like routines to be supported, the library
functionality is complemented by a set of routines described in <i>Advanced
programming in the Unix environent</i>.</p>
<p>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.</p>
<p>The library supports floating point math, which, for the 68k platform, 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 <tt>IEEE_FLOATING_POINT_SUPPORT</tt> preprocessor symbol to activate IEEE math
code and the <tt>M68881_FLOATING_POINT_SUPPORT</tt> symbol for M68881 inline math.</p>
<p>For the PowerPC platform, the library uses code borrowed from <i>fdlibm 5.3</i>,
which is a portable library of arithmetic functions developed by Sun
Microsystems which, for example, is also used within the Java platform.</p>
<h2>3. What does it not do?</h2>
<p>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.</p>
<p>There is very little support for <tt>amiga.lib</tt> functionality. There is <tt>NewList()</tt>,
<tt>HookEntry()</tt>, <tt>CallHook()</tt>, <tt>CallHookA()</tt>, the <tt>DoMethod()</tt> 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 <tt>amiga.lib</tt>, you really shouldn't need it in the first place.</p>
<h2>4. Where does the source code come from?</h2>
<p>I originally thought that it might be helpful to piece this library together
from various sources, such as the BSD libc. It 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 <tt>bcopy()</tt> as an alias for <tt>memcpy()</tt>, and
unlike <tt>memcpy()</tt> is documented to, <tt>bcopy()</tt> supports overlapping copies.</p>
<p>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 <tt>setjmp</tt>/<tt>longjmp</tt>
routines and the startup code. The M68881 inline math code comes from the
<tt>&lt;math-68881.h&gt;</tt> file written by Matthew Self <tt>(self [at] bayes&#46;arc&#46;nasa&#46;gov)</tt>.</p>
<h2>5. Limitations and caveats</h2>
<p>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.</p>
<p>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.</p>
<p>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 <tt>data=faronly</tt> option to compile the
library and the programs.</p>
<p>Different build makefiles are supplied for use with GCC. There is a
<tt>GNUmakefile.68k</tt> for the 68k platform and a <tt>GNUmakefile.os4</tt> for the AmigaOS4
PowerPC version.</p>
<h3>5.1 Floating point math and functions (<tt>scanf()</tt>, <tt>printf()</tt>, etc.) </h3>
<p>The plain <tt>libc.a</tt>, which your software would be linked against by default, does not contain
any floating point support code. This means, for example, that <tt>printf("%f",...)</tt> will not produce
the desired output and that <tt>scanf("%f",...)</tt> may not read any data at all. If your
program needs functions such as these or <tt>atod()</tt> then you must link against <tt>libm.a</tt> or
the equivalent.</p>
<p>To link the floating point support code with your software, use the <tt>-lm</tt> compiler option. <em>Careful!</em>
The order in which you specify the libraries to link against is important here. Thus, <tt>gcc -o test test.c -lm -lc</tt>
would correctly link the program <tt>test</tt> against the proper floating point math library, but
<tt>gcc -o test test.c -lc -lm</tt> would not.</p>
<h3>5.2 The thread-safe library</h3>
<p>Thread-safety does not imply that you can have multiple callers
access and close the same file. There is no resource tracking to that degree
yet. All that the thread-safety tries to afford you is not to get into big trouble
if simultaneous and overlapping accesses to files, memory allocation and other
resources are taking place.</p>
<p>The library code is supposed to be thread-safe if built with the <tt>__THREAD_SAFE</tt>
preprocesssor symbol defined. Note that 'thread-safe' does <em>not</em> mean
'reentrant'. Multiple callers for certain library functions are permitted, but
not for all of them. For example, <tt>mkdtemp()</tt> is not thread-safe, and neither is
<tt>rand()</tt> or <tt>localtime()</tt>. But as per <i>POSIX 1003.1c-1995</i> there are thread-safe
variants of <tt>rand()</tt> and <tt>localtime()</tt> called <tt>rand_r()</tt>, <tt>localtime_r()</tt>, and others.</p>
<p>The use of the socket I/O functions is problematic because the
underlying <tt>bsdsocket.library</tt> API is not supposed to be used by any process
other than the one which opened it. While one TCP/IP stack (my own "Roadshow") allows you
to share the library base among different processes, if so configured, it is the
exception. No other TCP/IP stack available for the Amiga robustly supports a similar
feature. If the TCP/IP stack supports this feature, then the global variable
<tt>__can_share_socket_library_base</tt> will be set to a non-zero value.</p>
<p>Errors reported by the socket I/O functions which modify the global variables
<tt>errno</tt> and <tt>h_errno</tt> may be directed to call the <tt>__set_errno()</tt>
and <tt>__set_h_errno()</tt> functions instead, if the TCP/IP stack supports this feature. The global
variable <tt>__thread_safe_errno_h_errno</tt> will be set to a non-zero value if it does.</p>
<p>A much more serious problem resides with the <tt>exit()</tt>, <tt>abort()</tt>,
<tt>assert()</tt> and <tt>raise()</tt> functions, and how the <tt>SIGINT</tt> signal is
processed. In the thread-safe library only the <tt>main()</tt> function may directly
or indirectly call the <tt>exit()</tt> function. No child process may do so, since this
would wreck its stack context, crashing it instantly; the main program would be very
likely to crash, too, because <tt>exit()</tt> will clean up after all memory allocations
and files currently in use. Functions such as <tt>abort()</tt> and <tt>raise()</tt> may
call the <tt>exit()</tt> function indirectly. And the <tt>raise()</tt> function may
be invoked as part of the <tt>Control+C</tt> checking. You should make sure that the
signal handling does not affect any child processes. This can be done by replacing the
<tt>__check_abort()</tt> function or by disabling <tt>SIGINT</tt> processing altogether,
such as through a <tt>signal(SIGINT,SIG_IGN)</tt> call.</p>
<p> Also take care with file I/O involving the <tt>stdin</tt>/<tt>stdout</tt>/<tt>stderr</tt>
streams; read/write operations on these streams will be mapped to the <tt>Input()</tt>/<tt>Output()</tt>/<tt>ErrorOutput()</tt>
file handles of the process performing these operations. Since only this small set of
operations is mapped, functions such as <tt>fcntl()</tt> or <tt>select()</tt> will not
work on the <tt>stdin</tt>/<tt>stdout</tt>/<tt>stderr</tt> streams and the corresponding
file descriptors <tt>STDIN_FILENO</tt>/<tt>STDOUT_FILENO</tt>/<tt>STDERR_FILENO</tt>.
It is therefore strongly recommended to use the thread-safe library only for applications
which can cope with the limitations described above.</p>
<h3>5.3 Using gmon (PowerPC only)</h3>
<p>To use profiling, two steps are required. First of all, your program must be compiled with
the gcc command line option <tt>-pg</tt>. This instructs the compiler to generate special
profiling code in the prologue and epilogue of each function. Additionally, the program
must be linked with <tt>libprofile.a</tt>. To do this, either manually add
<tt>-lprofile</tt> to the linker command line, or modify the specs file as follows.
Find the lines that look like this (it may actually differ silghtily from your specs file,
but the important thing is that the line before the line to be modified reads <tt>lib:</tt>):
<pre>
lib:
--start-group -lc --end-group
</pre>
You will have to modify this to look like this:
<pre>
lib:
%{pg: -lprofile} --start-group -lc --end-group
</pre>
<p>Normally, the specs file is located at the compilers installation directory. For cross-compilers,
this is <tt>/usr/local/amiga/lib/gcc/ppc-amigaos/<i>compiler-version</i>/specs</tt>. For a native compiler,
it's in <tt>gcc:lib/gcc/ppc-amigaos/<i>compiler-version</i>/specs</tt>. Most likely, your compiler will already have this added to it's specs file.</p>
<p>Profiling makes use of a special PowerPC facility called the Performance Monitor. It
allows to "mark" tasks and count only during while a marked task is running. This allows
performance analysis to be made independant of the actual system load. The Performace Monitor
is available on all PowerPC models supported by AmigaOS 4 except for the <tt>603e</tt>, and
embedded versions of the PowerPC like the <tt>405</tt> and <tt>440</tt> series. Consult the manual
of the appropriate chip for more information.</p>
<h3>5.4 Implementation defined behaviour</h3>
<h4>5.4.1. 'C' language</h4>
<h5>5.4.1.1. Environment</h5>
<p>The <tt>main(int argc,char **argv);</tt> function may be called with an <tt>argc</tt> value of 0,
in which case the <tt>argv</tt> variable will contain a pointer to the Amiga Workbench startup
message, which is of type <tt>struct WBStartup *</tt>, and is defined in the Amiga system header
file <tt>&lt;workbench/startup.h&gt;</tt>.</p>
<h5>5.4.1.2. Characters</h5>
<p>The current locale is derived from the current Amiga operating system locale settings. The
<tt>setlocale("")</tt> function call will choose the current Amiga operating system locale settings.
Any other name passed to the <tt>setlocale()</tt> function, with the exception of <tt>"C"</tt>,
which selects the 'C' locale, must be a locale name, as used by the Amiga operating system
function <tt>OpenLocale()</tt> in <tt>locale.library</tt>.</p>
<h5>5.4.1.3. Floating-point</h5>
<p>The 68k version of clib2 supports single and double precision floating point numbers,
according to the <i>IEEE 754</i> standard. The software floating point number support is built upon the Amiga
operating system libraries <tt>mathieeesingbas.library</tt>, <tt>mathieeedoubbas.library</tt>
and <tt>mathieeedoubtrans.library</tt>. The hardware floating point number support uses
the M68881/M68882/M68040/M68060 floating point unit intead.</p>
<p>The PowerPC version of clib2 supports only double precision floating point numbers, according to
the <i>IEEE 754</i> standard, because that is exactly what the PowerPC CPU supports. Single precision
numbers may be implicitly converted to double precision numbers. This also means that the <i>C99</i>
data type <tt>long double</tt> is identical to the <tt>double</tt> data type. Because there is no
difference between these two, the library omits support for <i>C99</i> functions specifically designed
to operate on <tt>long double</tt> data types, such as <tt>rintl()</tt>.</p>
<p>Both the 68k and the PowerPC versions of clib2 may call software floating point support
routines in order to perform double and single precision operations that go beyond
simple addition and multiplication, such as <tt>sqrt()</tt>. These functions come from
Sun Microsystems <i>fdlibm 5.3</i> library.</p>
<p>Unless your software is linked against <tt>libm.a</tt> no floating point functions will
be available to it, possibly causing a linker error. When using the GNU 'C' compiler, you will
want to add the option <tt>-lm -lc</tt> to the linker command line.</p>
<p>The exception handling is currently entirely out of control of the developer
and solely subject to the rules imposed by the operating system itself.</p>
<p>The <tt>fmod()</tt> function returns the value of the <tt>x</tt> parameter and
sets <tt>errno</tt> to <tt>EDOM</tt> if the <tt>y</tt> parameter value is 0.</p>
<h4>5.4.2. Library functions</h4>
<h5>5.4.2.1. <tt>NULL</tt></h5>
<p>The <tt>NULL</tt> pointer constant is defined in the <tt>&lt;stddef.h&gt;</tt> header and
will expand to <tt>((void *)0L)</tt> if the 'C' compiler is used. For a C++ compiler the constant
will expand to <tt>0L</tt> instead.</p>
<h5>5.4.2.2. <tt>assert()</tt> diagnostic messages</h5>
<p>The diagnostic messages printed by the <tt>assert()</tt> function take the following form:</p>
<blockquote><tt>[<i>program name</i>] <i>file</i>:<i>line</i>: failed assertion "<i>condition</i>".</tt></blockquote>
<p>where:</p>
<table border=0>
<tr><th align=right>program name</th><td>Optional program name; if the program name is not yet known, then the
entire text enclosed in square brackets will be omitted.</td></tr>
<tr><th align=right>file</th><td>The value of the <tt>__FILE__</tt> symbol at the location of the <tt>assert()</tt> call.</td></tr>
<tr><th align=right>line</th><td>The value of the <tt>__LINE__</tt> symbol at the location of the <tt>assert()</tt> call.</td></tr>
<tr><th align=right>condition</th><td>The condition passed to the <tt>assert()</tt> function.</td></tr>
</table>
<p>If available, the diagnostic messages will be sent to <tt>stderr</tt>.</p>
<p>If the program was launched from Workbench or if the global variable <tt>__no_standard_io</tt> is set
to a non-zero value, then the assertion failure message will not be displayed in the shell window, but
in a requester window. The diagnostic message shown in this window will take the following form:</p>
<blockquote><tt>Assertion of condition "<i>condition</i>" failed in file "<i>file</i>", line <i>line</i>.</tt></blockquote>
<p>The name of the program, if it is know at that time, will be displayed in the requester window title.</p>
<h5>5.4.2.3. Signal handling</h5>
<p>Only the minimum of required signals are supported by this library. These are <tt>SIGABRT</tt>, <tt>SIGFPE</tt>,
<tt>SIGILL</tt>, <tt>SIGINT</tt>, <tt>SIGSEGV</tt> and <tt>SIGTERM</tt>.</p>
<p>As of this writing <tt>SIGFPE</tt> is never called by the floating point library functions.</p>
<p>The <tt>Ctrl+C</tt> event is translated into <tt>SIGINT</tt>. Signal delivery may be delayed
until a library function which polls for the signal examines it. This means, for example, that
a runaway program caught in an infinite loop cannot be aborted by sending it a <tt>Ctrl+C</tt> event unless special code
is added which tests for the presence of the signal and calls the <tt>__check_abort()</tt> all on its own.</p>
<p>Processing of the <tt>Ctrl+C</tt> event involves the internal <tt>__check_abort()</tt> function which
polls for the presence of the event and which will call <tt>raise(SIGINT);</tt>. The <tt>__check_abort()</tt>
function may be replaced by user code.</p>
<h5>5.4.2.4. Files</h5>
<p>No new line characters are written unless specifically requested.</p>
<p>Space characters in a text stream before a new line character are read in and not discarded.</p>
<p>When data is read from a file, the last character does not have to be a new line character.</p>
<p>No NUL byte will be appended to data written to a binary stream.</p>
<p>There is no difference between text and binary streams.</p>
<p>Writing to a text or binary stream does not truncate the associated file. A stream may be
truncated by the initial <tt>fopen()</tt> call if the <tt>mode</tt> parameter starts with
the letter <tt>w</tt>.</p>
<p>The file position indicator is initially set to the end of an append mode stream.</p>
<h5>5.4.2.5. <tt>printf()</tt> family</h5>
<p>The <tt>%p</tt> conversion is the hexadecimal representation of the pointer, and
it is preceded by the string <tt>0x</tt>.</p>
<p>The <tt>%a</tt>, <tt>%e</tt>, <tt>%f</tt>, <tt>%g</tt>, <tt>%A</tt>,
<tt>%E</tt>, <tt>%F</tt> and <tt>%G</tt> specifiers will produce the string <tt>inf</tt>
for infinity.</p>
<h5>5.4.2.6. <tt>scanf()</tt> family</h5>
<p>The input for the <tt>%p</tt> conversion must be a hexadecimal number,
preceded by either the string <tt>0x</tt> or <tt>0X</tt>.</p>
<p>In the <tt>%[</tt> conversion a <tt>-</tt> (dash) character that is neither the
first nor the last character in the scanset indicates that a subrange of
characters should be used. Thus <tt>%[a-d]</tt> is equivalent to <tt>%[abcd]</tt>.</p>
<p>The period (.) is the decimal-point character. The locale specific decimal-point
character is accepted as an alternative to the period (.).</p>
<h5>5.4.2.7. <tt>malloc()</tt>, <tt>realloc()</tt> and <tt>calloc()</tt></h5>
<p>In the standard <tt>libc.a</tt> implementation any request to allocate
0 (zero) bytes will fail. A result value of <tt>NULL</tt> will be returned and
the global <tt>errno</tt> variable will be set to <tt>EINVAL</tt>.</p>
<p>In the <tt>libunix.a</tt> implementation a request to allocate
0 (zero) bytes will result in an allocation of at least 4 bytes, which will
be set to zero. Each zero length allocation will return a different
memory address.</p>
<h5>5.4.2.8. <tt>rename()</tt></h5>
<p>In the standard <tt>libc.a</tt> implementation the <tt>rename()</tt> function
will fail if there already is a file or directory by the new name to be used.</p>
<p>In the <tt>libunix.a</tt> implementation the <tt>rename()</tt> function will
delete any existing file or directory by the new name.</p>
<h5>5.4.2.9. <tt>remove()</tt></h5>
<p>In the standard <tt>libc.a</tt> implementation the <tt>remove()</tt> function
will fail if the file is protected by deletion or currently in use.</p>
<p>In the <tt>libunix.a</tt> implementation the <tt>remove()</tt> function
will remove the file when the program exits or the file is closed.</p>
<h5>5.4.2.10. <tt>abort()</tt></h5>
<p>The <tt>abort()</tt> function will flush all buffered files,
close all the files currently open and delete temporary files.</p>
<h5>5.4.2.11. <tt>exit()</tt> and <tt>_Exit()</tt></h5>
<p>The value passed to the <tt>exit()</tt> function will be passed to the
Amiga operating system. The value of <tt>EXIT_FAILURE</tt> is equivalent
to <tt>RETURN_FAIL</tt> as defined in the Amiga system header file
<tt>&lt;dos/dos.h&gt;</tt>; this value maps to the number 20. The value
of <tt>EXIT_SUCCESS</tt> is equivalent to <tt>RETURN_OK</tt> as defined in
the Amiga system header file <tt>&lt;dos/dos.h&gt;</tt>; this value maps to
the number 0.</p>
<p>The <tt>_Exit()</tt> function will flush all buffered files,
close all the files currently open and delete temporary files.</p>
<h5>5.4.2.12. <tt>getenv()</tt></h5>
<p>Environment data is retrieved from the global Amiga operating system environment
storage area through the <tt>dos.library/GetEnv()</tt> function. Global variables are
stored in files in the <tt>ENV:</tt> directory.</p>
<h5>5.4.2.13. <tt>system()</tt></h5>
<p>If the <tt>command</tt> parameter is not NULL and the <tt>system()</tt> function returns, then the result will
be equivalent to the exit code of the program invoked, or -1 if the program could not be started.
This follows the behaviour of the Amiga operating system function <tt>dos.library/System()</tt>.
A return value of 0 typically indicates successful execution and a value &gt; 0
typically indicates failure.</p>
<h5>5.4.2.14. Time</h5>
<p>The default time zone is derived from the Amiga operating system locale
settings and takes the form <tt>GMT+<i>hh</i></tt> or <tt>GMT-<i>hh</i></tt>,
respectively, in which <i>hh</i> stands for the difference between the local
time zone and Greenwich Mean Time.</p>
<p>The <tt>clock_t</tt> and <tt>time_t</tt> types are unsigned 32 bit integers.
The <tt>time_t</tt> epoch starts with midnight January 1st, 1970.</p>
<p>Daylight savings time is not supported.</p>
<p>The reference point used by the <tt>clock()</tt> function is the time
when the program was started.</p>
<h4>5.4.3. Locale specific behaviour</h4>
<p>The direction of printing is from left to right.</p>
<p>The period (.) is the decimal-point character.</p>
<p>The <tt>strftime()</tt> behaviour follows the Amiga operating system locale
settings. If the 'C' locale is in effect, then the output generated by the
<tt>%Z</tt> takes the form <tt>GMT+<i>hh</i></tt> or <tt>GMT-<i>hh</i></tt>,
respectively, in which <i>hh</i> stands for the difference between the local
time zone and Greenwich Mean Time.</p>
<h2>6. Conventions and design issues</h2>
<p>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 <tt>unistd_lchown.c</tt> contains the definition of
the <tt>lchown()</tt> routine, which has its prototype defined in the <tt>&lt;unistd.h&gt;</tt> header
file.</p>
<p>Internal function and variables which need to be visible across several
modules have names prefixed with two underscores, as in <tt>__stdio_init()</tt>.</p>
<p>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, <tt>unlink()</tt> will by default operate like <tt>DeleteFile()</tt> and <tt>rename()</tt>
will return with an error code set if the name of the file/directory to be
renamed would collide with an existing directory entry.</p>
<h2>7. The startup code</h2>
<p>There are three program startup files provided. The most simplistic is in
<tt>startup.c</tt> which I use for SAS/C. It just invokes the setup routine which
eventually calls <tt>main()</tt> and drops straight into <tt>exit()</tt>.</p>
<p>The <tt>ncrt0.S</tt> file was adapted from the libnix startup code which sets up the
base relative data area, if necessary (the <tt>SMALL_DATA</tt> preprocessor symbol must
be defined).</p>
<p>The <tt>nrcrt0.S</tt> 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
<tt>geta4()</tt> stub is missing here; it wouldn't work in a resident program anyway.</p>
<p>The <tt>ncrt0.S</tt> and <tt>nrcrt0.S</tt> 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 <tt>stdlib_main.c</tt> file rather than in
assembly language.</p>
<h2>8. Documentation</h2>
<p>Well, you're reading it. There isn't anything much yet. You can consult the book
<i>'C' - A reference manual</i> and you could look at the
<a href="http://www.opengroup.org/onlinepubs/007904975">Open Group's Single Unix
Specification</a>.</p>
<p>It is recommended to browse the contents of the <tt>include</tt> directory. The
header files contain information on library behaviour and not just data type and
function prototype definitions. Specifically, the <tt>&lt;dos.h&gt;</tt> header file
contains documentation about special libraries and global variables which may be
used or replaced by user code.</p>
<h2>9. Legal status</h2>
<p>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.</p>
<p>The PowerPC math library is based in part on work by Sun Microsystems:</p>
<pre>
====================================================
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.
====================================================
</pre>
<h2>10. Contacting the author</h2>
<p>The basic work was done by Olaf Barthel during two weeks in July 2002. You
can reach me at:</p>
<p>Olaf Barthel<br>
Gneisenaustr. 43<br>
D-31275 Lehrte<br></p>
<p>Or via e-mail:</p>
<p>olsen [at] sourcery&#46;han&#46;de</p>
</body>
</html>

View File

@@ -1,64 +0,0 @@
*asm:
%{m68000:-mc68010} %{mc68000:-mc68010} %{m68020:-mc68020} %{mc68020:-mc68020} %{m68030:-mc68030} %{m68040:-mc68040} %{m68060:-mc68060} %{m68020-40:-mc68020} %{m68020-60:-mc68020} %{!mc68000:%{!m68000:%{!mc68020:%{!m68020:%{!m68030:%{!m68040:%{!m68060:%{!m68020-40:%{!m68020-60:-mc68010}}}}}}}}} %{msmall-code:-sc}
*asm_final:
*cpp:
%{m68881:-D__HAVE_68881__} %{!ansi:%{m68020:-Dmc68020} %{mc68020:-Dmc68020} %{m68020-40:-Dmc68020} %{m68020-60:-Dmc68020} %{m68030:-Dmc68030} %{m68040:-Dmc68040} %{m68060:-Dmc68060}} %{m68020:-D__mc68020__ -D__mc68020} %{mc68020:-D__mc68020__ -D__mc68020} %{m68020-40:-D__mc68020__ -D__mc68020} %{m68020-60:-D__mc68020__ -D__mc68020} %{m68030:-D__mc68030__ -D__mc68030} %{m68040:-D__mc68040__ -D__mc68040} %{m68060:-D__mc68060__ -D__mc68060}
*cc1:
%{resident:-fbaserel} %{resident32:-fbaserel32} %{msmall-code:-fno-function-cse}
*cc1plus:
*endfile:
*link:
%{fbaserel:%{!resident:-m amiga_bss -fl libb}} %{resident:-m amiga_bss -amiga-datadata-reloc -fl libb} %{fbaserel32:%{!resident32:-m amiga_bss -fl libb32}} %{resident32:-m amiga_bss -amiga-datadata-reloc -fl libb32} %{g:-amiga-debug-hunk} %{m68020:-fl libm020} %{mc68020:-fl libm020} %{m68030:-fl libm020} %{m68040:-fl libm020} %{m68060:-fl libm020} %{m68020-40:-fl libm020} %{m68020-60:-fl libm020} %{noixemul:}
*lib:
%{mstackextend:-lstack} -lc -lamiga -ldebug -lgcc -lc
*libgcc:
%{mstackextend:-lstack} -lc -lgcc
*startfile:
%{resident32:nr32crt0.o%s}%{!resident32:%{fbaserel32:nb32crt0.o%s}%{!fbaserel32:%{resident:nrcrt0.o%s}%{!resident:%{fbaserel:nbcrt0.o%s}%{!fbaserel:ncrt0.o%s}}}}
*switches_need_spaces:
*signed_char:
%{funsigned-char:-D__CHAR_UNSIGNED__}
*predefines:
-Dmc68000 -Damiga -Damigaos -DMCH_AMIGA -DAMIGA -D__CLIB2__ -D__chip=__attribute__((__chip__)) -D__saveds=__attribute__((__saveds__)) -D__interrupt=__attribute__((__interrupt__)) -D__stackext=__attribute__((__stackext__)) -D__regargs=__attribute__((__regparm__)) -D__stdargs=__attribute__((__stkparm__)) -D__aligned=__attribute__((__aligned__(4))) -Asystem(amigaos) -Acpu(m68k) -Amachine(m68k)
*cross_compile:
0
*version:
2.95.3
*multilib:
. ;
*multilib_defaults:
*multilib_extra:
*multilib_matches:
*linker:
collect2
*link_command:
%{!fsyntax-only: %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %D %o %{!nostdlib:%{!nodefaultlibs:%G %L %G}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*}
}}}}}}

View File

@@ -1,5 +1,5 @@
# #
# $Id: GNUmakefile.os4,v 1.114 2008-04-28 15:49:25 obarthel Exp $ # $Id: GNUmakefile.os4,v 1.116 2008-11-06 14:44:07 obarthel Exp $
# #
# :ts=8 # :ts=8
# #
@@ -26,10 +26,15 @@ NET_INCLUDE := netinclude
CC := ppc-amigaos-gcc CC := ppc-amigaos-gcc
AR := ppc-amigaos-ar -q AR := ppc-amigaos-ar -q
RANLIB := ppc-amigaos-ranlib RANLIB := ppc-amigaos-ranlib
COPY := cp -a COPY := cp -p
DELETE := rm -rf DELETE := rm -rf
MAKEDIR := mkdir -p MAKEDIR := mkdir -p
LOG_COMMAND := 2>&1 | tee -a compiler.log LOG_COMMAND := 2>&1 | tee -a compiler.log
# You may need to request a specific compiler version in order to
# build the baserel versions of the library. At this time of
# writing (2008-11-06) GCC 4.0.4 and below support the -mbaserel
# feature, but more recent versions, including GCC 4.2.4, do not.
#COMPILER_VERSION := -V4.0.2
# The following are for the native OS4 compiler; note that the # The following are for the native OS4 compiler; note that the
# LOG_COMMAND should not be enabled unless you have a shell # LOG_COMMAND should not be enabled unless you have a shell
@@ -42,6 +47,7 @@ LOG_COMMAND := 2>&1 | tee -a compiler.log
#COPY := copy #COPY := copy
#DELETE := delete all quiet force #DELETE := delete all quiet force
#MAKEDIR := makedir all force #MAKEDIR := makedir all force
#COMPILER_VERSION := -V4.0.2
#LOG_COMMAND := *>< | tee >>compiler.log #LOG_COMMAND := *>< | tee >>compiler.log
############################################################################## ##############################################################################
@@ -53,14 +59,14 @@ WARNINGS := \
# -Wconversion -Wshadow # -Wconversion -Wshadow
INCLUDES := -Iinclude -I. -I$(SDK_INCLUDE) INCLUDES := -Iinclude -I. -I$(SDK_INCLUDE)
OPTIONS := -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-common -std=gnu99 OPTIONS := -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-common -std=gnu99 -mcrt=clib2
OPTIMIZE := -DNDEBUG -O3 OPTIMIZE := -DNDEBUG -O3
#DEBUG := -ggdb #DEBUG := -ggdb
#MEMDEBUG := -D__USE_MEM_TREES -D__MEM_DEBUG #MEMDEBUG := -D__USE_MEM_TREES -D__MEM_DEBUG
CFLAGS := $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(MEMDEBUG) $(OPTIONS) $(INCLUDES) CFLAGS := $(COMPILER_VERSION) $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(MEMDEBUG) $(OPTIONS) $(INCLUDES)
AFLAGS := -Wa,-mregnames AFLAGS := $(COMPILER_VERSION) -Wa,-mregnames
LARGEDATA := -msdata=data LARGEDATA := -msdata=data
SOFTFLOAT := -msdata=data -msoft-float SOFTFLOAT := -msdata=data -msoft-float
@@ -214,13 +220,13 @@ lib.threadsafe/baserel/%.o : %.c
define COMPILE define COMPILE
-$(MAKEDIR) $(@D) -$(MAKEDIR) $(@D)
echo "Compiling $< [$(@D)]" echo "Compiling $< [$(@D)]"
$(CC) -o $@ -c $(CFLAGS) $< $(LOG_COMMAND) $(CC) $(CFLAGS) -o $@ -c $< $(LOG_COMMAND)
endef endef
define ASSEMBLE define ASSEMBLE
-$(MAKEDIR) $(@D) -$(MAKEDIR) $(@D)
echo "Assembling $< [$(@D)]" echo "Assembling $< [$(@D)]"
$(CC) -o $@ -c $(AFLAGS) $< $(LOG_COMMAND) $(CC) $(AFLAGS) -o $@ -c $< $(LOG_COMMAND)
endef endef
define MAKELIB define MAKELIB

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 203 #define REVISION 205
#define DATE "28.4.2008" #define DATE "21.8.2010"
#define VERS "amiga.lib 1.203" #define VERS "amiga.lib 1.205"
#define VSTRING "amiga.lib 1.203 (28.4.2008)\r\n" #define VSTRING "amiga.lib 1.205 (21.8.2010)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.203 (28.4.2008)" #define VERSTAG "\0$VER: amiga.lib 1.205 (21.8.2010)"

View File

@@ -1 +1 @@
203 205

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: amiga_argarrayinit.c,v 1.6 2006-09-22 09:02:51 obarthel Exp $ * $Id: amiga_argarrayinit.c,v 1.7 2008-09-30 14:09:00 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -52,6 +52,14 @@
/****************************************************************************/ /****************************************************************************/
#ifdef __amigaos4__
#define MEMORY_TYPE MEMF_PRIVATE
#else
#define MEMORY_TYPE MEMF_ANY
#endif /* __amigaos4__ */
/****************************************************************************/
const unsigned char ** CXLIB_argarray; const unsigned char ** CXLIB_argarray;
struct DiskObject * CXLIB_disko; struct DiskObject * CXLIB_disko;
@@ -70,7 +78,7 @@ ArgArrayInit(LONG argc, CONST_STRPTR * argv)
if(argc == 1) if(argc == 1)
goto out; /* skip command name */ goto out; /* skip command name */
CXLIB_argarray = (const unsigned char **)AllocVec(sizeof(char *) * argc,MEMF_ANY|MEMF_CLEAR); CXLIB_argarray = (const unsigned char **)AllocVec(sizeof(char *) * argc,MEMORY_TYPE|MEMF_CLEAR);
if(CXLIB_argarray == NULL) if(CXLIB_argarray == NULL)
goto out; goto out;

View File

@@ -13,9 +13,9 @@ rm -rf $dir_name
# Create the directory, copy all the libraries, header files # Create the directory, copy all the libraries, header files
# and release note files inside. # and release note files inside.
mkdir $dir_name mkdir $dir_name
cp -a lib $dir_name cp -pR lib $dir_name
cp -a lib.threadsafe $dir_name cp -pR lib.threadsafe $dir_name
cp -a include $dir_name cp -pR include $dir_name
cp changes $dir_name cp changes $dir_name
# Delete the CVS data from the include directory # Delete the CVS data from the include directory

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 203 #define REVISION 205
#define DATE "28.4.2008" #define DATE "21.8.2010"
#define VERS "c.lib 1.203" #define VERS "c.lib 1.205"
#define VSTRING "c.lib 1.203 (28.4.2008)\r\n" #define VSTRING "c.lib 1.205 (21.8.2010)\r\n"
#define VERSTAG "\0$VER: c.lib 1.203 (28.4.2008)" #define VERSTAG "\0$VER: c.lib 1.205 (21.8.2010)"

View File

@@ -1 +1 @@
203 205

View File

@@ -1,3 +1,54 @@
c.lib 1.205 (21.8.2010)
- Added dlclose(), dlerror(), dlopen() and dlsym() functions, which are
available only under OS4. There is a variant of dlopen() in libunix.a
which will perform a path name conversion. Note that these functions
will not work in the thread-safe variant of the library because it
would be unwise to tinker with the currently running program's binary.
- Added support for ELF shared objects and libraries. This is implemented through
constructor/destructor functions, which means that you can use this
functionality even in Amiga Exec style shared libraries, with the proper
library initialization code to invoke the constructor/destructor functions
for you.
- Updated uname() to recognize AmigaOS 4.1.
- The translation from Unix to Amiga path names did not properly process
multiple occurences of "/./" in the path name. Thanks go to Steven Solie
for finding the issue.
- The detection of "/./" and "/../" patterns in Unix path names to be
translated into Amiga path names did not test if it was overrunning
the end of the string.
- If strcmp(), strncmp() and memcmp() detect a pair of different
characters, then the function result must be calculated as if the
characters were of type "unsigned char". This is a requirement
according to the ISO 'C' (1994) standard. Thanks go to Georg Steger
for finding the issue.
- The definitions for INT_MIN, INT_MAX and UINT_MAX in <limits.h> no
longer use long integer types, as prompted by Steven Solie.
c.lib 1.204 (11.11.2008)
- The memory allocated by malloc() and friends is now of type MEMF_PRIVATE
under OS4 and beyond. The AmigaOS 2.x/3.x compatible code will still
use MEMF_ANY in the same situation, though. Other uses of MEMF_ANY have
been replaced as well where MEMF_PRIVATE would have made better sense.
- I/O buffers allocated are now aligned according to the CPU cache line size,
if the operating system can supply such detailed information.
- unsetenv() now returns a status value.
- Corrected the function prototype for wcspbrk().
- Added function prototypes for mbrtowc_l(), wcscoll_l(), wcscspn() and wcsrchr().
c.lib 1.203 (28.4.2008) c.lib 1.203 (28.4.2008)
- Added 68k stubs to amiga_rexxvars.c for the OS4 build to use. The new code now - Added 68k stubs to amiga_rexxvars.c for the OS4 build to use. The new code now

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: crtbegin.c,v 1.11 2006-09-22 09:02:51 obarthel Exp $ * $Id: crtbegin.c,v 1.13 2010-08-21 11:37:03 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -35,9 +35,14 @@ void _fini(void);
void void
_init(void) _init(void)
{ {
extern void shared_obj_init(void);
int num_ctors,i; int num_ctors,i;
int j; int j;
/* The shared objects need to be set up before any local
constructors are invoked. */
shared_obj_init();
for(i = 1, num_ctors = 0 ; __CTOR_LIST__[i] != NULL ; i++) for(i = 1, num_ctors = 0 ; __CTOR_LIST__[i] != NULL ; i++)
num_ctors++; num_ctors++;
@@ -50,6 +55,7 @@ _init(void)
void void
_fini(void) _fini(void)
{ {
extern void shared_obj_exit(void);
int num_dtors,i; int num_dtors,i;
static int j; static int j;
@@ -58,6 +64,10 @@ _fini(void)
while(j++ < num_dtors) while(j++ < num_dtors)
__DTOR_LIST__[j](); __DTOR_LIST__[j]();
/* The shared objects need to be cleaned up after all local
destructors have been invoked. */
shared_obj_exit();
} }
/****************************************************************************/ /****************************************************************************/

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 203 #define REVISION 205
#define DATE "28.4.2008" #define DATE "21.8.2010"
#define VERS "debug.lib 1.203" #define VERS "debug.lib 1.205"
#define VSTRING "debug.lib 1.203 (28.4.2008)\r\n" #define VSTRING "debug.lib 1.205 (21.8.2010)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.203 (28.4.2008)" #define VERSTAG "\0$VER: debug.lib 1.205 (21.8.2010)"

View File

@@ -1 +1 @@
203 205

87
library/include/dlfcn.h Normal file
View File

@@ -0,0 +1,87 @@
/*
* $Id: dlfcn.h,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) 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.
*
*****************************************************************************
*
* Documentation and source code for this library, and the most recent library
* build are available from <http://sourceforge.net/projects/clib2>.
*
*****************************************************************************
*/
#ifndef _DLFCN_H
#define _DLFCN_H
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
/* We only support a subset of the flags available on Unix systems. */
#define RTLD_LAZY 1
#define RTLD_NOW 2
#define RTLD_LOCAL 4
#define RTLD_GLOBAL 8
#define RTLD_DEFAULT ((void *)0)
/****************************************************************************/
extern int dlclose(void * __handle);
extern const char * dlerror(void);
extern void * dlopen(const char * __path_name,int __mode);
extern void * dlsym(void * __handle,const char * __symbol_name);
/****************************************************************************/
#endif /* __amigaos4__ */
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */
/****************************************************************************/
#endif /* _DLFCN_H */

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: limits.h,v 1.11 2006-01-08 12:06:14 obarthel Exp $ * $Id: limits.h,v 1.12 2010-08-20 15:33:36 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -78,9 +78,9 @@
/****************************************************************************/ /****************************************************************************/
#define INT_MIN (-2147483647L - 1) #define INT_MIN (-2147483647 - 1)
#define INT_MAX 2147483647L #define INT_MAX 2147483647
#define UINT_MAX 4294967295UL #define UINT_MAX 4294967295U
/****************************************************************************/ /****************************************************************************/
@@ -109,7 +109,7 @@
/****************************************************************************/ /****************************************************************************/
#define SSIZE_MAX 2147483647L #define SSIZE_MAX LONG_MAX
/****************************************************************************/ /****************************************************************************/

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib.h,v 1.18 2006-11-13 09:51:53 obarthel Exp $ * $Id: stdlib.h,v 1.19 2008-04-30 14:34:03 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -195,7 +195,7 @@ extern int rand_r(unsigned int * seed);
extern int setenv(const char *name, const char *value, int overwrite); extern int setenv(const char *name, const char *value, int overwrite);
extern int putenv(const char *string); extern int putenv(const char *string);
extern void unsetenv(const char *name); extern int unsetenv(const char *name);
extern char * mktemp(char * name_template); extern char * mktemp(char * name_template);
extern int mkstemp(char *name_template); extern int mkstemp(char *name_template);
extern char * mkdtemp(char *name_template); extern char * mkdtemp(char *name_template);

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: wchar.h,v 1.7 2006-01-08 12:06:14 obarthel Exp $ * $Id: wchar.h,v 1.8 2008-04-30 14:34:03 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -97,7 +97,7 @@ extern wchar_t * wcsncpy(wchar_t *dest, const wchar_t *src, size_t n);
extern size_t wcslen(const wchar_t *s); extern size_t wcslen(const wchar_t *s);
extern wchar_t * wcschr(const wchar_t *s, wchar_t c); extern wchar_t * wcschr(const wchar_t *s, wchar_t c);
extern size_t wcsspn(const wchar_t *s, const wchar_t *set); extern size_t wcsspn(const wchar_t *s, const wchar_t *set);
extern wchar_t wcspbrk(const wchar_t *s, const wchar_t *set); extern wchar_t *wcspbrk(const wchar_t *s, const wchar_t *set);
extern wchar_t *wcstok(wchar_t *str, const wchar_t *set); extern wchar_t *wcstok(wchar_t *str, const wchar_t *set);
extern wchar_t *wcsstr(const wchar_t *src, const wchar_t *sub); extern wchar_t *wcsstr(const wchar_t *src, const wchar_t *sub);
@@ -179,6 +179,11 @@ extern size_t wcsftime(wchar_t *s, size_t maxsize, const wchar_t *format, const
extern long long wcstoll(const wchar_t *str, wchar_t **ptr, int base); extern long long wcstoll(const wchar_t *str, wchar_t **ptr, int base);
extern unsigned long long wcstoull(const wchar_t *str, wchar_t **ptr, int base); extern unsigned long long wcstoull(const wchar_t *str, wchar_t **ptr, int base);
extern size_t mbrtowc_l(wchar_t *restrict pwc, const char *restrict s, size_t n, mbstate_t *restrict ps, locale_t loc);
extern int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t loc);
extern size_t wcscspn(const wchar_t *ws1, const wchar_t *ws2);
extern wchar_t * wcsrchr(const wchar_t *ws, wchar_t wc);
#endif /* __STDC_VERSION__ && __STDC_VERSION__ >= 199901L */ #endif /* __STDC_VERSION__ && __STDC_VERSION__ >= 199901L */
/****************************************************************************/ /****************************************************************************/

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: wctype.h,v 1.7 2006-01-08 12:06:14 obarthel Exp $ * $Id: wctype.h,v 1.8 2008-04-30 14:41:28 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -68,7 +68,7 @@ extern int iswdigit(wint_t c);
extern int iswxdigit(wint_t c); extern int iswxdigit(wint_t c);
extern int iswgraph(wint_t c); extern int iswgraph(wint_t c);
extern int iswpunc(wint_t c); extern int iswpunct(wint_t c);
extern int iswprint(wint_t c); extern int iswprint(wint_t c);
extern int iswlower(wint_t c); extern int iswlower(wint_t c);

View File

@@ -1,5 +1,5 @@
# #
# $Id: libc.gmk,v 1.4 2006-11-16 14:39:23 obarthel Exp $ # $Id: libc.gmk,v 1.8 2010-08-21 11:37:03 obarthel Exp $
# #
# :ts=8 # :ts=8
# #
@@ -205,6 +205,10 @@ C_LIB := \
stdlib_div.o \ stdlib_div.o \
stdlib_divsi3.o \ stdlib_divsi3.o \
stdlib_divsi4.o \ stdlib_divsi4.o \
stdlib_dlclose.o \
stdlib_dlerror.o \
stdlib_dlopen.o \
stdlib_dlsym.o \
stdlib_dosbase.o \ stdlib_dosbase.o \
stdlib_exit.o \ stdlib_exit.o \
stdlib_free.o \ stdlib_free.o \
@@ -248,6 +252,7 @@ C_LIB := \
stdlib_setjmp.o \ stdlib_setjmp.o \
stdlib_set_errno.o \ stdlib_set_errno.o \
stdlib_set_process_window.o \ stdlib_set_process_window.o \
stdlib_shared_objs.o \
stdlib_shell_escape.o \ stdlib_shell_escape.o \
stdlib_showerror.o \ stdlib_showerror.o \
stdlib_srand.o \ stdlib_srand.o \

View File

@@ -1,5 +1,5 @@
# #
# $Id: libunix.gmk,v 1.3 2006-11-13 09:25:28 obarthel Exp $ # $Id: libunix.gmk,v 1.4 2010-08-21 10:59:34 obarthel Exp $
# #
# :ts=8 # :ts=8
# #
@@ -57,6 +57,7 @@ UNIX_LIB := \
stdlib_alloca_cleanup.o \ stdlib_alloca_cleanup.o \
stdlib_alloca_trap.o \ stdlib_alloca_trap.o \
stdlib_arg.o \ stdlib_arg.o \
stdlib_dlopen.o \
stdlib_expand_wildcard.o \ stdlib_expand_wildcard.o \
stdlib_expand_wildcard_check.o \ stdlib_expand_wildcard_check.o \
stdlib_getmemstats.o \ stdlib_getmemstats.o \

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 203 #define REVISION 205
#define DATE "28.4.2008" #define DATE "21.8.2010"
#define VERS "m.lib 1.203" #define VERS "m.lib 1.205"
#define VSTRING "m.lib 1.203 (28.4.2008)\r\n" #define VSTRING "m.lib 1.205 (21.8.2010)\r\n"
#define VERSTAG "\0$VER: m.lib 1.203 (28.4.2008)" #define VERSTAG "\0$VER: m.lib 1.205 (21.8.2010)"

View File

@@ -1 +1 @@
203 205

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 202 #define REVISION 205
#define DATE "16.1.2007" #define DATE "21.8.2010"
#define VERS "m881.lib 1.202" #define VERS "m881.lib 1.205"
#define VSTRING "m881.lib 1.202 (16.1.2007)\r\n" #define VSTRING "m881.lib 1.205 (21.8.2010)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.202 (16.1.2007)" #define VERSTAG "\0$VER: m881.lib 1.205 (21.8.2010)"

View File

@@ -1 +1 @@
202 205

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 203 #define REVISION 205
#define DATE "28.4.2008" #define DATE "21.8.2010"
#define VERS "net.lib 1.203" #define VERS "net.lib 1.205"
#define VSTRING "net.lib 1.203 (28.4.2008)\r\n" #define VSTRING "net.lib 1.205 (21.8.2010)\r\n"
#define VERSTAG "\0$VER: net.lib 1.203 (28.4.2008)" #define VERSTAG "\0$VER: net.lib 1.205 (21.8.2010)"

View File

@@ -1 +1 @@
203 205

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_file_init.c,v 1.12 2006-11-16 14:39:23 obarthel Exp $ * $Id: stdio_file_init.c,v 1.13 2008-09-04 12:07:58 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -76,6 +76,11 @@ struct WBStartup * NOCOMMON __WBenchMsg;
/****************************************************************************/ /****************************************************************************/
/* CPU cache line size; used to align I/O buffers for best performance. */
ULONG __cache_line_size = 32;
/****************************************************************************/
FILE_DESTRUCTOR(workbench_exit) FILE_DESTRUCTOR(workbench_exit)
{ {
ENTER(); ENTER();
@@ -215,6 +220,24 @@ FILE_CONSTRUCTOR(stdio_file_init)
ENTER(); ENTER();
/* Figure out the proper address alignment for the memory we are
going to use for disk I/O. The default is 32 bytes, which should
be OK for most cases. If possible, ask the operating system for
its preferred alignment size. */
#if defined(__amigaos4__)
{
if(SysBase->lib_Version >= 50)
{
uint32 physical_alignment = 0;
GetCPUInfoTags(GCIT_CacheLineSize,&physical_alignment,TAG_DONE);
if(__cache_line_size < physical_alignment)
__cache_line_size = physical_alignment;
}
}
#endif /* __amigaos4__ */
/* If we were invoked from Workbench, set up the standard I/O streams. */ /* If we were invoked from Workbench, set up the standard I/O streams. */
if(__WBenchMsg != NULL) if(__WBenchMsg != NULL)
{ {
@@ -255,7 +278,7 @@ FILE_CONSTRUCTOR(stdio_file_init)
PROFILE_ON(); PROFILE_ON();
/* Allocate a little more memory than necessary. */ /* Allocate a little more memory than necessary. */
buffer = malloc(BUFSIZ + (CACHE_LINE_SIZE-1)); buffer = malloc(BUFSIZ + (__cache_line_size - 1));
if(buffer == NULL) if(buffer == NULL)
goto out; goto out;
@@ -300,7 +323,7 @@ FILE_CONSTRUCTOR(stdio_file_init)
#endif /* __THREAD_SAFE */ #endif /* __THREAD_SAFE */
/* Align the buffer start address to a cache line boundary. */ /* Align the buffer start address to a cache line boundary. */
aligned_buffer = (char *)((ULONG)(buffer + (CACHE_LINE_SIZE-1)) & ~(CACHE_LINE_SIZE-1)); aligned_buffer = (char *)((ULONG)(buffer + (__cache_line_size-1)) & ~(__cache_line_size-1));
__initialize_fd(__fd[i],__fd_hook_entry,default_file,fd_flags,fd_lock); __initialize_fd(__fd[i],__fd_hook_entry,default_file,fd_flags,fd_lock);

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_grow_file.c,v 1.7 2006-11-16 14:39:23 obarthel Exp $ * $Id: stdio_grow_file.c,v 1.8 2008-09-04 12:07:58 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -90,7 +90,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
/* Allocate a little more memory than required to allow for /* Allocate a little more memory than required to allow for
* the buffer to be aligned to a cache line boundary. * the buffer to be aligned to a cache line boundary.
*/ */
buffer = malloc((size_t)buffer_size + (CACHE_LINE_SIZE-1)); buffer = malloc((size_t)buffer_size + (__cache_line_size-1));
if(buffer == NULL) if(buffer == NULL)
{ {
SHOWMSG("not enough memory for write buffer"); SHOWMSG("not enough memory for write buffer");
@@ -100,7 +100,7 @@ __grow_file_size(struct fd * fd,int num_bytes)
} }
/* Align the buffer to a cache line boundary. */ /* Align the buffer to a cache line boundary. */
aligned_buffer = (unsigned char *)(((ULONG)(buffer + (CACHE_LINE_SIZE-1))) & ~(CACHE_LINE_SIZE-1)); aligned_buffer = (unsigned char *)(((ULONG)(buffer + (__cache_line_size-1))) & ~(__cache_line_size-1));
memset(aligned_buffer,0,(size_t)buffer_size); memset(aligned_buffer,0,(size_t)buffer_size);

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_headers.h,v 1.30 2006-11-16 14:39:23 obarthel Exp $ * $Id: stdio_headers.h,v 1.31 2008-09-04 12:07:58 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -156,18 +156,6 @@ struct iob;
/****************************************************************************/ /****************************************************************************/
/* CPU cache line size; used for alignment purposes with some data structures.
This should be determined dynamically rather than preset here. For the
68040/68060 the cache line size is 16 bytes, for the PowerPC G4 it's
32 bytes and 128 bytes (gross!) for the PowerPC G5. */
#if defined(__PPC__)
#define CACHE_LINE_SIZE 32UL
#else
#define CACHE_LINE_SIZE 16UL
#endif /* __PPC__ */
/****************************************************************************/
/* The directory entry type a socket is identified with (in a FileInfoBlock). */ /* The directory entry type a socket is identified with (in a FileInfoBlock). */
#define ST_SOCKET (31082002) #define ST_SOCKET (31082002)
@@ -399,6 +387,11 @@ extern BOOL NOCOMMON __no_standard_io;
/****************************************************************************/ /****************************************************************************/
/* CPU cache line size; used to align I/O buffers for best performance. */
extern ULONG __cache_line_size;
/****************************************************************************/
/*extern int __iob_write_buffer_is_full(struct iob * file);*/ /*extern int __iob_write_buffer_is_full(struct iob * file);*/
#define __iob_write_buffer_is_full(file) \ #define __iob_write_buffer_is_full(file) \

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_openiob.c,v 1.14 2006-01-08 12:04:24 obarthel Exp $ * $Id: stdio_openiob.c,v 1.15 2008-09-04 12:07:58 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -133,7 +133,7 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
SHOWMSG("allocating file buffer"); SHOWMSG("allocating file buffer");
/* Allocate a little more memory than necessary. */ /* Allocate a little more memory than necessary. */
buffer = malloc(BUFSIZ + (CACHE_LINE_SIZE-1)); buffer = malloc(BUFSIZ + (__cache_line_size-1));
if(buffer == NULL) if(buffer == NULL)
{ {
SHOWMSG("that didn't work"); SHOWMSG("that didn't work");
@@ -143,7 +143,7 @@ __open_iob(const char *filename, const char *mode, int file_descriptor, int slot
} }
/* Align the buffer start address to a cache line boundary. */ /* Align the buffer start address to a cache line boundary. */
aligned_buffer = (char *)((ULONG)(buffer + (CACHE_LINE_SIZE-1)) & ~(CACHE_LINE_SIZE-1)); aligned_buffer = (char *)((ULONG)(buffer + (__cache_line_size-1)) & ~(__cache_line_size-1));
if(file_descriptor < 0) if(file_descriptor < 0)
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_popen.c,v 1.9 2006-01-08 12:04:24 obarthel Exp $ * $Id: stdio_popen.c,v 1.10 2008-05-07 09:33:55 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -154,7 +154,9 @@ popen(const char *command, const char *type)
goto out; goto out;
} }
/* The current PIPE: device only supports unidirectional connections. */ /* The current PIPE: device only supports unidirectional connections. Worse: even if
a PIPE: device with bidirectional connection support were available, we would
be unable to detect this property. */
if((type[1] == '+') || (type[1] != '\0' && type[2] == '+')) if((type[1] == '+') || (type[1] != '\0' && type[2] == '+'))
{ {
D(("unsupported access mode '%s'",type)); D(("unsupported access mode '%s'",type));

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdio_setvbuf.c,v 1.10 2006-09-22 09:02:51 obarthel Exp $ * $Id: stdio_setvbuf.c,v 1.11 2008-09-04 12:07:58 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -123,7 +123,7 @@ setvbuf(FILE *stream,char *buf,int bufmode,size_t size)
if(size > 0 && buf == NULL) if(size > 0 && buf == NULL)
{ {
/* Allocate a little more memory than necessary. */ /* Allocate a little more memory than necessary. */
new_buffer = malloc(size + (CACHE_LINE_SIZE-1)); new_buffer = malloc(size + (__cache_line_size-1));
if(new_buffer == NULL) if(new_buffer == NULL)
{ {
__set_errno(ENOBUFS); __set_errno(ENOBUFS);
@@ -170,7 +170,7 @@ setvbuf(FILE *stream,char *buf,int bufmode,size_t size)
file->iob_CustomBuffer = new_buffer; file->iob_CustomBuffer = new_buffer;
/* Align the buffer start address to a cache line boundary. */ /* Align the buffer start address to a cache line boundary. */
new_buffer = (char *)((ULONG)(new_buffer + (CACHE_LINE_SIZE-1)) & ~(CACHE_LINE_SIZE-1)); new_buffer = (char *)((ULONG)(new_buffer + (__cache_line_size-1)) & ~(__cache_line_size-1));
} }
} }

86
library/stdlib_dlclose.c Normal file
View File

@@ -0,0 +1,86 @@
/*
* $Id: stdlib_dlclose.c,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) 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_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
#include <dlfcn.h>
/****************************************************************************/
#include <libraries/elf.h>
#include <proto/elf.h>
/****************************************************************************/
extern struct ElfIFace * __IElf;
extern Elf32_Handle __dl_elf_handle;
extern Elf32_Error __elf_error_code;
/****************************************************************************/
int dlclose(void * handle)
{
int result = -1;
if(__dl_elf_handle != NULL)
{
struct ElfIFace * IElf = __IElf;
Elf32_Error error;
error = DLClose(__dl_elf_handle,handle);
if(error != ELF32_NO_ERROR)
{
__elf_error_code = error;
goto out;
}
}
result = 0;
out:
return(result);
}
/****************************************************************************/
#endif /* __amigaos4__ */

132
library/stdlib_dlerror.c Normal file
View File

@@ -0,0 +1,132 @@
/*
* $Id: stdlib_dlerror.c,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) 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_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
#include <dlfcn.h>
/****************************************************************************/
#include <libraries/elf.h>
/****************************************************************************/
extern Elf32_Error __elf_error_code;
/****************************************************************************/
const char * dlerror(void)
{
const char * result;
switch(__elf_error_code)
{
case ELF32_NO_ERROR:
result = NULL;
break;
case ELF32_OUT_OF_MEMORY:
result = "out of memory";
break;
case ELF32_INVALID_HANDLE:
result = "invalid handle";
break;
case ELF32_NO_MORE_RELOCS:
result = "no more relocs";
break;
case ELF32_SECTION_NOT_LOADED:
result = "section not loaded";
break;
case ELF32_UNKNOWN_RELOC:
result = "unknown reloc";
break;
case ELF32_READ_ERROR:
result = "read error";
break;
case ELF32_INVALID_SDA_BASE:
result = "invalid SDA base";
break;
case ELF32_SYMBOL_NOT_FOUND:
result = "symbol not found";
break;
case ELF32_INVALID_NAME:
result = "invalid name";
break;
case ELF32_REQUIRED_OBJECT_MISSING:
result = "required object missing";
break;
default:
result = "unknown error";
break;
}
/* Calling dlerror() will clear the error code. */
__elf_error_code = ELF32_NO_ERROR;
return(result);
}
/****************************************************************************/
#endif /* __amigaos4__ */

112
library/stdlib_dlopen.c Normal file
View File

@@ -0,0 +1,112 @@
/*
* $Id: stdlib_dlopen.c,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) 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_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
#include <dlfcn.h>
/****************************************************************************/
#include <libraries/elf.h>
#include <proto/elf.h>
/****************************************************************************/
extern struct ElfIFace * __IElf;
extern Elf32_Handle __dl_elf_handle;
/****************************************************************************/
void * dlopen(const char * path_name,int mode)
{
#if defined(UNIX_PATH_SEMANTICS)
struct name_translation_info path_name_nti;
#endif /* UNIX_PATH_SEMANTICS */
void * result = NULL;
#if defined(UNIX_PATH_SEMANTICS)
{
if(__unix_path_semantics)
{
if(path_name[0] == '\0')
{
SHOWMSG("no name given");
__set_errno(ENOENT);
goto out;
}
if(__translate_unix_to_amiga_path_name(&path_name,&path_name_nti) != 0)
goto out;
if(path_name_nti.is_root)
{
__set_errno(EACCES);
goto out;
}
}
}
#endif /* UNIX_PATH_SEMANTICS */
if(__dl_elf_handle != NULL)
{
struct ElfIFace * IElf = __IElf;
uint32 flags = 0;
if(mode & RTLD_LOCAL)
flags = ELF32_RTLD_LOCAL;
if(mode & RTLD_GLOBAL)
flags = ELF32_RTLD_GLOBAL;
result = DLOpen(__dl_elf_handle,path_name,flags);
}
out:
return(result);
}
/****************************************************************************/
#endif /* __amigaos4__ */

87
library/stdlib_dlsym.c Normal file
View File

@@ -0,0 +1,87 @@
/*
* $Id: stdlib_dlsym.c,v 1.2 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) 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_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
/* The shared object API is available only on AmigaOS 4.0. */
#if defined(__amigaos4__)
/****************************************************************************/
#include <dlfcn.h>
/****************************************************************************/
#include <libraries/elf.h>
#include <proto/elf.h>
/****************************************************************************/
extern struct ElfIFace * __IElf;
extern Elf32_Handle __dl_elf_handle;
extern Elf32_Error __elf_error_code;
/****************************************************************************/
void * dlsym(void * handle,const char * symbol_name)
{
void * result = NULL;
if(__dl_elf_handle != NULL)
{
struct ElfIFace * IElf = __IElf;
APTR symbol_data = NULL;
Elf32_Error error;
error = DLSym(__dl_elf_handle,handle,symbol_name,&symbol_data);
if(error != ELF32_NO_ERROR)
{
__elf_error_code = error;
goto out;
}
result = symbol_data;
}
out:
return(result);
}
/****************************************************************************/
#endif /* __amigaos4__ */

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib_main.c,v 1.33 2006-09-25 14:51:15 obarthel Exp $ * $Id: stdlib_main.c,v 1.34 2008-09-30 14:09:00 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -61,6 +61,16 @@
/****************************************************************************/ /****************************************************************************/
/* On OS4 memory of type MEMF_ANY may not be paged out. Where this is desirable
MEMF_PRIVATE should be used instead. */
#ifdef __amigaos4__
#define MEMORY_TYPE MEMF_PRIVATE
#else
#define MEMORY_TYPE MEMF_ANY
#endif /* __amigaos4__ */
/****************************************************************************/
extern int main(int arg_c,char ** arg_v); extern int main(int arg_c,char ** arg_v);
/****************************************************************************/ /****************************************************************************/
@@ -107,7 +117,7 @@ call_main(void)
struct Process * this_process = (struct Process *)FindTask(NULL); struct Process * this_process = (struct Process *)FindTask(NULL);
UBYTE * arg_str = GetArgStr(); UBYTE * arg_str = GetArgStr();
size_t arg_str_len = strlen(arg_str); size_t arg_str_len = strlen(arg_str);
UBYTE * arg_str_copy = AllocVec(arg_str_len+1,MEMF_ANY); UBYTE * arg_str_copy = AllocVec(arg_str_len+1,MEMF_PRIVATE);
UBYTE current_dir_name[256]; UBYTE current_dir_name[256];
if(arg_str_copy != NULL && NameFromLock(this_process->pr_CurrentDir,current_dir_name,sizeof(current_dir_name))) if(arg_str_copy != NULL && NameFromLock(this_process->pr_CurrentDir,current_dir_name,sizeof(current_dir_name)))

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib_malloc.c,v 1.19 2006-01-08 12:04:25 obarthel Exp $ * $Id: stdlib_malloc.c,v 1.20 2008-09-30 14:09:00 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -143,9 +143,21 @@ __allocate_memory(size_t size,BOOL never_free,const char * UNUSED unused_file,in
#endif /* __MEM_DEBUG */ #endif /* __MEM_DEBUG */
if(__memory_pool != NULL) if(__memory_pool != NULL)
{
mn = AllocPooled(__memory_pool,allocation_size); mn = AllocPooled(__memory_pool,allocation_size);
}
else else
mn = AllocMem(allocation_size,MEMF_ANY); {
#if defined(__amigaos4__)
{
mn = AllocMem(allocation_size,MEMF_PRIVATE);
}
#else
{
mn = AllocMem(allocation_size,MEMF_ANY);
}
#endif /* __amigaos4__ */
}
if(mn == NULL) if(mn == NULL)
{ {
@@ -401,7 +413,7 @@ STDLIB_CONSTRUCTOR(stdlib_memory_init)
#if defined(__amigaos4__) #if defined(__amigaos4__)
{ {
__memory_pool = CreatePool(MEMF_ANY,(ULONG)__default_pool_size,(ULONG)__default_puddle_size); __memory_pool = CreatePool(MEMF_PRIVATE,(ULONG)__default_pool_size,(ULONG)__default_puddle_size);
} }
#else #else
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib_program_name.c,v 1.2 2006-01-08 12:04:26 obarthel Exp $ * $Id: stdlib_program_name.c,v 1.3 2008-09-30 14:09:00 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -49,6 +49,14 @@
/****************************************************************************/ /****************************************************************************/
#ifdef __amigaos4__
#define MEMORY_TYPE MEMF_PRIVATE
#else
#define MEMORY_TYPE MEMF_ANY
#endif /* __amigaos4__ */
/****************************************************************************/
static BOOL free_program_name; static BOOL free_program_name;
/****************************************************************************/ /****************************************************************************/
@@ -83,7 +91,7 @@ STDLIB_CONSTRUCTOR(stdlib_program_name_init)
const size_t program_name_size = 256; const size_t program_name_size = 256;
/* Make a copy of the current command name string. */ /* Make a copy of the current command name string. */
__program_name = AllocVec((ULONG)program_name_size,MEMF_ANY); __program_name = AllocVec((ULONG)program_name_size,MEMORY_TYPE);
if(__program_name == NULL) if(__program_name == NULL)
goto out; goto out;

View File

@@ -0,0 +1,192 @@
/*
* $Id: stdlib_shared_objs.c,v 1.1 2010-08-21 11:37:03 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2010 by Olaf Barthel <olsen (at) 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.
*/
#if defined(__amigaos4__)
/****************************************************************************/
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
#include <libraries/elf.h>
#include <proto/elf.h>
/****************************************************************************/
/* These are used to initialize the shared objects linked to this binary,
and for the dlopen(), dlclose() and dlsym() functions. */
struct Library * __ElfBase;
struct ElfIFace * __IElf;
/* This is used with the dlopen(), dlclose() and dlsym() functions. */
Elf32_Handle __dl_elf_handle;
/****************************************************************************/
/* This is used to initialize the shared objects only. */
static Elf32_Handle elf_handle;
/****************************************************************************/
void shared_obj_init(void);
void shared_obj_exit(void);
/****************************************************************************/
static VOID close_elf_library(void)
{
if(__IElf != NULL)
{
DropInterface((struct Interface *)__IElf);
__IElf = NULL;
}
if(__ElfBase != NULL)
{
CloseLibrary(__ElfBase);
__ElfBase = NULL;
}
}
/****************************************************************************/
static BOOL open_elf_library(void)
{
BOOL success = FALSE;
/* We need elf.library V52.2 or higher. */
__ElfBase = OpenLibrary("elf.library",0);
if(__ElfBase == NULL || (__ElfBase->lib_Version < 52) || (__ElfBase->lib_Version == 52 && __ElfBase->lib_Revision < 2))
goto out;
__IElf = (struct ElfIFace *)GetInterface(__ElfBase,"main",1,NULL);
if(__IElf == NULL)
goto out;
success = TRUE;
out:
return(success);
}
/****************************************************************************/
void shared_obj_exit(void)
{
struct ElfIFace * IElf = __IElf;
#ifndef __THREAD_SAFE
{
/* Release this program's Elf handle, if we grabbed it below. */
if(__dl_elf_handle != NULL)
{
CloseElfTags(__dl_elf_handle,
CET_ReClose,TRUE,
TAG_DONE);
__dl_elf_handle = NULL;
}
}
#endif /* __THREAD_SAFE */
/* If we got what we wanted, trigger the destructors,
etc. in the shared objects linked to this binary. */
if(elf_handle != NULL)
{
InitSHLibs(elf_handle,FALSE);
elf_handle = NULL;
}
close_elf_library();
}
/****************************************************************************/
void shared_obj_init(void)
{
if(open_elf_library())
{
struct ElfIFace * IElf = __IElf;
BPTR segment_list;
/* Try to find the Elf handle associated with this
program's segment list. */
segment_list = GetProcSegList(NULL,GPSLF_CLI | GPSLF_SEG);
if(segment_list != ZERO)
{
if(GetSegListInfoTags(segment_list,
GSLI_ElfHandle,&elf_handle,
TAG_DONE) == 1)
{
if(elf_handle != NULL)
{
/* Trigger the constructors, etc. in the shared objects
linked to this binary. */
InitSHLibs(elf_handle,TRUE);
}
}
}
/* Next: try to grab the Elf handle associated with the currently
running process. This is not thread-safe! */
#ifndef __THREAD_SAFE
{
segment_list = GetProcSegList(NULL,GPSLF_RUN);
if(segment_list != ZERO)
{
Elf32_Handle handle = NULL;
if(GetSegListInfoTags(segment_list,
GSLI_ElfHandle,&handle,
TAG_DONE) == 1)
{
if(handle != NULL)
{
__dl_elf_handle = OpenElfTags(
OET_ElfHandle,handle,
TAG_DONE);
}
}
}
}
#endif /* __THREAD_SAFE */
}
}
/****************************************************************************/
#endif /*__amigaos4__ */

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: stdlib_unsetenv.c,v 1.8 2006-09-25 14:51:15 obarthel Exp $ * $Id: stdlib_unsetenv.c,v 1.10 2008-04-30 16:32:49 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -43,6 +43,12 @@
/****************************************************************************/ /****************************************************************************/
#ifndef _STDIO_HEADERS_H
#include "stdio_headers.h"
#endif /* _STDIO_HEADERS_H */
/****************************************************************************/
#ifndef _STDLIB_MEMORY_H #ifndef _STDLIB_MEMORY_H
#include "stdlib_memory.h" #include "stdlib_memory.h"
#endif /* _STDLIB_MEMORY_H */ #endif /* _STDLIB_MEMORY_H */
@@ -53,10 +59,12 @@
/****************************************************************************/ /****************************************************************************/
void int
unsetenv(const char *name) unsetenv(const char *name)
{ {
char * name_copy = NULL; char * name_copy = NULL;
int result = -1;
LONG status;
size_t i; size_t i;
if(__check_abort_enabled) if(__check_abort_enabled)
@@ -91,11 +99,21 @@ unsetenv(const char *name)
} }
PROFILE_OFF(); PROFILE_OFF();
DeleteVar((STRPTR)name,0); status = DeleteVar((STRPTR)name,0);
PROFILE_ON(); PROFILE_ON();
if(status == DOSFALSE)
{
__set_errno(__translate_access_io_error_to_errno(IoErr()));
goto out;
}
result = 0;
out: out:
if(name_copy != NULL) if(name_copy != NULL)
free(name_copy); free(name_copy);
return(result);
} }

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: string_memcmp.c,v 1.7 2006-01-08 12:04:26 obarthel Exp $ * $Id: string_memcmp.c,v 1.8 2010-08-20 15:33:36 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -135,7 +135,14 @@ __memcmp(const char *m1,const char *m2,size_t len)
{ {
if((*m1) != (*m2)) if((*m1) != (*m2))
{ {
result = (*m1) - (*m2); int b1,b2;
/* The comparison must be performed as if the
bytes were unsigned characters. */
b1 = *(unsigned char *)m1;
b2 = *(unsigned char *)m2;
result = b1 - b2;
break; break;
} }
@@ -185,7 +192,12 @@ memcmp(const void *ptr1, const void *ptr2, size_t len)
{ {
if((*m1) != (*m2)) if((*m1) != (*m2))
{ {
result = (*m1) - (*m2); int b1,b2;
b1 = *(unsigned char *)m1;
b2 = *(unsigned char *)m2;
result = b1 - b2;
break; break;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: string_strcmp.c,v 1.4 2006-01-08 12:04:27 obarthel Exp $ * $Id: string_strcmp.c,v 1.5 2010-08-20 15:33:36 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -62,6 +62,8 @@ strcmp(const char *s1, const char * s2)
if(s1 != s2) if(s1 != s2)
{ {
int c1,c2;
while((*s1) == (*s2)) while((*s1) == (*s2))
{ {
if((*s1) == '\0') if((*s1) == '\0')
@@ -71,7 +73,12 @@ strcmp(const char *s1, const char * s2)
s2++; s2++;
} }
result = (*s1) - (*s2); /* The comparison must be performed as if the
characters were unsigned characters. */
c1 = *(unsigned char *)s1;
c2 = *(unsigned char *)s2;
result = c1 - c2;
} }
out: out:

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: string_strncmp.c,v 1.4 2006-01-08 12:04:27 obarthel Exp $ * $Id: string_strncmp.c,v 1.5 2010-08-20 15:33:36 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -78,7 +78,14 @@ strncmp(const char *s1, const char *s2, size_t n)
} }
else else
{ {
result = (*s1) - (*s2); int c1,c2;
/* The comparison must be performed as if the
characters were unsigned characters. */
c1 = *(unsigned char *)s1;
c2 = *(unsigned char *)s2;
result = c1 - c2;
break; break;
} }
} }

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: systeminfo_sysinfo.c,v 1.5 2006-09-22 09:02:51 obarthel Exp $ * $Id: systeminfo_sysinfo.c,v 1.6 2010-08-20 15:33:36 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -141,7 +141,7 @@ sysinfo(int cmd,char *buf,long buflen)
GetCPUInfoTags(GCIT_VectorUnit,&vecu,TAG_DONE); GetCPUInfoTags(GCIT_VectorUnit,&vecu,TAG_DONE);
if(vecu == VECTORTYPE_ALTIVEC || vecu == VECTORTYPE_VMX) /* AltiVec and VMX are the same. */ if(vecu == VECTORTYPE_ALTIVEC || vecu == 2 /* VECTORTYPE_VMX == 2 */) /* AltiVec and VMX are the same. */
s = "ppc+altivec ppc common"; s = "ppc+altivec ppc common";
else else
s = "ppc common"; s = "ppc common";

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: unistd_translateu2a.c,v 1.11 2006-10-03 16:36:47 obarthel Exp $ * $Id: unistd_translateu2a.c,v 1.12 2010-08-20 15:33:36 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -50,6 +50,7 @@
* ././foo * ././foo
* foo/./baz * foo/./baz
* foo/./bar/./baz * foo/./bar/./baz
* foo/./././bar
* foo/. * foo/.
* /. * /.
* /tmp * /tmp
@@ -260,7 +261,7 @@ __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translati
D(("name = '%s' (line %ld)",name,__LINE__)); D(("name = '%s' (line %ld)",name,__LINE__));
} }
/* Ditch all embedded '/./' ('foo/./bar' -> 'foo/bar'). */ /* Ditch all embedded '/./' ('foo/./bar' -> 'foo/bar', 'foo/././bar' -> 'foo/bar'). */
if(len > 2) if(len > 2)
{ {
BOOL have_slash_dot_slash = FALSE; BOOL have_slash_dot_slash = FALSE;
@@ -278,10 +279,11 @@ __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translati
{ {
for(i = j = 0 ; i < len ; i++) for(i = j = 0 ; i < len ; i++)
{ {
replace[j++] = name[i]; while(i < len - 2 && name[i] == '/' && name[i + 1] == '.' && name[i + 2] == '/')
if(name[i] == '/' && name[i + 1] == '.' && name[i + 2] == '/')
i += 2; i += 2;
if(i < len)
replace[j++] = name[i];
} }
len = j; len = j;
@@ -474,10 +476,10 @@ __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translati
{ {
for(i = j = 0 ; i < len ; i++) for(i = j = 0 ; i < len ; i++)
{ {
replace[j++] = name[i]; if(i < len - 3 && name[i] == '/' && name[i + 1] == '.' && name[i + 2] == '.' && name[i + 3] == '/')
if(name[i] == '/' && name[i + 1] == '.' && name[i + 2] == '.' && name[i + 3] == '/')
i += 2; i += 2;
replace[j++] = name[i];
} }
len = j; len = j;

View File

@@ -1,6 +1,6 @@
#define VERSION 1 #define VERSION 1
#define REVISION 203 #define REVISION 205
#define DATE "28.4.2008" #define DATE "21.8.2010"
#define VERS "unix.lib 1.203" #define VERS "unix.lib 1.205"
#define VSTRING "unix.lib 1.203 (28.4.2008)\r\n" #define VSTRING "unix.lib 1.205 (21.8.2010)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.203 (28.4.2008)" #define VERSTAG "\0$VER: unix.lib 1.205 (21.8.2010)"

View File

@@ -1 +1 @@
203 205

View File

@@ -1,5 +1,5 @@
/* /*
* $Id: utsname_uname.c,v 1.7 2006-11-13 09:25:28 obarthel Exp $ * $Id: utsname_uname.c,v 1.8 2010-08-20 15:33:36 obarthel Exp $
* *
* :ts=4 * :ts=4
* *
@@ -135,7 +135,9 @@ uname(struct utsname *info)
* 45.3 3.9-BB2 * 45.3 3.9-BB2
*/ */
if (46 <= Version && Version <= 52) if (Version == 53)
version_string = "4.1";
else if (46 <= Version && Version <= 52)
version_string = "4.0"; version_string = "4.0";
else if (Version == 45) else if (Version == 45)
version_string = "3.9"; version_string = "3.9";

View File

@@ -1,152 +0,0 @@
#
# $Id: GNUmakefile.68k,v 1.15 2006-09-25 18:20:09 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 -fwritable-strings -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 = -ggdb
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 uname simple \
fstat_stdout_test simple_sprintf date_test sscanf_64 factorial \
execvp_test setlocale rand fstat_test base_dir_nametest
clean:
$(DELETE) #?.o #?.map test fgets_test iotest sscanf_test printf_test \
sprintf_test stack_size_test translate_test strtok_test uname \
simple fstat_stdout_test fstat_test simple_sprintf date_test sscanf_64 \
factorial execvp_test setlocale rand base_dir_nametest
##############################################################################
setlocale : setlocale.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ setlocale.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
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
uname : uname.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ uname.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map
simple : simple.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ simple.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
fstat_stdout_test : fstat_stdout_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ fstat_stdout_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
fstat_test : fstat_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ fstat_test.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map
simple_sprintf : simple_sprintf.o
@echo "Linking $@"
$(CC) -nostdlib $(CFLAGS) -o $@ simple_sprintf.o -lc -Wl,--cref,-M,-Map=$@.map
date_test : date_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ date_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
sscanf_64 : sscanf_64.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ sscanf_64.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
factorial : factorial.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ factorial.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
execvp_test : execvp_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ execvp_test.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map
base_dir_nametest : base_dir_nametest.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ base_dir_nametest.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map
rand : rand.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ rand.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
##############################################################################
mkid:
mkid -v #?.(c|h|asm|i)
update:
mkid -v -u

View File

@@ -1,124 +0,0 @@
#
# $Id: GNUmakefile.os4,v 1.13 2006-04-18 08:29:46 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$(V)/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 -DNO_INLINE_STDARG -fno-builtin
#OPTIMIZE = -O
#OPTIMIZE = -O2 -fomit-frame-pointer
DEBUG = -ggdb
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDE) $(LIB)
##############################################################################
LIBS = -lm -lc -ldebug -lgcc
##############################################################################
all: test fgets_test iotest sscanf_test printf_test sprintf_test \
stack_size_test translate_test strtok_test uname simple \
fstat_stdout_test simple_sprintf date_test sscanf_64 \
factorial setlocale
clean:
$(DELETE) *.o *.map test fgets_test iotest sscanf_test printf_test \
sprintf_test stack_size_test translate_test strtok_test \
uname simple fstat_stdout_test simple_sprintf date_test \
sscanf_64 factorial setlocale rand
##############################################################################
setlocale : setlocale.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ setlocale.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
test : test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
date_test : date_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
uname : uname.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ uname.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map
simple : simple.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ simple.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
fstat_stdout_test : fstat_stdout_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ fstat_stdout_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
simple_sprintf : simple_sprintf.o
@echo "Linking $@"
$(CC) -nostdlib $(CFLAGS) -o $@ simple_sprintf.o -lc -lgcc -Wl,--cref,-M,-Map=$@.map
sscanf_64 : sscanf_64.o
@echo "Linking $@"
$(CC) -nostdlib $(CFLAGS) -o $@ sscanf_64.o -lc -lgcc -Wl,--cref,-M,-Map=$@.map
factorial : factorial.o
@echo "Linking $@"
$(CC) -nostdlib $(CFLAGS) -o $@ factorial.o -lc -lgcc -Wl,--cref,-M,-Map=$@.map
rand : rand.o
@echo "Linking $@"
$(CC) -nostdlib $(CFLAGS) -o $@ rand.o -lc -lgcc -Wl,--cref,-M,-Map=$@.map

View File

@@ -1,4 +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.

View File

@@ -1,20 +0,0 @@
/*
* $Id: base_dir_nametest.c,v 1.1 2006-09-25 18:20:09 obarthel Exp $
*
* :ts=4
*/
#include <unistd.h>
#include <libgen.h>
#include <stdio.h>
int
main(int argc,char ** argv)
{
int i;
for(i = 1 ; i < argc ; i++)
printf("%s\n\tbasename=%s\n\t dirname=%s\n",argv[i],basename(argv[i]),dirname(argv[i]));
return(0);
}

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,22 +0,0 @@
#include <time.h>
#include <stdio.h>
#include <locale.h>
int
main(void)
{
time_t tm;
struct tm *ptr;
char str[60];
setlocale(LC_ALL, "C");
tm = time(NULL);
ptr = localtime(&tm);
strftime(str, sizeof(str), "%x\n", ptr);
printf(str);
return 0;
}

View File

@@ -1,16 +0,0 @@
/*
* $Id: execvp_test.c,v 1.2 2006-08-07 08:39:56 obarthel Exp $
*
* :ts=4
*/
#include <unistd.h>
int
main(int argc,char ** argv)
{
if(argc > 1)
execvp(argv[1],&argv[1]);
return(0);
}

View File

@@ -1,25 +0,0 @@
#include <stdio.h>
/*
gcc -std=c99 -mcrt=clib2 -o factorial factorial.c -lm
output is:
16! = 20922789888 <- Wrong
gcc -std=c99 -mcrt=newlib -o factorial factorial.c
output is:
16! = 20922789888000 <- Correct
*/
int
main(void)
{
double result = 1.0;
int i;
for ( i = 2; i < 17; ++i )
result = result * i;
printf("16! = %.14g\n", result);
return 0;
}

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,36 +0,0 @@
/*
* $Id: fstat_stdout_test.c,v 1.1 2005-05-08 16:27:25 obarthel Exp $
*
* :ts=4
*/
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
/****************************************************************************/
int
main(int argc,char ** argv)
{
struct stat st;
int fd;
fd = dup(STDOUT_FILENO);
if(fd < 0)
{
perror("dup(STDOUT_FILENO)");
return(EXIT_FAILURE);
}
if(fstat(fd,&st) < 0)
{
perror("fstat(fd,&st)");
return(EXIT_FAILURE);
}
return(EXIT_SUCCESS);
}

View File

@@ -1,39 +0,0 @@
/*
* $Id: fstat_test.c,v 1.1 2006-09-20 19:46:37 obarthel Exp $
*
* :ts=4
*/
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
/****************************************************************************/
int
main(int argc,char ** argv)
{
struct stat st;
int fd;
if(argc <= 1)
return(EXIT_FAILURE);
fd = open(argv[1],O_RDONLY);
if(fd == -1)
{
perror("open");
return(EXIT_FAILURE);
}
if(fstat(fd,&st) == -1)
{
perror("fstat");
return(EXIT_FAILURE);
}
return(EXIT_SUCCESS);
}

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,238 +0,0 @@
#include <string.h>
#include <stdlib.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.2a",12.678,-12.678);
print_format_float("%010.2a",12.678,-12.678);
print_format_float("% 010.2a",12.678,-12.678);
print_format_float("%+10.2A",12.678,-12.678);
print_format_float("%+010.2A",12.678,-12.678);
print_format_float("%-10.2a",12.678,-12.678);
print_format_float("%- 10.2a",12.678,-12.678);
print_format_float("%-+10.2a",12.678,-12.678);
print_format_float("%a",12.678,-12.678);
print_format_float("%10a",12.678,-12.678);
print_format_float("%10.0a",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);
printf("\n");
print_format_float("%10.2g",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("%010.2g",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("% 010.2g",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("%+10.2G",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("%+010.2G",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("%-10.2g",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("%- 10.2g",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("%-+10.2g",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("%g",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("%10g",strtod("infinity",NULL),strtod("-infinity",NULL));
print_format_float("%10.0g",strtod("infinity",NULL),strtod("-infinity",NULL));
printf("\n");
print_format_float("%10.2g",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("%010.2g",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("% 010.2g",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("%+10.2G",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("%+010.2G",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("%-10.2g",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("%- 10.2g",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("%-+10.2g",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("%g",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("%10g",strtod("nan",NULL),strtod("-nan",NULL));
print_format_float("%10.0g",strtod("nan",NULL),strtod("-nan",NULL));
return(0);
}

View File

@@ -1,20 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
int
main(int argc,char **argv)
{
int n = 10,i,x;
if(argc > 1)
n = atoi(argv[1]);
for(i = 0 ; i < n ; i++)
{
x = rand();
printf("0x%08lx %d\n",x,x);
}
return(0);
}

View File

@@ -1,29 +0,0 @@
#include <stdio.h>
#include <locale.h>
/* uncomment to fix corruption
#include <dos.h>
BOOL __open_locale = FALSE;
*/
int
main(void)
{
char *loc;
time_t t;
struct tm *m;
char buf[200];
int len;
loc = setlocale(LC_ALL, "");
printf("loc=%p (%s)\n", loc, loc);
time(&t);
m = gmtime(&t);
len = strftime(buf, sizeof(buf), "%a %b", m);
printf("len=%d buf=%s\n", len, buf);
return 0;
}

View File

@@ -1,13 +0,0 @@
/*
* $Id: simple.c,v 1.1 2005-03-03 15:12:18 obarthel Exp $
*
* :ts=4
*/
/****************************************************************************/
int
main(int argc,char ** argv)
{
return(0);
}

View File

@@ -1,99 +0,0 @@
/*
* $Id: simple_sprintf.c,v 1.2 2005-05-18 07:22:52 obarthel Exp $
*
* :ts=4
*/
#include <exec/execbase.h>
/****************************************************************************/
#define __NOLIBBASE__
#define __USE_INLINE__
#define __NOGLOBALIFACE__
/****************************************************************************/
#include <proto/exec.h>
#include <proto/dos.h>
/****************************************************************************/
#include <string.h>
#include <stdio.h>
#include <dos.h>
/****************************************************************************/
struct Library * SysBase;
struct Library * DOSBase;
/****************************************************************************/
#if defined(__amigaos4__)
struct ExecIFace * IExec;
struct DOSIFace * IDOS;
#endif /* __amigaos4__ */
/****************************************************************************/
BOOL __check_abort_enabled = FALSE;
/****************************************************************************/
int _start(void);
/****************************************************************************/
int
_start(void)
{
char string[80];
SysBase = *(struct Library **)4;
#if defined(__amigaos4__)
{
IExec = (struct ExecIFace *)((struct ExecBase *)SysBase)->MainInterface;
}
#endif /* __amigaos4__ */
DOSBase = OpenLibrary("dos.library",37);
if(DOSBase == NULL)
goto out;
#if defined(__amigaos4__)
{
IDOS = (struct DOSIFace *)GetInterface(DOSBase, "main", 1, 0);
if(IDOS == NULL)
goto out;
}
#endif /* __amigaos4__ */
sprintf(string,"a %s c\n","b");
Write(Output(),string,(LONG)strlen(string));
out:
#if defined(__amigaos4__)
{
if(IDOS != NULL)
DropInterface((struct Interface *)IDOS);
}
#endif /* __amigaos4__ */
if(DOSBase != NULL)
CloseLibrary(DOSBase);
return(0);
}
/****************************************************************************/
void
__check_abort(void)
{
}

View File

@@ -1,172 +0,0 @@
#
# $Id: smakefile,v 1.9 2006-01-02 13:11:39 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 uname simple \
fstat_stdout_test simple_sprintf date_test factorial \
cleanup
clean:
-delete \#?.o \#?.map \
test fgets_test iotest sscanf_test printf_test sprintf_test \
stack_size_test translate_test strtok_test uname simple \
simple_sprintf date_test factorial
##############################################################################
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
date_test: date_test.o
@echo "Linking $@"
@slink $(LIB)startup.o date_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
uname: uname.o
@echo "Linking $@"
@slink $(LIB)startup.o uname.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
simple: simple.o
@echo "Linking $@"
@slink $(LIB)startup.o simple.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
fstat_stdout_test: fstat_stdout_test.o
@echo "Linking $@"
@slink $(LIB)startup.o fstat_stdout_test.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
simple_sprintf: simple_sprintf.o
@echo "Linking $@"
@slink simple_sprintf.o to $@ lib $(LIB)c.lib addsym \
map $@.map,fhx fwidth 32 pwidth 32 swidth 32
factorial: factorial.o
@echo "Linking $@"
@slink $(LIB)startup.o factorial.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,22 +0,0 @@
#include <stdio.h>
/*extern int __debug_level;*/
int
main (int argc, char **argv)
{
long long int l;
char * arg;
/*__debug_level = 2;*/
if(argc > 1)
arg = argv[1];
else
arg = "123456789012";
sscanf (arg, "%lld", &l);
printf ("number = %lld = 0x%llX\n", l, l);
return(0);
}

View File

@@ -1,135 +0,0 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int
main(void)
{
int first, second, third, num;
int n,a,b,c;
char str[4];
double f;
a = 0;
n = sscanf("060206","%x",&a);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, a = %d\n",n,a);
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);
n = sscanf("1","%lf",&f);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, f = '%f' (%f)\n",n,f,atof("1"));
n = sscanf("1234.567","%lf",&f);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, f = '%f' (%f)\n",n,f,atof("1234.567"));
n = sscanf("inf","%lf",&f);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, f = '%f' (%f)\n",n,f,atof("inf"));
n = sscanf("infinity","%lf",&f);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, f = '%f' (%f)\n",n,f,atof("infinity"));
n = sscanf("nan","%lf",&f);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, f = '%f' (%f)\n",n,f,atof("nan"));
n = sscanf("nan(23)","%lf",&f);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, f = '%f' (%f)\n",n,f,atof("nan(23)"));
n = sscanf("0xabc.defp+101","%lf",&f);
printf("%s:%d:",__FILE__,__LINE__);printf("n = %d, f = '%f' (%f)\n",n,f,atof("0xabc.defp+101"));
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);
}

View File

@@ -1,35 +0,0 @@
/*
* $Id: strtok_test.c,v 1.1 2004-10-25 19:50:33 obarthel Exp $
*
* :ts=4
*/
/****************************************************************************/
#include <string.h>
#include <stdio.h>
/****************************************************************************/
int
main(int argc,char ** argv)
{
char test[256];
char * one;
char * two;
char * three;
strcpy(test," one two three");
strtok(test," ");
one = strtok(NULL," ");
two = strtok(NULL," ");
three = strtok(NULL," ");
printf("one = %p '%s'\n",one,one);
printf("two = %p '%s'\n",two,two);
printf("three = %p '%s'\n",three,three);
return(0);
}

View File

@@ -1,282 +0,0 @@
/*
* $Id: test.c,v 1.6 2005-08-26 12:21:51 obarthel Exp $
*
* :ts=4
*/
/****************************************************************************/
#define __USE_INLINE__
#include <proto/exec.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <stdlib.h>
#include <math.h>
#include <sys/stat.h>
/****************************************************************************/
/*int __stack_size = 20000;*/
/****************************************************************************/
#if defined(__GNUC__)
void __attribute__ ((constructor))
constructor_test1(void)
{
fprintf(stderr,"constructor #1 called\n");
}
void __attribute__ ((constructor))
constructor_test2(void)
{
fprintf(stderr,"constructor #2 called\n");
}
void __attribute__ ((destructor))
destructor_test1(void)
{
fprintf(stderr,"destructor #1 called\n");
}
void __attribute__ ((destructor))
destructor_test2(void)
{
fprintf(stderr,"destructor #2 called\n");
}
void __attribute__ ((destructor))
destructor_test3(void)
{
/*DebugPrintF("__iob = 0x%08lx\n",__iob);*/
fprintf(stderr,"destructor #3 called\n");
}
#endif /* __GNUC__ */
/****************************************************************************/
int foo = 3;
int bar = 9;
/****************************************************************************/
#if 1
int
main(int argc,char ** argv)
{
struct timeval tv;
time_t now;
struct tm tm;
int i,j,k;
long n,r;
char time_buffer[100];
for(i = 0 ; i < argc ; i++)
printf("%2d) \"%s\"\n",i,argv[i]);
printf("div %d mod %d\n",foo / 2,bar % 4);
time(&now);
printf("%s",ctime(&now));
tm = (*localtime(&now));
strftime(time_buffer,sizeof(time_buffer),"%c",&tm);
printf("local time = %s\n",time_buffer);
tm = (*gmtime(&now));
strftime(time_buffer,sizeof(time_buffer),"%c",&tm);
printf("gmt = %s\n",time_buffer);
tm = (*gmtime(&now));
strftime(time_buffer,sizeof(time_buffer),"%c %U %W %j",&tm);
printf("%s\n",time_buffer);
tm.tm_year = 105;
tm.tm_mon = 0;
tm.tm_mday = 25;
tm.tm_hour = 12;
tm.tm_min = 3;
tm.tm_sec = 53;
tm.tm_isdst = -1;
now = mktime(&tm);
tm = (*localtime(&now));
strftime(time_buffer,sizeof(time_buffer),"%c",&tm);
printf("2005-01-25 12:03:53 -> local time = %s\n",time_buffer);
tm = (*gmtime(&now));
strftime(time_buffer,sizeof(time_buffer),"%c",&tm);
printf("2005-01-25 12:03:53 -> gmt = %s\n",time_buffer);
#if defined(IEEE_FLOATING_POINT_SUPPORT) || defined(M68881_FLOATING_POINT_SUPPORT)
{
const double pi = 3.14159265358979323846;
const double ten = 10.0;
const double quarter = 0.25;
const double thousand = 1000.0;
const double foo = 4 * atan((double)1);
float f1;
double d1;
printf("pi=%3.1f (float)\n",pi);
printf("pi=%.21e (exponential)\n",pi);
printf("pi=%g (float/exponential)\n",pi);
printf("ten=%f (float)\n",ten);
printf("ten=%.21e (exponential)\n",ten);
printf("ten=%g (float/exponential)\n",ten);
printf("thousand=%f (float)\n",thousand);
printf("thousand=%.21e (exponential)\n",thousand);
printf("thousand=%g (float/exponential)\n",thousand);
printf("quarter=%f (float)\n",quarter);
printf("quarter=%.21e (exponential)\n",quarter);
printf("quarter=%g (float/exponential)\n",quarter);
printf("foo=%f (float)\n",foo);
printf("foo=%.21e (exponential)\n",foo);
printf("foo=%g (float/exponential)\n",foo);
printf("32 bit float = %f\n",4294967295.0);
printf("32+1 bit float = %f\n",-4294967295.0);
printf("big float on the edge = %f\n",4294967296.0);
printf("big float = %f\n",429496729654321.0);
printf("small float = %f\n",-429496729654321.0);
f1 = d1 = 9;
r = sscanf("13.24 1.324","%f %lf",&f1,&d1);
printf("r = %ld, f1 = %f, d1 = %f\n",r,f1,d1);
}
#endif
#ifndef NDEBUG
{
char * allocation;
allocation = malloc(4);
if(allocation != NULL)
{
strcpy(allocation,"....FOO");
strcpy(allocation-3,"bar");
}
}
#endif /* NDEBUG */
printf("hex 0x%08x\n",1);
printf("hex 0x%08x\n",1);
printf("hex 0x%08x\n",2);
printf("big int %d\n",0x80000000L);
printf("converted big int %d\n",atoi("-2147483648"));
r = sscanf("1324","%lx",&n);
printf("r = %ld, n = %ld\n",r,n);
r = sscanf("1234567890","%4d%3d%3d",&i,&j,&k);
printf("r = %ld, i = %d, j = %d, k = %d\n",r,i,j,k);
/*#if defined(IEEE_FLOATING_POINT_SUPPORT) || defined(M68881_FLOATING_POINT_SUPPORT)
{
const char *arg = "100x100";
float xres = 0, yres = 0;
printf("%d: ", sscanf(arg, "%fx%f", &xres, &yres));
printf("%.02fx%.02f\n", xres, yres);
}
#endif*/
gettimeofday(&tv,0);
printf("time = %d.%06d\n",tv.tv_sec,tv.tv_usec);
if(argc > 1)
{
DIR * dir;
dir = opendir(argv[1]);
if(dir != NULL)
{
struct dirent *d;
struct stat st;
chdir(argv[1]);
while((d = readdir(dir)) != NULL)
{
if(stat(d->d_name,&st) == 0)
printf("%s%s\n",d->d_name,S_ISDIR(st.st_mode) ? " (dir)" : "");
}
closedir(dir);
}
}
return(0);
}
#endif
/****************************************************************************/
#if 0
#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;
}
#endif

View File

@@ -1,39 +0,0 @@
/*
* $Id: translate_test.c,v 1.1.1.1 2004-07-26 16:36:08 obarthel Exp $
*
* :ts=4
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <dos.h>
extern char __current_path_name[];
int
main(int argc,char ** argv)
{
struct name_translation_info nti;
char * name;
int error;
int i;
/*strcpy(__current_path_name,"/absolute_path_name/whatever");*/
for(i = 1 ; i < argc ; i++)
{
name = argv[i];
printf("'%s' -> ",name);
error = __translate_unix_to_amiga_path_name(&name,&nti);
/*error = __translate_amiga_to_unix_path_name(&name,&nti);*/
if(error == 0)
printf("'%s'\n",name);
else
printf("%s\n",strerror(error));
}
return(0);
}

View File

@@ -1,56 +0,0 @@
/*
* $Id: uname.c,v 1.2 2005-03-03 15:12:18 obarthel Exp $
*
* :ts=4
*/
/****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/utsname.h>
int main(int cnt,char *arg[])
{
struct utsname uinfo;
int Ret=EXIT_SUCCESS;
if(cnt>1 && (!strcmp(arg[1],"-h") || !strcmp(arg[1],"--help"))) {
printf(
" -a\tPrint all information.\n"
" -m\tPrint the machine type.\n"
" -n\tPrint the node (host) name.\n"
" -r\tPrint the OS release.\n"
" -s\tPrint the OS name.\n"
" -v\tPrint the OS version.\n\n"
" -h or --help displays this message.\n\n"
);
} else {
if(!uname(&uinfo)) {
if(cnt<2 || !strcmp(arg[1],"-s")) {
printf("%s\n",uinfo.sysname);
} else if(!strcmp(arg[1],"-a")) {
printf("%s %s %s %s %s\n",uinfo.sysname,uinfo.version,uinfo.release,uinfo.nodename,uinfo.machine);
} else if(!strcmp(arg[1],"-m")) {
printf("%s\n",uinfo.machine);
} else if(!strcmp(arg[1],"-n")) {
printf("%s\n",uinfo.nodename);
} else if(!strcmp(arg[1],"-r")) {
printf("%s\n",uinfo.release);
} else if(!strcmp(arg[1],"-v")) {
printf("%s\n",uinfo.version);
} else {
printf("Unknown option \"%s\"!\nTry -h or --help.\n",arg[1]);
Ret=EXIT_FAILURE;
}
} else {
printf("Unknown error!\n");
}
}
return(Ret);
}
/* vi:set ts=3: */