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

26 Commits

Author SHA1 Message Date
Olaf Barthel
93fe7d42e6 This commit was manufactured by cvs2svn to create tag 'V1_187'.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/tags/V1_187@14817 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-29 18:22:20 +00:00
Olaf Barthel
8e2820e9b7 - Added the missing 'time_convert_time.c'.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14816 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-29 18:22:19 +00:00
Olaf Barthel
ab22a23f27 - Changed the algorithm that calculates the number of days that have passed
so far as used by the the __convert_time() function and the conversion
  code in strftime().

- Also changed the algorithm used by strftime() to produce the week numbers
  (the '%U' and '%W' format specifiers). The new method is much simpler
  than the old one.

- Made the code that converts a 'time_t' value into the 'struct DateStamp',
  as used by strftime() and utime(), into its own function. This also
  fixes a bug in the code strftime() would use which was completely
  unaware of the local time zone settings.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14815 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-29 18:05:14 +00:00
Olaf Barthel
0ae8d68e64 - We also test the strftime() %U, %W and %j format specifiers.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14814 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-29 17:48:07 +00:00
Olaf Barthel
0b1d21471d - Plugged in a different algorithm for calculating the day of the week in
strftime() and asctime_r(). This one isn't sensitive to the effects of
  adding/subtracting the local time zone.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14813 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-26 18:41:39 +00:00
Olaf Barthel
987316e638 - Added a missing file.
- Updated the .cvsignore file.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14812 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-26 09:24:38 +00:00
Olaf Barthel
e8d4187ea5 - The general test program now also exercises the time conversion functions.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14811 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-25 11:21:58 +00:00
Olaf Barthel
003faf7a24 - mktime() is supposed to convert the time specification, given as local
time, into the number of seconds since January 1st, 1970, relative to
  UTC. This didn't really work up until now since the time value returned
  was given as local time.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14810 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-25 11:21:00 +00:00
Olaf Barthel
d1aaa84bcc - Moved the common DateStamp to time_t conversion code into a shared
function.

- The fall-back function for converting time into a string in strftime()
  now calls itself for the "%x" and "%X" format specifiers.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14809 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-24 10:25:46 +00:00
Olaf Barthel
e1476c15b3 - Added instructions for switching over an existing Amiga 68k GCC installation
to use "clib2".


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14808 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-20 12:47:31 +00:00
Olaf Barthel
17fea5626a - Added a check against DBL_EPSILON in log() and log10() in place of the
check against 0 that used to be in there.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14807 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-18 20:00:08 +00:00
Olaf Barthel
e4b70e946f - The default console output window opened when a program is launched
from Workbench would open and stay open. This was not intended to
  happen and is a side-effect of the new stdio initialization code which
  checks if the stdio streams are in non-blocking mode. Fixed.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14806 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-15 08:17:10 +00:00
Olaf Barthel
56b0a74c61 - Added a missing definition to stdio_init_exit.c which is part of
the OS4 header files, but not of the older header file distributions.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14804 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-14 09:07:17 +00:00
Olaf Barthel
d23f4318f9 - close() did not reset the non-blocking file property, as it should
have. This only worked for files which were closed anyway, but not
  for the stdio streams. Fixed.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14803 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-14 08:36:54 +00:00
Olaf Barthel
23f70d0c53 - Lost some more code that is not required for AmigaOS 4.x and can be
handled conveniently through conditional compilation.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14802 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-13 15:39:39 +00:00
Olaf Barthel
c6fcede4ce - Whether or not stdio console streams are blocking or non-blocking
is now determined at initialization time. The I/O mode is restored before
  the program exits. Previously, any changes to the I/O mode would persist.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14801 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-12 09:15:50 +00:00
Olaf Barthel
5801d000d4 Added -a switch to cp so that it behaves like Copy CLONE.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14800 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-10 00:56:15 +00:00
Olaf Barthel
619b64e6f4 - open() no longer examines a file after opening it in order to figure
out whether read/write accesses are permitted. This decision is now
  for the file system to make.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14799 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-09 16:07:27 +00:00
Olaf Barthel
5191ee5660 - The V37/V40 compatibility code is no longer built for the AmigaOS4
version of the library.

- Switched over the last use of DeviceProc() to GetDeviceProc(), etc.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14798 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-09 15:58:02 +00:00
Olaf Barthel
64c1175f7b - Made the <ctype.h> macros more robust.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14797 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-09 15:20:33 +00:00
Olaf Barthel
be827762de - Added the baserel directory to the .cvsignore file.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14796 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-09 10:44:25 +00:00
Olaf Barthel
618299fb48 - Replaced ASSERT() macro invocation with assert() call.
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14795 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-09 10:43:40 +00:00
Olaf Barthel
fbc6d94840 - Dropped the special flag variable used by the abort() function that
tracks whether or not console output is possible. We now use the
  global "__no_standard_io" instead.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14794 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-09 10:10:41 +00:00
Olaf Barthel
5cf80326bc - Removed a misplaced IsInteractive() from the stdio initialization
function. Now this could have been big trouble...

- Removed tests for FileHandle->fh_Type != NULL which used to precede
  all IsInterative() tests. I verified that IsInteractive() will always
  return FALSE for NIL: type file handles.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14793 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-09 09:54:33 +00:00
Olaf Barthel
e571888f4f - The "char" limits in <limits.h> are now set up according to the current
compiler settings, which can either default to an unsigned or
  signed definition.

- Changed the rules again for the use of stderr/stdout redirection when
  printing error messages. It is always safe to redirect them now and
  no requester will appear unless you specifically set the value of the
  "__no_standard_io" variable to TRUE in your program.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14792 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-09 09:40:33 +00:00
Olaf Barthel
f519aafaca - Redirecting stderr to a file no longer has the effect of showing error
messages and assertion failure notifications as requesters. The exception
  is in redirecting stderr to NIL: which will prompt the requester use.

- gettimeofday() now calls GetSysTime() rather than DateStamp() to obtain
  the current system time. This resolves granularity issues since the
  DateStamp() result was only accurate by 1/50 of a second.

- The "ptrdiff_t" definition in <stddef.h> now defaults to type 'int' rather
  than 'long int'.


git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14791 87f5fb63-7c3d-0410-a384-fd976d0f7a62
2005-01-08 10:21:28 +00:00
93 changed files with 1039 additions and 2377 deletions

View File

@@ -1,13 +0,0 @@
# The "checkoutlist" file is used to support additional version controlled
# administrative files in $CVSROOT/CVSROOT, such as template files.
#
# The first entry on a line is a filename which will be checked out from
# the corresponding RCS file in the $CVSROOT/CVSROOT directory.
# The remainder of the line is an error message to use if the file cannot
# be checked out.
#
# File format:
#
# [<whitespace>]<filename>[<whitespace><error message>]<end-of-line>
#
# comment lines begin with '#'

View File

@@ -1,15 +0,0 @@
# The "commitinfo" file is used to control pre-commit checks.
# The filter on the right is invoked with the repository and a list
# of files to check. A non-zero exit of the filter program will
# cause the commit to be aborted.
#
# The first entry on a line is a regular expression which is tested
# against the directory that the change is being committed to, relative
# to the $CVSROOT. For the first match that is found, then the remainder
# of the line is the name of the filter to run.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name "ALL" appears as a regular expression it is always used
# in addition to the first matching regex or "DEFAULT".

View File

@@ -1,21 +0,0 @@
# Set this to "no" if pserver shouldn't check system users/passwords
#SystemAuth=no
# Put CVS lock files in this directory rather than directly in the repository.
#LockDir=/var/lock/cvs
# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top
# level of the new working directory when using the `cvs checkout'
# command.
#TopLevelAdmin=no
# Set `LogHistory' to `all' or `TOEFWUPCGMAR' to log all transactions to the
# history file, or a subset as needed (ie `TMAR' logs all write operations)
#LogHistory=TOEFWUPCGMAR
# Set `RereadLogAfterVerify' to `always' (the default) to allow the verifymsg
# script to change the log message. Set it to `stat' to force CVS to verify# that the file has changed before reading it (this can take up to an extra
# second per directory being committed, so it is not recommended for large
# repositories. Set it to `never' (the previous CVS behavior) to prevent
# verifymsg scripts from changing the log message.
#RereadLogAfterVerify=always

View File

@@ -1,19 +0,0 @@
# This file affects handling of files based on their names.
#
# The -m option specifies whether CVS attempts to merge files.
#
# The -k option specifies keyword expansion (e.g. -kb for binary).
#
# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
#
# wildcard [option value][option value]...
#
# where option is one of
# -f from cvs filter value: path to filter
# -t to cvs filter value: path to filter
# -m update methodology value: MERGE or COPY
# -k expansion mode value: b, o, kkv, &c
#
# and value is a single-quote delimited value.
# For example:
#*.gif -k 'b'

View File

@@ -1,21 +0,0 @@
# The "editinfo" file is used to allow verification of logging
# information. It works best when a template (as specified in the
# rcsinfo file) is provided for the logging procedure. Given a
# template with locations for, a bug-id number, a list of people who
# reviewed the code before it can be checked in, and an external
# process to catalog the differences that were code reviewed, the
# following test can be applied to the code:
#
# Making sure that the entered bug-id number is correct.
# Validating that the code that was reviewed is indeed the code being
# checked in (using the bug-id number or a seperate review
# number to identify this particular code set.).
#
# If any of the above test failed, then the commit would be aborted.
#
# Actions such as mailing a copy of the report to each reviewer are
# better handled by an entry in the loginfo file.
#
# One thing that should be noted is the the ALL keyword is not
# supported. There can be only one entry that matches a given
# repository.

View File

@@ -1,27 +0,0 @@
# The "loginfo" file controls where "cvs commit" log information
# is sent. The first entry on a line is a regular expression which must match
# the directory that the change is being made to, relative to the
# $CVSROOT. If a match is found, then the remainder of the line is a filter
# program that should expect log information on its standard input.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name ALL appears as a regular expression it is always used
# in addition to the first matching regex or DEFAULT.
#
# You may specify a format string as part of the
# filter. The string is composed of a `%' followed
# by a single format character, or followed by a set of format
# characters surrounded by `{' and `}' as separators. The format
# characters are:
#
# s = file name
# V = old version number (pre-checkin)
# v = new version number (post-checkin)
# t = tag or branch name
#
# For example:
#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog
# or
#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog

View File

@@ -1,26 +0,0 @@
# Three different line formats are valid:
# key -a aliases...
# key [options] directory
# key [options] directory files...
#
# Where "options" are composed of:
# -i prog Run "prog" on "cvs commit" from top-level of module.
# -o prog Run "prog" on "cvs checkout" of module.
# -e prog Run "prog" on "cvs export" of module.
# -t prog Run "prog" on "cvs rtag" of module.
# -u prog Run "prog" on "cvs update" of module.
# -d dir Place module in directory "dir" instead of module name.
# -l Top-level directory only -- do not recurse.
#
# NOTE: If you change any of the "Run" options above, you'll have to
# release and re-checkout any working directories of these modules.
#
# And "directory" is a path to a directory relative to $CVSROOT.
#
# The "-a" option specifies an alias. An alias is interpreted as if
# everything on the right of the "-a" had been typed on the command line.
#
# You can encode a module within a module by using the special '&'
# character to interpose another module into the current module. This
# can be useful for creating a module that consists of many directories
# spread out over the entire source repository.

View File

@@ -1,12 +0,0 @@
# The "notify" file controls where notifications from watches set by
# "cvs watch add" or "cvs edit" are sent. The first entry on a line is
# a regular expression which is tested against the directory that the
# change is being made to, relative to the $CVSROOT. If it matches,
# then the remainder of the line is a filter program that should contain
# one occurrence of %s for the user to notify, and information on its
# standard input.
#
# "ALL" or "DEFAULT" can be used in place of the regular expression.
#
# For example:
#ALL mail -s "CVS notification" %s

View File

@@ -1,13 +0,0 @@
# The "rcsinfo" file is used to control templates with which the editor
# is invoked on commit and import.
#
# The first entry on a line is a regular expression which is tested
# against the directory that the change is being made to, relative to the
# $CVSROOT. For the first match that is found, then the remainder of the
# line is the name of the file that contains the template.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name "ALL" appears as a regular expression it is always used
# in addition to the first matching regex or "DEFAULT".

View File

@@ -1,20 +0,0 @@
# The "taginfo" file is used to control pre-tag checks.
# The filter on the right is invoked with the following arguments:
#
# $1 -- tagname
# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d
# $3 -- repository
# $4-> file revision [file revision ...]
#
# A non-zero exit of the filter program will cause the tag to be aborted.
#
# The first entry on a line is a regular expression which is tested
# against the directory that the change is being committed to, relative
# to the $CVSROOT. For the first match that is found, then the remainder
# of the line is the name of the filter to run.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name "ALL" appears as a regular expression it is always used
# in addition to the first matching regex or "DEFAULT".

View File

@@ -1,21 +0,0 @@
# The "verifymsg" file is used to allow verification of logging
# information. It works best when a template (as specified in the
# rcsinfo file) is provided for the logging procedure. Given a
# template with locations for, a bug-id number, a list of people who
# reviewed the code before it can be checked in, and an external
# process to catalog the differences that were code reviewed, the
# following test can be applied to the code:
#
# Making sure that the entered bug-id number is correct.
# Validating that the code that was reviewed is indeed the code being
# checked in (using the bug-id number or a seperate review
# number to identify this particular code set.).
#
# If any of the above test failed, then the commit would be aborted.
#
# Actions such as mailing a copy of the report to each reviewer are
# better handled by an entry in the loginfo file.
#
# One thing that should be noted is the the ALL keyword is not
# supported. There can be only one entry that matches a given
# repository.

View File

@@ -1,19 +0,0 @@
In order to build the library, you need a 'C' compiler (obvious, isn't it?) and
a set of header files for the networking API definitions. The networking header
files go into a directory "netinclude" which has to sit in the same directory as
the source code and the "include" directory you find in there. I'm not currently
supplying these header files here. Drop me a line, and I'll take care of that.
The SAS/C flavour (smakefile) should get the library built using the "large data"
model. This rules out the use of residentable programs as the startup code I'm
using is very primitive (startup.o) and doesn't tinker with A4 relative data
addressing (and how this may be set up).
There are two makefiles for GCC, each a different flavour. There is "GNUmakefile.68k",
which will build the library for GCC on the 68k platform ("classic" Amiga). This
builds all variants of the library, for large data, small data, resident, whatever
model. It's a lot of work and I don't recommend you do this on a plain 68k machine.
It will literally (!) take hours. The other makefile flavour is for AmigaOS4 using
the PowerPC hosted GCC system ("GNUmakefile.os4"). This builds only the large data
version of the library, but this is usually all you need. Small data support is
currently not implemented but might follow in the future.

View File

@@ -1,235 +0,0 @@
An ISO 'C' (1994) compliant runtime library for the Amiga
=========================================================
1. What is this?
This is my attempt to get Samba 2.2.x ported to the Amiga. My first Amiga
port required SAS/C and a number of strange tricks had to be pulled to get
it to support the kind of environment Samba needed. But with the
introduction of Samba 2.2.x many of those tricks did not work any more,
which is why I decided to attack the problem at the root, namely the
runtime library.
Because it was no longer possible to build Samba with SAS/C on the new
Amiga platform, the idea came up to move development to the GNU 'C'
compiler. This turned out to be a challenge due to its somewhat
underdeveloped runtime library and header files. Eventually, I decided to
rewrite that library from scratch.
2. What does it do?
Using "'C' - A reference manual" as a reference I wrote a set of header
files, then proceeded to implement each single function referenced in them.
With few exceptions in the area of wide character support, the result
should be a feature complete implementation of the ISO 'C' (1994) runtime
library.
Because Samba needs a few POSIX-like routines to be supported, the library
functionality is complemented by a set of routines described in "Advanced
programming in the Unix environent". This set is not complete, however. It
will have to grow even further to accomodate for Samba's needs, but this is
a good start. I specifically added hooks for integrating socket I/O at a
later point of time.
This is not a portable implementation of the library in the sense that you
could move it from one 'C' compiler on one operating system to another.
This is an Amiga specific implementation.
The library supports floating point math, which is limited to IEEE single
and double precision or M68881 inline math. There is no support for the
fast floating point (FFP) format or exclusive IEEE single precision. You
either get double precision (IEEE math) or extended precision (M68881
inline math). What it is that you get is determined at compile time. Use
the IEEE_FLOATING_POINT_SUPPORT preprocessor symbol to activate IEEE math
code and the M68881_FLOATING_POINT_SUPPORT symbol for M68881 inline math.
Not unlike SAS/C, you can configure a minimum stack size the program is to
use when it starts up. This is controlled via the '__stack_size' variable
(see "stdlib_main.c").
I added some amiga.lib and debug.lib functionality to the library, but
don't count on it to be complete.
3. What does it not do?
This library is a departure from the typical 'C' runtime environments of
the past which had to run on all AmigaOS releases, down to Kickstart 1.1.
This very library was designed to take advantage of the routines available
since Kickstart 2.04 was introduced and virtually nobody ever put to use.
This helps to cut the code size, and it also helps to keep bugs out of the
library by falling back onto well-tested implementations. However, the
catch is that the code won't run under Kickstart 1.3 and below. But then
these operating system releases have been obsolete for more than a decade,
and you can always go back to a compiler environment which supports them.
Practically all library routines are implemented in a sort of naïve
fashion. That is, they contain virtually no optimizations whatsoever. This
is particularly apparent in workhorses such as memset() or memmove(). But
then, the issue is easy testability and Amiga platform portability.
There is very little support for amiga.lib functionality. There is
NewList(), HookEntry(), CallHook(), CallHookA(), the DoMethod() family, the
RexxVars family, but that's all. If you need more, you would have to
implement it yourself. Put another way, if you absolutely need
functionality that is only found in amiga.lib, you really shouldn't need in
in the first place.
4. Where does the source code come from?
I originally thought that it might be helpful to piece this library
together from various sources, such as the BSD libc. Turned out that this
code was so 'portable' that it became much more complex than it ought to
be. Also, some side-effects were present which considerably changed the
behaviour of the library. For example, the BSD libc uses bcopy() as an
alias for memcpy(), and unlike memcpy() is documented to, bcopy() supports
overlapping copies.
Eventually, I wrote virtually all the code myself, borrowing algorithmic
ideas from the BSD libc and the Manx Aztec 'C' runtime library. Because I
don't know much about the environment GCC expects, I borrowed code snippets
from libnix, which was written by Matthias Fleischer and Gunther Nikl. This
in particular concerns the integer and floating point math support, the
setjmp/longjmp routines and the startup code. The M68881 inline math code
comes from the <math-68881.h> file written by Matthew Self
(self@bayes.arc.nasa.gov).
5. Limitations and caveats
There is hardly any documentation on the code I wrote. In part this is due
to the fact that the code itself is very simple in design. It should speak
for itself. However, to make a usable runtime library you have to have a
user documentation as in man pages or autodocs. We will eventually have to
have autodocs for this library.
The code is currently plastered with assertions and debug code. It is
therefore much larger than it ought to be and runs much slower than it
ought to be. For example, the malloc() routine will set the contents of the
memory allocated to a 'dirty' bit pattern which is likely to break software
which makes assumptions about its contents. Likewise, the free() routine
will trash the memory to deallocate with a different 'dirty' bit pattern to
turn up reuse of memory after deallocation. All these debugging features
can be disabled by defining the NDEBUG preprocessor symbol at compile time
(see <assert.h>).
The exception handling in the math code is not particularly effective. For
one part this is due to the fact that there is no exception handler
installed by the runtime library when it starts up which could catch and
process the error conditions the CPU or FPU generates. The idea was to
provide for a portable runtime library with little to no assembly language
involved. To make the exception handling complete, such code would be
necessary.
The library currently builds under SAS/C, but because the 'normal' program
startup code is not utilized, the base relative (A4) addressing does not
work. If you are going to test it, use the data=faronly option to compile
the library and the programs.
If you are going to rebuild the library with SAS/C you will need to
reassign INCLUDE: to point to the local 'include' directory or things won't
work.
6. Conventions and design issues
You will have noticed the 330+ files in this directory. This is not the
best way to organize a runtime library, but at least all the bits and
pieces are in plain sight. Each file stands for the one or two routines it
contains. The name indicates what routine(s) that might be. Each file name
is prefixed by the name of the header file in which the corresponding
routine is defined. So, for example, you will find that "unistd_lchown.c"
contains the definition of the lchown() routine, which has its prototype
defined in the <unistd.h> header file.
Internal function and variable names are prefixed with two underscores, as
in '__stdio_init()'.
All routines attempt to do error checking on their parameters. They will
either drop into an assert() or set an errno value and refuse to go any
further. This cuts performance but should help to catch the simple bugs
quite easily (NULL pointers).
Just like any halfway sane Amiga 'C' runtime library, this one performs its
^C checking in the I/O routines. Typically once upon entry and in every
iteration of the loop there might be it will quickly poll the ^C signal and
drop into raise(SIGINT) in case the signal is set. This is just about the
safest method to solve the problem and should be much more robust than the
ixemul approach of 'interrupt anywhere - crash anywhere' using the task
switch/launch hooks to test for signals.
By default all library routines follow the ISO 'C' conventions in that
where implementation defined behaviour is permitted, the AmigaOS rules are
followed. For example, unlink() will by default operate like DeleteFile()
and rename() will return with an error code set if the name of the
file/directory to be renamed would collide with an existing directory
entry. However, your program can set a global variable '__unix_semantics'
which will cause some routines to perform like their Unix counterparts.
This is necessary for Samba to work but not a generally desirable feature.
You have some Unix-like behaviour, but the environment itself is not
completely Unix- or POSIX-compliant. And it shouldn't be. Don't make the
mistake of trying to mold the environment into a POSIX emulation. It
doesn't work; AmigaOS is not Unix.
7. The startup code
There are three program startup files provided. The most simplistic is in
'startup.c' which I use for SAS/C. It just invokes the setup routine which
eventually calls main() and drops straight into exit().
The ncrt0.S file was adapted from the libnix startup code which sets up the
base relative data area, if necessary (the SMALL_DATA preprocessor symbol
must be defined).
The nrcrt0.S file was adapted from libnix startup code, too, and sets up
the base relative data area for programs to be made resident. Note that the
geta4() stub is missing here; it wouldn't work in a resident program
anyway.
The ncrt0.S and nrcrt0.S files are considerably smaller and less complex
than the libnix code they are based on. This is because in this library
design all the more complex tasks are performed in the stdlib_main.c file
rather than in assembly language.
8. Documentation
Well, you're reading it. There isn't anything much yet. You can consult the book
"'C' - A reference manual" and you could look at the Open Group's Single Unix
Specification at <http://www.opengroup.org/onlinepubs/007904975>.
9. Legal status
Because this library is in part based upon free software it would be uncourteous
not to make it free software itself. The BSD license would probably be
appropriate here.
The PowerPC math library is based in part on work by Sun Microsystems:
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
10. Contacting the author
The basic work was done by Olaf Barthel during two weeks in July 2002. You
can reach me at:
Olaf Barthel
Gneisenaustr. 43
D-31275 Lehrte
Or via e-mail:
olsen@sourcery.han.de

View File

@@ -1,5 +1,5 @@
#
# $Id: GNUmakefile.68k,v 1.19 2004-12-26 10:28:56 obarthel Exp $
# $Id: GNUmakefile.68k,v 1.23 2005-01-29 18:05:13 obarthel Exp $
#
# :ts=8
#
@@ -99,8 +99,10 @@ endif
##############################################################################
WARNINGS = \
-Wall -W -Wshadow -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
-Wall -W -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
-Wundef -Wbad-function-cast -Wmissing-declarations
# -Wconversion -Wshadow
INCLUDES = -Iinclude -I. -Inetinclude
OPTIONS = -DNDEBUG -fno-builtin
@@ -361,9 +363,12 @@ C_LIB = \
time_asctime_r.o \
time_clock.o \
time_converttime.o \
time_convert_datestamp.o \
time_convert_time.o \
time_ctime.o \
time_ctime_r.o \
time_data.o \
time_days_per_date.o \
time_gettimeofday.o \
time_gmtime.o \
time_gmtime_r.o \
@@ -373,6 +378,7 @@ C_LIB = \
time_numbertostring.o \
time_strftime.o \
time_time.o \
time_weekday.o \
unistd_access.o \
unistd_chdir.o \
unistd_chdir_exit.o \

View File

@@ -1,5 +1,5 @@
#
# $Id: GNUmakefile.os4,v 1.19 2004-12-26 10:28:56 obarthel Exp $
# $Id: GNUmakefile.os4,v 1.23 2005-01-29 18:05:13 obarthel Exp $
#
# :ts=8
#
@@ -15,7 +15,7 @@ NET_INCLUDE = netinclude
CC = ppc-amigaos-gcc
AR = ppc-amigaos-ar -q
RANLIB = ppc-amigaos-ranlib
COPY = cp
COPY = cp -a
DELETE = rm -r
MAKEDIR = mkdir
@@ -365,9 +365,12 @@ C_LIB = \
time_asctime_r.o \
time_clock.o \
time_converttime.o \
time_convert_datestamp.o \
time_convert_time.o \
time_ctime.o \
time_ctime_r.o \
time_data.o \
time_days_per_date.o \
time_gettimeofday.o \
time_gmtime.o \
time_gmtime_r.o \
@@ -377,6 +380,7 @@ C_LIB = \
time_numbertostring.o \
time_strftime.o \
time_time.o \
time_weekday.o \
unistd_access.o \
unistd_chdir.o \
unistd_chdir_exit.o \

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 185
#define DATE "2.1.2005"
#define VERS "amiga.lib 1.185"
#define VSTRING "amiga.lib 1.185 (2.1.2005)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.185 (2.1.2005)"
#define REVISION 187
#define DATE "29.1.2005"
#define VERS "amiga.lib 1.187"
#define VSTRING "amiga.lib 1.187 (29.1.2005)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.187 (29.1.2005)"

View File

@@ -1 +1 @@
185
187

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_rexxvars.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: amiga_rexxvars.c,v 1.3 2005-01-09 10:10:40 obarthel Exp $
*
* :ts=4
*
@@ -50,12 +50,12 @@
/****************************************************************************/
STATIC struct Library * RexxSysBase;
static struct Library * RexxSysBase;
/****************************************************************************/
#if defined(__amigaos4__)
STATIC struct RexxSysIFace * IRexxSys;
static struct RexxSysIFace * IRexxSys;
#endif /* __amigaos4__ */
/****************************************************************************/
@@ -144,7 +144,7 @@ CheckRexxMsg(struct RexxMsg *message)
LONG
GetRexxVar(struct RexxMsg *message,STRPTR variable_name,STRPTR *buffer_pointer)
{
STATIC TEXT buffer[256];
static UBYTE buffer[256];
LONG result;
/* The following uses a function which was added to rexxsyslib.library V45.

View File

@@ -1,5 +1,5 @@
/*
* $Id: amiga_setsuperattrs.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: amiga_setsuperattrs.c,v 1.3 2005-01-09 10:10:41 obarthel Exp $
*
* :ts=4
*
@@ -46,7 +46,7 @@
/****************************************************************************/
STATIC ULONG
static ULONG
SetSuperAttrsA(Class * cl,Object * obj,struct TagItem * tags)
{
ULONG result = 0;

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 185
#define DATE "2.1.2005"
#define VERS "c.lib 1.185"
#define VSTRING "c.lib 1.185 (2.1.2005)\r\n"
#define VERSTAG "\0$VER: c.lib 1.185 (2.1.2005)"
#define REVISION 187
#define DATE "29.1.2005"
#define VERS "c.lib 1.187"
#define VSTRING "c.lib 1.187 (29.1.2005)\r\n"
#define VERSTAG "\0$VER: c.lib 1.187 (29.1.2005)"

View File

@@ -1 +1 @@
185
187

View File

@@ -1,3 +1,103 @@
c.lib 1.187 (29.1.2005)
- The default console output window opened when a program is launched
from Workbench would open and stay open. This was not intended to
happen and is a side-effect of the new stdio initialization code which
checks if the stdio streams are in non-blocking mode. Fixed.
- Moved the common DateStamp to time_t conversion code into a shared
function.
- The fall-back function for converting time into a string in strftime()
now calls itself for the "%c", "%x" and "%X" format specifiers.
- mktime() is supposed to convert the time specification, given as local
time, into the number of seconds since January 1st, 1970, relative to
UTC. This didn't really work up until now since the time value returned
was given as local time.
- Plugged in a different algorithm for calculating the day of the week in
strftime() and asctime_r(). This one isn't sensitive to the effects of
adding/subtracting the local time zone.
- Changed the algorithm that calculates the number of days that have passed
so far as used by the the __convert_time() function and the conversion
code in strftime().
- Also changed the algorithm used by strftime() to produce the week numbers
(the '%U' and '%W' format specifiers). The new method is much simpler
than the old one.
- Made the code that converts a 'time_t' value into the 'struct DateStamp',
as used by strftime() and utime(), into its own function. This also
fixes a bug in the code strftime() would use which was completely
unaware of the local time zone settings.
c.lib 1.186 (14.1.2005)
- Redirecting stderr to a file no longer has the effect of showing error
messages and assertion failure notifications as requesters. The exception
is in redirecting stderr to NIL: which will prompt the requester use.
- gettimeofday() now calls GetSysTime() rather than DateStamp() to obtain
the current system time. This resolves granularity issues since the
DateStamp() result was only accurate by 1/50 of a second.
- The "ptrdiff_t" definition in <stddef.h> now defaults to type 'int' rather
than 'long int'.
- The "char" limits in <limits.h> are now set up according to the current
compiler settings, which can either default to an unsigned or
signed definition.
- Changed the rules again for the use of stderr/stdout redirection when
printing error messages. It is always safe to redirect them now and
no requester will appear unless you specifically set the value of the
"__no_standard_io" variable to TRUE in your program.
- Removed a misplaced IsInteractive() from the stdio initialization
function. Now this could have been big trouble...
- Removed tests for FileHandle->fh_Type != NULL which used to precede
all IsInterative() tests. I verified that IsInteractive() will always
return FALSE for NIL: type file handles.
- Dropped the special flag variable used by the abort() function that
tracks whether or not console output is possible. We now use the
global "__no_standard_io" instead.
- Made the <ctype.h> macros more robust.
- Removed the "NIL:" file handle tests preceding the Open("CONSOLE:",..)
calls. As of Kickstart 2.x and beyond these are no longer a source of
trouble.
- The V37/V40 compatibility code is no longer built for the AmigaOS4
version of the library.
- Switched over the last use of DeviceProc() to GetDeviceProc(), etc.
- open() no longer examines a file after opening it in order to figure
out whether read/write accesses are permitted. This decision is now
for the file system to make.
- Whether or not stdio console streams are blocking or non-blocking
is now determined at initialization time. The I/O mode is restored before
the program exits. Previously, any changes to the I/O mode would persist.
- Lost some more code that is not required for AmigaOS 4.x and can be
handled conveniently through conditional compilation.
- close() did not reset the non-blocking file property, as it should
have. This only worked for files which were closed anyway, but not
for the stdio streams. Fixed.
- Added a missing definition to stdio_init_exit.c which is part of
the OS4 header files, but not of the older header file distributions.
c.lib 1.185 (2.1.2005)
- Moved the environment variable cleanup code into a destructor function.

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype_table.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: ctype_table.c,v 1.3 2005-01-09 15:20:31 obarthel Exp $
*
* :ts=4
*
@@ -36,22 +36,8 @@
/****************************************************************************/
/* The construction of this table is rather peculiar. The assumption is that
the table index from which a flag value could be fetched is in the range
-128..255 since the character to be tested could be a signed or unsigned
8 bit value. The table access pointer (declared below) therefore points
to the 128th byte of '__ctype_data[]'. */
static const unsigned char __ctype_data[3 * 128] =
const unsigned char __ctype_table[2 * 128] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0 */ __CTYPE_CONTROL,
/* 1 */ __CTYPE_CONTROL,
/* 2 */ __CTYPE_CONTROL,
@@ -190,7 +176,3 @@ static const unsigned char __ctype_data[3 * 128] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
/****************************************************************************/
const unsigned char * const __ctype_table = &__ctype_data[128];

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 185
#define DATE "2.1.2005"
#define VERS "debug.lib 1.185"
#define VSTRING "debug.lib 1.185 (2.1.2005)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.185 (2.1.2005)"
#define REVISION 187
#define DATE "29.1.2005"
#define VERS "debug.lib 1.187"
#define VSTRING "debug.lib 1.187 (29.1.2005)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.187 (29.1.2005)"

View File

@@ -1 +1 @@
185
187

View File

@@ -1,5 +1,5 @@
/*
* $Id: dirent_readdir.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
* $Id: dirent_readdir.c,v 1.5 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@@ -89,7 +89,6 @@ readdir(DIR * directory_pointer)
D_S(struct FileInfoBlock,fib);
D_S(struct bcpl_name,bcpl_name);
UBYTE * name = bcpl_name->name;
struct MsgPort * port;
BPTR dir_lock;
assert( (((ULONG)name) & 3) == 0 );
@@ -103,10 +102,12 @@ readdir(DIR * directory_pointer)
{
if(IsFileSystem(dh->dh_VolumeNode->ln_Name))
{
port = DeviceProc(dh->dh_VolumeNode->ln_Name);
if(port != NULL)
struct DevProc * dvp;
dvp = GetDeviceProc(dh->dh_VolumeNode->ln_Name,NULL);
if(dvp != NULL)
{
dir_lock = DoPkt(port,ACTION_LOCATE_OBJECT,ZERO,MKBADDR(name),SHARED_LOCK, 0,0);
dir_lock = DoPkt(dvp->dvp_Port,ACTION_LOCATE_OBJECT,ZERO,MKBADDR(name),SHARED_LOCK, 0,0);
if(dir_lock != ZERO)
{
if(Examine(dir_lock,fib))
@@ -122,6 +123,8 @@ readdir(DIR * directory_pointer)
UnLock(dir_lock);
}
FreeDeviceProc(dvp);
}
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_close.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
* $Id: fcntl_close.c,v 1.6 2005-01-14 08:36:54 obarthel Exp $
*
* :ts=4
*
@@ -45,9 +45,12 @@ int
__close(int file_descriptor,int * error_ptr)
{
DECLARE_UTILITYBASE();
struct file_hook_message message;
struct fd * fd;
int result = -1;
BOOL no_close;
BOOL is_alias;
ENTER();
@@ -96,6 +99,7 @@ __close(int file_descriptor,int * error_ptr)
}
no_close = TRUE;
is_alias = TRUE;
}
else if (fd->fd_NextLink != NULL) /* this one has aliases attached; it is the 'original' resource */
{
@@ -117,31 +121,36 @@ __close(int file_descriptor,int * error_ptr)
}
no_close = TRUE;
is_alias = TRUE;
}
else
{
no_close = FLAG_IS_SET(fd->fd_Flags,FDF_NO_CLOSE);
is_alias = FALSE;
}
(*error_ptr) = OK;
if(NOT no_close)
/* Reset the console to regular buffered/unbuffered input. We don't do this
for aliases and their like since the original stream is still in use. */
if(NOT is_alias)
{
struct file_hook_message message;
/* Reset the console to regular buffered input. */
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
if((FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_DEFAULT_NON_BLOCKING)) ||
(FLAG_IS_CLEAR(fd->fd_Flags,FDF_NON_BLOCKING) && FLAG_IS_SET(fd->fd_Flags,FDF_DEFAULT_NON_BLOCKING)))
{
SHOWMSG("resetting non-blocking access mode");
message.action = file_hook_action_set_blocking;
message.arg = 1;
message.arg = FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING);
assert( fd->fd_Hook != NULL );
CallHookPkt(fd->fd_Hook,fd,&message);
}
}
(*error_ptr) = OK;
if(NOT no_close && NOT is_alias)
{
SHOWMSG("shutting down");
message.action = file_hook_action_close;

View File

@@ -1,5 +1,5 @@
/*
* $Id: fcntl_open.c,v 1.4 2005-01-02 09:07:07 obarthel Exp $
* $Id: fcntl_open.c,v 1.7 2005-01-09 16:07:27 obarthel Exp $
*
* :ts=4
*
@@ -53,6 +53,39 @@
/****************************************************************************/
/* This is used in place of ChangeMode() in order to work around a bug in
dos.library V40 and below: a "NIL:" file handle will crash the
caller of the ChangeMode() function. */
static LONG
safe_change_mode(LONG type,BPTR file_handle,LONG mode)
{
LONG result = DOSFALSE;
#ifndef __amigaos4__
{
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
assert( type == CHANGE_FH );
if(fh == NULL || fh->fh_Type == NULL)
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
}
}
#endif /* __amigaos4__ */
PROFILE_OFF();
result = ChangeMode(type,file_handle,mode);
PROFILE_ON();
out:
return(result);
}
/****************************************************************************/
int
open(const char *path_name, int open_flag, ... /* mode_t mode */ )
{
@@ -64,10 +97,9 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
LONG is_file_system = FALSE;
LONG open_mode;
BPTR lock = ZERO;
struct FileHandle * file_handle;
BPTR handle = ZERO;
BOOL create_new_file = FALSE;
LONG is_interactive = FALSE;
LONG is_interactive;
int fd_slot_number;
struct fd * fd;
int access_mode;
@@ -294,60 +326,13 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
goto out;
}
file_handle = BADDR(handle);
/* NOTE: workaround for a bug in dos.library V40 and below which will
* crash the caller if the file handle refers to "NIL:".
*/
if(file_handle->fh_Type != NULL)
{
LONG status;
PROFILE_OFF();
status = ExamineFH(handle,fib);
PROFILE_ON();
if(status != DOSFALSE)
{
BOOL operation_permitted = TRUE;
/* Check if the file is readable. */
if(FLAG_IS_SET(fib->fib_Protection,FIBF_READ))
{
if(access_mode == O_RDONLY ||
access_mode == O_RDWR)
{
operation_permitted = FALSE;
}
}
/* Check if the file can be written to. */
if(FLAG_IS_SET(fib->fib_Protection,FIBF_WRITE))
{
if(access_mode == O_WRONLY)
operation_permitted = FALSE;
}
if(NOT operation_permitted)
{
SHOWMSG("this object must not be opened");
errno = EACCES;
goto out;
}
}
}
fd = __fd[fd_slot_number];
__initialize_fd(fd,(HOOKFUNC)__fd_hook_entry,handle,0);
/* Figure out if this stream is attached to a console. */
PROFILE_OFF();
if(file_handle->fh_Type != NULL)
is_interactive = IsInteractive(handle);
is_interactive = IsInteractive(handle);
PROFILE_ON();
if(is_interactive)
@@ -368,7 +353,7 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
len = 0;
for(i = 0 ; i < (int)strlen(path_name) ; i++)
for(i = 0 ; path_name[i] != '\0' ; i++)
{
if(path_name[i] == ':')
{
@@ -403,21 +388,11 @@ open(const char *path_name, int open_flag, ... /* mode_t mode */ )
if(is_file_system)
{
/* NOTE: workaround for a bug in dos.library V40 and below which will
* crash the caller if the file handle refers to "NIL:".
*/
if(file_handle->fh_Type != NULL)
{
/* We opened the file in exclusive access mode. Switch it back
into shared access mode so that its contents can be read
while it's still open. */
if(open_mode == MODE_NEWFILE)
{
PROFILE_OFF();
ChangeMode(CHANGE_FH,handle,SHARED_LOCK);
PROFILE_ON();
}
}
/* We opened the file in exclusive access mode. Switch it back
into shared access mode so that its contents can be read
while it's still open. */
if(open_mode == MODE_NEWFILE)
safe_change_mode(CHANGE_FH,handle,SHARED_LOCK);
/* We should be able to seek in this file. */
SET_FLAG(fd->fd_Flags,FDF_CACHE_POSITION);

View File

@@ -1,5 +1,5 @@
/*
* $Id: ctype.h,v 1.4 2005-01-02 09:07:21 obarthel Exp $
* $Id: ctype.h,v 1.5 2005-01-09 15:20:33 obarthel Exp $
*
* :ts=4
*
@@ -66,15 +66,14 @@ extern int toupper(int c);
/*
* If requested, reimplement the character classification functions as macros;
* note that the macro variants ignore the current locale and default to the
* 'C' locale rules. Note that the characters to be tested must be either
* signed or unsigned 8 bit values.
* 'C' locale rules.
*/
#ifdef __C_MACROS__
/****************************************************************************/
extern const unsigned char * const __ctype_table;
extern const unsigned char __ctype_table[];
/****************************************************************************/
@@ -89,17 +88,17 @@ extern const unsigned char * const __ctype_table;
/****************************************************************************/
#define isalnum(c) ((__ctype_table[c] & (__CTYPE_DIGIT|__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
#define isalpha(c) ((__ctype_table[c] & (__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
#define iscntrl(c) ((__ctype_table[c] & __CTYPE_CONTROL) != 0)
#define isdigit(c) ((__ctype_table[c] & __CTYPE_DIGIT) != 0)
#define isxdigit(c) ((__ctype_table[c] & __CTYPE_HEX_DIGIT) != 0)
#define isgraph(c) ((__ctype_table[c] & (__CTYPE_DIGIT|__CTYPE_PUNCTUATION|__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
#define ispunct(c) ((__ctype_table[c] & __CTYPE_PUNCTUATION) != 0)
#define isprint(c) ((__ctype_table[c] & __CTYPE_PRINTABLE) != 0)
#define islower(c) ((__ctype_table[c] & __CTYPE_LOWER_CASE) != 0)
#define isupper(c) ((__ctype_table[c] & __CTYPE_UPPER_CASE) != 0)
#define isspace(c) ((__ctype_table[c] & __CTYPE_WHITE_SPACE) != 0)
#define isalnum(c) ((__ctype_table[(c) & 255] & (__CTYPE_DIGIT|__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
#define isalpha(c) ((__ctype_table[(c) & 255] & (__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
#define iscntrl(c) ((__ctype_table[(c) & 255] & __CTYPE_CONTROL) != 0)
#define isdigit(c) ((__ctype_table[(c) & 255] & __CTYPE_DIGIT) != 0)
#define isxdigit(c) ((__ctype_table[(c) & 255] & __CTYPE_HEX_DIGIT) != 0)
#define isgraph(c) ((__ctype_table[(c) & 255] & (__CTYPE_DIGIT|__CTYPE_PUNCTUATION|__CTYPE_LOWER_CASE|__CTYPE_UPPER_CASE)) != 0)
#define ispunct(c) ((__ctype_table[(c) & 255] & __CTYPE_PUNCTUATION) != 0)
#define isprint(c) ((__ctype_table[(c) & 255] & __CTYPE_PRINTABLE) != 0)
#define islower(c) ((__ctype_table[(c) & 255] & __CTYPE_LOWER_CASE) != 0)
#define isupper(c) ((__ctype_table[(c) & 255] & __CTYPE_UPPER_CASE) != 0)
#define isspace(c) ((__ctype_table[(c) & 255] & __CTYPE_WHITE_SPACE) != 0)
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: limits.h,v 1.4 2005-01-02 09:07:21 obarthel Exp $
* $Id: limits.h,v 1.5 2005-01-09 09:40:33 obarthel Exp $
*
* :ts=4
*
@@ -36,24 +36,53 @@
/****************************************************************************/
#define CHAR_BIT 8
#define CHAR_MAX 127
#define CHAR_MIN -128
#define INT_MAX 2147483647L
#define INT_MIN (-2147483647L - 1)
#define LONG_MAX 2147483647L
#define LONG_MIN (-2147483647L - 1)
#define SCHAR_MAX 127
#define SCHAR_MIN -128
#define SHRT_MAX 32767
#define CHAR_BIT 8
/****************************************************************************/
#define SCHAR_MIN -128
#define SCHAR_MAX 127
#define UCHAR_MAX 255
/****************************************************************************/
/*
* The following defines the range a 'char' can cover by checking a
* preprocessor symbol; we support both SAS/C and GCC here.
*/
#if (defined(__GNUC__) && defined(__CHAR_UNSIGNED__)) || (defined(__SASC) && defined(_UNSCHAR))
#define CHAR_MIN 0
#define CHAR_MAX 255
#else
#define CHAR_MIN -128
#define CHAR_MAX 127
#endif /* (__GNUC__ && __CHAR_UNSIGNED) || (__SASC && _UNSCHAR) */
/****************************************************************************/
#define SHRT_MIN -32768
#define UCHAR_MAX 255
#define UINT_MAX 4294967295UL
#define ULONG_MAX 4294967295UL
#define SHRT_MAX 32767
#define USHRT_MAX 65535
/****************************************************************************/
#define INT_MIN (-2147483647L - 1)
#define INT_MAX 2147483647L
#define UINT_MAX 4294967295UL
/****************************************************************************/
#define LONG_MIN (-2147483647L - 1)
#define LONG_MAX 2147483647L
#define ULONG_MAX 4294967295UL
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stddef.h,v 1.2 2005-01-02 09:07:21 obarthel Exp $
* $Id: stddef.h,v 1.3 2005-01-08 10:21:28 obarthel Exp $
*
* :ts=4
*
@@ -52,7 +52,7 @@ extern "C" {
/****************************************************************************/
typedef long int ptrdiff_t;
typedef int ptrdiff_t;
typedef unsigned int size_t;
typedef unsigned int wchar_t;

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 185
#define DATE "2.1.2005"
#define VERS "m.lib 1.185"
#define VSTRING "m.lib 1.185 (2.1.2005)\r\n"
#define VERSTAG "\0$VER: m.lib 1.185 (2.1.2005)"
#define REVISION 187
#define DATE "29.1.2005"
#define VERS "m.lib 1.187"
#define VSTRING "m.lib 1.187 (29.1.2005)\r\n"
#define VERSTAG "\0$VER: m.lib 1.187 (29.1.2005)"

View File

@@ -1 +1 @@
185
187

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 185
#define DATE "2.1.2005"
#define VERS "m881.lib 1.185"
#define VSTRING "m881.lib 1.185 (2.1.2005)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.185 (2.1.2005)"
#define REVISION 187
#define DATE "29.1.2005"
#define VERS "m881.lib 1.187"
#define VSTRING "m881.lib 1.187 (29.1.2005)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.187 (29.1.2005)"

View File

@@ -1 +1 @@
185
187

View File

@@ -1,5 +1,5 @@
/*
* $Id: macros.h,v 1.4 2005-01-02 09:07:07 obarthel Exp $
* $Id: macros.h,v 1.7 2005-01-29 18:05:14 obarthel Exp $
*
* :ts=4
*
@@ -60,6 +60,9 @@
/****************************************************************************/
/* This is the difference (in seconds) between the Unix epoch (which began
on January 1st, 1970) and the AmigaOS epoch (which began eight years
later on January 1st 1978). */
#define UNIX_TIME_OFFSET 252460800
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_ceil.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_ceil.c,v 1.3 2005-01-26 09:24:38 obarthel Exp $
*
* :ts=4
*
@@ -150,7 +150,6 @@ __ceil(double x)
#if defined(PPC_FLOATING_POINT_SUPPORT)
static const double huge = 1.0e300;
INLINE static const double
@@ -233,6 +232,7 @@ __ceil(double x)
}
#endif /* PPC_FLOATING_POINT_SUPPORT */
/****************************************************************************/
double

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_cos.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_cos.c,v 1.3 2005-01-26 09:24:38 obarthel Exp $
*
* :ts=4
*
@@ -172,6 +172,7 @@ __cos(double x)
}
}
}
#endif /* PPC_FLOATING_POINT_SUPPORT */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_log.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_log.c,v 1.4 2005-01-18 20:00:08 obarthel Exp $
*
* :ts=4
*
@@ -244,11 +244,10 @@ log(double x)
{
double result;
/* ZZZ when do we consider 'x' to be invalid? If it's close
* enough to zero or negative. How large is epsilon, and how
* do we return minus infinity?
/* When do we consider 'x' to be invalid? If it's close
* enough to zero or negative.
*/
if(x > 0.0)
if(x > DBL_EPSILON)
{
result = __log(x);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: math_log10.c,v 1.2 2005-01-02 09:07:07 obarthel Exp $
* $Id: math_log10.c,v 1.3 2005-01-18 20:00:08 obarthel Exp $
*
* :ts=4
*
@@ -186,11 +186,10 @@ log10(double x)
{
double result;
/* ZZZ when do we consider 'x' to be invalid? If it's close
* enough to zero or negative. How large is epsilon, and how
* do we return minus infinity?
/* When do we consider 'x' to be invalid? If it's close
* enough to zero or negative.
*/
if(x > 0.0)
if(x > DBL_EPSILON)
{
result = __log10(x);
}

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 185
#define DATE "2.1.2005"
#define VERS "net.lib 1.185"
#define VSTRING "net.lib 1.185 (2.1.2005)\r\n"
#define VERSTAG "\0$VER: net.lib 1.185 (2.1.2005)"
#define REVISION 187
#define DATE "29.1.2005"
#define VERS "net.lib 1.187"
#define VSTRING "net.lib 1.187 (29.1.2005)\r\n"
#define VERSTAG "\0$VER: net.lib 1.187 (29.1.2005)"

View File

@@ -1 +1 @@
185
187

View File

@@ -1,5 +1,5 @@
/*
* $Id: signal_data.c,v 1.3 2005-01-02 09:07:07 obarthel Exp $
* $Id: signal_data.c,v 1.4 2005-01-09 10:10:41 obarthel Exp $
*
* :ts=4
*
@@ -54,7 +54,3 @@ int __signals_blocked;
/****************************************************************************/
BOOL __check_abort_enabled = TRUE;
/****************************************************************************/
BOOL __termination_message_disabled;

View File

@@ -1,5 +1,5 @@
/*
* $Id: signal_headers.h,v 1.5 2005-01-02 09:07:07 obarthel Exp $
* $Id: signal_headers.h,v 1.6 2005-01-09 10:10:41 obarthel Exp $
*
* :ts=4
*
@@ -76,10 +76,6 @@ extern int NOCOMMON __signals_blocked;
/****************************************************************************/
extern BOOL NOCOMMON __termination_message_disabled;
/****************************************************************************/
#ifndef _STDLIB_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */

View File

@@ -1,5 +1,5 @@
#
# $Id: smakefile,v 1.15 2004-12-26 10:28:56 obarthel Exp $
# $Id: smakefile,v 1.18 2005-01-29 18:05:14 obarthel Exp $
#
# :ts=8
#
@@ -471,9 +471,12 @@ TIME_OBJ = \
time_asctime_r.o \
time_clock.o \
time_converttime.o \
time_convert_datestamp.o \
time_convert_time.o \
time_ctime.o \
time_ctime_r.o \
time_data.o \
time_days_per_date.o \
time_difftime.o \
time_gettimeofday.o \
time_gmtime.o \
@@ -483,7 +486,8 @@ TIME_OBJ = \
time_mktime.o \
time_numbertostring.o \
time_strftime.o \
time_time.o
time_time.o \
time_weekday.o
UNISTD_OBJ = \
unistd_access.o \

View File

@@ -1,5 +1,5 @@
/*
* $Id: socket_init_exit.c,v 1.7 2005-01-02 09:07:08 obarthel Exp $
* $Id: socket_init_exit.c,v 1.8 2005-01-09 10:10:41 obarthel Exp $
*
* :ts=4
*
@@ -244,15 +244,13 @@ __socket_init(void)
SHOWVALUE(daemon_socket);
/* Whatever happens, the following likely won't end up
* in the console...
*/
__termination_message_disabled = TRUE;
/* Shut down the three standard I/O streams. */
for(i = STDIN_FILENO ; i <= STDERR_FILENO ; i++)
close(i);
/* The standard I/O streams are no longer attached to a console. */
__no_standard_io = TRUE;
/* Put the socket into the three standard I/O streams. */
for(i = STDIN_FILENO ; i <= STDERR_FILENO ; i++)
{
@@ -284,9 +282,6 @@ __socket_init(void)
/* This program now runs as an internet superserver client (daemon). */
__is_daemon = TRUE;
/* The standard I/O streams are no longer attached to a console. */
__no_standard_io = TRUE;
}
}

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 185
#define DATE "2.1.2005"
#define VERS "stack.lib 1.185"
#define VSTRING "stack.lib 1.185 (2.1.2005)\r\n"
#define VERSTAG "\0$VER: stack.lib 1.185 (2.1.2005)"
#define REVISION 187
#define DATE "29.1.2005"
#define VERS "stack.lib 1.187"
#define VSTRING "stack.lib 1.187 (29.1.2005)\r\n"
#define VERSTAG "\0$VER: stack.lib 1.187 (29.1.2005)"

View File

@@ -1 +1 @@
185
187

View File

@@ -1,5 +1,5 @@
/*
* $Id: stat_convertfileinfo.c,v 1.4 2005-01-02 09:07:08 obarthel Exp $
* $Id: stat_convertfileinfo.c,v 1.5 2005-01-24 10:25:46 obarthel Exp $
*
* :ts=4
*
@@ -39,6 +39,10 @@
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
#ifndef _TIME_HEADERS_H
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
/****************************************************************************/
void
@@ -109,9 +113,7 @@ __convert_file_info_to_stat(
if(FLAG_IS_SET(flags,FIBF_OTR_EXECUTE))
SET_FLAG(mode,S_IXOTH);
mtime = UNIX_TIME_OFFSET + fib->fib_Date.ds_Days * 24*60*60 + fib->fib_Date.ds_Minute * 60 + (fib->fib_Date.ds_Tick / TICKS_PER_SECOND);
if(__default_locale != NULL)
mtime += 60 * __default_locale->loc_GMTOffset;
mtime = __convert_datestamp_to_time(&fib->fib_Date);
if(fib->fib_DirEntryType < 0)
{

View File

@@ -1,5 +1,5 @@
/*
* $Id: stat_stat.c,v 1.3 2005-01-02 09:07:08 obarthel Exp $
* $Id: stat_stat.c,v 1.4 2005-01-24 10:25:46 obarthel Exp $
*
* :ts=4
*
@@ -45,6 +45,10 @@
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
#ifndef _TIME_HEADERS_H
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
@@ -108,9 +112,7 @@ stat(const char * path_name, struct stat * st)
DateStamp(&ds);
PROFILE_ON();
mtime = UNIX_TIME_OFFSET + ds.ds_Days * 24*60*60 + ds.ds_Minute * 60 + (ds.ds_Tick / TICKS_PER_SECOND);
if(__default_locale != NULL)
mtime += 60 * __default_locale->loc_GMTOffset;
mtime = __convert_datestamp_to_time(&ds);
st->st_mode = S_IFDIR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
st->st_mtime = mtime;

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_fdhookentry.c,v 1.5 2005-01-02 09:07:08 obarthel Exp $
* $Id: stdio_fdhookentry.c,v 1.7 2005-01-12 09:15:50 obarthel Exp $
*
* :ts=4
*
@@ -59,16 +59,21 @@
static LONG
safe_examine_file_handle(BPTR file_handle,struct FileInfoBlock *fib)
{
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
LONG result = DOSFALSE;
assert( fib != NULL );
if(fh == NULL || fh->fh_Type == NULL)
#ifndef __amigaos4__
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
if(fh == NULL || fh->fh_Type == NULL)
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
}
}
#endif /* __amigaos4__ */
PROFILE_OFF();
result = ExamineFH(file_handle,fib);
@@ -85,14 +90,19 @@ safe_examine_file_handle(BPTR file_handle,struct FileInfoBlock *fib)
static BPTR
safe_parent_of_file_handle(BPTR file_handle)
{
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
BPTR result = ZERO;
if(fh == NULL || fh->fh_Type == NULL)
#ifndef __amigaos4__
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
struct FileHandle * fh = (struct FileHandle *)BADDR(file_handle);
if(fh == NULL || fh->fh_Type == NULL)
{
SetIoErr(ERROR_OBJECT_WRONG_TYPE);
goto out;
}
}
#endif /* __amigaos4__ */
PROFILE_OFF();
result = ParentOfFH(file_handle);
@@ -244,19 +254,27 @@ obtain_file_lock_semaphore(BOOL shared)
if(shared)
{
if(((struct Library *)SysBase)->lib_Version >= 39)
#if defined(__amigaos4__)
{
ObtainSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore);
}
else
#else
{
/* Workaround for shared semaphore nesting problem. */
if(CANNOT AttemptSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore))
if(((struct Library *)SysBase)->lib_Version >= 39)
{
if(CANNOT AttemptSemaphore((struct SignalSemaphore *)FileLockSemaphore))
ObtainSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore);
ObtainSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore);
}
else
{
/* Workaround for shared semaphore nesting problem. */
if(CANNOT AttemptSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore))
{
if(CANNOT AttemptSemaphore((struct SignalSemaphore *)FileLockSemaphore))
ObtainSemaphoreShared((struct SignalSemaphore *)FileLockSemaphore);
}
}
}
#endif /* __amigaos4__ */
}
else
{
@@ -1830,9 +1848,9 @@ __fd_hook_entry(
SHOWMSG("changing the mode");
if(message->arg != 0)
mode = 0; /* buffered mode */
mode = DOSFALSE; /* buffered mode */
else
mode = 1; /* single character mode */
mode = DOSTRUE; /* single character mode */
if(CANNOT SetMode(fd->fd_DefaultFile,mode))
{
@@ -1885,10 +1903,8 @@ __fd_hook_entry(
old_current_dir = CurrentDir(parent_dir);
if(((struct Library *)DOSBase)->lib_Version >= 39)
#if defined(__amigaos4__)
{
SHOWMSG("changing owner");
if(SetOwner(fib->fib_FileName,(LONG)((((ULONG)message->owner) << 16) | message->group)))
{
result = 0;
@@ -1900,36 +1916,55 @@ __fd_hook_entry(
__translate_io_error_to_errno(IoErr(),&error);
}
}
else
#else
{
D_S(struct bcpl_name,new_name);
struct DevProc * dvp;
unsigned int len;
SHOWMSG("have to do this manually...");
len = strlen(fib->fib_FileName);
assert( len < sizeof(new_name->name) );
dvp = GetDeviceProc(fib->fib_FileName,NULL);
if(dvp != NULL)
if(((struct Library *)DOSBase)->lib_Version >= 39)
{
new_name->name[0] = len;
memmove(&new_name->name[1],fib->fib_FileName,len);
SHOWMSG("changing owner");
if(DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)message->owner) << 16) | message->group),0,0))
if(SetOwner(fib->fib_FileName,(LONG)((((ULONG)message->owner) << 16) | message->group)))
{
result = 0;
}
else
__translate_io_error_to_errno(IoErr(),&error);
{
SHOWMSG("that didn't work");
FreeDeviceProc(dvp);
__translate_io_error_to_errno(IoErr(),&error);
}
}
else
{
__translate_io_error_to_errno(IoErr(),&error);
D_S(struct bcpl_name,new_name);
struct DevProc * dvp;
unsigned int len;
SHOWMSG("have to do this manually...");
len = strlen(fib->fib_FileName);
assert( len < sizeof(new_name->name) );
dvp = GetDeviceProc(fib->fib_FileName,NULL);
if(dvp != NULL)
{
new_name->name[0] = len;
memmove(&new_name->name[1],fib->fib_FileName,len);
if(DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)message->owner) << 16) | message->group),0,0))
result = 0;
else
__translate_io_error_to_errno(IoErr(),&error);
FreeDeviceProc(dvp);
}
else
{
__translate_io_error_to_errno(IoErr(),&error);
}
}
}
#endif /* __amigaos4__ */
CurrentDir(old_current_dir);

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_headers.h,v 1.8 2005-01-02 09:07:08 obarthel Exp $
* $Id: stdio_headers.h,v 1.9 2005-01-12 09:15:50 obarthel Exp $
*
* :ts=4
*
@@ -249,25 +249,27 @@ struct iob
/****************************************************************************/
#define FDF_READ (1UL<<0) /* Data can be read from this file */
#define FDF_WRITE (1UL<<1) /* Data can be written to this file */
#define FDF_APPEND (1UL<<2) /* Before any data is written to it,
the file position must be set to the
end of the file */
#define FDF_NO_CLOSE (1UL<<3) /* Never close this file */
#define FDF_NON_BLOCKING (1UL<<4) /* File was switched into non-blocking
mode (console streams only) */
#define FDF_IS_SOCKET (1UL<<5) /* This is not a disk file but a socket */
#define FDF_IS_LOCKED (1UL<<6) /* This file has an advisory record lock set */
#define FDF_IN_USE (1UL<<7) /* This file is in use */
#define FDF_CREATED (1UL<<8) /* This file was newly created and may need
to have its protection bits updated after
it has been closed */
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
#define FDF_ASYNC_IO (1UL<<10) /* File was switched into asynchronous I/O
mode (sockets only). */
#define FDF_IS_INTERACTIVE (1UL<<11) /* File is attached to a console window or
something like it. */
#define FDF_READ (1UL<<0) /* Data can be read from this file */
#define FDF_WRITE (1UL<<1) /* Data can be written to this file */
#define FDF_APPEND (1UL<<2) /* Before any data is written to it,
the file position must be set to the
end of the file */
#define FDF_NO_CLOSE (1UL<<3) /* Never close this file */
#define FDF_NON_BLOCKING (1UL<<4) /* File was switched into non-blocking
mode (console streams only) */
#define FDF_IS_SOCKET (1UL<<5) /* This is not a disk file but a socket */
#define FDF_IS_LOCKED (1UL<<6) /* This file has an advisory record lock set */
#define FDF_IN_USE (1UL<<7) /* This file is in use */
#define FDF_CREATED (1UL<<8) /* This file was newly created and may need
to have its protection bits updated after
it has been closed */
#define FDF_CACHE_POSITION (1UL<<9) /* Cache the file position. */
#define FDF_ASYNC_IO (1UL<<10) /* File was switched into asynchronous I/O
mode (sockets only). */
#define FDF_IS_INTERACTIVE (1UL<<11) /* File is attached to a console window or
something like it. */
#define FDF_DEFAULT_NON_BLOCKING (1UL<<12) /* This file defaults to non-blocking I/O
mode. */
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdio_init_exit.c,v 1.6 2005-01-02 09:07:08 obarthel Exp $
* $Id: stdio_init_exit.c,v 1.14 2005-01-15 08:17:10 obarthel Exp $
*
* :ts=4
*
@@ -51,6 +51,12 @@
/****************************************************************************/
#ifndef ID_RAWCON
#define ID_RAWCON 0x52415700L /* "RAW\0" */
#endif /* ID_RAWCON */
/****************************************************************************/
void
__close_all_files(void)
{
@@ -113,6 +119,8 @@ __stdio_init(void)
ENTER();
assert( num_standard_files == (STDERR_FILENO-STDIN_FILENO+1) );
__iob = malloc(sizeof(*__iob) * num_standard_files);
if(__iob == NULL)
goto out;
@@ -169,7 +177,7 @@ __stdio_init(void)
iob_flags = IOBF_IN_USE | IOBF_WRITE | IOBF_NO_NUL | IOBF_BUFFER_MODE_NONE;
fd_flags = FDF_IN_USE | FDF_WRITE;
default_file = ZERO;
default_file = ZERO; /* NOTE: this is really initialized later; see below... */
break;
}
@@ -183,13 +191,37 @@ __stdio_init(void)
/* Check if this stream is attached to a console window. */
if(default_file != ZERO)
{
struct FileHandle * fh = BADDR(default_file);
PROFILE_OFF();
if(fh->fh_Type != NULL && IsInteractive(default_file))
if(IsInteractive(default_file))
{
SET_FLAG(fd_flags,FDF_IS_INTERACTIVE);
/* Try to figure out if the console is in single
character mode. We don't do that if we opened the
output console window since this will prevent it
from closing, or end up making it visible. */
if(__WBenchMsg == NULL)
{
struct FileHandle * fh;
fh = BADDR(default_file);
if(fh->fh_Type != NULL)
{
D_S(struct InfoData,id);
if(DoPkt(fh->fh_Type,ACTION_DISK_INFO,MKBADDR(id),0,0,0,0))
{
if(id->id_DiskType == ID_RAWCON)
{
SET_FLAG(fd_flags,FDF_NON_BLOCKING);
SET_FLAG(fd_flags,FDF_DEFAULT_NON_BLOCKING);
}
}
}
}
}
PROFILE_ON();
}
@@ -242,13 +274,9 @@ __stdio_init(void)
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_NO_CLOSE);
}
else if (__fd[STDOUT_FILENO]->fd_DefaultFile != ZERO)
else
{
struct FileHandle * fh = (struct FileHandle *)BADDR(__fd[STDOUT_FILENO]->fd_DefaultFile);
/* Careful, this could be "NIL:". */
if(fh->fh_Type != NULL)
__fd[STDERR_FILENO]->fd_DefaultFile = Open("CONSOLE:",MODE_NEWFILE);
__fd[STDERR_FILENO]->fd_DefaultFile = Open("CONSOLE:",MODE_NEWFILE);
}
}
@@ -257,19 +285,34 @@ __stdio_init(void)
/* Figure out if the standard error stream is bound to a console. */
if(__fd[STDERR_FILENO]->fd_DefaultFile != ZERO)
{
struct FileHandle * fh = BADDR(IsInteractive(__fd[STDERR_FILENO]->fd_DefaultFile));
if(fh->fh_Type != NULL && IsInteractive(__fd[STDERR_FILENO]->fd_DefaultFile))
if(IsInteractive(__fd[STDERR_FILENO]->fd_DefaultFile))
{
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_IS_INTERACTIVE);
}
/* Check if the standard/error output refers to a console or must
be considered unusable for console output. */
if(FLAG_IS_CLEAR(__fd[STDOUT_FILENO]->fd_Flags,FDF_IS_INTERACTIVE) ||
FLAG_IS_CLEAR(__fd[STDERR_FILENO]->fd_Flags,FDF_IS_INTERACTIVE))
{
/* The standard I/O streams are no longer attached to a console. */
__no_standard_io = TRUE;
/* Careful: the console handler may open an AUTO console window
which so far was hidden when the ACTION_DISK_INFO
packet is sent. We don't want that to happen if we
can avoid it. */
if(__WBenchMsg == NULL)
{
struct FileHandle * fh;
fh = BADDR(__fd[STDERR_FILENO]->fd_DefaultFile);
if(fh->fh_Type != NULL)
{
D_S(struct InfoData,id);
if(DoPkt(fh->fh_Type,ACTION_DISK_INFO,MKBADDR(id),0,0,0,0))
{
if(id->id_DiskType == ID_RAWCON)
{
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_NON_BLOCKING);
SET_FLAG(__fd[STDERR_FILENO]->fd_Flags,FDF_DEFAULT_NON_BLOCKING);
}
}
}
}
}
}
PROFILE_ON();

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_assertion_failure.c,v 1.4 2005-01-02 09:07:08 obarthel Exp $
* $Id: stdlib_assertion_failure.c,v 1.6 2005-01-09 09:40:32 obarthel Exp $
*
* :ts=4
*
@@ -61,46 +61,7 @@ __assertion_failure(
/* Don't drop into a recursion. */
if(been_here_before++ == 0)
{
BOOL use_stderr = FALSE;
/* Figure out if the assertion failure message can be printed
on the stderr stream. */
if(__iob != NULL && NOT __no_standard_io)
{
struct iob * iob;
iob = (struct iob *)stderr;
if(iob != NULL &&
FLAG_IS_SET(iob->iob_Flags,IOBF_IN_USE) &&
FLAG_IS_SET(iob->iob_Flags,IOBF_WRITE))
{
struct fd * fd;
fd = __get_file_descriptor(iob->iob_Descriptor);
if(fd != NULL &&
FLAG_IS_SET(fd->fd_Flags,FDF_IN_USE) &&
FLAG_IS_SET(fd->fd_Flags,FDF_WRITE) &&
FLAG_IS_SET(fd->fd_Flags,FDF_IS_INTERACTIVE))
{
assert( FLAG_IS_CLEAR(fd->fd_Flags,FDF_IS_SOCKET) );
use_stderr = TRUE;
}
}
}
if(use_stderr)
{
if(__program_name != NULL)
fprintf(stderr,"[%s] ",__program_name);
fprintf(stderr,
"%s:%d: failed assertion '%s'\n",
file_name,
line_number,
expression);
}
else
if(__no_standard_io || __WBenchMsg != NULL)
{
#if defined(__amigaos4__)
struct IntuitionIFace * IIntuition = NULL;
@@ -146,6 +107,17 @@ __assertion_failure(
CloseLibrary(IntuitionBase);
}
}
else
{
if(__program_name != NULL)
fprintf(stderr,"[%s] ",__program_name);
fprintf(stderr,
"%s:%d: failed assertion '%s'\n",
file_name,
line_number,
expression);
}
abort();
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_main.c,v 1.9 2005-01-02 09:07:18 obarthel Exp $
* $Id: stdlib_main.c,v 1.10 2005-01-13 15:39:39 obarthel Exp $
*
* :ts=4
*
@@ -250,34 +250,32 @@ detach_cleanup(REG(d0, LONG UNUSED unused_return_code),REG(d1, BPTR segment_list
{
if(__IUtility != NULL)
DropInterface((struct Interface *)__IUtility);
if(IDOS != NULL)
DropInterface((struct Interface *)IDOS);
}
#else
{
/* The following trick is necessary only under dos.library V40 and below. */
if(((struct Library *)DOSBase)->lib_Version < 50)
{
/* Now for the slightly shady part. We need to unload the segment
list this program was originally loaded with. We have to close
dos.library, though, which means that either we can close the
library or unload the code, but not both. But there's a loophole
in that we can enter Forbid(), unload the code, close the library
and exit and nobody will be able to allocate this program's
memory until after the process has been terminated. */
Forbid();
UnLoadSeg(segment_list);
}
}
#endif /* __amigaos4__ */
if(__UtilityBase != NULL)
CloseLibrary(__UtilityBase);
/* The following trick is necessary only under dos.library V40 and below. */
if(((struct Library *)DOSBase)->lib_Version < 50)
{
/* Now for the slightly shady part. We need to unload the segment
list this program was originally loaded with. We have to close
dos.library, though, which means that either we can close the
library or unload the code, but not both. But there's a loophole
in that we can enter Forbid(), unload the code, close the library
and exit and nobody will be able to allocate this program's
memory until after the process has been terminated. */
Forbid();
UnLoadSeg(segment_list);
}
#if defined(__amigaos4__)
{
if(IDOS != NULL)
DropInterface((struct Interface *)IDOS);
}
#endif /* __amigaos4__ */
if(DOSBase != NULL)
CloseLibrary(DOSBase);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_malloc.c,v 1.5 2005-01-02 09:07:18 obarthel Exp $
* $Id: stdlib_malloc.c,v 1.6 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@@ -275,8 +275,16 @@ __memory_init(void)
NewList((struct List *)&__memory_list);
if(((struct Library *)SysBase)->lib_Version >= 39)
#if defined(__amigaos4__)
{
__memory_pool = CreatePool(MEMF_ANY,(ULONG)__default_pool_size,(ULONG)__default_puddle_size);
}
#else
{
if(((struct Library *)SysBase)->lib_Version >= 39)
__memory_pool = CreatePool(MEMF_ANY,(ULONG)__default_pool_size,(ULONG)__default_puddle_size);
}
#endif /* __amigaos4__ */
LEAVE();
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_setenv.c,v 1.4 2005-01-02 09:07:18 obarthel Exp $
* $Id: stdlib_setenv.c,v 1.5 2005-01-09 10:10:41 obarthel Exp $
*
* :ts=4
*
@@ -61,7 +61,7 @@ struct LocalVariable
/****************************************************************************/
STATIC struct LocalVariable * __lv_root;
static struct LocalVariable * __lv_root;
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_showerror.c,v 1.5 2005-01-02 09:07:18 obarthel Exp $
* $Id: stdlib_showerror.c,v 1.9 2005-01-13 15:39:39 obarthel Exp $
*
* :ts=4
*
@@ -99,39 +99,17 @@ __show_error(const char * message)
}
#endif /* __amigaos4__ */
if(__detach || __no_standard_io || __WBenchMsg != NULL)
/* If we can't hope to print the error message, show a requester instead. */
if(__no_standard_io || __WBenchMsg != NULL)
{
if(IntuitionBase->lib_Version >= 37)
UBYTE program_name[256];
struct EasyStruct es;
STRPTR title_string;
/* The following does not make great sense on OS4. */
#if NOT defined(__amigaos4__)
{
UBYTE program_name[256];
struct EasyStruct es;
STRPTR title_string;
if(__WBenchMsg != NULL)
{
title_string = (STRPTR)FilePart(__WBenchMsg->sm_ArgList[0].wa_Name);
}
else
{
if(GetProgramName(program_name,sizeof(program_name)))
title_string = FilePart((STRPTR)program_name);
else
title_string = (STRPTR)"Error";
}
memset(&es,0,sizeof(es));
es.es_StructSize = sizeof(es);
es.es_Title = title_string;
es.es_TextFormat = (STRPTR)message;
es.es_GadgetFormat = (STRPTR)"Sorry";
EasyRequestArgs(NULL,&es,NULL,NULL);
}
else
{
/* The following does not make great sense on OS4. */
#if NOT defined(__amigaos4__)
if(IntuitionBase->lib_Version < 37)
{
static struct TextAttr default_font = { (STRPTR)"topaz.font",8,FS_NORMAL,FPF_ROMFONT|FPF_DESIGNED };
static struct IntuiText sorry_text = {0,1,JAM1,6,3,(struct TextAttr *)NULL,(STRPTR)"Sorry",(struct IntuiText *)NULL};
@@ -143,18 +121,58 @@ __show_error(const char * message)
body_text.IText = (STRPTR)message;
AutoRequest(NULL,&body_text,NULL,&sorry_text,0,0,37 + 8 * strlen(message),46);
goto out;
}
#endif /* __amigaos4__ */
}
#endif /* __amigaos4__ */
if(__WBenchMsg != NULL)
{
title_string = (STRPTR)FilePart(__WBenchMsg->sm_ArgList[0].wa_Name);
}
else
{
if(GetProgramName(program_name,sizeof(program_name)))
title_string = FilePart((STRPTR)program_name);
else
title_string = (STRPTR)"Error";
}
memset(&es,0,sizeof(es));
es.es_StructSize = sizeof(es);
es.es_Title = title_string;
es.es_TextFormat = (STRPTR)message;
es.es_GadgetFormat = (STRPTR)"Sorry";
EasyRequestArgs(NULL,&es,NULL,NULL);
}
else
{
BPTR output;
output = Output();
#if defined(__amigaos4__)
{
/* Try to print the error message on the default error output stream. */
output = ErrorOutput();
}
#else
{
struct Process * this_process = (struct Process *)FindTask(NULL);
Write(output,(STRPTR)message,(LONG)strlen(message));
Write(output,"\n",1);
output = this_process->pr_CES;
}
#endif /* __amigaos4__ */
if(output == ZERO)
output = Output();
if(output != ZERO)
{
Write(output,(STRPTR)message,(LONG)strlen(message));
Write(output,"\n",1);
}
}
out:

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_startup.c,v 1.5 2005-01-02 09:07:19 obarthel Exp $
* $Id: stdlib_startup.c,v 1.6 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@@ -387,17 +387,13 @@ __startup_init(void)
{
struct FileHandle * fh = BADDR(input);
/* Careful: "NIL:" will have a NULL MsgPort in the file handle. */
if(fh->fh_Type != NULL)
{
old_console_task = SetConsoleTask(fh->fh_Type);
old_console_task = SetConsoleTask(fh->fh_Type);
output = Open("CONSOLE:",MODE_NEWFILE);
if(output != ZERO)
restore_console_task = TRUE;
else
SetConsoleTask((struct MsgPort *)old_console_task);
}
output = Open("CONSOLE:",MODE_NEWFILE);
if(output != ZERO)
restore_console_task = TRUE;
else
SetConsoleTask((struct MsgPort *)old_console_task);
}
if(output == ZERO)

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_system.c,v 1.2 2005-01-02 09:07:19 obarthel Exp $
* $Id: stdlib_system.c,v 1.3 2005-01-09 10:10:41 obarthel Exp $
*
* :ts=4
*
@@ -69,7 +69,7 @@ system(const char * command)
}
else
{
STATIC const struct TagItem system_tags[2] =
static const struct TagItem system_tags[2] =
{
{ SYS_UserShell, TRUE },
{ TAG_END, 0 }

View File

@@ -1,5 +1,5 @@
/*
* $Id: stdlib_termination_message.c,v 1.3 2005-01-02 09:07:19 obarthel Exp $
* $Id: stdlib_termination_message.c,v 1.4 2005-01-09 10:10:41 obarthel Exp $
*
* :ts=4
*
@@ -54,7 +54,7 @@ __print_termination_message(const char * termination_message)
{
termination_message_printed = TRUE;
if(NOT __termination_message_disabled && NOT __no_standard_io)
if(NOT __no_standard_io)
{
fputs((termination_message != NULL) ? termination_message : "Abnormal program termination",stderr);

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_asctime_r.c,v 1.3 2005-01-02 09:07:19 obarthel Exp $
* $Id: time_asctime_r.c,v 1.4 2005-01-26 18:41:39 obarthel Exp $
*
* :ts=4
*
@@ -101,21 +101,13 @@ __asctime_r(const struct tm *tm,char * buffer,size_t buffer_size)
/* Fill in the week day if it's not in proper range. */
if(tm->tm_wday < 0 || tm->tm_wday > 6)
{
struct tm other_tm;
time_t seconds;
/* We use a peculiar algorithm rather than falling back onto
mktime() here in order to avoid trouble with skewed results
owing to time zone influence. */
copy_tm = (*tm);
copy_tm.tm_wday = __calculate_weekday(tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday);
other_tm = (*tm);
seconds = mktime(&other_tm);
if(seconds != (time_t)-1)
{
__convert_time(seconds,0,&other_tm);
copy_tm = (*tm);
copy_tm.tm_wday = other_tm.tm_wday;
tm = &copy_tm;
}
tm = &copy_tm;
}
if(0 <= tm->tm_wday && tm->tm_wday <= 6)

View File

@@ -0,0 +1,60 @@
/*
* $Id: time_convert_datestamp.c,v 1.1 2005-01-26 09:24:38 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _TIME_HEADERS_H
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
#ifndef _LOCALE_HEADERS_H
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
/****************************************************************************/
time_t
__convert_datestamp_to_time(const struct DateStamp * ds)
{
time_t result;
ENTER();
/* If possible, adjust for the local time zone. We do this because the
AmigaOS system time is returned in local time and we want to return
it in UTC. */
result = UNIX_TIME_OFFSET + ds->ds_Days * (24*60*60) + ds->ds_Minute * 60 + (ds->ds_Tick / TICKS_PER_SECOND);
if(__default_locale != NULL)
result += 60 * __default_locale->loc_GMTOffset;
RETURN(result);
return(result);
}

View File

@@ -0,0 +1,72 @@
/*
* $Id: time_convert_time.c,v 1.1 2005-01-29 18:22:19 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _TIME_HEADERS_H
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
#ifndef _LOCALE_HEADERS_H
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
/****************************************************************************/
BOOL
__convert_time_to_datestamp(time_t time_value,struct DateStamp * ds)
{
BOOL success;
/* The time has to lie within the AmigaOS epoch. */
if(time_value < UNIX_TIME_OFFSET)
{
success = FALSE;
goto out;
}
/* Adjust the time to the AmigaOS epoch. */
time_value -= UNIX_TIME_OFFSET;
/* If possible, adjust the time to match the local time zone settings. */
if(__default_locale != NULL)
time_value -= 60 * __default_locale->loc_GMTOffset;
ds->ds_Days = (time_value / (24 * 60 * 60));
ds->ds_Minute = (time_value % (24 * 60 * 60)) / 60;
ds->ds_Tick = (time_value % 60) * TICKS_PER_SECOND;
success = TRUE;
out:
return(success);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_converttime.c,v 1.2 2005-01-02 09:07:19 obarthel Exp $
* $Id: time_converttime.c,v 1.3 2005-01-29 18:05:14 obarthel Exp $
*
* :ts=4
*
@@ -43,7 +43,6 @@ __convert_time(ULONG seconds, LONG gmt_offset, struct tm * tm)
DECLARE_UTILITYBASE();
struct ClockData clock_data;
struct tm * result;
ULONG delta;
ENTER();
@@ -62,8 +61,13 @@ __convert_time(ULONG seconds, LONG gmt_offset, struct tm * tm)
/* Now the local time offset will have to go. */
seconds -= gmt_offset;
/* Convert the number of seconds into a more useful format. */
Amiga2Date(seconds, &clock_data);
/* The 'struct clockdata' layout and contents are very similar
* to the 'struct tm' contents. We don't have to convert much,
* except for the 'tm.tm_yday' field below.
*/
tm->tm_sec = clock_data.sec;
tm->tm_min = clock_data.min;
tm->tm_hour = clock_data.hour;
@@ -73,12 +77,8 @@ __convert_time(ULONG seconds, LONG gmt_offset, struct tm * tm)
tm->tm_wday = clock_data.wday;
tm->tm_isdst = -1;
clock_data.mday = 1;
clock_data.month = 1;
delta = Date2Amiga(&clock_data);
tm->tm_yday = (seconds - delta) / (24 * 60 * 60);
/* Now figure out how many days have passed since January 1st. */
tm->tm_yday = __calculate_days_per_date(clock_data.year,clock_data.month,clock_data.mday) - __calculate_days_per_date(clock_data.year,1,1);
result = tm;

View File

@@ -0,0 +1,56 @@
/*
* $Id: time_days_per_date.c,v 1.1 2005-01-29 18:05:14 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/****************************************************************************/
#ifndef _TIME_HEADERS_H
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
/****************************************************************************/
/* This calculates the number of days that have passed up to the
given date. */
int
__calculate_days_per_date(int year,int month,int day)
{
int result;
month = month + 9;
year = year - 1 + (month / 12);
month = (month % 12) * 306 + 5;
result = (year * 365) + (year / 4) - (year / 100) + (year / 400) + (month / 10) + day - 1;
return(result);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_gettimeofday.c,v 1.3 2005-01-02 09:07:19 obarthel Exp $
* $Id: time_gettimeofday.c,v 1.5 2005-01-24 10:25:46 obarthel Exp $
*
* :ts=4
*
@@ -39,12 +39,20 @@
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
#ifndef _UNISTD_HEADERS_H
#include "unistd_headers.h"
#endif /* _UNISTD_HEADERS_H */
/****************************************************************************/
#include <sys/time.h>
/****************************************************************************/
#include <proto/timer.h>
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
@@ -52,18 +60,27 @@
int
gettimeofday(struct timeval *tp, struct timezone *tzp)
{
struct Library * TimerBase = __TimerBase;
#if defined(__amigaos4__)
struct TimerIFace * ITimer = __ITimer;
#endif /* __amigaos4__ */
ULONG seconds,microseconds;
struct DateStamp ds;
struct timeval tv;
ENTER();
PROFILE_OFF();
DateStamp(&ds);
PROFILE_ON();
/* Obtain the current system time. */
GetSysTime(&tv);
seconds = UNIX_TIME_OFFSET + 60 * ((ULONG)ds.ds_Minute + 24 * 60 * (ULONG)ds.ds_Days) + (ds.ds_Tick / TICKS_PER_SECOND);
microseconds = (1000000 * (ds.ds_Tick % TICKS_PER_SECOND)) / TICKS_PER_SECOND;
/* Convert the number of seconds so that they match the Unix epoch, which
starts (January 1st, 1970) eight years before the AmigaOS epoch. */
seconds = tv.tv_sec + UNIX_TIME_OFFSET;
microseconds = tv.tv_usec;
/* If possible, adjust for the local time zone. We do this because the
AmigaOS system time is returned in local time and we want to return
it in UTC. */
if(__default_locale != NULL)
seconds += 60 * __default_locale->loc_GMTOffset;
@@ -83,6 +100,8 @@ gettimeofday(struct timeval *tp, struct timezone *tzp)
else
tzp->tz_minuteswest = 0;
/* The -1 means "we do not know if the time given is in
daylight savings time". */
tzp->tz_dsttime = -1;
SHOWVALUE(tzp->tz_minuteswest);

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_headers.h,v 1.5 2005-01-02 09:07:19 obarthel Exp $
* $Id: time_headers.h,v 1.8 2005-01-29 18:05:14 obarthel Exp $
*
* :ts=4
*
@@ -94,6 +94,10 @@ extern const char * const NOCOMMON __month_names[12];
extern char * __asctime_r(const struct tm *tm,char * buffer,size_t buffer_size);
extern char * __number_to_string(unsigned int number,char * string,size_t max_len,size_t min_len);
extern struct tm * __convert_time(ULONG seconds, LONG gmt_offset, struct tm * tm);
extern time_t __convert_datestamp_to_time(const struct DateStamp * ds);
extern BOOL __convert_time_to_datestamp(time_t time_value,struct DateStamp * ds);
extern int __calculate_weekday(int year,int month,int day);
extern int __calculate_days_per_date(int year,int month,int day);
/****************************************************************************/

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_localtime_r.c,v 1.2 2005-01-02 09:07:19 obarthel Exp $
* $Id: time_localtime_r.c,v 1.3 2005-01-25 11:21:00 obarthel Exp $
*
* :ts=4
*
@@ -67,8 +67,8 @@ localtime_r(const time_t *t,struct tm * tm_ptr)
}
#endif /* CHECK_FOR_NULL_POINTERS */
/* The time parameter given represents local time and
* must be converted to UTC before we proceed.
/* The time parameter given represents UTC and
* must be converted to local time before we proceed.
*/
if(__default_locale != NULL)
gmt_offset = 60 * __default_locale->loc_GMTOffset;

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_mktime.c,v 1.2 2005-01-02 09:07:19 obarthel Exp $
* $Id: time_mktime.c,v 1.4 2005-01-25 11:21:00 obarthel Exp $
*
* :ts=4
*
@@ -41,6 +41,10 @@
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
#ifndef _LOCALE_HEADERS_H
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
/****************************************************************************/
time_t
@@ -100,14 +104,12 @@ mktime(struct tm *tm)
int year;
/* We need to have the full year number for the
* leap year calculation below.
*/
leap year calculation below. */
year = tm->tm_year + 1900;
/* Now for the famous leap year calculation rules... We
* need to find out if the number of days in the month
* of February are appropriate for the data given.
*/
need to find out if the number of days in the month
of February are appropriate for the data given. */
if((year % 4) != 0)
max_month_days = 28;
else if ((year % 400) == 0)
@@ -177,8 +179,7 @@ mktime(struct tm *tm)
seconds = Date2Amiga(&clock_data);
/* The AmigaOS "epoch" starts with January 1st, 1978, which was
* a Sunday.
*/
a Sunday. */
tm->tm_wday = (seconds / (24 * 60 * 60)) % 7;
clock_data.mday = 1;
@@ -188,6 +189,13 @@ mktime(struct tm *tm)
tm->tm_yday = (seconds - delta) / (24 * 60 * 60);
/* The data in 'struct tm *tm' was given in local time. We need
to convert the result into UTC. */
if(__default_locale != NULL)
seconds += 60 * __default_locale->loc_GMTOffset;
/* Finally, adjust for the difference between the Unix and the
AmigaOS epochs, which differ by 8 years. */
result = seconds + UNIX_TIME_OFFSET;
error = 0;

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_strftime.c,v 1.2 2005-01-02 09:07:19 obarthel Exp $
* $Id: time_strftime.c,v 1.5 2005-01-29 18:05:14 obarthel Exp $
*
* :ts=4
*
@@ -103,35 +103,25 @@ store_string_via_hook(const char * string,int len,struct Hook * hook)
/****************************************************************************/
static void
format_date(const char *format,const struct tm *tm,time_t time_value,struct Hook * hook)
format_date(const char *format,const struct tm *tm,struct Hook * hook)
{
struct tm other_tm;
struct tm copy_tm;
time_t other_time_value = 0; /* ZZZ compiler claims that this assignment is unnecessary. */
char buffer[40];
const char * str;
char c;
int i;
assert( format != NULL && tm != NULL && hook != NULL);
/* Fill in the week day if it's not in proper range. */
if(tm->tm_wday < 0 || tm->tm_wday > 6)
{
time_t seconds;
/* We use a peculiar algorithm rather than falling back onto
mktime() here in order to avoid trouble with skewed results
owing to time zone influence. */
copy_tm = (*tm);
copy_tm.tm_wday = __calculate_weekday(tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday);
other_tm = (*tm);
seconds = mktime(&other_tm);
if(seconds != (time_t)-1)
{
__convert_time(seconds,0,&other_tm);
copy_tm = (*tm);
copy_tm.tm_wday = other_tm.tm_wday;
tm = &copy_tm;
}
tm = &copy_tm;
}
while((c = (*format++)) != '\0')
@@ -207,55 +197,7 @@ format_date(const char *format,const struct tm *tm,time_t time_value,struct Hook
/* Locale specific date and time ("%a %b %d %H:%M:%S %Y"). */
case 'c':
assert( 0 <= tm->tm_wday && tm->tm_wday <= 6 );
if(0 <= tm->tm_wday && tm->tm_wday <= 6)
str = __abbreviated_week_day_names[tm->tm_wday];
else
str = "-";
store_string_via_hook(str,-1,hook);
store_string_via_hook(" ",1,hook);
assert( 0 <= tm->tm_mon && tm->tm_mon <= 11 );
if(0 <= tm->tm_mon && tm->tm_mon <= 11)
str = __abbreviated_month_names[tm->tm_mon];
else
str = "-";
store_string_via_hook(str,-1,hook);
store_string_via_hook(" ",1,hook);
assert( 1 <= tm->tm_mday && tm->tm_mday <= 31 );
__number_to_string((unsigned int)tm->tm_mday,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
store_string_via_hook(" ",1,hook);
assert( 0 <= tm->tm_hour && tm->tm_hour <= 23 );
__number_to_string((unsigned int)tm->tm_hour,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
store_string_via_hook(":",1,hook);
assert( 0 <= tm->tm_min && tm->tm_min <= 59 );
__number_to_string((unsigned int)tm->tm_min,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
store_string_via_hook(":",1,hook);
assert( 0 <= tm->tm_sec && tm->tm_sec <= 59 );
__number_to_string((unsigned int)tm->tm_sec,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
store_string_via_hook(" ",1,hook);
assert( 0 <= tm->tm_year );
__number_to_string((unsigned int)1900 + tm->tm_year,buffer,sizeof(buffer),0);
store_string_via_hook(buffer,-1,hook);
format_date("%a %b %d %H:%M:%S %Y",tm,hook);
break;
/* Day of the month ("01"-"31"). */
@@ -289,13 +231,7 @@ format_date(const char *format,const struct tm *tm,time_t time_value,struct Hook
/* Day of the year ("001"-"366"). */
case 'j':
other_tm = (*tm);
other_tm.tm_mday = 1;
other_tm.tm_mon = 0;
other_time_value = mktime(&other_tm);
__number_to_string((unsigned int)(other_time_value - time_value) / (24 * 60 * 60) + 1,buffer,sizeof(buffer),3);
__number_to_string(1 + __calculate_days_per_date(tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday) - __calculate_days_per_date(tm->tm_year+1900,1,1),buffer,sizeof(buffer),3);
store_string_via_hook(buffer,-1,hook);
break;
@@ -339,32 +275,7 @@ format_date(const char *format,const struct tm *tm,time_t time_value,struct Hook
*/
case 'U':
/* Go back to January and find the first Sunday. */
other_tm = (*tm);
other_tm.tm_mon = 0;
for(i = 0 ; i < 7 ; i++)
{
other_tm.tm_mday = i+1;
other_time_value = mktime(&other_tm);
if(other_tm.tm_wday == 0)
break;
}
/* Store the number of weeks difference between
* the given day and the first Sunday.
*/
if(time_value < other_time_value)
{
/* This must be week zero. */
__number_to_string((unsigned int)0,buffer,sizeof(buffer),2);
}
else
{
__number_to_string((unsigned int)(time_value - other_time_value) / (7 * 24 * 60 * 60) + 1,buffer,sizeof(buffer),2);
}
__number_to_string((tm->tm_yday + 7 - tm->tm_wday) / 7,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
break;
@@ -382,90 +293,20 @@ format_date(const char *format,const struct tm *tm,time_t time_value,struct Hook
*/
case 'W':
/* Go back to January and find the first Monday. */
other_tm = (*tm);
other_tm.tm_mon = 0;
for(i = 0 ; i < 7 ; i++)
{
other_tm.tm_mday = i+1;
other_time_value = mktime(&other_tm);
if(other_tm.tm_wday == 1)
break;
}
/* Store the number of weeks difference between
* the given day and the first Monday.
*/
if(time_value < other_time_value)
{
/* This must be week zero. */
__number_to_string((unsigned int)0,buffer,sizeof(buffer),2);
}
else
{
__number_to_string((unsigned int)(time_value - other_time_value) / (7 * 24 * 60 * 60) + 1,buffer,sizeof(buffer),2);
}
__number_to_string((tm->tm_yday + 7 - ((tm->tm_wday + 6) % 7)) / 7,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
break;
/* Locale-specific date ("%a %b %d, %Y"). */
case 'x':
assert( 0 <= tm->tm_wday && tm->tm_wday <= 6 );
if(0 <= tm->tm_wday && tm->tm_wday <= 6)
str = __abbreviated_week_day_names[tm->tm_wday];
else
str = "-";
store_string_via_hook(str,-1,hook);
store_string_via_hook(" ",1,hook);
assert( 0 <= tm->tm_mon && tm->tm_mon <= 11 );
if(0 <= tm->tm_mon && tm->tm_mon <= 11)
str = __abbreviated_month_names[tm->tm_mon];
else
str = "-";
store_string_via_hook(str,-1,hook);
store_string_via_hook(" ",1,hook);
assert( 1 <= tm->tm_mday && tm->tm_mday <= 31 );
__number_to_string((unsigned int)tm->tm_mday,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
store_string_via_hook(", ",2,hook);
assert( 0 <= tm->tm_year );
__number_to_string((unsigned int)1900 + tm->tm_year,buffer,sizeof(buffer),0);
store_string_via_hook(buffer,-1,hook);
format_date("%a %b %d, %Y",tm,hook);
break;
/* Locale-specific time ("%H:%M:%S"). */
case 'X':
assert( 0 <= tm->tm_hour && tm->tm_hour <= 23 );
__number_to_string((unsigned int)tm->tm_hour,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
store_string_via_hook(":",1,hook);
assert( 0 <= tm->tm_min && tm->tm_min <= 59 );
__number_to_string((unsigned int)tm->tm_min,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
store_string_via_hook(":",1,hook);
assert( 0 <= tm->tm_sec && tm->tm_sec <= 59 );
__number_to_string((unsigned int)tm->tm_sec,buffer,sizeof(buffer),2);
store_string_via_hook(buffer,2,hook);
format_date("%H:%M:%S",tm,hook);
break;
/* Year without century ("00"-"99"). */
@@ -536,8 +377,6 @@ strftime(char *s, size_t maxsize, const char *format, const struct tm *tm)
struct format_hook_data data;
struct Hook hook;
size_t result = 0;
struct tm tm_copy;
time_t time_value;
ENTER();
@@ -565,15 +404,6 @@ strftime(char *s, size_t maxsize, const char *format, const struct tm *tm)
if(maxsize > 0)
{
tm_copy = (*tm);
time_value = mktime(&tm_copy);
if(time_value == (time_t)-1)
{
SHOWMSG("invalid time");
goto out;
}
data.buffer = s;
data.max_size = maxsize-1;
@@ -596,12 +426,25 @@ strftime(char *s, size_t maxsize, const char *format, const struct tm *tm)
if(__locale_table[LC_TIME] != NULL)
{
struct DateStamp ds;
struct tm tm_copy;
time_t time_value;
time_value -= UNIX_TIME_OFFSET;
tm_copy = (*tm);
ds.ds_Days = time_value / (24 * 60 * 60);
ds.ds_Minute = (time_value % (24 * 60 * 60)) / 60;
ds.ds_Tick = (time_value % 60) * TICKS_PER_SECOND;
time_value = mktime(&tm_copy);
if(time_value == (time_t)-1)
{
SHOWMSG("invalid time");
goto out;
}
/* Convert the number of seconds into a DateStamp, as to be
submitted to the FormatDate() function below. */
if(CANNOT __convert_time_to_datestamp(time_value,&ds))
{
SHOWMSG("time conversion to datestamp failed");
goto out;
}
assert( LocaleBase != NULL );
@@ -609,7 +452,7 @@ strftime(char *s, size_t maxsize, const char *format, const struct tm *tm)
}
else
{
format_date(format,tm,time_value,&hook);
format_date(format,tm,&hook);
}
(*data.buffer) = '\0';

View File

@@ -1,5 +1,5 @@
/*
* $Id: time_time.c,v 1.2 2005-01-02 09:07:19 obarthel Exp $
* $Id: time_time.c,v 1.4 2005-01-25 11:21:00 obarthel Exp $
*
* :ts=4
*
@@ -45,22 +45,16 @@ time_t
time(time_t * tptr)
{
struct DateStamp ds;
ULONG seconds;
time_t result;
PROFILE_OFF();
DateStamp(&ds);
PROFILE_ON();
seconds = 60 * ((ULONG)ds.ds_Minute + 24 * 60 * (ULONG)ds.ds_Days) + (ds.ds_Tick / TICKS_PER_SECOND);
/* time() should try to return the current time in UTC form. Thus,
* we have to take the local time zone into account.
*/
if(__default_locale != NULL)
result = UNIX_TIME_OFFSET + seconds + 60 * __default_locale->loc_GMTOffset;
else
result = UNIX_TIME_OFFSET + seconds;
/* This converts the DateStamp contents into the number of
seconds elapsed since January 1st 1970. The time is
given as relative to UTC, not local time. */
result = __convert_datestamp_to_time(&ds);
if(tptr != NULL)
(*tptr) = result;

86
library/time_weekday.c Normal file
View File

@@ -0,0 +1,86 @@
/*
* $Id: time_weekday.c,v 1.1 2005-01-26 18:41:39 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/****************************************************************************/
#ifndef _TIME_HEADERS_H
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
/****************************************************************************/
int
__calculate_weekday(int year,int month,int day)
{
/* This algorithm comes from <http://klausler.com/new-dayofweek.html>. */
static const char month_skew[12] =
{
0,3,3,6,
1,4,6,2,
5,0,3,5
};
int sum;
/* Subtract 1900 from the year. */
sum = year - 1900;
/* To that number, add one fourth of itself, discarding
any remainder. This sum is the year's skew value. */
sum += sum / 4;
/* If the month in question is January or February in a leap
year, subtract 1 from the sum. */
if(month == 1 || month == 2)
{
int leap_year_adjust;
/* Figure out if the year is a leap year. */
if((year % 4) != 0)
leap_year_adjust = 0;
else if ((year % 400) == 0)
leap_year_adjust = 1;
else if ((year % 100) == 0)
leap_year_adjust = 0;
else
leap_year_adjust = 1;
sum -= leap_year_adjust;
}
/* Add the month's skew value from the table. */
sum += day + month_skew[month-1];
/* The sum is the number of days after Sunday on which the date falls. */
return(sum % 7);
}

View File

@@ -1,5 +1,5 @@
/*
* $Id: unistd_chown.c,v 1.3 2005-01-02 09:07:19 obarthel Exp $
* $Id: unistd_chown.c,v 1.4 2005-01-09 15:58:02 obarthel Exp $
*
* :ts=4
*
@@ -106,57 +106,59 @@ chown(const char * path_name, uid_t owner, gid_t group)
D(("changing owner of '%s'",path_name));
if(((struct Library *)DOSBase)->lib_Version >= 39)
#if defined(__amigaos4__)
{
PROFILE_OFF();
status = SetOwner((STRPTR)path_name,(LONG)((((ULONG)owner) << 16) | group));
PROFILE_ON();
if(status == DOSFALSE)
{
__translate_io_error_to_errno(IoErr(),&errno);
goto out;
}
result = 0;
}
else
#else
{
D_S(struct bcpl_name,new_name);
size_t len;
len = strlen(path_name);
if(len >= sizeof(new_name->name))
if(((struct Library *)DOSBase)->lib_Version >= 39)
{
errno = ENAMETOOLONG;
goto out;
PROFILE_OFF();
status = SetOwner((STRPTR)path_name,(LONG)((((ULONG)owner) << 16) | group));
PROFILE_ON();
}
PROFILE_OFF();
dvp = GetDeviceProc((STRPTR)path_name,NULL);
PROFILE_ON();
if(dvp == NULL)
else
{
__translate_io_error_to_errno(IoErr(),&errno);
goto out;
D_S(struct bcpl_name,new_name);
size_t len;
len = strlen(path_name);
if(len >= sizeof(new_name->name))
{
errno = ENAMETOOLONG;
goto out;
}
PROFILE_OFF();
dvp = GetDeviceProc((STRPTR)path_name,NULL);
PROFILE_ON();
if(dvp == NULL)
{
__translate_io_error_to_errno(IoErr(),&errno);
goto out;
}
new_name->name[0] = len;
memmove(&new_name->name[1],path_name,len);
PROFILE_OFF();
status = DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)owner) << 16) | group),0,0);
PROFILE_ON();
}
new_name->name[0] = len;
memmove(&new_name->name[1],path_name,len);
PROFILE_OFF();
status = DoPkt(dvp->dvp_Port,ACTION_SET_OWNER,dvp->dvp_Lock,MKBADDR(new_name),(LONG)((((ULONG)owner) << 16) | group),0,0);
PROFILE_ON();
if(status == DOSFALSE)
{
__translate_io_error_to_errno(IoErr(),&errno);
goto out;
}
result = 0;
}
#endif /* __amigaos4__ */
if(status == DOSFALSE)
{
__translate_io_error_to_errno(IoErr(),&errno);
goto out;
}
result = 0;
out:

View File

@@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 185
#define DATE "2.1.2005"
#define VERS "unix.lib 1.185"
#define VSTRING "unix.lib 1.185 (2.1.2005)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.185 (2.1.2005)"
#define REVISION 187
#define DATE "29.1.2005"
#define VERS "unix.lib 1.187"
#define VSTRING "unix.lib 1.187 (29.1.2005)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.187 (29.1.2005)"

View File

@@ -1 +1 @@
185
187

View File

@@ -1,5 +1,5 @@
/*
* $Id: utime_utime.c,v 1.3 2005-01-02 09:07:19 obarthel Exp $
* $Id: utime_utime.c,v 1.5 2005-01-29 18:05:14 obarthel Exp $
*
* :ts=4
*
@@ -45,6 +45,10 @@
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
#ifndef _TIME_HEADERS_H
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
@@ -76,29 +80,20 @@ utime(const char * path_name,const struct utimbuf * times)
if(__check_abort_enabled)
__check_abort();
/* If a modification time is provided, convert it into the local
DateStamp format, as used by the SetFileDate() function. */
if(times != NULL)
{
time_t seconds;
seconds = times->modtime;
if(seconds < UNIX_TIME_OFFSET)
if(CANNOT __convert_time_to_datestamp(times->modtime,&ds))
{
errno = EINVAL;
goto out;
}
seconds -= UNIX_TIME_OFFSET;
if(__default_locale != NULL)
seconds -= 60 * __default_locale->loc_GMTOffset;
ds.ds_Days = (seconds / (24 * 60 * 60));
ds.ds_Minute = (seconds % (24 * 60 * 60)) / 60;
ds.ds_Tick = (seconds % 60) * TICKS_PER_SECOND;
}
else
{
/* No special modification time provided; use the current
time instead. */
DateStamp(&ds);
}

View File

@@ -1,100 +0,0 @@
#
# $Id: GNUmakefile.68k,v 1.3 2004-10-25 19:50:33 obarthel Exp $
#
# :ts=8
#
##############################################################################
CC = gcc
DELETE = delete all quiet
##############################################################################
.c.o:
@echo "Compiling $<"
@$(CC) -c $(CFLAGS) $<
##############################################################################
#CODE_TYPE := -fbaserel -DSMALL_DATA -m68020-60 -DM68020
#CODE_TYPE := -fbaserel -DSMALL_DATA -m68000
#CODE_TYPE := -fbaserel32 -DSMALL_DATA32 -m68020-60 -DM68020
CODE_TYPE := -m68020-60 -DM68020
#CODE_TYPE := -m68000
##############################################################################
WARNINGS = \
-Wall -W -Wshadow -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
INCLUDE = -I../library/include
LIB = -L../library/lib
OPTIONS = -DNDEBUG -fno-builtin -DNO_INLINE_STDARG -DIEEE_FLOATING_POINT_SUPPORT
#OPTIONS = -D__MEM_DEBUG -fno-builtin
#OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
OPTIMIZE = -O
#OPTIMIZE = -O2 -fomit-frame-pointer
#DEBUG = -g2
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDE) $(LIB)
##############################################################################
LIBS = -lm -lc -lgcc
##############################################################################
all: test fgets_test iotest sscanf_test printf_test sprintf_test stack_size_test \
translate_test strtok_test
clean:
$(DELETE) #?.o #?.map test fgets_test iotest sscanf_test printf_test sprintf_test \
stack_size_test translate_test strtok_test
##############################################################################
test : test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
fgets_test : fgets_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ fgets_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
strtok_test : strtok_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ strtok_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
iotest : iotest.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ iotest.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
sscanf_test : sscanf_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ sscanf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
printf_test : printf_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ printf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
sprintf_test : sprintf_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ sprintf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
stack_size_test : stack_size_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ stack_size_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
translate_test : translate_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ translate_test.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map
##############################################################################
mkid:
mkid -v #?.(c|h|asm|i)
update:
mkid -v -u

View File

@@ -1,84 +0,0 @@
#
# $Id: GNUmakefile.os4,v 1.2 2004-10-25 19:50:33 obarthel Exp $
#
# :ts=8
#
##############################################################################
CC = ppc-amigaos-gcc
DELETE = rm -r
##############################################################################
.c.o:
@echo "Compiling $<"
@$(CC) -c $(CFLAGS) $<
##############################################################################
WARNINGS = \
-Wall -W -Wshadow -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
INCLUDE = -I../library/include
LIB = -L../library/lib
#OPTIONS = -DNDEBUG -fno-builtin -DNO_INLINE_STDARG -DIEEE_FLOATING_POINT_SUPPORT
#OPTIONS = -D__MEM_DEBUG -fno-builtin
OPTIONS = -DDEBUG -D__MEM_DEBUG -DNO_INLINE_STDARG -fno-builtin
OPTIMIZE = -O
#OPTIMIZE = -O2 -fomit-frame-pointer
#DEBUG = -g2
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDE) $(LIB)
##############################################################################
LIBS = -lm -lc
##############################################################################
all: test fgets_test iotest sscanf_test printf_test sprintf_test stack_size_test \
translate_test strtok_test
clean:
$(DELETE) *.o *.map test fgets_test iotest sscanf_test printf_test sprintf_test \
stack_size_test translate_test strtok_test
##############################################################################
test : test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
fgets_test : fgets_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ fgets_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
strtok_test : strtok_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ strtok_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
iotest : iotest.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ iotest.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
sscanf_test : sscanf_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ sscanf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
printf_test : printf_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ printf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
sprintf_test : sprintf_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ sprintf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
stack_size_test : stack_size_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ stack_size_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
translate_test : translate_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ translate_test.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map

View File

@@ -1,5 +0,0 @@
This is a collection of programs I'm using to test the library. These
are functional tests: the library is supposed to do something, and produce
a particular result. For example, "printf_test" exercises a bunch of
output formatting rules. Currently, there is only an smakefile for SAS/C
to build these programs with.

View File

@@ -1,74 +0,0 @@
#include <stdio.h>
#include <string.h>
#define LINEBUFLENGTH 180
#define STRIP_LF(str) (str[strlen(str)-1]=0)
void invert_str(char * in)
{
char t;
while(t=*in)
{
*in++=~t;
}
}
int main(int i, char *c[])
{
char dest_fname[80], in_linebuffer[LINEBUFLENGTH];
FILE * fileout, * filein;
if(i>1)
{
sprintf(dest_fname, "%s.c", c[1]);
fileout=fopen(dest_fname, "w");
filein =fopen(c[1], "r");
if(fileout && filein)
{
fgets(in_linebuffer, LINEBUFLENGTH, filein);
STRIP_LF(in_linebuffer);
invert_str(in_linebuffer);
fputs("char *s_leading=\"", fileout);
fputs(in_linebuffer, fileout);
fputs("\";\n", fileout);
fputs("char *s_messages[]={\n", fileout);
while(fgets(in_linebuffer, LINEBUFLENGTH, filein))
{
STRIP_LF(in_linebuffer);
invert_str(in_linebuffer);
fputs("\"", fileout);
fputs(in_linebuffer, fileout);
fputs("\",\n", fileout);
}
fputs("};\n", fileout);
fputs("unsigned s_mess_num = sizeof(s_messages)/sizeof(char *);\n", fileout);
fclose(filein);
fclose(fileout);
}
}
return 0;
}
/*
What's this stuff for ? I use it in SP_Engine to hide the usual bunch of "secret
messages". As you can see, the strings are simply not'ed .
This source shows both flaws: fgets() and the missing buffer flush. You can
change the while() statement with
while(!feof(filein))
{
fgets(in_linebuffer, LINEBUFLENGTH, filein);
....
This way you'll workaround the first problem.
The second issue manifests itself this way: the last two fputs() followed by the
fclose() don't do anything: no "};\n" and no "unsigned....." lines are output to
'fileout'. With SAS, it works perfectly. Converting the source to dos.library
calls also works perfectly. I wonder if there's some kind of strange interaction
with the dos/shell updates.
*/

View File

@@ -1,41 +0,0 @@
/*
* $Id: fgets_test.c,v 1.1.1.1 2004-07-26 16:36:07 obarthel Exp $
*
* :ts=4
*/
/****************************************************************************/
#include <string.h>
#include <stdio.h>
/****************************************************************************/
int
main(int argc,char ** argv)
{
char line[256];
size_t len;
FILE * in;
int i;
for(i = 1 ; i < argc ; i++)
{
in = fopen(argv[i],"rb");
if(in != NULL)
{
while(fgets(line,sizeof(line),in) != NULL)
{
len = strlen(line);
while(len > 0 && (line[len-1] == '\n' || line[len-1] == '\r'))
line[--len] = '\0';
printf("%s\n",line);
}
fclose(in);
}
}
return(0);
}

View File

@@ -1,44 +0,0 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define FILE_SIZE 2048
#define WRITE_SIZE 32
char FileData[FILE_SIZE];
void CreateFile(char *filename)
{
FILE *file;
if (file = fopen(filename,"w")) {
memset(FileData,'0',FILE_SIZE);
memset(FileData,'-',WRITE_SIZE);
fwrite(FileData,1,FILE_SIZE,file);
fclose(file);
}
}
void ReadWriteFile(char *filename)
{
FILE *file;
if (file = fopen(filename,"r+")) {
fseek(file,0,SEEK_SET);
fread(FileData,1,FILE_SIZE,file);
fseek(file,0,SEEK_SET);
memset(FileData,'1',WRITE_SIZE);
fwrite(FileData,1,WRITE_SIZE,file);
fclose(file);
}
}
int main(int argc, char **argv)
{
if (argc > 1) {
CreateFile(argv[1]);
ReadWriteFile(argv[1]);
}
return 0;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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,241 +0,0 @@
/*
* $Id: test.c,v 1.1.1.1 2004-07-26 16:36:08 obarthel Exp $
*
* :ts=4
*/
/****************************************************************************/
#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)
{
fprintf(stderr,"destructor #3 called\n");
}
#endif /* __GNUC__ */
/****************************************************************************/
int foo = 3;
int bar = 9;
/****************************************************************************/
#if 1
int
main(int argc,char ** argv)
{
time_t now;
int i,j,k;
long n,r;
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));
#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*/
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);
}